diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/AbstractBaseProposalProvider.java b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/AbstractBaseProposalProvider.java
index 8dc5fd5..b2c58fc 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/AbstractBaseProposalProvider.java
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/AbstractBaseProposalProvider.java
@@ -40,6 +40,9 @@
 	public void completePathNameCS_OwnedPathElements(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeUnreservedPathNameCS_OwnedPathElements(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeFirstPathElementCS_ReferredElement(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
@@ -86,6 +89,9 @@
 	public void complete_PathNameCS(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_UnreservedPathNameCS(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_FirstPathElementCS(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/BaseParser.java b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/BaseParser.java
index 14e7a35..c77bca0 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/BaseParser.java
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/BaseParser.java
@@ -55,6 +55,8 @@
 					put(grammarAccess.getMultiplicityCSAccess().getGroup(), "rule__MultiplicityCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup(), "rule__PathNameCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup_1(), "rule__PathNameCS__Group_1__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup(), "rule__UnreservedPathNameCS__Group__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1(), "rule__UnreservedPathNameCS__Group_1__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup(), "rule__TemplateBindingCS__Group__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup_1(), "rule__TemplateBindingCS__Group_1__0");
 					put(grammarAccess.getTemplateSignatureCSAccess().getGroup(), "rule__TemplateSignatureCS__Group__0");
@@ -72,6 +74,8 @@
 					put(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment(), "rule__MultiplicityStringCS__StringBoundsAssignment");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__PathNameCS__OwnedPathElementsAssignment_0");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__PathNameCS__OwnedPathElementsAssignment_1_1");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1");
 					put(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment(), "rule__FirstPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment(), "rule__NextPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0(), "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0");
diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBase.g b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBase.g
index 922741f..bb92364 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBase.g
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBase.g
@@ -176,6 +176,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS
 :
@@ -1130,6 +1132,8 @@
 
 
 
+
+
 rule__TemplateBindingCS__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -1921,6 +1925,8 @@
 	restoreStackSize(stackSize);
 }
 
+
+
 rule__FirstPathElementCS__ReferredElementAssignment
     @init {
 		int stackSize = keepStackSize();
diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseLexer.java b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseLexer.java
index 43f9b82..be97028 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseLexer.java
@@ -352,8 +352,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalBase.g:2115:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalBase.g:2115:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalBase.g:2121:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalBase.g:2121:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -377,8 +377,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalBase.g:2117:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalBase.g:2117:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalBase.g:2123:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalBase.g:2123:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -403,11 +403,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2119:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalBase.g:2119:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalBase.g:2125:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalBase.g:2125:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalBase.g:2119:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalBase.g:2125:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -423,14 +423,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalBase.g:2119:34: RULE_ESCAPED_CHARACTER
+            	    // InternalBase.g:2125:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalBase.g:2119:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalBase.g:2125:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -467,11 +467,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2121:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalBase.g:2121:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalBase.g:2127:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalBase.g:2127:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalBase.g:2121:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalBase.g:2127:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -487,14 +487,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalBase.g:2121:35: RULE_ESCAPED_CHARACTER
+            	    // InternalBase.g:2127:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalBase.g:2121:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalBase.g:2127:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -531,12 +531,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2123:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalBase.g:2123:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalBase.g:2129:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalBase.g:2129:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalBase.g:2123:38: ( options {greedy=false; } : . )*
+            // InternalBase.g:2129:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -561,7 +561,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalBase.g:2123:66: .
+            	    // InternalBase.g:2129:66: .
             	    {
             	    matchAny();
 
@@ -591,11 +591,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2125:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalBase.g:2125:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalBase.g:2131:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalBase.g:2131:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalBase.g:2125:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalBase.g:2131:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -644,8 +644,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2127:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalBase.g:2127:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalBase.g:2133:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalBase.g:2133:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -665,10 +665,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2129:10: ( ( '0' .. '9' )+ )
-            // InternalBase.g:2129:12: ( '0' .. '9' )+
+            // InternalBase.g:2135:10: ( ( '0' .. '9' )+ )
+            // InternalBase.g:2135:12: ( '0' .. '9' )+
             {
-            // InternalBase.g:2129:12: ( '0' .. '9' )+
+            // InternalBase.g:2135:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -682,7 +682,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalBase.g:2129:13: '0' .. '9'
+            	    // InternalBase.g:2135:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -714,12 +714,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2131:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalBase.g:2131:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalBase.g:2137:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalBase.g:2137:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalBase.g:2131:24: ( options {greedy=false; } : . )*
+            // InternalBase.g:2137:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -744,7 +744,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalBase.g:2131:52: .
+            	    // InternalBase.g:2137:52: .
             	    {
             	    matchAny();
 
@@ -774,12 +774,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2133:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalBase.g:2133:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalBase.g:2139:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalBase.g:2139:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalBase.g:2133:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalBase.g:2139:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -792,7 +792,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalBase.g:2133:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalBase.g:2139:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -812,7 +812,7 @@
                 }
             } while (true);
 
-            // InternalBase.g:2133:40: ( ( '\\r' )? '\\n' )?
+            // InternalBase.g:2139:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -821,9 +821,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalBase.g:2133:41: ( '\\r' )? '\\n'
+                    // InternalBase.g:2139:41: ( '\\r' )? '\\n'
                     {
-                    // InternalBase.g:2133:41: ( '\\r' )?
+                    // InternalBase.g:2139:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -832,7 +832,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalBase.g:2133:41: '\\r'
+                            // InternalBase.g:2139:41: '\\r'
                             {
                             match('\r');
 
@@ -864,10 +864,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2135:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalBase.g:2135:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalBase.g:2141:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalBase.g:2141:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalBase.g:2135:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalBase.g:2141:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -921,8 +921,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:2137:16: ( . )
-            // InternalBase.g:2137:18: .
+            // InternalBase.g:2143:16: ( . )
+            // InternalBase.g:2143:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseParser.java b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseParser.java
index 1ba6691..fea2239 100644
--- a/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseParser.java
+++ b/plugins/org.eclipse.ocl.xtext.base.ui/src-gen/org/eclipse/ocl/xtext/base/ui/contentassist/antlr/internal/InternalBaseParser.java
@@ -441,11 +441,11 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalBase.g:180:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
+    // InternalBase.g:182:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
     public final void entryRuleFirstPathElementCS() throws RecognitionException {
         try {
-            // InternalBase.g:181:1: ( ruleFirstPathElementCS EOF )
-            // InternalBase.g:182:1: ruleFirstPathElementCS EOF
+            // InternalBase.g:183:1: ( ruleFirstPathElementCS EOF )
+            // InternalBase.g:184:1: ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSRule());
@@ -475,23 +475,23 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalBase.g:189:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalBase.g:191:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleFirstPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:193:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
-            // InternalBase.g:194:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalBase.g:195:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
+            // InternalBase.g:196:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalBase.g:194:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
-            // InternalBase.g:195:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalBase.g:196:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalBase.g:197:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalBase.g:196:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
-            // InternalBase.g:196:2: rule__FirstPathElementCS__ReferredElementAssignment
+            // InternalBase.g:198:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalBase.g:198:2: rule__FirstPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__FirstPathElementCS__ReferredElementAssignment();
@@ -526,11 +526,11 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalBase.g:208:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
+    // InternalBase.g:210:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
     public final void entryRuleNextPathElementCS() throws RecognitionException {
         try {
-            // InternalBase.g:209:1: ( ruleNextPathElementCS EOF )
-            // InternalBase.g:210:1: ruleNextPathElementCS EOF
+            // InternalBase.g:211:1: ( ruleNextPathElementCS EOF )
+            // InternalBase.g:212:1: ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSRule());
@@ -560,23 +560,23 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalBase.g:217:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalBase.g:219:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleNextPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:221:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
-            // InternalBase.g:222:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalBase.g:223:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
+            // InternalBase.g:224:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalBase.g:222:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
-            // InternalBase.g:223:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalBase.g:224:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalBase.g:225:1: ( rule__NextPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalBase.g:224:1: ( rule__NextPathElementCS__ReferredElementAssignment )
-            // InternalBase.g:224:2: rule__NextPathElementCS__ReferredElementAssignment
+            // InternalBase.g:226:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalBase.g:226:2: rule__NextPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NextPathElementCS__ReferredElementAssignment();
@@ -611,11 +611,11 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalBase.g:236:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
+    // InternalBase.g:238:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
     public final void entryRuleTemplateBindingCS() throws RecognitionException {
         try {
-            // InternalBase.g:237:1: ( ruleTemplateBindingCS EOF )
-            // InternalBase.g:238:1: ruleTemplateBindingCS EOF
+            // InternalBase.g:239:1: ( ruleTemplateBindingCS EOF )
+            // InternalBase.g:240:1: ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSRule());
@@ -645,23 +645,23 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalBase.g:245:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
+    // InternalBase.g:247:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
     public final void ruleTemplateBindingCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:249:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
-            // InternalBase.g:250:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalBase.g:251:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
+            // InternalBase.g:252:1: ( ( rule__TemplateBindingCS__Group__0 ) )
             {
-            // InternalBase.g:250:1: ( ( rule__TemplateBindingCS__Group__0 ) )
-            // InternalBase.g:251:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalBase.g:252:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalBase.g:253:1: ( rule__TemplateBindingCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup());
             }
-            // InternalBase.g:252:1: ( rule__TemplateBindingCS__Group__0 )
-            // InternalBase.g:252:2: rule__TemplateBindingCS__Group__0
+            // InternalBase.g:254:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalBase.g:254:2: rule__TemplateBindingCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__0();
@@ -696,11 +696,11 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalBase.g:264:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalBase.g:266:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
     public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         try {
-            // InternalBase.g:265:1: ( ruleTemplateParameterSubstitutionCS EOF )
-            // InternalBase.g:266:1: ruleTemplateParameterSubstitutionCS EOF
+            // InternalBase.g:267:1: ( ruleTemplateParameterSubstitutionCS EOF )
+            // InternalBase.g:268:1: ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -730,23 +730,23 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalBase.g:273:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
+    // InternalBase.g:275:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
     public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:277:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
-            // InternalBase.g:278:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalBase.g:279:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
+            // InternalBase.g:280:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
             {
-            // InternalBase.g:278:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
-            // InternalBase.g:279:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalBase.g:280:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalBase.g:281:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
             }
-            // InternalBase.g:280:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
-            // InternalBase.g:280:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
+            // InternalBase.g:282:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalBase.g:282:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment();
@@ -781,11 +781,11 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalBase.g:294:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
+    // InternalBase.g:296:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
     public final void entryRuleTypeParameterCS() throws RecognitionException {
         try {
-            // InternalBase.g:295:1: ( ruleTypeParameterCS EOF )
-            // InternalBase.g:296:1: ruleTypeParameterCS EOF
+            // InternalBase.g:297:1: ( ruleTypeParameterCS EOF )
+            // InternalBase.g:298:1: ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSRule());
@@ -815,23 +815,23 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalBase.g:303:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
+    // InternalBase.g:305:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
     public final void ruleTypeParameterCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:307:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
-            // InternalBase.g:308:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalBase.g:309:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
+            // InternalBase.g:310:1: ( ( rule__TypeParameterCS__Group__0 ) )
             {
-            // InternalBase.g:308:1: ( ( rule__TypeParameterCS__Group__0 ) )
-            // InternalBase.g:309:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalBase.g:310:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalBase.g:311:1: ( rule__TypeParameterCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup());
             }
-            // InternalBase.g:310:1: ( rule__TypeParameterCS__Group__0 )
-            // InternalBase.g:310:2: rule__TypeParameterCS__Group__0
+            // InternalBase.g:312:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalBase.g:312:2: rule__TypeParameterCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__0();
@@ -866,11 +866,11 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalBase.g:322:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
+    // InternalBase.g:324:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
     public final void entryRuleTypeRefCS() throws RecognitionException {
         try {
-            // InternalBase.g:323:1: ( ruleTypeRefCS EOF )
-            // InternalBase.g:324:1: ruleTypeRefCS EOF
+            // InternalBase.g:325:1: ( ruleTypeRefCS EOF )
+            // InternalBase.g:326:1: ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSRule());
@@ -900,23 +900,23 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalBase.g:331:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
+    // InternalBase.g:333:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
     public final void ruleTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:335:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
-            // InternalBase.g:336:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalBase.g:337:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
+            // InternalBase.g:338:1: ( ( rule__TypeRefCS__Alternatives ) )
             {
-            // InternalBase.g:336:1: ( ( rule__TypeRefCS__Alternatives ) )
-            // InternalBase.g:337:1: ( rule__TypeRefCS__Alternatives )
+            // InternalBase.g:338:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalBase.g:339:1: ( rule__TypeRefCS__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSAccess().getAlternatives());
             }
-            // InternalBase.g:338:1: ( rule__TypeRefCS__Alternatives )
-            // InternalBase.g:338:2: rule__TypeRefCS__Alternatives
+            // InternalBase.g:340:1: ( rule__TypeRefCS__Alternatives )
+            // InternalBase.g:340:2: rule__TypeRefCS__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeRefCS__Alternatives();
@@ -951,11 +951,11 @@
 
 
     // $ANTLR start "entryRuleTypedRefCS"
-    // InternalBase.g:350:1: entryRuleTypedRefCS : ruleTypedRefCS EOF ;
+    // InternalBase.g:352:1: entryRuleTypedRefCS : ruleTypedRefCS EOF ;
     public final void entryRuleTypedRefCS() throws RecognitionException {
         try {
-            // InternalBase.g:351:1: ( ruleTypedRefCS EOF )
-            // InternalBase.g:352:1: ruleTypedRefCS EOF
+            // InternalBase.g:353:1: ( ruleTypedRefCS EOF )
+            // InternalBase.g:354:1: ruleTypedRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedRefCSRule());
@@ -985,17 +985,17 @@
 
 
     // $ANTLR start "ruleTypedRefCS"
-    // InternalBase.g:359:1: ruleTypedRefCS : ( ruleTypedTypeRefCS ) ;
+    // InternalBase.g:361:1: ruleTypedRefCS : ( ruleTypedTypeRefCS ) ;
     public final void ruleTypedRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:363:2: ( ( ruleTypedTypeRefCS ) )
-            // InternalBase.g:364:1: ( ruleTypedTypeRefCS )
+            // InternalBase.g:365:2: ( ( ruleTypedTypeRefCS ) )
+            // InternalBase.g:366:1: ( ruleTypedTypeRefCS )
             {
-            // InternalBase.g:364:1: ( ruleTypedTypeRefCS )
-            // InternalBase.g:365:1: ruleTypedTypeRefCS
+            // InternalBase.g:366:1: ( ruleTypedTypeRefCS )
+            // InternalBase.g:367:1: ruleTypedTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall());
@@ -1030,11 +1030,11 @@
 
 
     // $ANTLR start "entryRuleTypedTypeRefCS"
-    // InternalBase.g:378:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
+    // InternalBase.g:380:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
     public final void entryRuleTypedTypeRefCS() throws RecognitionException {
         try {
-            // InternalBase.g:379:1: ( ruleTypedTypeRefCS EOF )
-            // InternalBase.g:380:1: ruleTypedTypeRefCS EOF
+            // InternalBase.g:381:1: ( ruleTypedTypeRefCS EOF )
+            // InternalBase.g:382:1: ruleTypedTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSRule());
@@ -1064,23 +1064,23 @@
 
 
     // $ANTLR start "ruleTypedTypeRefCS"
-    // InternalBase.g:387:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
+    // InternalBase.g:389:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
     public final void ruleTypedTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:391:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
-            // InternalBase.g:392:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
+            // InternalBase.g:393:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
+            // InternalBase.g:394:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
             {
-            // InternalBase.g:392:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
-            // InternalBase.g:393:1: ( rule__TypedTypeRefCS__Group__0 )
+            // InternalBase.g:394:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
+            // InternalBase.g:395:1: ( rule__TypedTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup());
             }
-            // InternalBase.g:394:1: ( rule__TypedTypeRefCS__Group__0 )
-            // InternalBase.g:394:2: rule__TypedTypeRefCS__Group__0
+            // InternalBase.g:396:1: ( rule__TypedTypeRefCS__Group__0 )
+            // InternalBase.g:396:2: rule__TypedTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__0();
@@ -1115,11 +1115,11 @@
 
 
     // $ANTLR start "entryRuleUnreservedName"
-    // InternalBase.g:406:1: entryRuleUnreservedName : ruleUnreservedName EOF ;
+    // InternalBase.g:408:1: entryRuleUnreservedName : ruleUnreservedName EOF ;
     public final void entryRuleUnreservedName() throws RecognitionException {
         try {
-            // InternalBase.g:407:1: ( ruleUnreservedName EOF )
-            // InternalBase.g:408:1: ruleUnreservedName EOF
+            // InternalBase.g:409:1: ( ruleUnreservedName EOF )
+            // InternalBase.g:410:1: ruleUnreservedName EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnreservedNameRule());
@@ -1149,17 +1149,17 @@
 
 
     // $ANTLR start "ruleUnreservedName"
-    // InternalBase.g:415:1: ruleUnreservedName : ( ruleUnrestrictedName ) ;
+    // InternalBase.g:417:1: ruleUnreservedName : ( ruleUnrestrictedName ) ;
     public final void ruleUnreservedName() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:419:2: ( ( ruleUnrestrictedName ) )
-            // InternalBase.g:420:1: ( ruleUnrestrictedName )
+            // InternalBase.g:421:2: ( ( ruleUnrestrictedName ) )
+            // InternalBase.g:422:1: ( ruleUnrestrictedName )
             {
-            // InternalBase.g:420:1: ( ruleUnrestrictedName )
-            // InternalBase.g:421:1: ruleUnrestrictedName
+            // InternalBase.g:422:1: ( ruleUnrestrictedName )
+            // InternalBase.g:423:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnreservedNameAccess().getUnrestrictedNameParserRuleCall());
@@ -1194,11 +1194,11 @@
 
 
     // $ANTLR start "entryRuleUnrestrictedName"
-    // InternalBase.g:434:1: entryRuleUnrestrictedName : ruleUnrestrictedName EOF ;
+    // InternalBase.g:436:1: entryRuleUnrestrictedName : ruleUnrestrictedName EOF ;
     public final void entryRuleUnrestrictedName() throws RecognitionException {
         try {
-            // InternalBase.g:435:1: ( ruleUnrestrictedName EOF )
-            // InternalBase.g:436:1: ruleUnrestrictedName EOF
+            // InternalBase.g:437:1: ( ruleUnrestrictedName EOF )
+            // InternalBase.g:438:1: ruleUnrestrictedName EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnrestrictedNameRule());
@@ -1228,17 +1228,17 @@
 
 
     // $ANTLR start "ruleUnrestrictedName"
-    // InternalBase.g:443:1: ruleUnrestrictedName : ( ruleIdentifier ) ;
+    // InternalBase.g:445:1: ruleUnrestrictedName : ( ruleIdentifier ) ;
     public final void ruleUnrestrictedName() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:447:2: ( ( ruleIdentifier ) )
-            // InternalBase.g:448:1: ( ruleIdentifier )
+            // InternalBase.g:449:2: ( ( ruleIdentifier ) )
+            // InternalBase.g:450:1: ( ruleIdentifier )
             {
-            // InternalBase.g:448:1: ( ruleIdentifier )
-            // InternalBase.g:449:1: ruleIdentifier
+            // InternalBase.g:450:1: ( ruleIdentifier )
+            // InternalBase.g:451:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnrestrictedNameAccess().getIdentifierParserRuleCall());
@@ -1273,11 +1273,11 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalBase.g:462:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
+    // InternalBase.g:464:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
     public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
         try {
-            // InternalBase.g:463:1: ( ruleWildcardTypeRefCS EOF )
-            // InternalBase.g:464:1: ruleWildcardTypeRefCS EOF
+            // InternalBase.g:465:1: ( ruleWildcardTypeRefCS EOF )
+            // InternalBase.g:466:1: ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSRule());
@@ -1307,23 +1307,23 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalBase.g:471:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
+    // InternalBase.g:473:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
     public final void ruleWildcardTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:475:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
-            // InternalBase.g:476:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalBase.g:477:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
+            // InternalBase.g:478:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
             {
-            // InternalBase.g:476:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
-            // InternalBase.g:477:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalBase.g:478:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalBase.g:479:1: ( rule__WildcardTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
             }
-            // InternalBase.g:478:1: ( rule__WildcardTypeRefCS__Group__0 )
-            // InternalBase.g:478:2: rule__WildcardTypeRefCS__Group__0
+            // InternalBase.g:480:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalBase.g:480:2: rule__WildcardTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__0();
@@ -1358,11 +1358,11 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalBase.g:490:1: entryRuleID : ruleID EOF ;
+    // InternalBase.g:492:1: entryRuleID : ruleID EOF ;
     public final void entryRuleID() throws RecognitionException {
         try {
-            // InternalBase.g:491:1: ( ruleID EOF )
-            // InternalBase.g:492:1: ruleID EOF
+            // InternalBase.g:493:1: ( ruleID EOF )
+            // InternalBase.g:494:1: ruleID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDRule());
@@ -1392,23 +1392,23 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalBase.g:499:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
+    // InternalBase.g:501:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
     public final void ruleID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:503:2: ( ( ( rule__ID__Alternatives ) ) )
-            // InternalBase.g:504:1: ( ( rule__ID__Alternatives ) )
+            // InternalBase.g:505:2: ( ( ( rule__ID__Alternatives ) ) )
+            // InternalBase.g:506:1: ( ( rule__ID__Alternatives ) )
             {
-            // InternalBase.g:504:1: ( ( rule__ID__Alternatives ) )
-            // InternalBase.g:505:1: ( rule__ID__Alternatives )
+            // InternalBase.g:506:1: ( ( rule__ID__Alternatives ) )
+            // InternalBase.g:507:1: ( rule__ID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDAccess().getAlternatives());
             }
-            // InternalBase.g:506:1: ( rule__ID__Alternatives )
-            // InternalBase.g:506:2: rule__ID__Alternatives
+            // InternalBase.g:508:1: ( rule__ID__Alternatives )
+            // InternalBase.g:508:2: rule__ID__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ID__Alternatives();
@@ -1443,11 +1443,11 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalBase.g:518:1: entryRuleIdentifier : ruleIdentifier EOF ;
+    // InternalBase.g:520:1: entryRuleIdentifier : ruleIdentifier EOF ;
     public final void entryRuleIdentifier() throws RecognitionException {
         try {
-            // InternalBase.g:519:1: ( ruleIdentifier EOF )
-            // InternalBase.g:520:1: ruleIdentifier EOF
+            // InternalBase.g:521:1: ( ruleIdentifier EOF )
+            // InternalBase.g:522:1: ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierRule());
@@ -1477,17 +1477,17 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalBase.g:527:1: ruleIdentifier : ( ruleID ) ;
+    // InternalBase.g:529:1: ruleIdentifier : ( ruleID ) ;
     public final void ruleIdentifier() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:531:2: ( ( ruleID ) )
-            // InternalBase.g:532:1: ( ruleID )
+            // InternalBase.g:533:2: ( ( ruleID ) )
+            // InternalBase.g:534:1: ( ruleID )
             {
-            // InternalBase.g:532:1: ( ruleID )
-            // InternalBase.g:533:1: ruleID
+            // InternalBase.g:534:1: ( ruleID )
+            // InternalBase.g:535:1: ruleID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierAccess().getIDParserRuleCall());
@@ -1522,11 +1522,11 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalBase.g:546:1: entryRuleLOWER : ruleLOWER EOF ;
+    // InternalBase.g:548:1: entryRuleLOWER : ruleLOWER EOF ;
     public final void entryRuleLOWER() throws RecognitionException {
         try {
-            // InternalBase.g:547:1: ( ruleLOWER EOF )
-            // InternalBase.g:548:1: ruleLOWER EOF
+            // InternalBase.g:549:1: ( ruleLOWER EOF )
+            // InternalBase.g:550:1: ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERRule());
@@ -1556,17 +1556,17 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalBase.g:555:1: ruleLOWER : ( RULE_INT ) ;
+    // InternalBase.g:557:1: ruleLOWER : ( RULE_INT ) ;
     public final void ruleLOWER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:559:2: ( ( RULE_INT ) )
-            // InternalBase.g:560:1: ( RULE_INT )
+            // InternalBase.g:561:2: ( ( RULE_INT ) )
+            // InternalBase.g:562:1: ( RULE_INT )
             {
-            // InternalBase.g:560:1: ( RULE_INT )
-            // InternalBase.g:561:1: RULE_INT
+            // InternalBase.g:562:1: ( RULE_INT )
+            // InternalBase.g:563:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
@@ -1597,11 +1597,11 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalBase.g:578:1: entryRuleUPPER : ruleUPPER EOF ;
+    // InternalBase.g:580:1: entryRuleUPPER : ruleUPPER EOF ;
     public final void entryRuleUPPER() throws RecognitionException {
         try {
-            // InternalBase.g:579:1: ( ruleUPPER EOF )
-            // InternalBase.g:580:1: ruleUPPER EOF
+            // InternalBase.g:581:1: ( ruleUPPER EOF )
+            // InternalBase.g:582:1: ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERRule());
@@ -1631,23 +1631,23 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalBase.g:587:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
+    // InternalBase.g:589:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
     public final void ruleUPPER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:591:2: ( ( ( rule__UPPER__Alternatives ) ) )
-            // InternalBase.g:592:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalBase.g:593:2: ( ( ( rule__UPPER__Alternatives ) ) )
+            // InternalBase.g:594:1: ( ( rule__UPPER__Alternatives ) )
             {
-            // InternalBase.g:592:1: ( ( rule__UPPER__Alternatives ) )
-            // InternalBase.g:593:1: ( rule__UPPER__Alternatives )
+            // InternalBase.g:594:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalBase.g:595:1: ( rule__UPPER__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERAccess().getAlternatives());
             }
-            // InternalBase.g:594:1: ( rule__UPPER__Alternatives )
-            // InternalBase.g:594:2: rule__UPPER__Alternatives
+            // InternalBase.g:596:1: ( rule__UPPER__Alternatives )
+            // InternalBase.g:596:2: rule__UPPER__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UPPER__Alternatives();
@@ -1682,13 +1682,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_1"
-    // InternalBase.g:608:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
+    // InternalBase.g:610:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
     public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:612:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
+            // InternalBase.g:614:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -1707,10 +1707,10 @@
             }
             switch (alt1) {
                 case 1 :
-                    // InternalBase.g:613:1: ( ruleMultiplicityBoundsCS )
+                    // InternalBase.g:615:1: ( ruleMultiplicityBoundsCS )
                     {
-                    // InternalBase.g:613:1: ( ruleMultiplicityBoundsCS )
-                    // InternalBase.g:614:1: ruleMultiplicityBoundsCS
+                    // InternalBase.g:615:1: ( ruleMultiplicityBoundsCS )
+                    // InternalBase.g:616:1: ruleMultiplicityBoundsCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
@@ -1730,10 +1730,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:619:6: ( ruleMultiplicityStringCS )
+                    // InternalBase.g:621:6: ( ruleMultiplicityStringCS )
                     {
-                    // InternalBase.g:619:6: ( ruleMultiplicityStringCS )
-                    // InternalBase.g:620:1: ruleMultiplicityStringCS
+                    // InternalBase.g:621:6: ( ruleMultiplicityStringCS )
+                    // InternalBase.g:622:1: ruleMultiplicityStringCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
@@ -1770,13 +1770,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_2"
-    // InternalBase.g:630:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
+    // InternalBase.g:632:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
     public final void rule__MultiplicityCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:634:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
+            // InternalBase.g:636:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
             int alt2=2;
             int LA2_0 = input.LA(1);
 
@@ -1795,10 +1795,10 @@
             }
             switch (alt2) {
                 case 1 :
-                    // InternalBase.g:635:1: ( '|?' )
+                    // InternalBase.g:637:1: ( '|?' )
                     {
-                    // InternalBase.g:635:1: ( '|?' )
-                    // InternalBase.g:636:1: '|?'
+                    // InternalBase.g:637:1: ( '|?' )
+                    // InternalBase.g:638:1: '|?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
@@ -1814,16 +1814,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:643:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalBase.g:645:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                     {
-                    // InternalBase.g:643:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
-                    // InternalBase.g:644:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalBase.g:645:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalBase.g:646:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                     }
-                    // InternalBase.g:645:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
-                    // InternalBase.g:645:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
+                    // InternalBase.g:647:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalBase.g:647:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__IsNullFreeAssignment_2_1();
@@ -1860,13 +1860,13 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAlternatives_0"
-    // InternalBase.g:654:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
+    // InternalBase.g:656:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
     public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:658:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
+            // InternalBase.g:660:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
             int alt3=3;
             switch ( input.LA(1) ) {
             case 17:
@@ -1894,10 +1894,10 @@
 
             switch (alt3) {
                 case 1 :
-                    // InternalBase.g:659:1: ( '*' )
+                    // InternalBase.g:661:1: ( '*' )
                     {
-                    // InternalBase.g:659:1: ( '*' )
-                    // InternalBase.g:660:1: '*'
+                    // InternalBase.g:661:1: ( '*' )
+                    // InternalBase.g:662:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
@@ -1913,10 +1913,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:667:6: ( '+' )
+                    // InternalBase.g:669:6: ( '+' )
                     {
-                    // InternalBase.g:667:6: ( '+' )
-                    // InternalBase.g:668:1: '+'
+                    // InternalBase.g:669:6: ( '+' )
+                    // InternalBase.g:670:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
@@ -1932,10 +1932,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalBase.g:675:6: ( '?' )
+                    // InternalBase.g:677:6: ( '?' )
                     {
-                    // InternalBase.g:675:6: ( '?' )
-                    // InternalBase.g:676:1: '?'
+                    // InternalBase.g:677:6: ( '?' )
+                    // InternalBase.g:678:1: '?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
@@ -1968,13 +1968,13 @@
 
 
     // $ANTLR start "rule__TypeRefCS__Alternatives"
-    // InternalBase.g:688:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
+    // InternalBase.g:690:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
     public final void rule__TypeRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:692:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
+            // InternalBase.g:694:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -1993,10 +1993,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalBase.g:693:1: ( ruleTypedRefCS )
+                    // InternalBase.g:695:1: ( ruleTypedRefCS )
                     {
-                    // InternalBase.g:693:1: ( ruleTypedRefCS )
-                    // InternalBase.g:694:1: ruleTypedRefCS
+                    // InternalBase.g:695:1: ( ruleTypedRefCS )
+                    // InternalBase.g:696:1: ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
@@ -2016,10 +2016,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:699:6: ( ruleWildcardTypeRefCS )
+                    // InternalBase.g:701:6: ( ruleWildcardTypeRefCS )
                     {
-                    // InternalBase.g:699:6: ( ruleWildcardTypeRefCS )
-                    // InternalBase.g:700:1: ruleWildcardTypeRefCS
+                    // InternalBase.g:701:6: ( ruleWildcardTypeRefCS )
+                    // InternalBase.g:702:1: ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
@@ -2056,13 +2056,13 @@
 
 
     // $ANTLR start "rule__ID__Alternatives"
-    // InternalBase.g:710:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
+    // InternalBase.g:712:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
     public final void rule__ID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:714:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
+            // InternalBase.g:716:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -2081,10 +2081,10 @@
             }
             switch (alt5) {
                 case 1 :
-                    // InternalBase.g:715:1: ( RULE_SIMPLE_ID )
+                    // InternalBase.g:717:1: ( RULE_SIMPLE_ID )
                     {
-                    // InternalBase.g:715:1: ( RULE_SIMPLE_ID )
-                    // InternalBase.g:716:1: RULE_SIMPLE_ID
+                    // InternalBase.g:717:1: ( RULE_SIMPLE_ID )
+                    // InternalBase.g:718:1: RULE_SIMPLE_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
@@ -2100,10 +2100,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:721:6: ( RULE_ESCAPED_ID )
+                    // InternalBase.g:723:6: ( RULE_ESCAPED_ID )
                     {
-                    // InternalBase.g:721:6: ( RULE_ESCAPED_ID )
-                    // InternalBase.g:722:1: RULE_ESCAPED_ID
+                    // InternalBase.g:723:6: ( RULE_ESCAPED_ID )
+                    // InternalBase.g:724:1: RULE_ESCAPED_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
@@ -2136,13 +2136,13 @@
 
 
     // $ANTLR start "rule__UPPER__Alternatives"
-    // InternalBase.g:732:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
+    // InternalBase.g:734:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
     public final void rule__UPPER__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:736:1: ( ( RULE_INT ) | ( '*' ) )
+            // InternalBase.g:738:1: ( ( RULE_INT ) | ( '*' ) )
             int alt6=2;
             int LA6_0 = input.LA(1);
 
@@ -2161,10 +2161,10 @@
             }
             switch (alt6) {
                 case 1 :
-                    // InternalBase.g:737:1: ( RULE_INT )
+                    // InternalBase.g:739:1: ( RULE_INT )
                     {
-                    // InternalBase.g:737:1: ( RULE_INT )
-                    // InternalBase.g:738:1: RULE_INT
+                    // InternalBase.g:739:1: ( RULE_INT )
+                    // InternalBase.g:740:1: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
@@ -2180,10 +2180,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:743:6: ( '*' )
+                    // InternalBase.g:745:6: ( '*' )
                     {
-                    // InternalBase.g:743:6: ( '*' )
-                    // InternalBase.g:744:1: '*'
+                    // InternalBase.g:745:6: ( '*' )
+                    // InternalBase.g:746:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
@@ -2216,14 +2216,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0"
-    // InternalBase.g:758:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
+    // InternalBase.g:760:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
     public final void rule__MultiplicityBoundsCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:762:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
-            // InternalBase.g:763:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
+            // InternalBase.g:764:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
+            // InternalBase.g:765:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_3);
             rule__MultiplicityBoundsCS__Group__0__Impl();
@@ -2254,23 +2254,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0__Impl"
-    // InternalBase.g:770:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
+    // InternalBase.g:772:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:774:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
-            // InternalBase.g:775:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalBase.g:776:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
+            // InternalBase.g:777:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
             {
-            // InternalBase.g:775:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
-            // InternalBase.g:776:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalBase.g:777:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalBase.g:778:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
             }
-            // InternalBase.g:777:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
-            // InternalBase.g:777:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
+            // InternalBase.g:779:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalBase.g:779:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__LowerBoundAssignment_0();
@@ -2305,14 +2305,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1"
-    // InternalBase.g:787:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
+    // InternalBase.g:789:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:791:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
-            // InternalBase.g:792:2: rule__MultiplicityBoundsCS__Group__1__Impl
+            // InternalBase.g:793:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
+            // InternalBase.g:794:2: rule__MultiplicityBoundsCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group__1__Impl();
@@ -2338,22 +2338,22 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1__Impl"
-    // InternalBase.g:798:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
+    // InternalBase.g:800:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
     public final void rule__MultiplicityBoundsCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:802:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
-            // InternalBase.g:803:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalBase.g:804:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
+            // InternalBase.g:805:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
             {
-            // InternalBase.g:803:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
-            // InternalBase.g:804:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalBase.g:805:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalBase.g:806:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
             }
-            // InternalBase.g:805:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalBase.g:807:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -2362,7 +2362,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalBase.g:805:2: rule__MultiplicityBoundsCS__Group_1__0
+                    // InternalBase.g:807:2: rule__MultiplicityBoundsCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityBoundsCS__Group_1__0();
@@ -2400,14 +2400,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0"
-    // InternalBase.g:819:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
+    // InternalBase.g:821:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
     public final void rule__MultiplicityBoundsCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:823:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
-            // InternalBase.g:824:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
+            // InternalBase.g:825:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
+            // InternalBase.g:826:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__MultiplicityBoundsCS__Group_1__0__Impl();
@@ -2438,17 +2438,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0__Impl"
-    // InternalBase.g:831:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
+    // InternalBase.g:833:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:835:1: ( ( '..' ) )
-            // InternalBase.g:836:1: ( '..' )
+            // InternalBase.g:837:1: ( ( '..' ) )
+            // InternalBase.g:838:1: ( '..' )
             {
-            // InternalBase.g:836:1: ( '..' )
-            // InternalBase.g:837:1: '..'
+            // InternalBase.g:838:1: ( '..' )
+            // InternalBase.g:839:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
@@ -2479,14 +2479,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1"
-    // InternalBase.g:850:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
+    // InternalBase.g:852:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:854:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
-            // InternalBase.g:855:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
+            // InternalBase.g:856:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
+            // InternalBase.g:857:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group_1__1__Impl();
@@ -2512,23 +2512,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1__Impl"
-    // InternalBase.g:861:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
+    // InternalBase.g:863:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:865:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
-            // InternalBase.g:866:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalBase.g:867:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
+            // InternalBase.g:868:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
             {
-            // InternalBase.g:866:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
-            // InternalBase.g:867:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalBase.g:868:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalBase.g:869:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
             }
-            // InternalBase.g:868:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
-            // InternalBase.g:868:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
+            // InternalBase.g:870:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalBase.g:870:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1();
@@ -2563,14 +2563,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0"
-    // InternalBase.g:882:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
+    // InternalBase.g:884:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
     public final void rule__MultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:886:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
-            // InternalBase.g:887:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
+            // InternalBase.g:888:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
+            // InternalBase.g:889:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_5);
             rule__MultiplicityCS__Group__0__Impl();
@@ -2601,17 +2601,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0__Impl"
-    // InternalBase.g:894:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
+    // InternalBase.g:896:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
     public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:898:1: ( ( '[' ) )
-            // InternalBase.g:899:1: ( '[' )
+            // InternalBase.g:900:1: ( ( '[' ) )
+            // InternalBase.g:901:1: ( '[' )
             {
-            // InternalBase.g:899:1: ( '[' )
-            // InternalBase.g:900:1: '['
+            // InternalBase.g:901:1: ( '[' )
+            // InternalBase.g:902:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
@@ -2642,14 +2642,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1"
-    // InternalBase.g:913:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
+    // InternalBase.g:915:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
     public final void rule__MultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:917:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
-            // InternalBase.g:918:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
+            // InternalBase.g:919:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
+            // InternalBase.g:920:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__MultiplicityCS__Group__1__Impl();
@@ -2680,23 +2680,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1__Impl"
-    // InternalBase.g:925:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
+    // InternalBase.g:927:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
     public final void rule__MultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:929:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
-            // InternalBase.g:930:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalBase.g:931:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
+            // InternalBase.g:932:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
             {
-            // InternalBase.g:930:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
-            // InternalBase.g:931:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalBase.g:932:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalBase.g:933:1: ( rule__MultiplicityCS__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
             }
-            // InternalBase.g:932:1: ( rule__MultiplicityCS__Alternatives_1 )
-            // InternalBase.g:932:2: rule__MultiplicityCS__Alternatives_1
+            // InternalBase.g:934:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalBase.g:934:2: rule__MultiplicityCS__Alternatives_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Alternatives_1();
@@ -2731,14 +2731,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2"
-    // InternalBase.g:942:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
+    // InternalBase.g:944:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
     public final void rule__MultiplicityCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:946:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
-            // InternalBase.g:947:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
+            // InternalBase.g:948:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
+            // InternalBase.g:949:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__MultiplicityCS__Group__2__Impl();
@@ -2769,22 +2769,22 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2__Impl"
-    // InternalBase.g:954:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
+    // InternalBase.g:956:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
     public final void rule__MultiplicityCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:958:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
-            // InternalBase.g:959:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalBase.g:960:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
+            // InternalBase.g:961:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
             {
-            // InternalBase.g:959:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
-            // InternalBase.g:960:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalBase.g:961:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalBase.g:962:1: ( rule__MultiplicityCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
             }
-            // InternalBase.g:961:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalBase.g:963:1: ( rule__MultiplicityCS__Alternatives_2 )?
             int alt8=2;
             int LA8_0 = input.LA(1);
 
@@ -2793,7 +2793,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalBase.g:961:2: rule__MultiplicityCS__Alternatives_2
+                    // InternalBase.g:963:2: rule__MultiplicityCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__Alternatives_2();
@@ -2831,14 +2831,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3"
-    // InternalBase.g:971:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
+    // InternalBase.g:973:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
     public final void rule__MultiplicityCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:975:1: ( rule__MultiplicityCS__Group__3__Impl )
-            // InternalBase.g:976:2: rule__MultiplicityCS__Group__3__Impl
+            // InternalBase.g:977:1: ( rule__MultiplicityCS__Group__3__Impl )
+            // InternalBase.g:978:2: rule__MultiplicityCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Group__3__Impl();
@@ -2864,17 +2864,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3__Impl"
-    // InternalBase.g:982:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
+    // InternalBase.g:984:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
     public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:986:1: ( ( ']' ) )
-            // InternalBase.g:987:1: ( ']' )
+            // InternalBase.g:988:1: ( ( ']' ) )
+            // InternalBase.g:989:1: ( ']' )
             {
-            // InternalBase.g:987:1: ( ']' )
-            // InternalBase.g:988:1: ']'
+            // InternalBase.g:989:1: ( ']' )
+            // InternalBase.g:990:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
@@ -2905,14 +2905,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0"
-    // InternalBase.g:1009:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
+    // InternalBase.g:1011:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
     public final void rule__PathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1013:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
-            // InternalBase.g:1014:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
+            // InternalBase.g:1015:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
+            // InternalBase.g:1016:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PathNameCS__Group__0__Impl();
@@ -2943,23 +2943,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0__Impl"
-    // InternalBase.g:1021:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalBase.g:1023:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__PathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1025:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalBase.g:1026:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalBase.g:1027:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalBase.g:1028:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalBase.g:1026:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalBase.g:1027:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalBase.g:1028:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalBase.g:1029:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalBase.g:1028:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalBase.g:1028:2: rule__PathNameCS__OwnedPathElementsAssignment_0
+            // InternalBase.g:1030:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalBase.g:1030:2: rule__PathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_0();
@@ -2994,14 +2994,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1"
-    // InternalBase.g:1038:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
+    // InternalBase.g:1040:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
     public final void rule__PathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1042:1: ( rule__PathNameCS__Group__1__Impl )
-            // InternalBase.g:1043:2: rule__PathNameCS__Group__1__Impl
+            // InternalBase.g:1044:1: ( rule__PathNameCS__Group__1__Impl )
+            // InternalBase.g:1045:2: rule__PathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group__1__Impl();
@@ -3027,22 +3027,22 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1__Impl"
-    // InternalBase.g:1049:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
+    // InternalBase.g:1051:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
     public final void rule__PathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1053:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
-            // InternalBase.g:1054:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalBase.g:1055:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
+            // InternalBase.g:1056:1: ( ( rule__PathNameCS__Group_1__0 )* )
             {
-            // InternalBase.g:1054:1: ( ( rule__PathNameCS__Group_1__0 )* )
-            // InternalBase.g:1055:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalBase.g:1056:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalBase.g:1057:1: ( rule__PathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getGroup_1());
             }
-            // InternalBase.g:1056:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalBase.g:1058:1: ( rule__PathNameCS__Group_1__0 )*
             loop9:
             do {
                 int alt9=2;
@@ -3055,7 +3055,7 @@
 
                 switch (alt9) {
             	case 1 :
-            	    // InternalBase.g:1056:2: rule__PathNameCS__Group_1__0
+            	    // InternalBase.g:1058:2: rule__PathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_8);
             	    rule__PathNameCS__Group_1__0();
@@ -3096,14 +3096,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0"
-    // InternalBase.g:1070:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
+    // InternalBase.g:1072:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
     public final void rule__PathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1074:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
-            // InternalBase.g:1075:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
+            // InternalBase.g:1076:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
+            // InternalBase.g:1077:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__PathNameCS__Group_1__0__Impl();
@@ -3134,17 +3134,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0__Impl"
-    // InternalBase.g:1082:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalBase.g:1084:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1086:1: ( ( '::' ) )
-            // InternalBase.g:1087:1: ( '::' )
+            // InternalBase.g:1088:1: ( ( '::' ) )
+            // InternalBase.g:1089:1: ( '::' )
             {
-            // InternalBase.g:1087:1: ( '::' )
-            // InternalBase.g:1088:1: '::'
+            // InternalBase.g:1089:1: ( '::' )
+            // InternalBase.g:1090:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
@@ -3175,14 +3175,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1"
-    // InternalBase.g:1101:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
+    // InternalBase.g:1103:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
     public final void rule__PathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1105:1: ( rule__PathNameCS__Group_1__1__Impl )
-            // InternalBase.g:1106:2: rule__PathNameCS__Group_1__1__Impl
+            // InternalBase.g:1107:1: ( rule__PathNameCS__Group_1__1__Impl )
+            // InternalBase.g:1108:2: rule__PathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group_1__1__Impl();
@@ -3208,23 +3208,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1__Impl"
-    // InternalBase.g:1112:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalBase.g:1114:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__PathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1116:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalBase.g:1117:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalBase.g:1118:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalBase.g:1119:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalBase.g:1117:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalBase.g:1118:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalBase.g:1119:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalBase.g:1120:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalBase.g:1119:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalBase.g:1119:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalBase.g:1121:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalBase.g:1121:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_1_1();
@@ -3259,14 +3259,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0"
-    // InternalBase.g:1133:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
+    // InternalBase.g:1137:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
     public final void rule__TemplateBindingCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1137:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
-            // InternalBase.g:1138:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
+            // InternalBase.g:1141:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
+            // InternalBase.g:1142:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__TemplateBindingCS__Group__0__Impl();
@@ -3297,23 +3297,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0__Impl"
-    // InternalBase.g:1145:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
+    // InternalBase.g:1149:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
     public final void rule__TemplateBindingCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1149:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
-            // InternalBase.g:1150:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalBase.g:1153:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
+            // InternalBase.g:1154:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
             {
-            // InternalBase.g:1150:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
-            // InternalBase.g:1151:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalBase.g:1154:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalBase.g:1155:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
             }
-            // InternalBase.g:1152:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
-            // InternalBase.g:1152:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
+            // InternalBase.g:1156:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalBase.g:1156:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0();
@@ -3348,14 +3348,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1"
-    // InternalBase.g:1162:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
+    // InternalBase.g:1166:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
     public final void rule__TemplateBindingCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1166:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
-            // InternalBase.g:1167:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
+            // InternalBase.g:1170:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
+            // InternalBase.g:1171:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__TemplateBindingCS__Group__1__Impl();
@@ -3386,22 +3386,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1__Impl"
-    // InternalBase.g:1174:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
+    // InternalBase.g:1178:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
     public final void rule__TemplateBindingCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1178:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
-            // InternalBase.g:1179:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalBase.g:1182:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
+            // InternalBase.g:1183:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
             {
-            // InternalBase.g:1179:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
-            // InternalBase.g:1180:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalBase.g:1183:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalBase.g:1184:1: ( rule__TemplateBindingCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
             }
-            // InternalBase.g:1181:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalBase.g:1185:1: ( rule__TemplateBindingCS__Group_1__0 )*
             loop10:
             do {
                 int alt10=2;
@@ -3414,7 +3414,7 @@
 
                 switch (alt10) {
             	case 1 :
-            	    // InternalBase.g:1181:2: rule__TemplateBindingCS__Group_1__0
+            	    // InternalBase.g:1185:2: rule__TemplateBindingCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__TemplateBindingCS__Group_1__0();
@@ -3455,14 +3455,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2"
-    // InternalBase.g:1191:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
+    // InternalBase.g:1195:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
     public final void rule__TemplateBindingCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1195:1: ( rule__TemplateBindingCS__Group__2__Impl )
-            // InternalBase.g:1196:2: rule__TemplateBindingCS__Group__2__Impl
+            // InternalBase.g:1199:1: ( rule__TemplateBindingCS__Group__2__Impl )
+            // InternalBase.g:1200:2: rule__TemplateBindingCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__2__Impl();
@@ -3488,22 +3488,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2__Impl"
-    // InternalBase.g:1202:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
+    // InternalBase.g:1206:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
     public final void rule__TemplateBindingCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1206:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
-            // InternalBase.g:1207:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalBase.g:1210:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
+            // InternalBase.g:1211:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
             {
-            // InternalBase.g:1207:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
-            // InternalBase.g:1208:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalBase.g:1211:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalBase.g:1212:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
             }
-            // InternalBase.g:1209:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalBase.g:1213:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -3512,7 +3512,7 @@
             }
             switch (alt11) {
                 case 1 :
-                    // InternalBase.g:1209:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
+                    // InternalBase.g:1213:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateBindingCS__OwnedMultiplicityAssignment_2();
@@ -3550,14 +3550,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0"
-    // InternalBase.g:1225:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
+    // InternalBase.g:1229:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
     public final void rule__TemplateBindingCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1229:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
-            // InternalBase.g:1230:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
+            // InternalBase.g:1233:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
+            // InternalBase.g:1234:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TemplateBindingCS__Group_1__0__Impl();
@@ -3588,17 +3588,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0__Impl"
-    // InternalBase.g:1237:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
+    // InternalBase.g:1241:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
     public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1241:1: ( ( ',' ) )
-            // InternalBase.g:1242:1: ( ',' )
+            // InternalBase.g:1245:1: ( ( ',' ) )
+            // InternalBase.g:1246:1: ( ',' )
             {
-            // InternalBase.g:1242:1: ( ',' )
-            // InternalBase.g:1243:1: ','
+            // InternalBase.g:1246:1: ( ',' )
+            // InternalBase.g:1247:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
@@ -3629,14 +3629,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1"
-    // InternalBase.g:1256:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
+    // InternalBase.g:1260:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
     public final void rule__TemplateBindingCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1260:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
-            // InternalBase.g:1261:2: rule__TemplateBindingCS__Group_1__1__Impl
+            // InternalBase.g:1264:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
+            // InternalBase.g:1265:2: rule__TemplateBindingCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group_1__1__Impl();
@@ -3662,23 +3662,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1__Impl"
-    // InternalBase.g:1267:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
+    // InternalBase.g:1271:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
     public final void rule__TemplateBindingCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1271:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
-            // InternalBase.g:1272:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalBase.g:1275:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
+            // InternalBase.g:1276:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
             {
-            // InternalBase.g:1272:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
-            // InternalBase.g:1273:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalBase.g:1276:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalBase.g:1277:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
             }
-            // InternalBase.g:1274:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
-            // InternalBase.g:1274:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
+            // InternalBase.g:1278:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalBase.g:1278:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1();
@@ -3713,14 +3713,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0"
-    // InternalBase.g:1290:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
+    // InternalBase.g:1294:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
     public final void rule__TypeParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1294:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
-            // InternalBase.g:1295:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
+            // InternalBase.g:1298:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
+            // InternalBase.g:1299:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__TypeParameterCS__Group__0__Impl();
@@ -3751,23 +3751,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0__Impl"
-    // InternalBase.g:1302:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
+    // InternalBase.g:1306:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
     public final void rule__TypeParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1306:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
-            // InternalBase.g:1307:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalBase.g:1310:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
+            // InternalBase.g:1311:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
             {
-            // InternalBase.g:1307:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
-            // InternalBase.g:1308:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalBase.g:1311:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalBase.g:1312:1: ( rule__TypeParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
             }
-            // InternalBase.g:1309:1: ( rule__TypeParameterCS__NameAssignment_0 )
-            // InternalBase.g:1309:2: rule__TypeParameterCS__NameAssignment_0
+            // InternalBase.g:1313:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalBase.g:1313:2: rule__TypeParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__NameAssignment_0();
@@ -3802,14 +3802,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1"
-    // InternalBase.g:1319:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
+    // InternalBase.g:1323:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
     public final void rule__TypeParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1323:1: ( rule__TypeParameterCS__Group__1__Impl )
-            // InternalBase.g:1324:2: rule__TypeParameterCS__Group__1__Impl
+            // InternalBase.g:1327:1: ( rule__TypeParameterCS__Group__1__Impl )
+            // InternalBase.g:1328:2: rule__TypeParameterCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__1__Impl();
@@ -3835,22 +3835,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1__Impl"
-    // InternalBase.g:1330:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
+    // InternalBase.g:1334:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
     public final void rule__TypeParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1334:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
-            // InternalBase.g:1335:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalBase.g:1338:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
+            // InternalBase.g:1339:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
             {
-            // InternalBase.g:1335:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
-            // InternalBase.g:1336:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalBase.g:1339:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalBase.g:1340:1: ( rule__TypeParameterCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
             }
-            // InternalBase.g:1337:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalBase.g:1341:1: ( rule__TypeParameterCS__Group_1__0 )?
             int alt12=2;
             int LA12_0 = input.LA(1);
 
@@ -3859,7 +3859,7 @@
             }
             switch (alt12) {
                 case 1 :
-                    // InternalBase.g:1337:2: rule__TypeParameterCS__Group_1__0
+                    // InternalBase.g:1341:2: rule__TypeParameterCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeParameterCS__Group_1__0();
@@ -3897,14 +3897,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0"
-    // InternalBase.g:1351:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
+    // InternalBase.g:1355:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
     public final void rule__TypeParameterCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1355:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
-            // InternalBase.g:1356:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
+            // InternalBase.g:1359:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
+            // InternalBase.g:1360:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__TypeParameterCS__Group_1__0__Impl();
@@ -3935,17 +3935,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0__Impl"
-    // InternalBase.g:1363:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
+    // InternalBase.g:1367:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
     public final void rule__TypeParameterCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1367:1: ( ( 'extends' ) )
-            // InternalBase.g:1368:1: ( 'extends' )
+            // InternalBase.g:1371:1: ( ( 'extends' ) )
+            // InternalBase.g:1372:1: ( 'extends' )
             {
-            // InternalBase.g:1368:1: ( 'extends' )
-            // InternalBase.g:1369:1: 'extends'
+            // InternalBase.g:1372:1: ( 'extends' )
+            // InternalBase.g:1373:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
@@ -3976,14 +3976,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1"
-    // InternalBase.g:1382:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
+    // InternalBase.g:1386:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
     public final void rule__TypeParameterCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1386:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
-            // InternalBase.g:1387:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
+            // InternalBase.g:1390:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
+            // InternalBase.g:1391:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__TypeParameterCS__Group_1__1__Impl();
@@ -4014,23 +4014,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1__Impl"
-    // InternalBase.g:1394:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
+    // InternalBase.g:1398:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1398:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
-            // InternalBase.g:1399:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalBase.g:1402:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
+            // InternalBase.g:1403:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
             {
-            // InternalBase.g:1399:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
-            // InternalBase.g:1400:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalBase.g:1403:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalBase.g:1404:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
             }
-            // InternalBase.g:1401:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
-            // InternalBase.g:1401:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
+            // InternalBase.g:1405:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalBase.g:1405:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_1();
@@ -4065,14 +4065,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2"
-    // InternalBase.g:1411:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
+    // InternalBase.g:1415:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
     public final void rule__TypeParameterCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1415:1: ( rule__TypeParameterCS__Group_1__2__Impl )
-            // InternalBase.g:1416:2: rule__TypeParameterCS__Group_1__2__Impl
+            // InternalBase.g:1419:1: ( rule__TypeParameterCS__Group_1__2__Impl )
+            // InternalBase.g:1420:2: rule__TypeParameterCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1__2__Impl();
@@ -4098,22 +4098,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2__Impl"
-    // InternalBase.g:1422:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
+    // InternalBase.g:1426:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
     public final void rule__TypeParameterCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1426:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
-            // InternalBase.g:1427:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalBase.g:1430:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
+            // InternalBase.g:1431:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
             {
-            // InternalBase.g:1427:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
-            // InternalBase.g:1428:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalBase.g:1431:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalBase.g:1432:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
             }
-            // InternalBase.g:1429:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalBase.g:1433:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             loop13:
             do {
                 int alt13=2;
@@ -4126,7 +4126,7 @@
 
                 switch (alt13) {
             	case 1 :
-            	    // InternalBase.g:1429:2: rule__TypeParameterCS__Group_1_2__0
+            	    // InternalBase.g:1433:2: rule__TypeParameterCS__Group_1_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_15);
             	    rule__TypeParameterCS__Group_1_2__0();
@@ -4167,14 +4167,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0"
-    // InternalBase.g:1445:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
+    // InternalBase.g:1449:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
     public final void rule__TypeParameterCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1449:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
-            // InternalBase.g:1450:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
+            // InternalBase.g:1453:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
+            // InternalBase.g:1454:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__TypeParameterCS__Group_1_2__0__Impl();
@@ -4205,17 +4205,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0__Impl"
-    // InternalBase.g:1457:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
+    // InternalBase.g:1461:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
     public final void rule__TypeParameterCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1461:1: ( ( '&&' ) )
-            // InternalBase.g:1462:1: ( '&&' )
+            // InternalBase.g:1465:1: ( ( '&&' ) )
+            // InternalBase.g:1466:1: ( '&&' )
             {
-            // InternalBase.g:1462:1: ( '&&' )
-            // InternalBase.g:1463:1: '&&'
+            // InternalBase.g:1466:1: ( '&&' )
+            // InternalBase.g:1467:1: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
@@ -4246,14 +4246,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1"
-    // InternalBase.g:1476:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
+    // InternalBase.g:1480:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
     public final void rule__TypeParameterCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1480:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
-            // InternalBase.g:1481:2: rule__TypeParameterCS__Group_1_2__1__Impl
+            // InternalBase.g:1484:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
+            // InternalBase.g:1485:2: rule__TypeParameterCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1_2__1__Impl();
@@ -4279,23 +4279,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1__Impl"
-    // InternalBase.g:1487:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
+    // InternalBase.g:1491:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1491:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
-            // InternalBase.g:1492:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalBase.g:1495:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
+            // InternalBase.g:1496:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
             {
-            // InternalBase.g:1492:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
-            // InternalBase.g:1493:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalBase.g:1496:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalBase.g:1497:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
             }
-            // InternalBase.g:1494:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
-            // InternalBase.g:1494:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
+            // InternalBase.g:1498:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalBase.g:1498:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1();
@@ -4330,14 +4330,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0"
-    // InternalBase.g:1508:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
+    // InternalBase.g:1512:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
     public final void rule__TypedTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1512:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
-            // InternalBase.g:1513:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
+            // InternalBase.g:1516:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
+            // InternalBase.g:1517:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__TypedTypeRefCS__Group__0__Impl();
@@ -4368,23 +4368,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0__Impl"
-    // InternalBase.g:1520:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalBase.g:1524:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypedTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1524:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalBase.g:1525:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalBase.g:1528:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalBase.g:1529:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalBase.g:1525:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
-            // InternalBase.g:1526:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalBase.g:1529:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalBase.g:1530:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalBase.g:1527:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
-            // InternalBase.g:1527:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
+            // InternalBase.g:1531:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalBase.g:1531:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedPathNameAssignment_0();
@@ -4419,14 +4419,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1"
-    // InternalBase.g:1537:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
+    // InternalBase.g:1541:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
     public final void rule__TypedTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1541:1: ( rule__TypedTypeRefCS__Group__1__Impl )
-            // InternalBase.g:1542:2: rule__TypedTypeRefCS__Group__1__Impl
+            // InternalBase.g:1545:1: ( rule__TypedTypeRefCS__Group__1__Impl )
+            // InternalBase.g:1546:2: rule__TypedTypeRefCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__1__Impl();
@@ -4452,22 +4452,22 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1__Impl"
-    // InternalBase.g:1548:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Group_1__0 )? ) ;
+    // InternalBase.g:1552:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Group_1__0 )? ) ;
     public final void rule__TypedTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1552:1: ( ( ( rule__TypedTypeRefCS__Group_1__0 )? ) )
-            // InternalBase.g:1553:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
+            // InternalBase.g:1556:1: ( ( ( rule__TypedTypeRefCS__Group_1__0 )? ) )
+            // InternalBase.g:1557:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
             {
-            // InternalBase.g:1553:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
-            // InternalBase.g:1554:1: ( rule__TypedTypeRefCS__Group_1__0 )?
+            // InternalBase.g:1557:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
+            // InternalBase.g:1558:1: ( rule__TypedTypeRefCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1());
             }
-            // InternalBase.g:1555:1: ( rule__TypedTypeRefCS__Group_1__0 )?
+            // InternalBase.g:1559:1: ( rule__TypedTypeRefCS__Group_1__0 )?
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -4476,7 +4476,7 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalBase.g:1555:2: rule__TypedTypeRefCS__Group_1__0
+                    // InternalBase.g:1559:2: rule__TypedTypeRefCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1__0();
@@ -4514,14 +4514,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0"
-    // InternalBase.g:1569:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
+    // InternalBase.g:1573:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
     public final void rule__TypedTypeRefCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1573:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
-            // InternalBase.g:1574:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
+            // InternalBase.g:1577:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
+            // InternalBase.g:1578:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TypedTypeRefCS__Group_1__0__Impl();
@@ -4552,17 +4552,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0__Impl"
-    // InternalBase.g:1581:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalBase.g:1585:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TypedTypeRefCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1585:1: ( ( '(' ) )
-            // InternalBase.g:1586:1: ( '(' )
+            // InternalBase.g:1589:1: ( ( '(' ) )
+            // InternalBase.g:1590:1: ( '(' )
             {
-            // InternalBase.g:1586:1: ( '(' )
-            // InternalBase.g:1587:1: '('
+            // InternalBase.g:1590:1: ( '(' )
+            // InternalBase.g:1591:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());
@@ -4593,14 +4593,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1"
-    // InternalBase.g:1600:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 ;
+    // InternalBase.g:1604:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 ;
     public final void rule__TypedTypeRefCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1604:1: ( rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 )
-            // InternalBase.g:1605:2: rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2
+            // InternalBase.g:1608:1: ( rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 )
+            // InternalBase.g:1609:2: rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_17);
             rule__TypedTypeRefCS__Group_1__1__Impl();
@@ -4631,23 +4631,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1__Impl"
-    // InternalBase.g:1612:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) ;
+    // InternalBase.g:1616:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1616:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) )
-            // InternalBase.g:1617:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
+            // InternalBase.g:1620:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) )
+            // InternalBase.g:1621:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
             {
-            // InternalBase.g:1617:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
-            // InternalBase.g:1618:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
+            // InternalBase.g:1621:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
+            // InternalBase.g:1622:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1());
             }
-            // InternalBase.g:1619:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
-            // InternalBase.g:1619:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1
+            // InternalBase.g:1623:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
+            // InternalBase.g:1623:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedBindingAssignment_1_1();
@@ -4682,14 +4682,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__2"
-    // InternalBase.g:1629:1: rule__TypedTypeRefCS__Group_1__2 : rule__TypedTypeRefCS__Group_1__2__Impl ;
+    // InternalBase.g:1633:1: rule__TypedTypeRefCS__Group_1__2 : rule__TypedTypeRefCS__Group_1__2__Impl ;
     public final void rule__TypedTypeRefCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1633:1: ( rule__TypedTypeRefCS__Group_1__2__Impl )
-            // InternalBase.g:1634:2: rule__TypedTypeRefCS__Group_1__2__Impl
+            // InternalBase.g:1637:1: ( rule__TypedTypeRefCS__Group_1__2__Impl )
+            // InternalBase.g:1638:2: rule__TypedTypeRefCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1__2__Impl();
@@ -4715,17 +4715,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__2__Impl"
-    // InternalBase.g:1640:1: rule__TypedTypeRefCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalBase.g:1644:1: rule__TypedTypeRefCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TypedTypeRefCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1644:1: ( ( ')' ) )
-            // InternalBase.g:1645:1: ( ')' )
+            // InternalBase.g:1648:1: ( ( ')' ) )
+            // InternalBase.g:1649:1: ( ')' )
             {
-            // InternalBase.g:1645:1: ( ')' )
-            // InternalBase.g:1646:1: ')'
+            // InternalBase.g:1649:1: ( ')' )
+            // InternalBase.g:1650:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_2());
@@ -4756,14 +4756,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0"
-    // InternalBase.g:1665:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
+    // InternalBase.g:1669:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
     public final void rule__WildcardTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1669:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
-            // InternalBase.g:1670:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
+            // InternalBase.g:1673:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
+            // InternalBase.g:1674:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__WildcardTypeRefCS__Group__0__Impl();
@@ -4794,23 +4794,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0__Impl"
-    // InternalBase.g:1677:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
+    // InternalBase.g:1681:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
     public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1681:1: ( ( () ) )
-            // InternalBase.g:1682:1: ( () )
+            // InternalBase.g:1685:1: ( ( () ) )
+            // InternalBase.g:1686:1: ( () )
             {
-            // InternalBase.g:1682:1: ( () )
-            // InternalBase.g:1683:1: ()
+            // InternalBase.g:1686:1: ( () )
+            // InternalBase.g:1687:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
             }
-            // InternalBase.g:1684:1: ()
-            // InternalBase.g:1686:1:
+            // InternalBase.g:1688:1: ()
+            // InternalBase.g:1690:1:
             {
             }
 
@@ -4835,14 +4835,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1"
-    // InternalBase.g:1696:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
+    // InternalBase.g:1700:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
     public final void rule__WildcardTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1700:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
-            // InternalBase.g:1701:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
+            // InternalBase.g:1704:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
+            // InternalBase.g:1705:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__WildcardTypeRefCS__Group__1__Impl();
@@ -4873,17 +4873,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1__Impl"
-    // InternalBase.g:1708:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
+    // InternalBase.g:1712:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
     public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1712:1: ( ( '?' ) )
-            // InternalBase.g:1713:1: ( '?' )
+            // InternalBase.g:1716:1: ( ( '?' ) )
+            // InternalBase.g:1717:1: ( '?' )
             {
-            // InternalBase.g:1713:1: ( '?' )
-            // InternalBase.g:1714:1: '?'
+            // InternalBase.g:1717:1: ( '?' )
+            // InternalBase.g:1718:1: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
@@ -4914,14 +4914,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2"
-    // InternalBase.g:1727:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
+    // InternalBase.g:1731:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
     public final void rule__WildcardTypeRefCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1731:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
-            // InternalBase.g:1732:2: rule__WildcardTypeRefCS__Group__2__Impl
+            // InternalBase.g:1735:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
+            // InternalBase.g:1736:2: rule__WildcardTypeRefCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__2__Impl();
@@ -4947,22 +4947,22 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2__Impl"
-    // InternalBase.g:1738:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
+    // InternalBase.g:1742:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
     public final void rule__WildcardTypeRefCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1742:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
-            // InternalBase.g:1743:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalBase.g:1746:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
+            // InternalBase.g:1747:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
             {
-            // InternalBase.g:1743:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
-            // InternalBase.g:1744:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalBase.g:1747:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalBase.g:1748:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
             }
-            // InternalBase.g:1745:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalBase.g:1749:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -4971,7 +4971,7 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalBase.g:1745:2: rule__WildcardTypeRefCS__Group_2__0
+                    // InternalBase.g:1749:2: rule__WildcardTypeRefCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__WildcardTypeRefCS__Group_2__0();
@@ -5009,14 +5009,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0"
-    // InternalBase.g:1761:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
+    // InternalBase.g:1765:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
     public final void rule__WildcardTypeRefCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1765:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
-            // InternalBase.g:1766:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
+            // InternalBase.g:1769:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
+            // InternalBase.g:1770:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__WildcardTypeRefCS__Group_2__0__Impl();
@@ -5047,17 +5047,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0__Impl"
-    // InternalBase.g:1773:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
+    // InternalBase.g:1777:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
     public final void rule__WildcardTypeRefCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1777:1: ( ( 'extends' ) )
-            // InternalBase.g:1778:1: ( 'extends' )
+            // InternalBase.g:1781:1: ( ( 'extends' ) )
+            // InternalBase.g:1782:1: ( 'extends' )
             {
-            // InternalBase.g:1778:1: ( 'extends' )
-            // InternalBase.g:1779:1: 'extends'
+            // InternalBase.g:1782:1: ( 'extends' )
+            // InternalBase.g:1783:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
@@ -5088,14 +5088,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1"
-    // InternalBase.g:1792:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
+    // InternalBase.g:1796:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
     public final void rule__WildcardTypeRefCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1796:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
-            // InternalBase.g:1797:2: rule__WildcardTypeRefCS__Group_2__1__Impl
+            // InternalBase.g:1800:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
+            // InternalBase.g:1801:2: rule__WildcardTypeRefCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group_2__1__Impl();
@@ -5121,23 +5121,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1__Impl"
-    // InternalBase.g:1803:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
+    // InternalBase.g:1807:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
     public final void rule__WildcardTypeRefCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1807:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
-            // InternalBase.g:1808:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalBase.g:1811:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
+            // InternalBase.g:1812:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
             {
-            // InternalBase.g:1808:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
-            // InternalBase.g:1809:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalBase.g:1812:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalBase.g:1813:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
             }
-            // InternalBase.g:1810:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
-            // InternalBase.g:1810:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
+            // InternalBase.g:1814:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalBase.g:1814:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1();
@@ -5172,17 +5172,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"
-    // InternalBase.g:1825:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
+    // InternalBase.g:1829:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
     public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1829:1: ( ( ruleLOWER ) )
-            // InternalBase.g:1830:1: ( ruleLOWER )
+            // InternalBase.g:1833:1: ( ( ruleLOWER ) )
+            // InternalBase.g:1834:1: ( ruleLOWER )
             {
-            // InternalBase.g:1830:1: ( ruleLOWER )
-            // InternalBase.g:1831:1: ruleLOWER
+            // InternalBase.g:1834:1: ( ruleLOWER )
+            // InternalBase.g:1835:1: ruleLOWER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
@@ -5217,17 +5217,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"
-    // InternalBase.g:1840:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
+    // InternalBase.g:1844:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
     public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1844:1: ( ( ruleUPPER ) )
-            // InternalBase.g:1845:1: ( ruleUPPER )
+            // InternalBase.g:1848:1: ( ( ruleUPPER ) )
+            // InternalBase.g:1849:1: ( ruleUPPER )
             {
-            // InternalBase.g:1845:1: ( ruleUPPER )
-            // InternalBase.g:1846:1: ruleUPPER
+            // InternalBase.g:1849:1: ( ruleUPPER )
+            // InternalBase.g:1850:1: ruleUPPER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
@@ -5262,23 +5262,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__IsNullFreeAssignment_2_1"
-    // InternalBase.g:1855:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
+    // InternalBase.g:1859:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
     public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1859:1: ( ( ( '|1' ) ) )
-            // InternalBase.g:1860:1: ( ( '|1' ) )
+            // InternalBase.g:1863:1: ( ( ( '|1' ) ) )
+            // InternalBase.g:1864:1: ( ( '|1' ) )
             {
-            // InternalBase.g:1860:1: ( ( '|1' ) )
-            // InternalBase.g:1861:1: ( '|1' )
+            // InternalBase.g:1864:1: ( ( '|1' ) )
+            // InternalBase.g:1865:1: ( '|1' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
             }
-            // InternalBase.g:1862:1: ( '|1' )
-            // InternalBase.g:1863:1: '|1'
+            // InternalBase.g:1866:1: ( '|1' )
+            // InternalBase.g:1867:1: '|1'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
@@ -5315,23 +5315,23 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAssignment"
-    // InternalBase.g:1878:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
+    // InternalBase.g:1882:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
     public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1882:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
-            // InternalBase.g:1883:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalBase.g:1886:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
+            // InternalBase.g:1887:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
             {
-            // InternalBase.g:1883:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
-            // InternalBase.g:1884:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalBase.g:1887:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalBase.g:1888:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
             }
-            // InternalBase.g:1885:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
-            // InternalBase.g:1885:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
+            // InternalBase.g:1889:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalBase.g:1889:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityStringCS__StringBoundsAlternatives_0();
@@ -5366,17 +5366,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_0"
-    // InternalBase.g:1894:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
+    // InternalBase.g:1898:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1898:1: ( ( ruleFirstPathElementCS ) )
-            // InternalBase.g:1899:1: ( ruleFirstPathElementCS )
+            // InternalBase.g:1902:1: ( ( ruleFirstPathElementCS ) )
+            // InternalBase.g:1903:1: ( ruleFirstPathElementCS )
             {
-            // InternalBase.g:1899:1: ( ruleFirstPathElementCS )
-            // InternalBase.g:1900:1: ruleFirstPathElementCS
+            // InternalBase.g:1903:1: ( ruleFirstPathElementCS )
+            // InternalBase.g:1904:1: ruleFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
@@ -5411,17 +5411,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalBase.g:1909:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalBase.g:1913:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1913:1: ( ( ruleNextPathElementCS ) )
-            // InternalBase.g:1914:1: ( ruleNextPathElementCS )
+            // InternalBase.g:1917:1: ( ( ruleNextPathElementCS ) )
+            // InternalBase.g:1918:1: ( ruleNextPathElementCS )
             {
-            // InternalBase.g:1914:1: ( ruleNextPathElementCS )
-            // InternalBase.g:1915:1: ruleNextPathElementCS
+            // InternalBase.g:1918:1: ( ruleNextPathElementCS )
+            // InternalBase.g:1919:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -5456,23 +5456,23 @@
 
 
     // $ANTLR start "rule__FirstPathElementCS__ReferredElementAssignment"
-    // InternalBase.g:1924:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
+    // InternalBase.g:1930:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1928:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalBase.g:1929:1: ( ( ruleUnrestrictedName ) )
+            // InternalBase.g:1934:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalBase.g:1935:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalBase.g:1929:1: ( ( ruleUnrestrictedName ) )
-            // InternalBase.g:1930:1: ( ruleUnrestrictedName )
+            // InternalBase.g:1935:1: ( ( ruleUnrestrictedName ) )
+            // InternalBase.g:1936:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalBase.g:1931:1: ( ruleUnrestrictedName )
-            // InternalBase.g:1932:1: ruleUnrestrictedName
+            // InternalBase.g:1937:1: ( ruleUnrestrictedName )
+            // InternalBase.g:1938:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
@@ -5513,23 +5513,23 @@
 
 
     // $ANTLR start "rule__NextPathElementCS__ReferredElementAssignment"
-    // InternalBase.g:1943:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
+    // InternalBase.g:1949:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
     public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1947:1: ( ( ( ruleUnreservedName ) ) )
-            // InternalBase.g:1948:1: ( ( ruleUnreservedName ) )
+            // InternalBase.g:1953:1: ( ( ( ruleUnreservedName ) ) )
+            // InternalBase.g:1954:1: ( ( ruleUnreservedName ) )
             {
-            // InternalBase.g:1948:1: ( ( ruleUnreservedName ) )
-            // InternalBase.g:1949:1: ( ruleUnreservedName )
+            // InternalBase.g:1954:1: ( ( ruleUnreservedName ) )
+            // InternalBase.g:1955:1: ( ruleUnreservedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalBase.g:1950:1: ( ruleUnreservedName )
-            // InternalBase.g:1951:1: ruleUnreservedName
+            // InternalBase.g:1956:1: ( ruleUnreservedName )
+            // InternalBase.g:1957:1: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
@@ -5570,17 +5570,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"
-    // InternalBase.g:1962:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalBase.g:1968:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1966:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalBase.g:1967:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalBase.g:1972:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalBase.g:1973:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalBase.g:1967:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalBase.g:1968:1: ruleTemplateParameterSubstitutionCS
+            // InternalBase.g:1973:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalBase.g:1974:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
@@ -5615,17 +5615,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"
-    // InternalBase.g:1977:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalBase.g:1983:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1981:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalBase.g:1982:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalBase.g:1987:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalBase.g:1988:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalBase.g:1982:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalBase.g:1983:1: ruleTemplateParameterSubstitutionCS
+            // InternalBase.g:1988:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalBase.g:1989:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
@@ -5660,17 +5660,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"
-    // InternalBase.g:1992:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
+    // InternalBase.g:1998:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
     public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:1996:1: ( ( ruleMultiplicityCS ) )
-            // InternalBase.g:1997:1: ( ruleMultiplicityCS )
+            // InternalBase.g:2002:1: ( ( ruleMultiplicityCS ) )
+            // InternalBase.g:2003:1: ( ruleMultiplicityCS )
             {
-            // InternalBase.g:1997:1: ( ruleMultiplicityCS )
-            // InternalBase.g:1998:1: ruleMultiplicityCS
+            // InternalBase.g:2003:1: ( ruleMultiplicityCS )
+            // InternalBase.g:2004:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
@@ -5705,17 +5705,17 @@
 
 
     // $ANTLR start "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"
-    // InternalBase.g:2007:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
+    // InternalBase.g:2013:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
     public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2011:1: ( ( ruleTypeRefCS ) )
-            // InternalBase.g:2012:1: ( ruleTypeRefCS )
+            // InternalBase.g:2017:1: ( ( ruleTypeRefCS ) )
+            // InternalBase.g:2018:1: ( ruleTypeRefCS )
             {
-            // InternalBase.g:2012:1: ( ruleTypeRefCS )
-            // InternalBase.g:2013:1: ruleTypeRefCS
+            // InternalBase.g:2018:1: ( ruleTypeRefCS )
+            // InternalBase.g:2019:1: ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
@@ -5750,17 +5750,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__NameAssignment_0"
-    // InternalBase.g:2024:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalBase.g:2030:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2028:1: ( ( ruleUnrestrictedName ) )
-            // InternalBase.g:2029:1: ( ruleUnrestrictedName )
+            // InternalBase.g:2034:1: ( ( ruleUnrestrictedName ) )
+            // InternalBase.g:2035:1: ( ruleUnrestrictedName )
             {
-            // InternalBase.g:2029:1: ( ruleUnrestrictedName )
-            // InternalBase.g:2030:1: ruleUnrestrictedName
+            // InternalBase.g:2035:1: ( ruleUnrestrictedName )
+            // InternalBase.g:2036:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -5795,17 +5795,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"
-    // InternalBase.g:2039:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
+    // InternalBase.g:2045:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2043:1: ( ( ruleTypedRefCS ) )
-            // InternalBase.g:2044:1: ( ruleTypedRefCS )
+            // InternalBase.g:2049:1: ( ( ruleTypedRefCS ) )
+            // InternalBase.g:2050:1: ( ruleTypedRefCS )
             {
-            // InternalBase.g:2044:1: ( ruleTypedRefCS )
-            // InternalBase.g:2045:1: ruleTypedRefCS
+            // InternalBase.g:2050:1: ( ruleTypedRefCS )
+            // InternalBase.g:2051:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
@@ -5840,17 +5840,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"
-    // InternalBase.g:2054:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
+    // InternalBase.g:2060:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2058:1: ( ( ruleTypedRefCS ) )
-            // InternalBase.g:2059:1: ( ruleTypedRefCS )
+            // InternalBase.g:2064:1: ( ( ruleTypedRefCS ) )
+            // InternalBase.g:2065:1: ( ruleTypedRefCS )
             {
-            // InternalBase.g:2059:1: ( ruleTypedRefCS )
-            // InternalBase.g:2060:1: ruleTypedRefCS
+            // InternalBase.g:2065:1: ( ruleTypedRefCS )
+            // InternalBase.g:2066:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
@@ -5885,17 +5885,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_0"
-    // InternalBase.g:2069:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalBase.g:2075:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2073:1: ( ( rulePathNameCS ) )
-            // InternalBase.g:2074:1: ( rulePathNameCS )
+            // InternalBase.g:2079:1: ( ( rulePathNameCS ) )
+            // InternalBase.g:2080:1: ( rulePathNameCS )
             {
-            // InternalBase.g:2074:1: ( rulePathNameCS )
-            // InternalBase.g:2075:1: rulePathNameCS
+            // InternalBase.g:2080:1: ( rulePathNameCS )
+            // InternalBase.g:2081:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -5930,17 +5930,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1"
-    // InternalBase.g:2084:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 : ( ruleTemplateBindingCS ) ;
+    // InternalBase.g:2090:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 : ( ruleTemplateBindingCS ) ;
     public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2088:1: ( ( ruleTemplateBindingCS ) )
-            // InternalBase.g:2089:1: ( ruleTemplateBindingCS )
+            // InternalBase.g:2094:1: ( ( ruleTemplateBindingCS ) )
+            // InternalBase.g:2095:1: ( ruleTemplateBindingCS )
             {
-            // InternalBase.g:2089:1: ( ruleTemplateBindingCS )
-            // InternalBase.g:2090:1: ruleTemplateBindingCS
+            // InternalBase.g:2095:1: ( ruleTemplateBindingCS )
+            // InternalBase.g:2096:1: ruleTemplateBindingCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_0());
@@ -5975,17 +5975,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"
-    // InternalBase.g:2099:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
+    // InternalBase.g:2105:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalBase.g:2103:1: ( ( ruleTypedRefCS ) )
-            // InternalBase.g:2104:1: ( ruleTypedRefCS )
+            // InternalBase.g:2109:1: ( ( ruleTypedRefCS ) )
+            // InternalBase.g:2110:1: ( ruleTypedRefCS )
             {
-            // InternalBase.g:2104:1: ( ruleTypedRefCS )
-            // InternalBase.g:2105:1: ruleTypedRefCS
+            // InternalBase.g:2110:1: ( ruleTypedRefCS )
+            // InternalBase.g:2111:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/Base.xtextbin b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/Base.xtextbin
index fccaa1d..fc0cb43 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/Base.xtextbin
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/Base.xtextbin
Binary files differ
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/BaseGrammarResource.java b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/BaseGrammarResource.java
index 61b92be..2743723 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/BaseGrammarResource.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/BaseGrammarResource.java
@@ -200,6 +200,7 @@
 		private static final @NonNull ParserRule PR_UPPER = createParserRule("UPPER", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.EINT));
 		private static final @NonNull ParserRule PR_URI = createParserRule("URI", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_UnreservedName = createParserRule("UnreservedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
+		private static final @NonNull ParserRule PR_UnreservedPathNameCS = createParserRule("UnreservedPathNameCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.PATH_NAME_CS));
 		private static final @NonNull ParserRule PR_UnrestrictedName = createParserRule("UnrestrictedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_WildcardTypeRefCS = createParserRule("WildcardTypeRefCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.WILDCARD_TYPE_REF_CS));
 
@@ -296,6 +297,12 @@
 				createRuleCall(TR_SINGLE_QUOTED_STRING));
 			PR_UnreservedName.setAlternatives(
 				createRuleCall(PR_UnrestrictedName));
+			PR_UnreservedPathNameCS.setAlternatives(
+				createGroup(
+					createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS)),
+					setCardinality("*", createGroup(
+						createKeyword("::"),
+						createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS))))));
 			PR_UnrestrictedName.setAlternatives(
 				createRuleCall(PR_Identifier));
 			PR_WildcardTypeRefCS.setAlternatives(
@@ -324,6 +331,7 @@
 				rules.add(PR_MultiplicityCS);
 				rules.add(PR_MultiplicityStringCS);
 				rules.add(PR_PathNameCS);
+				rules.add(PR_UnreservedPathNameCS);
 				rules.add(PR_FirstPathElementCS);
 				rules.add(PR_NextPathElementCS);
 				rules.add(PR_TemplateBindingCS);
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBase.g b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBase.g
index c4301ee..39d71d8 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBase.g
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBase.g
@@ -335,6 +335,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS returns [EObject current=null]
 	:
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseLexer.java b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseLexer.java
index b0ccf63..c67576d 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseLexer.java
@@ -352,8 +352,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalBase.g:1020:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalBase.g:1020:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalBase.g:1022:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalBase.g:1022:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -377,8 +377,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalBase.g:1022:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalBase.g:1022:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalBase.g:1024:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalBase.g:1024:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -403,11 +403,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1024:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalBase.g:1024:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalBase.g:1026:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalBase.g:1026:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalBase.g:1024:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalBase.g:1026:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -423,14 +423,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalBase.g:1024:34: RULE_ESCAPED_CHARACTER
+            	    // InternalBase.g:1026:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalBase.g:1024:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalBase.g:1026:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -467,11 +467,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1026:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalBase.g:1026:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalBase.g:1028:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalBase.g:1028:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalBase.g:1026:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalBase.g:1028:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -487,14 +487,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalBase.g:1026:35: RULE_ESCAPED_CHARACTER
+            	    // InternalBase.g:1028:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalBase.g:1026:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalBase.g:1028:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -531,12 +531,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1028:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalBase.g:1028:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalBase.g:1030:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalBase.g:1030:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalBase.g:1028:38: ( options {greedy=false; } : . )*
+            // InternalBase.g:1030:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -561,7 +561,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalBase.g:1028:66: .
+            	    // InternalBase.g:1030:66: .
             	    {
             	    matchAny();
 
@@ -591,11 +591,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1030:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalBase.g:1030:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalBase.g:1032:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalBase.g:1032:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalBase.g:1030:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalBase.g:1032:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -644,8 +644,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1032:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalBase.g:1032:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalBase.g:1034:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalBase.g:1034:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -665,10 +665,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1034:10: ( ( '0' .. '9' )+ )
-            // InternalBase.g:1034:12: ( '0' .. '9' )+
+            // InternalBase.g:1036:10: ( ( '0' .. '9' )+ )
+            // InternalBase.g:1036:12: ( '0' .. '9' )+
             {
-            // InternalBase.g:1034:12: ( '0' .. '9' )+
+            // InternalBase.g:1036:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -682,7 +682,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalBase.g:1034:13: '0' .. '9'
+            	    // InternalBase.g:1036:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -714,12 +714,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1036:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalBase.g:1036:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalBase.g:1038:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalBase.g:1038:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalBase.g:1036:24: ( options {greedy=false; } : . )*
+            // InternalBase.g:1038:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -744,7 +744,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalBase.g:1036:52: .
+            	    // InternalBase.g:1038:52: .
             	    {
             	    matchAny();
 
@@ -774,12 +774,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1038:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalBase.g:1038:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalBase.g:1040:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalBase.g:1040:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalBase.g:1038:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalBase.g:1040:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -792,7 +792,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalBase.g:1038:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalBase.g:1040:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -812,7 +812,7 @@
                 }
             } while (true);
 
-            // InternalBase.g:1038:40: ( ( '\\r' )? '\\n' )?
+            // InternalBase.g:1040:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -821,9 +821,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalBase.g:1038:41: ( '\\r' )? '\\n'
+                    // InternalBase.g:1040:41: ( '\\r' )? '\\n'
                     {
-                    // InternalBase.g:1038:41: ( '\\r' )?
+                    // InternalBase.g:1040:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -832,7 +832,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalBase.g:1038:41: '\\r'
+                            // InternalBase.g:1040:41: '\\r'
                             {
                             match('\r');
 
@@ -864,10 +864,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1040:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalBase.g:1040:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalBase.g:1042:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalBase.g:1042:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalBase.g:1040:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalBase.g:1042:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -921,8 +921,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalBase.g:1042:16: ( . )
-            // InternalBase.g:1042:18: .
+            // InternalBase.g:1044:16: ( . )
+            // InternalBase.g:1044:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseParser.java b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseParser.java
index 66f9f8f..587a34f 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseParser.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/parser/antlr/internal/InternalBaseParser.java
@@ -869,7 +869,7 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalBase.g:339:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
+    // InternalBase.g:341:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
     public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -877,8 +877,8 @@
 
 
         try {
-            // InternalBase.g:340:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
-            // InternalBase.g:341:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
+            // InternalBase.g:342:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
+            // InternalBase.g:343:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFirstPathElementCSRule());
@@ -909,21 +909,21 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalBase.g:348:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
+    // InternalBase.g:350:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
     public final EObject ruleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalBase.g:351:28: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalBase.g:352:1: ( ( ruleUnrestrictedName ) )
+            // InternalBase.g:353:28: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalBase.g:354:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalBase.g:352:1: ( ( ruleUnrestrictedName ) )
-            // InternalBase.g:353:1: ( ruleUnrestrictedName )
+            // InternalBase.g:354:1: ( ( ruleUnrestrictedName ) )
+            // InternalBase.g:355:1: ( ruleUnrestrictedName )
             {
-            // InternalBase.g:353:1: ( ruleUnrestrictedName )
-            // InternalBase.g:354:3: ruleUnrestrictedName
+            // InternalBase.g:355:1: ( ruleUnrestrictedName )
+            // InternalBase.g:356:3: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -978,7 +978,7 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalBase.g:378:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
+    // InternalBase.g:380:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
     public final EObject entryRuleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -986,8 +986,8 @@
 
 
         try {
-            // InternalBase.g:379:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
-            // InternalBase.g:380:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
+            // InternalBase.g:381:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
+            // InternalBase.g:382:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNextPathElementCSRule());
@@ -1018,21 +1018,21 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalBase.g:387:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
+    // InternalBase.g:389:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
     public final EObject ruleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalBase.g:390:28: ( ( ( ruleUnreservedName ) ) )
-            // InternalBase.g:391:1: ( ( ruleUnreservedName ) )
+            // InternalBase.g:392:28: ( ( ( ruleUnreservedName ) ) )
+            // InternalBase.g:393:1: ( ( ruleUnreservedName ) )
             {
-            // InternalBase.g:391:1: ( ( ruleUnreservedName ) )
-            // InternalBase.g:392:1: ( ruleUnreservedName )
+            // InternalBase.g:393:1: ( ( ruleUnreservedName ) )
+            // InternalBase.g:394:1: ( ruleUnreservedName )
             {
-            // InternalBase.g:392:1: ( ruleUnreservedName )
-            // InternalBase.g:393:3: ruleUnreservedName
+            // InternalBase.g:394:1: ( ruleUnreservedName )
+            // InternalBase.g:395:3: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
 
@@ -1087,7 +1087,7 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalBase.g:417:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
+    // InternalBase.g:419:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
     public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -1095,8 +1095,8 @@
 
 
         try {
-            // InternalBase.g:418:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
-            // InternalBase.g:419:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
+            // InternalBase.g:420:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
+            // InternalBase.g:421:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateBindingCSRule());
@@ -1127,7 +1127,7 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalBase.g:426:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
+    // InternalBase.g:428:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
     public final EObject ruleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -1142,17 +1142,17 @@
          enterRule();
 
         try {
-            // InternalBase.g:429:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
-            // InternalBase.g:430:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalBase.g:431:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
+            // InternalBase.g:432:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
             {
-            // InternalBase.g:430:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
-            // InternalBase.g:430:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalBase.g:432:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalBase.g:432:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             {
-            // InternalBase.g:430:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
-            // InternalBase.g:431:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalBase.g:432:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
+            // InternalBase.g:433:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
             {
-            // InternalBase.g:431:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
-            // InternalBase.g:432:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
+            // InternalBase.g:433:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalBase.g:434:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
 
@@ -1183,7 +1183,7 @@
 
             }
 
-            // InternalBase.g:448:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
+            // InternalBase.g:450:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
             loop6:
             do {
                 int alt6=2;
@@ -1196,7 +1196,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalBase.g:448:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalBase.g:450:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
             	    {
             	    otherlv_1=(Token)match(input,25,FollowSets000.FOLLOW_11); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1204,11 +1204,11 @@
             	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
 
             	    }
-            	    // InternalBase.g:452:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
-            	    // InternalBase.g:453:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalBase.g:454:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalBase.g:455:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
             	    {
-            	    // InternalBase.g:453:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
-            	    // InternalBase.g:454:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
+            	    // InternalBase.g:455:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalBase.g:456:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -1248,7 +1248,7 @@
                 }
             } while (true);
 
-            // InternalBase.g:470:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalBase.g:472:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -1257,10 +1257,10 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalBase.g:471:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalBase.g:473:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                     {
-                    // InternalBase.g:471:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
-                    // InternalBase.g:472:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
+                    // InternalBase.g:473:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalBase.g:474:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1317,7 +1317,7 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalBase.g:496:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalBase.g:498:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
     public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -1325,8 +1325,8 @@
 
 
         try {
-            // InternalBase.g:497:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
-            // InternalBase.g:498:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
+            // InternalBase.g:499:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
+            // InternalBase.g:500:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -1357,7 +1357,7 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalBase.g:505:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
+    // InternalBase.g:507:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
     public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -1367,14 +1367,14 @@
          enterRule();
 
         try {
-            // InternalBase.g:508:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
-            // InternalBase.g:509:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalBase.g:510:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
+            // InternalBase.g:511:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
             {
-            // InternalBase.g:509:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
-            // InternalBase.g:510:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalBase.g:511:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalBase.g:512:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
             {
-            // InternalBase.g:510:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
-            // InternalBase.g:511:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
+            // InternalBase.g:512:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalBase.g:513:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -1425,7 +1425,7 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalBase.g:537:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
+    // InternalBase.g:539:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
     public final EObject entryRuleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -1433,8 +1433,8 @@
 
 
         try {
-            // InternalBase.g:538:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
-            // InternalBase.g:539:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
+            // InternalBase.g:540:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
+            // InternalBase.g:541:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeParameterCSRule());
@@ -1465,7 +1465,7 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalBase.g:546:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
+    // InternalBase.g:548:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
     public final EObject ruleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -1481,17 +1481,17 @@
          enterRule();
 
         try {
-            // InternalBase.g:549:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
-            // InternalBase.g:550:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalBase.g:551:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
+            // InternalBase.g:552:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
             {
-            // InternalBase.g:550:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
-            // InternalBase.g:550:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalBase.g:552:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalBase.g:552:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             {
-            // InternalBase.g:550:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
-            // InternalBase.g:551:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalBase.g:552:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
+            // InternalBase.g:553:1: (lv_name_0_0= ruleUnrestrictedName )
             {
-            // InternalBase.g:551:1: (lv_name_0_0= ruleUnrestrictedName )
-            // InternalBase.g:552:3: lv_name_0_0= ruleUnrestrictedName
+            // InternalBase.g:553:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalBase.g:554:3: lv_name_0_0= ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -1522,7 +1522,7 @@
 
             }
 
-            // InternalBase.g:568:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalBase.g:570:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -1531,7 +1531,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalBase.g:568:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalBase.g:570:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     {
                     otherlv_1=(Token)match(input,26,FollowSets000.FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -1539,11 +1539,11 @@
                           	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
 
                     }
-                    // InternalBase.g:572:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
-                    // InternalBase.g:573:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalBase.g:574:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
+                    // InternalBase.g:575:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                     {
-                    // InternalBase.g:573:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
-                    // InternalBase.g:574:3: lv_ownedExtends_2_0= ruleTypedRefCS
+                    // InternalBase.g:575:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalBase.g:576:3: lv_ownedExtends_2_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1574,7 +1574,7 @@
 
                     }
 
-                    // InternalBase.g:590:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalBase.g:592:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     loop8:
                     do {
                         int alt8=2;
@@ -1587,7 +1587,7 @@
 
                         switch (alt8) {
                     	case 1 :
-                    	    // InternalBase.g:590:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalBase.g:592:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                     	    {
                     	    otherlv_3=(Token)match(input,27,FollowSets000.FOLLOW_9); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -1595,11 +1595,11 @@
                     	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
 
                     	    }
-                    	    // InternalBase.g:594:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
-                    	    // InternalBase.g:595:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalBase.g:596:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalBase.g:597:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                     	    {
-                    	    // InternalBase.g:595:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
-                    	    // InternalBase.g:596:3: lv_ownedExtends_4_0= ruleTypedRefCS
+                    	    // InternalBase.g:597:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalBase.g:598:3: lv_ownedExtends_4_0= ruleTypedRefCS
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -1668,7 +1668,7 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalBase.g:620:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
+    // InternalBase.g:622:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
     public final EObject entryRuleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -1676,8 +1676,8 @@
 
 
         try {
-            // InternalBase.g:621:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
-            // InternalBase.g:622:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
+            // InternalBase.g:623:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
+            // InternalBase.g:624:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeRefCSRule());
@@ -1708,7 +1708,7 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalBase.g:629:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
+    // InternalBase.g:631:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
     public final EObject ruleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -1720,10 +1720,10 @@
          enterRule();
 
         try {
-            // InternalBase.g:632:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
-            // InternalBase.g:633:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalBase.g:634:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
+            // InternalBase.g:635:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             {
-            // InternalBase.g:633:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalBase.g:635:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -1742,7 +1742,7 @@
             }
             switch (alt10) {
                 case 1 :
-                    // InternalBase.g:634:2: this_TypedRefCS_0= ruleTypedRefCS
+                    // InternalBase.g:636:2: this_TypedRefCS_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1769,7 +1769,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:647:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
+                    // InternalBase.g:649:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1818,7 +1818,7 @@
 
 
     // $ANTLR start "entryRuleTypedRefCS"
-    // InternalBase.g:666:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
+    // InternalBase.g:668:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
     public final EObject entryRuleTypedRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -1826,8 +1826,8 @@
 
 
         try {
-            // InternalBase.g:667:2: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
-            // InternalBase.g:668:2: iv_ruleTypedRefCS= ruleTypedRefCS EOF
+            // InternalBase.g:669:2: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
+            // InternalBase.g:670:2: iv_ruleTypedRefCS= ruleTypedRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypedRefCSRule());
@@ -1858,7 +1858,7 @@
 
 
     // $ANTLR start "ruleTypedRefCS"
-    // InternalBase.g:675:1: ruleTypedRefCS returns [EObject current=null] : this_TypedTypeRefCS_0= ruleTypedTypeRefCS ;
+    // InternalBase.g:677:1: ruleTypedRefCS returns [EObject current=null] : this_TypedTypeRefCS_0= ruleTypedTypeRefCS ;
     public final EObject ruleTypedRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -1868,8 +1868,8 @@
          enterRule();
 
         try {
-            // InternalBase.g:678:28: (this_TypedTypeRefCS_0= ruleTypedTypeRefCS )
-            // InternalBase.g:680:2: this_TypedTypeRefCS_0= ruleTypedTypeRefCS
+            // InternalBase.g:680:28: (this_TypedTypeRefCS_0= ruleTypedTypeRefCS )
+            // InternalBase.g:682:2: this_TypedTypeRefCS_0= ruleTypedTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -1912,7 +1912,7 @@
 
 
     // $ANTLR start "entryRuleTypedTypeRefCS"
-    // InternalBase.g:699:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
+    // InternalBase.g:701:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
     public final EObject entryRuleTypedTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -1920,8 +1920,8 @@
 
 
         try {
-            // InternalBase.g:700:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
-            // InternalBase.g:701:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
+            // InternalBase.g:702:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
+            // InternalBase.g:703:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypedTypeRefCSRule());
@@ -1952,7 +1952,7 @@
 
 
     // $ANTLR start "ruleTypedTypeRefCS"
-    // InternalBase.g:708:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
+    // InternalBase.g:710:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
     public final EObject ruleTypedTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -1966,17 +1966,17 @@
          enterRule();
 
         try {
-            // InternalBase.g:711:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
-            // InternalBase.g:712:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
+            // InternalBase.g:713:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
+            // InternalBase.g:714:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
             {
-            // InternalBase.g:712:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
-            // InternalBase.g:712:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
+            // InternalBase.g:714:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
+            // InternalBase.g:714:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
             {
-            // InternalBase.g:712:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
-            // InternalBase.g:713:1: (lv_ownedPathName_0_0= rulePathNameCS )
+            // InternalBase.g:714:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
+            // InternalBase.g:715:1: (lv_ownedPathName_0_0= rulePathNameCS )
             {
-            // InternalBase.g:713:1: (lv_ownedPathName_0_0= rulePathNameCS )
-            // InternalBase.g:714:3: lv_ownedPathName_0_0= rulePathNameCS
+            // InternalBase.g:715:1: (lv_ownedPathName_0_0= rulePathNameCS )
+            // InternalBase.g:716:3: lv_ownedPathName_0_0= rulePathNameCS
             {
             if ( state.backtracking==0 ) {
 
@@ -2007,7 +2007,7 @@
 
             }
 
-            // InternalBase.g:730:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
+            // InternalBase.g:732:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -2016,7 +2016,7 @@
             }
             switch (alt11) {
                 case 1 :
-                    // InternalBase.g:730:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
+                    // InternalBase.g:732:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
                     {
                     otherlv_1=(Token)match(input,28,FollowSets000.FOLLOW_11); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -2024,11 +2024,11 @@
                           	newLeafNode(otherlv_1, grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());
 
                     }
-                    // InternalBase.g:734:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
-                    // InternalBase.g:735:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
+                    // InternalBase.g:736:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
+                    // InternalBase.g:737:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                     {
-                    // InternalBase.g:735:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
-                    // InternalBase.g:736:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
+                    // InternalBase.g:737:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
+                    // InternalBase.g:738:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -2094,7 +2094,7 @@
 
 
     // $ANTLR start "entryRuleUnreservedName"
-    // InternalBase.g:764:1: entryRuleUnreservedName returns [String current=null] : iv_ruleUnreservedName= ruleUnreservedName EOF ;
+    // InternalBase.g:766:1: entryRuleUnreservedName returns [String current=null] : iv_ruleUnreservedName= ruleUnreservedName EOF ;
     public final String entryRuleUnreservedName() throws RecognitionException {
         String current = null;
 
@@ -2102,8 +2102,8 @@
 
 
         try {
-            // InternalBase.g:765:2: (iv_ruleUnreservedName= ruleUnreservedName EOF )
-            // InternalBase.g:766:2: iv_ruleUnreservedName= ruleUnreservedName EOF
+            // InternalBase.g:767:2: (iv_ruleUnreservedName= ruleUnreservedName EOF )
+            // InternalBase.g:768:2: iv_ruleUnreservedName= ruleUnreservedName EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUnreservedNameRule());
@@ -2134,7 +2134,7 @@
 
 
     // $ANTLR start "ruleUnreservedName"
-    // InternalBase.g:773:1: ruleUnreservedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_UnrestrictedName_0= ruleUnrestrictedName ;
+    // InternalBase.g:775:1: ruleUnreservedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_UnrestrictedName_0= ruleUnrestrictedName ;
     public final AntlrDatatypeRuleToken ruleUnreservedName() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -2144,8 +2144,8 @@
          enterRule();
 
         try {
-            // InternalBase.g:776:28: (this_UnrestrictedName_0= ruleUnrestrictedName )
-            // InternalBase.g:778:5: this_UnrestrictedName_0= ruleUnrestrictedName
+            // InternalBase.g:778:28: (this_UnrestrictedName_0= ruleUnrestrictedName )
+            // InternalBase.g:780:5: this_UnrestrictedName_0= ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -2187,7 +2187,7 @@
 
 
     // $ANTLR start "entryRuleUnrestrictedName"
-    // InternalBase.g:796:1: entryRuleUnrestrictedName returns [String current=null] : iv_ruleUnrestrictedName= ruleUnrestrictedName EOF ;
+    // InternalBase.g:798:1: entryRuleUnrestrictedName returns [String current=null] : iv_ruleUnrestrictedName= ruleUnrestrictedName EOF ;
     public final String entryRuleUnrestrictedName() throws RecognitionException {
         String current = null;
 
@@ -2195,8 +2195,8 @@
 
 
         try {
-            // InternalBase.g:797:2: (iv_ruleUnrestrictedName= ruleUnrestrictedName EOF )
-            // InternalBase.g:798:2: iv_ruleUnrestrictedName= ruleUnrestrictedName EOF
+            // InternalBase.g:799:2: (iv_ruleUnrestrictedName= ruleUnrestrictedName EOF )
+            // InternalBase.g:800:2: iv_ruleUnrestrictedName= ruleUnrestrictedName EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUnrestrictedNameRule());
@@ -2227,7 +2227,7 @@
 
 
     // $ANTLR start "ruleUnrestrictedName"
-    // InternalBase.g:805:1: ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_Identifier_0= ruleIdentifier ;
+    // InternalBase.g:807:1: ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_Identifier_0= ruleIdentifier ;
     public final AntlrDatatypeRuleToken ruleUnrestrictedName() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -2237,8 +2237,8 @@
          enterRule();
 
         try {
-            // InternalBase.g:808:28: (this_Identifier_0= ruleIdentifier )
-            // InternalBase.g:810:5: this_Identifier_0= ruleIdentifier
+            // InternalBase.g:810:28: (this_Identifier_0= ruleIdentifier )
+            // InternalBase.g:812:5: this_Identifier_0= ruleIdentifier
             {
             if ( state.backtracking==0 ) {
 
@@ -2280,7 +2280,7 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalBase.g:828:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
+    // InternalBase.g:830:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
     public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -2288,8 +2288,8 @@
 
 
         try {
-            // InternalBase.g:829:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
-            // InternalBase.g:830:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
+            // InternalBase.g:831:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
+            // InternalBase.g:832:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
@@ -2320,7 +2320,7 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalBase.g:837:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
+    // InternalBase.g:839:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
     public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -2332,14 +2332,14 @@
          enterRule();
 
         try {
-            // InternalBase.g:840:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
-            // InternalBase.g:841:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalBase.g:842:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
+            // InternalBase.g:843:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
             {
-            // InternalBase.g:841:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
-            // InternalBase.g:841:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalBase.g:843:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalBase.g:843:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             {
-            // InternalBase.g:841:2: ()
-            // InternalBase.g:842:2:
+            // InternalBase.g:843:2: ()
+            // InternalBase.g:844:2:
             {
             if ( state.backtracking==0 ) {
 
@@ -2362,7 +2362,7 @@
                   	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
 
             }
-            // InternalBase.g:854:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalBase.g:856:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             int alt12=2;
             int LA12_0 = input.LA(1);
 
@@ -2371,7 +2371,7 @@
             }
             switch (alt12) {
                 case 1 :
-                    // InternalBase.g:854:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalBase.g:856:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                     {
                     otherlv_2=(Token)match(input,26,FollowSets000.FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -2379,11 +2379,11 @@
                           	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
 
                     }
-                    // InternalBase.g:858:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
-                    // InternalBase.g:859:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalBase.g:860:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalBase.g:861:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                     {
-                    // InternalBase.g:859:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
-                    // InternalBase.g:860:3: lv_ownedExtends_3_0= ruleTypedRefCS
+                    // InternalBase.g:861:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalBase.g:862:3: lv_ownedExtends_3_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -2443,7 +2443,7 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalBase.g:884:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
+    // InternalBase.g:886:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
     public final String entryRuleID() throws RecognitionException {
         String current = null;
 
@@ -2451,8 +2451,8 @@
 
 
         try {
-            // InternalBase.g:885:2: (iv_ruleID= ruleID EOF )
-            // InternalBase.g:886:2: iv_ruleID= ruleID EOF
+            // InternalBase.g:887:2: (iv_ruleID= ruleID EOF )
+            // InternalBase.g:888:2: iv_ruleID= ruleID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIDRule());
@@ -2483,7 +2483,7 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalBase.g:893:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
+    // InternalBase.g:895:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
     public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -2493,10 +2493,10 @@
          enterRule();
 
         try {
-            // InternalBase.g:896:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
-            // InternalBase.g:897:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalBase.g:898:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
+            // InternalBase.g:899:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             {
-            // InternalBase.g:897:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalBase.g:899:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             int alt13=2;
             int LA13_0 = input.LA(1);
 
@@ -2515,7 +2515,7 @@
             }
             switch (alt13) {
                 case 1 :
-                    // InternalBase.g:897:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
+                    // InternalBase.g:899:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                     {
                     this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -2532,7 +2532,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:905:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
+                    // InternalBase.g:907:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                     {
                     this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -2571,7 +2571,7 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalBase.g:920:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
+    // InternalBase.g:922:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
     public final String entryRuleIdentifier() throws RecognitionException {
         String current = null;
 
@@ -2579,8 +2579,8 @@
 
 
         try {
-            // InternalBase.g:921:2: (iv_ruleIdentifier= ruleIdentifier EOF )
-            // InternalBase.g:922:2: iv_ruleIdentifier= ruleIdentifier EOF
+            // InternalBase.g:923:2: (iv_ruleIdentifier= ruleIdentifier EOF )
+            // InternalBase.g:924:2: iv_ruleIdentifier= ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIdentifierRule());
@@ -2611,7 +2611,7 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalBase.g:929:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
+    // InternalBase.g:931:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
     public final AntlrDatatypeRuleToken ruleIdentifier() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -2621,8 +2621,8 @@
          enterRule();
 
         try {
-            // InternalBase.g:932:28: (this_ID_0= ruleID )
-            // InternalBase.g:934:5: this_ID_0= ruleID
+            // InternalBase.g:934:28: (this_ID_0= ruleID )
+            // InternalBase.g:936:5: this_ID_0= ruleID
             {
             if ( state.backtracking==0 ) {
 
@@ -2664,7 +2664,7 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalBase.g:952:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
+    // InternalBase.g:954:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
     public final String entryRuleLOWER() throws RecognitionException {
         String current = null;
 
@@ -2672,8 +2672,8 @@
 
 
         try {
-            // InternalBase.g:953:2: (iv_ruleLOWER= ruleLOWER EOF )
-            // InternalBase.g:954:2: iv_ruleLOWER= ruleLOWER EOF
+            // InternalBase.g:955:2: (iv_ruleLOWER= ruleLOWER EOF )
+            // InternalBase.g:956:2: iv_ruleLOWER= ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLOWERRule());
@@ -2704,7 +2704,7 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalBase.g:961:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalBase.g:963:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -2713,8 +2713,8 @@
          enterRule();
 
         try {
-            // InternalBase.g:964:28: (this_INT_0= RULE_INT )
-            // InternalBase.g:965:5: this_INT_0= RULE_INT
+            // InternalBase.g:966:28: (this_INT_0= RULE_INT )
+            // InternalBase.g:967:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -2747,7 +2747,7 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalBase.g:984:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
+    // InternalBase.g:986:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
     public final String entryRuleUPPER() throws RecognitionException {
         String current = null;
 
@@ -2755,8 +2755,8 @@
 
 
         try {
-            // InternalBase.g:985:2: (iv_ruleUPPER= ruleUPPER EOF )
-            // InternalBase.g:986:2: iv_ruleUPPER= ruleUPPER EOF
+            // InternalBase.g:987:2: (iv_ruleUPPER= ruleUPPER EOF )
+            // InternalBase.g:988:2: iv_ruleUPPER= ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUPPERRule());
@@ -2787,7 +2787,7 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalBase.g:993:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
+    // InternalBase.g:995:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -2797,10 +2797,10 @@
          enterRule();
 
         try {
-            // InternalBase.g:996:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
-            // InternalBase.g:997:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalBase.g:998:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
+            // InternalBase.g:999:1: (this_INT_0= RULE_INT | kw= '*' )
             {
-            // InternalBase.g:997:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalBase.g:999:1: (this_INT_0= RULE_INT | kw= '*' )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -2819,7 +2819,7 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalBase.g:997:6: this_INT_0= RULE_INT
+                    // InternalBase.g:999:6: this_INT_0= RULE_INT
                     {
                     this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -2836,7 +2836,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalBase.g:1006:2: kw= '*'
+                    // InternalBase.g:1008:2: kw= '*'
                     {
                     kw=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/serializer/AbstractBaseSemanticSequencer.java b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/serializer/AbstractBaseSemanticSequencer.java
index 364c6f5..fc5f20e 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/serializer/AbstractBaseSemanticSequencer.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/serializer/AbstractBaseSemanticSequencer.java
@@ -79,8 +79,15 @@
 				}
 				else break;
 			case BaseCSPackage.PATH_NAME_CS:
-				sequence_PathNameCS(context, (PathNameCS) semanticObject);
-				return;
+				if (rule == grammarAccess.getPathNameCSRule()) {
+					sequence_PathNameCS(context, (PathNameCS) semanticObject);
+					return;
+				}
+				else if (rule == grammarAccess.getUnreservedPathNameCSRule()) {
+					sequence_UnreservedPathNameCS(context, (PathNameCS) semanticObject);
+					return;
+				}
+				else break;
 			case BaseCSPackage.TEMPLATE_BINDING_CS:
 				sequence_TemplateBindingCS(context, (TemplateBindingCS) semanticObject);
 				return;
@@ -270,6 +277,18 @@
 
 	/**
 	 * Contexts:
+	 *     UnreservedPathNameCS returns PathNameCS
+	 *
+	 * Constraint:
+	 *     (ownedPathElements+=NextPathElementCS ownedPathElements+=NextPathElementCS*)
+	 */
+	protected void sequence_UnreservedPathNameCS(ISerializationContext context, PathNameCS semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+
+
+	/**
+	 * Contexts:
 	 *     TypeRefCS returns WildcardTypeRefCS
 	 *     WildcardTypeRefCS returns WildcardTypeRefCS
 	 *
diff --git a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/services/BaseGrammarAccess.java b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/services/BaseGrammarAccess.java
index 0be8cfd..cd45277 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/services/BaseGrammarAccess.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src-gen/org/eclipse/ocl/xtext/base/services/BaseGrammarAccess.java
@@ -172,6 +172,42 @@
 		public RuleCall getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0() { return cOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0; }
 	}
 
+	public class UnreservedPathNameCSElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cOwnedPathElementsAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cOwnedPathElementsNextPathElementCSParserRuleCall_0_0 = (RuleCall)cOwnedPathElementsAssignment_0.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cOwnedPathElementsAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0 = (RuleCall)cOwnedPathElementsAssignment_1_1.eContents().get(0);
+
+		//UnreservedPathNameCS PathNameCS:
+		//	ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*;
+		@Override public ParserRule getRule() { return rule; }
+
+		//ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*
+		public Group getGroup() { return cGroup; }
+
+		//ownedPathElements+=NextPathElementCS
+		public Assignment getOwnedPathElementsAssignment_0() { return cOwnedPathElementsAssignment_0; }
+
+		//NextPathElementCS
+		public RuleCall getOwnedPathElementsNextPathElementCSParserRuleCall_0_0() { return cOwnedPathElementsNextPathElementCSParserRuleCall_0_0; }
+
+		//('::' ownedPathElements+=NextPathElementCS)*
+		public Group getGroup_1() { return cGroup_1; }
+
+		//'::'
+		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
+
+		//ownedPathElements+=NextPathElementCS
+		public Assignment getOwnedPathElementsAssignment_1_1() { return cOwnedPathElementsAssignment_1_1; }
+
+		//NextPathElementCS
+		public RuleCall getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0() { return cOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0; }
+	}
+
 	public class FirstPathElementCSElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.ocl.xtext.base.Base.FirstPathElementCS");
 		private final Assignment cReferredElementAssignment = (Assignment)rule.eContents().get(1);
@@ -619,6 +655,7 @@
 	private final MultiplicityCSElements pMultiplicityCS;
 	private final MultiplicityStringCSElements pMultiplicityStringCS;
 	private final PathNameCSElements pPathNameCS;
+	private final UnreservedPathNameCSElements pUnreservedPathNameCS;
 	private final FirstPathElementCSElements pFirstPathElementCS;
 	private final NextPathElementCSElements pNextPathElementCS;
 	private final TemplateBindingCSElements pTemplateBindingCS;
@@ -660,6 +697,7 @@
 		this.pMultiplicityCS = new MultiplicityCSElements();
 		this.pMultiplicityStringCS = new MultiplicityStringCSElements();
 		this.pPathNameCS = new PathNameCSElements();
+		this.pUnreservedPathNameCS = new UnreservedPathNameCSElements();
 		this.pFirstPathElementCS = new FirstPathElementCSElements();
 		this.pNextPathElementCS = new NextPathElementCSElements();
 		this.pTemplateBindingCS = new TemplateBindingCSElements();
@@ -756,6 +794,16 @@
 		return getPathNameCSAccess().getRule();
 	}
 
+	//UnreservedPathNameCS PathNameCS:
+	//	ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*;
+	public UnreservedPathNameCSElements getUnreservedPathNameCSAccess() {
+		return pUnreservedPathNameCS;
+	}
+
+	public ParserRule getUnreservedPathNameCSRule() {
+		return getUnreservedPathNameCSAccess().getRule();
+	}
+
 	//FirstPathElementCS PathElementCS:
 	//	referredElement=[pivot::NamedElement|UnrestrictedName];
 	public FirstPathElementCSElements getFirstPathElementCSAccess() {
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/CompleteOCLParser.java b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/CompleteOCLParser.java
index 937af98..c96f11a 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/CompleteOCLParser.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/CompleteOCLParser.java
@@ -213,6 +213,8 @@
 					put(grammarAccess.getMultiplicityCSAccess().getGroup(), "rule__MultiplicityCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup(), "rule__PathNameCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup_1(), "rule__PathNameCS__Group_1__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup(), "rule__UnreservedPathNameCS__Group__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1(), "rule__UnreservedPathNameCS__Group_1__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup(), "rule__TemplateBindingCS__Group__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup_1(), "rule__TemplateBindingCS__Group_1__0");
 					put(grammarAccess.getTypeParameterCSAccess().getGroup(), "rule__TypeParameterCS__Group__0");
@@ -393,6 +395,8 @@
 					put(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment(), "rule__MultiplicityStringCS__StringBoundsAssignment");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__PathNameCS__OwnedPathElementsAssignment_0");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__PathNameCS__OwnedPathElementsAssignment_1_1");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1");
 					put(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment(), "rule__FirstPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment(), "rule__NextPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0(), "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0");
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCL.g b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCL.g
index 4cd7ceb..b1584d7 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCL.g
+++ b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCL.g
@@ -2429,6 +2429,34 @@
 
 
 
+// Entry rule entryRuleUnreservedPathNameCS
+entryRuleUnreservedPathNameCS
+:
+{ before(grammarAccess.getUnreservedPathNameCSRule()); }
+	 ruleUnreservedPathNameCS
+{ after(grammarAccess.getUnreservedPathNameCSRule()); }
+	 EOF
+;
+
+// Rule UnreservedPathNameCS
+ruleUnreservedPathNameCS
+    @init {
+		int stackSize = keepStackSize();
+    }
+	:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getGroup()); }
+(rule__UnreservedPathNameCS__Group__0)
+{ after(grammarAccess.getUnreservedPathNameCSAccess().getGroup()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS
 :
@@ -15786,6 +15814,130 @@
 
 
 
+rule__UnreservedPathNameCS__Group__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__UnreservedPathNameCS__Group__0__Impl
+	rule__UnreservedPathNameCS__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnreservedPathNameCS__Group__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0()); }
+(rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0)
+{ after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnreservedPathNameCS__Group__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__UnreservedPathNameCS__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnreservedPathNameCS__Group__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1()); }
+(rule__UnreservedPathNameCS__Group_1__0)*
+{ after(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
+rule__UnreservedPathNameCS__Group_1__0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__UnreservedPathNameCS__Group_1__0__Impl
+	rule__UnreservedPathNameCS__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnreservedPathNameCS__Group_1__0__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getColonColonKeyword_1_0()); }
+
+	'::'
+
+{ after(grammarAccess.getUnreservedPathNameCSAccess().getColonColonKeyword_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnreservedPathNameCS__Group_1__1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+	rule__UnreservedPathNameCS__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnreservedPathNameCS__Group_1__1__Impl
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1()); }
+(rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1)
+{ after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+
+
+
+
 rule__TemplateBindingCS__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -16557,8 +16709,8 @@
     }
 :
 (
-{ before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_3_0()); }
-	rulePathNameCS{ after(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_3_0()); }
+{ before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0()); }
+	ruleUnreservedPathNameCS{ after(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0()); }
 )
 
 ;
@@ -16926,8 +17078,8 @@
     }
 :
 (
-{ before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0()); }
-	rulePathNameCS{ after(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0()); }
+{ before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0()); }
+	ruleUnreservedPathNameCS{ after(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0()); }
 )
 
 ;
@@ -17031,8 +17183,8 @@
     }
 :
 (
-{ before(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0()); }
-	rulePathNameCS{ after(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0()); }
+{ before(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0()); }
+	ruleUnreservedPathNameCS{ after(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0()); }
 )
 
 ;
@@ -17106,8 +17258,8 @@
     }
 :
 (
-{ before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0()); }
-	rulePathNameCS{ after(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0()); }
+{ before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0()); }
+	ruleUnreservedPathNameCS{ after(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0()); }
 )
 
 ;
@@ -19125,6 +19277,36 @@
 	restoreStackSize(stackSize);
 }
 
+rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_0_0()); }
+	ruleNextPathElementCS{ after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_0_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1
+    @init {
+		int stackSize = keepStackSize();
+    }
+:
+(
+{ before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0()); }
+	ruleNextPathElementCS{ after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0()); }
+)
+
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 rule__FirstPathElementCS__ReferredElementAssignment
     @init {
 		int stackSize = keepStackSize();
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLLexer.java b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLLexer.java
index bbf2cdc..32ac486 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLLexer.java
@@ -2036,8 +2036,8 @@
         try {
             int _type = RULE_UNQUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19317:22: ( '\\u00A3$%^\\u00A3$%^' )
-            // InternalCompleteOCL.g:19317:24: '\\u00A3$%^\\u00A3$%^'
+            // InternalCompleteOCL.g:19499:22: ( '\\u00A3$%^\\u00A3$%^' )
+            // InternalCompleteOCL.g:19499:24: '\\u00A3$%^\\u00A3$%^'
             {
             match("\u00A3$%^\u00A3$%^");
 
@@ -2055,8 +2055,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:19319:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalCompleteOCL.g:19319:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalCompleteOCL.g:19501:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalCompleteOCL.g:19501:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -2080,8 +2080,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:19321:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalCompleteOCL.g:19321:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalCompleteOCL.g:19503:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalCompleteOCL.g:19503:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2106,11 +2106,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19323:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalCompleteOCL.g:19323:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalCompleteOCL.g:19505:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalCompleteOCL.g:19505:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalCompleteOCL.g:19323:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalCompleteOCL.g:19505:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -2126,14 +2126,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalCompleteOCL.g:19323:34: RULE_ESCAPED_CHARACTER
+            	    // InternalCompleteOCL.g:19505:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalCompleteOCL.g:19323:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalCompleteOCL.g:19505:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2170,11 +2170,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19325:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalCompleteOCL.g:19325:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalCompleteOCL.g:19507:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalCompleteOCL.g:19507:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalCompleteOCL.g:19325:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalCompleteOCL.g:19507:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -2190,14 +2190,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalCompleteOCL.g:19325:35: RULE_ESCAPED_CHARACTER
+            	    // InternalCompleteOCL.g:19507:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalCompleteOCL.g:19325:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalCompleteOCL.g:19507:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2234,12 +2234,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19327:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalCompleteOCL.g:19327:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalCompleteOCL.g:19509:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalCompleteOCL.g:19509:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalCompleteOCL.g:19327:38: ( options {greedy=false; } : . )*
+            // InternalCompleteOCL.g:19509:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -2264,7 +2264,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalCompleteOCL.g:19327:66: .
+            	    // InternalCompleteOCL.g:19509:66: .
             	    {
             	    matchAny();
 
@@ -2294,11 +2294,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19329:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalCompleteOCL.g:19329:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalCompleteOCL.g:19511:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalCompleteOCL.g:19511:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalCompleteOCL.g:19329:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalCompleteOCL.g:19511:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -2347,8 +2347,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19331:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalCompleteOCL.g:19331:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalCompleteOCL.g:19513:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:19513:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -2368,10 +2368,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19333:10: ( ( '0' .. '9' )+ )
-            // InternalCompleteOCL.g:19333:12: ( '0' .. '9' )+
+            // InternalCompleteOCL.g:19515:10: ( ( '0' .. '9' )+ )
+            // InternalCompleteOCL.g:19515:12: ( '0' .. '9' )+
             {
-            // InternalCompleteOCL.g:19333:12: ( '0' .. '9' )+
+            // InternalCompleteOCL.g:19515:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -2385,7 +2385,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalCompleteOCL.g:19333:13: '0' .. '9'
+            	    // InternalCompleteOCL.g:19515:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -2417,12 +2417,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19335:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalCompleteOCL.g:19335:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalCompleteOCL.g:19517:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalCompleteOCL.g:19517:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalCompleteOCL.g:19335:24: ( options {greedy=false; } : . )*
+            // InternalCompleteOCL.g:19517:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -2447,7 +2447,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalCompleteOCL.g:19335:52: .
+            	    // InternalCompleteOCL.g:19517:52: .
             	    {
             	    matchAny();
 
@@ -2477,12 +2477,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19337:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalCompleteOCL.g:19337:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalCompleteOCL.g:19519:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalCompleteOCL.g:19519:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalCompleteOCL.g:19337:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalCompleteOCL.g:19519:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -2495,7 +2495,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalCompleteOCL.g:19337:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalCompleteOCL.g:19519:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2515,7 +2515,7 @@
                 }
             } while (true);
 
-            // InternalCompleteOCL.g:19337:40: ( ( '\\r' )? '\\n' )?
+            // InternalCompleteOCL.g:19519:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2524,9 +2524,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalCompleteOCL.g:19337:41: ( '\\r' )? '\\n'
+                    // InternalCompleteOCL.g:19519:41: ( '\\r' )? '\\n'
                     {
-                    // InternalCompleteOCL.g:19337:41: ( '\\r' )?
+                    // InternalCompleteOCL.g:19519:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -2535,7 +2535,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalCompleteOCL.g:19337:41: '\\r'
+                            // InternalCompleteOCL.g:19519:41: '\\r'
                             {
                             match('\r');
 
@@ -2567,10 +2567,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19339:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalCompleteOCL.g:19339:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalCompleteOCL.g:19521:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalCompleteOCL.g:19521:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalCompleteOCL.g:19339:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalCompleteOCL.g:19521:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -2624,8 +2624,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:19341:16: ( . )
-            // InternalCompleteOCL.g:19341:18: .
+            // InternalCompleteOCL.g:19523:16: ( . )
+            // InternalCompleteOCL.g:19523:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLParser.java b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLParser.java
index 39f9bd5..24f3284 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLParser.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl.ui/src-gen/org/eclipse/ocl/xtext/completeocl/ui/contentassist/antlr/internal/InternalCompleteOCLParser.java
@@ -7341,12 +7341,97 @@
     // $ANTLR end "rulePathNameCS"
 
 
+    // $ANTLR start "entryRuleUnreservedPathNameCS"
+    // InternalCompleteOCL.g:2433:1: entryRuleUnreservedPathNameCS : ruleUnreservedPathNameCS EOF ;
+    public final void entryRuleUnreservedPathNameCS() throws RecognitionException {
+        try {
+            // InternalCompleteOCL.g:2434:1: ( ruleUnreservedPathNameCS EOF )
+            // InternalCompleteOCL.g:2435:1: ruleUnreservedPathNameCS EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSRule());
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnreservedPathNameCS();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSRule());
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnreservedPathNameCS"
+
+
+    // $ANTLR start "ruleUnreservedPathNameCS"
+    // InternalCompleteOCL.g:2442:1: ruleUnreservedPathNameCS : ( ( rule__UnreservedPathNameCS__Group__0 ) ) ;
+    public final void ruleUnreservedPathNameCS() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:2446:2: ( ( ( rule__UnreservedPathNameCS__Group__0 ) ) )
+            // InternalCompleteOCL.g:2447:1: ( ( rule__UnreservedPathNameCS__Group__0 ) )
+            {
+            // InternalCompleteOCL.g:2447:1: ( ( rule__UnreservedPathNameCS__Group__0 ) )
+            // InternalCompleteOCL.g:2448:1: ( rule__UnreservedPathNameCS__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getGroup());
+            }
+            // InternalCompleteOCL.g:2449:1: ( rule__UnreservedPathNameCS__Group__0 )
+            // InternalCompleteOCL.g:2449:2: rule__UnreservedPathNameCS__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getGroup());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnreservedPathNameCS"
+
+
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalCompleteOCL.g:2433:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
+    // InternalCompleteOCL.g:2461:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
     public final void entryRuleFirstPathElementCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2434:1: ( ruleFirstPathElementCS EOF )
-            // InternalCompleteOCL.g:2435:1: ruleFirstPathElementCS EOF
+            // InternalCompleteOCL.g:2462:1: ( ruleFirstPathElementCS EOF )
+            // InternalCompleteOCL.g:2463:1: ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSRule());
@@ -7376,23 +7461,23 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalCompleteOCL.g:2442:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalCompleteOCL.g:2470:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleFirstPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2446:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
-            // InternalCompleteOCL.g:2447:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalCompleteOCL.g:2474:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
+            // InternalCompleteOCL.g:2475:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalCompleteOCL.g:2447:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
-            // InternalCompleteOCL.g:2448:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalCompleteOCL.g:2475:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalCompleteOCL.g:2476:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalCompleteOCL.g:2449:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
-            // InternalCompleteOCL.g:2449:2: rule__FirstPathElementCS__ReferredElementAssignment
+            // InternalCompleteOCL.g:2477:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalCompleteOCL.g:2477:2: rule__FirstPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__FirstPathElementCS__ReferredElementAssignment();
@@ -7427,11 +7512,11 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalCompleteOCL.g:2461:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
+    // InternalCompleteOCL.g:2489:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
     public final void entryRuleNextPathElementCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2462:1: ( ruleNextPathElementCS EOF )
-            // InternalCompleteOCL.g:2463:1: ruleNextPathElementCS EOF
+            // InternalCompleteOCL.g:2490:1: ( ruleNextPathElementCS EOF )
+            // InternalCompleteOCL.g:2491:1: ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSRule());
@@ -7461,23 +7546,23 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalCompleteOCL.g:2470:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalCompleteOCL.g:2498:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleNextPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2474:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
-            // InternalCompleteOCL.g:2475:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalCompleteOCL.g:2502:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
+            // InternalCompleteOCL.g:2503:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalCompleteOCL.g:2475:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
-            // InternalCompleteOCL.g:2476:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalCompleteOCL.g:2503:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalCompleteOCL.g:2504:1: ( rule__NextPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalCompleteOCL.g:2477:1: ( rule__NextPathElementCS__ReferredElementAssignment )
-            // InternalCompleteOCL.g:2477:2: rule__NextPathElementCS__ReferredElementAssignment
+            // InternalCompleteOCL.g:2505:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalCompleteOCL.g:2505:2: rule__NextPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NextPathElementCS__ReferredElementAssignment();
@@ -7512,11 +7597,11 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalCompleteOCL.g:2489:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
+    // InternalCompleteOCL.g:2517:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
     public final void entryRuleTemplateBindingCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2490:1: ( ruleTemplateBindingCS EOF )
-            // InternalCompleteOCL.g:2491:1: ruleTemplateBindingCS EOF
+            // InternalCompleteOCL.g:2518:1: ( ruleTemplateBindingCS EOF )
+            // InternalCompleteOCL.g:2519:1: ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSRule());
@@ -7546,23 +7631,23 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalCompleteOCL.g:2498:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
+    // InternalCompleteOCL.g:2526:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
     public final void ruleTemplateBindingCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2502:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
-            // InternalCompleteOCL.g:2503:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalCompleteOCL.g:2530:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
+            // InternalCompleteOCL.g:2531:1: ( ( rule__TemplateBindingCS__Group__0 ) )
             {
-            // InternalCompleteOCL.g:2503:1: ( ( rule__TemplateBindingCS__Group__0 ) )
-            // InternalCompleteOCL.g:2504:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalCompleteOCL.g:2531:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalCompleteOCL.g:2532:1: ( rule__TemplateBindingCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup());
             }
-            // InternalCompleteOCL.g:2505:1: ( rule__TemplateBindingCS__Group__0 )
-            // InternalCompleteOCL.g:2505:2: rule__TemplateBindingCS__Group__0
+            // InternalCompleteOCL.g:2533:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalCompleteOCL.g:2533:2: rule__TemplateBindingCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__0();
@@ -7597,11 +7682,11 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalCompleteOCL.g:2517:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalCompleteOCL.g:2545:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
     public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2518:1: ( ruleTemplateParameterSubstitutionCS EOF )
-            // InternalCompleteOCL.g:2519:1: ruleTemplateParameterSubstitutionCS EOF
+            // InternalCompleteOCL.g:2546:1: ( ruleTemplateParameterSubstitutionCS EOF )
+            // InternalCompleteOCL.g:2547:1: ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -7631,23 +7716,23 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalCompleteOCL.g:2526:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
+    // InternalCompleteOCL.g:2554:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
     public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2530:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
-            // InternalCompleteOCL.g:2531:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalCompleteOCL.g:2558:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
+            // InternalCompleteOCL.g:2559:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
             {
-            // InternalCompleteOCL.g:2531:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
-            // InternalCompleteOCL.g:2532:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalCompleteOCL.g:2559:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalCompleteOCL.g:2560:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
             }
-            // InternalCompleteOCL.g:2533:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
-            // InternalCompleteOCL.g:2533:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
+            // InternalCompleteOCL.g:2561:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalCompleteOCL.g:2561:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment();
@@ -7682,11 +7767,11 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalCompleteOCL.g:2545:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
+    // InternalCompleteOCL.g:2573:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
     public final void entryRuleTypeParameterCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2546:1: ( ruleTypeParameterCS EOF )
-            // InternalCompleteOCL.g:2547:1: ruleTypeParameterCS EOF
+            // InternalCompleteOCL.g:2574:1: ( ruleTypeParameterCS EOF )
+            // InternalCompleteOCL.g:2575:1: ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSRule());
@@ -7716,23 +7801,23 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalCompleteOCL.g:2554:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
+    // InternalCompleteOCL.g:2582:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
     public final void ruleTypeParameterCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2558:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
-            // InternalCompleteOCL.g:2559:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalCompleteOCL.g:2586:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
+            // InternalCompleteOCL.g:2587:1: ( ( rule__TypeParameterCS__Group__0 ) )
             {
-            // InternalCompleteOCL.g:2559:1: ( ( rule__TypeParameterCS__Group__0 ) )
-            // InternalCompleteOCL.g:2560:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalCompleteOCL.g:2587:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalCompleteOCL.g:2588:1: ( rule__TypeParameterCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup());
             }
-            // InternalCompleteOCL.g:2561:1: ( rule__TypeParameterCS__Group__0 )
-            // InternalCompleteOCL.g:2561:2: rule__TypeParameterCS__Group__0
+            // InternalCompleteOCL.g:2589:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalCompleteOCL.g:2589:2: rule__TypeParameterCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__0();
@@ -7767,11 +7852,11 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalCompleteOCL.g:2573:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
+    // InternalCompleteOCL.g:2601:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
     public final void entryRuleTypeRefCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2574:1: ( ruleTypeRefCS EOF )
-            // InternalCompleteOCL.g:2575:1: ruleTypeRefCS EOF
+            // InternalCompleteOCL.g:2602:1: ( ruleTypeRefCS EOF )
+            // InternalCompleteOCL.g:2603:1: ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSRule());
@@ -7801,23 +7886,23 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalCompleteOCL.g:2582:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
+    // InternalCompleteOCL.g:2610:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
     public final void ruleTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2586:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
-            // InternalCompleteOCL.g:2587:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalCompleteOCL.g:2614:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
+            // InternalCompleteOCL.g:2615:1: ( ( rule__TypeRefCS__Alternatives ) )
             {
-            // InternalCompleteOCL.g:2587:1: ( ( rule__TypeRefCS__Alternatives ) )
-            // InternalCompleteOCL.g:2588:1: ( rule__TypeRefCS__Alternatives )
+            // InternalCompleteOCL.g:2615:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalCompleteOCL.g:2616:1: ( rule__TypeRefCS__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSAccess().getAlternatives());
             }
-            // InternalCompleteOCL.g:2589:1: ( rule__TypeRefCS__Alternatives )
-            // InternalCompleteOCL.g:2589:2: rule__TypeRefCS__Alternatives
+            // InternalCompleteOCL.g:2617:1: ( rule__TypeRefCS__Alternatives )
+            // InternalCompleteOCL.g:2617:2: rule__TypeRefCS__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeRefCS__Alternatives();
@@ -7852,11 +7937,11 @@
 
 
     // $ANTLR start "entryRuleTypedTypeRefCS"
-    // InternalCompleteOCL.g:2601:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
+    // InternalCompleteOCL.g:2629:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
     public final void entryRuleTypedTypeRefCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2602:1: ( ruleTypedTypeRefCS EOF )
-            // InternalCompleteOCL.g:2603:1: ruleTypedTypeRefCS EOF
+            // InternalCompleteOCL.g:2630:1: ( ruleTypedTypeRefCS EOF )
+            // InternalCompleteOCL.g:2631:1: ruleTypedTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSRule());
@@ -7886,23 +7971,23 @@
 
 
     // $ANTLR start "ruleTypedTypeRefCS"
-    // InternalCompleteOCL.g:2610:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
+    // InternalCompleteOCL.g:2638:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
     public final void ruleTypedTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2614:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
-            // InternalCompleteOCL.g:2615:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
+            // InternalCompleteOCL.g:2642:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
+            // InternalCompleteOCL.g:2643:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
             {
-            // InternalCompleteOCL.g:2615:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
-            // InternalCompleteOCL.g:2616:1: ( rule__TypedTypeRefCS__Group__0 )
+            // InternalCompleteOCL.g:2643:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
+            // InternalCompleteOCL.g:2644:1: ( rule__TypedTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup());
             }
-            // InternalCompleteOCL.g:2617:1: ( rule__TypedTypeRefCS__Group__0 )
-            // InternalCompleteOCL.g:2617:2: rule__TypedTypeRefCS__Group__0
+            // InternalCompleteOCL.g:2645:1: ( rule__TypedTypeRefCS__Group__0 )
+            // InternalCompleteOCL.g:2645:2: rule__TypedTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__0();
@@ -7937,11 +8022,11 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalCompleteOCL.g:2629:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
+    // InternalCompleteOCL.g:2657:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
     public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2630:1: ( ruleWildcardTypeRefCS EOF )
-            // InternalCompleteOCL.g:2631:1: ruleWildcardTypeRefCS EOF
+            // InternalCompleteOCL.g:2658:1: ( ruleWildcardTypeRefCS EOF )
+            // InternalCompleteOCL.g:2659:1: ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSRule());
@@ -7971,23 +8056,23 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalCompleteOCL.g:2638:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
+    // InternalCompleteOCL.g:2666:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
     public final void ruleWildcardTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2642:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
-            // InternalCompleteOCL.g:2643:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalCompleteOCL.g:2670:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
+            // InternalCompleteOCL.g:2671:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
             {
-            // InternalCompleteOCL.g:2643:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
-            // InternalCompleteOCL.g:2644:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalCompleteOCL.g:2671:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalCompleteOCL.g:2672:1: ( rule__WildcardTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
             }
-            // InternalCompleteOCL.g:2645:1: ( rule__WildcardTypeRefCS__Group__0 )
-            // InternalCompleteOCL.g:2645:2: rule__WildcardTypeRefCS__Group__0
+            // InternalCompleteOCL.g:2673:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalCompleteOCL.g:2673:2: rule__WildcardTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__0();
@@ -8022,11 +8107,11 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalCompleteOCL.g:2657:1: entryRuleID : ruleID EOF ;
+    // InternalCompleteOCL.g:2685:1: entryRuleID : ruleID EOF ;
     public final void entryRuleID() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2658:1: ( ruleID EOF )
-            // InternalCompleteOCL.g:2659:1: ruleID EOF
+            // InternalCompleteOCL.g:2686:1: ( ruleID EOF )
+            // InternalCompleteOCL.g:2687:1: ruleID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDRule());
@@ -8056,23 +8141,23 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalCompleteOCL.g:2666:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
+    // InternalCompleteOCL.g:2694:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
     public final void ruleID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2670:2: ( ( ( rule__ID__Alternatives ) ) )
-            // InternalCompleteOCL.g:2671:1: ( ( rule__ID__Alternatives ) )
+            // InternalCompleteOCL.g:2698:2: ( ( ( rule__ID__Alternatives ) ) )
+            // InternalCompleteOCL.g:2699:1: ( ( rule__ID__Alternatives ) )
             {
-            // InternalCompleteOCL.g:2671:1: ( ( rule__ID__Alternatives ) )
-            // InternalCompleteOCL.g:2672:1: ( rule__ID__Alternatives )
+            // InternalCompleteOCL.g:2699:1: ( ( rule__ID__Alternatives ) )
+            // InternalCompleteOCL.g:2700:1: ( rule__ID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDAccess().getAlternatives());
             }
-            // InternalCompleteOCL.g:2673:1: ( rule__ID__Alternatives )
-            // InternalCompleteOCL.g:2673:2: rule__ID__Alternatives
+            // InternalCompleteOCL.g:2701:1: ( rule__ID__Alternatives )
+            // InternalCompleteOCL.g:2701:2: rule__ID__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ID__Alternatives();
@@ -8107,11 +8192,11 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalCompleteOCL.g:2685:1: entryRuleIdentifier : ruleIdentifier EOF ;
+    // InternalCompleteOCL.g:2713:1: entryRuleIdentifier : ruleIdentifier EOF ;
     public final void entryRuleIdentifier() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2686:1: ( ruleIdentifier EOF )
-            // InternalCompleteOCL.g:2687:1: ruleIdentifier EOF
+            // InternalCompleteOCL.g:2714:1: ( ruleIdentifier EOF )
+            // InternalCompleteOCL.g:2715:1: ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierRule());
@@ -8141,17 +8226,17 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalCompleteOCL.g:2694:1: ruleIdentifier : ( ruleID ) ;
+    // InternalCompleteOCL.g:2722:1: ruleIdentifier : ( ruleID ) ;
     public final void ruleIdentifier() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2698:2: ( ( ruleID ) )
-            // InternalCompleteOCL.g:2699:1: ( ruleID )
+            // InternalCompleteOCL.g:2726:2: ( ( ruleID ) )
+            // InternalCompleteOCL.g:2727:1: ( ruleID )
             {
-            // InternalCompleteOCL.g:2699:1: ( ruleID )
-            // InternalCompleteOCL.g:2700:1: ruleID
+            // InternalCompleteOCL.g:2727:1: ( ruleID )
+            // InternalCompleteOCL.g:2728:1: ruleID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierAccess().getIDParserRuleCall());
@@ -8186,11 +8271,11 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalCompleteOCL.g:2713:1: entryRuleLOWER : ruleLOWER EOF ;
+    // InternalCompleteOCL.g:2741:1: entryRuleLOWER : ruleLOWER EOF ;
     public final void entryRuleLOWER() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2714:1: ( ruleLOWER EOF )
-            // InternalCompleteOCL.g:2715:1: ruleLOWER EOF
+            // InternalCompleteOCL.g:2742:1: ( ruleLOWER EOF )
+            // InternalCompleteOCL.g:2743:1: ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERRule());
@@ -8220,17 +8305,17 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalCompleteOCL.g:2722:1: ruleLOWER : ( RULE_INT ) ;
+    // InternalCompleteOCL.g:2750:1: ruleLOWER : ( RULE_INT ) ;
     public final void ruleLOWER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2726:2: ( ( RULE_INT ) )
-            // InternalCompleteOCL.g:2727:1: ( RULE_INT )
+            // InternalCompleteOCL.g:2754:2: ( ( RULE_INT ) )
+            // InternalCompleteOCL.g:2755:1: ( RULE_INT )
             {
-            // InternalCompleteOCL.g:2727:1: ( RULE_INT )
-            // InternalCompleteOCL.g:2728:1: RULE_INT
+            // InternalCompleteOCL.g:2755:1: ( RULE_INT )
+            // InternalCompleteOCL.g:2756:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
@@ -8261,11 +8346,11 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalCompleteOCL.g:2741:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
+    // InternalCompleteOCL.g:2769:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
     public final void entryRuleNUMBER_LITERAL() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2742:1: ( ruleNUMBER_LITERAL EOF )
-            // InternalCompleteOCL.g:2743:1: ruleNUMBER_LITERAL EOF
+            // InternalCompleteOCL.g:2770:1: ( ruleNUMBER_LITERAL EOF )
+            // InternalCompleteOCL.g:2771:1: ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALRule());
@@ -8295,17 +8380,17 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalCompleteOCL.g:2750:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
+    // InternalCompleteOCL.g:2778:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
     public final void ruleNUMBER_LITERAL() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2754:2: ( ( RULE_INT ) )
-            // InternalCompleteOCL.g:2755:1: ( RULE_INT )
+            // InternalCompleteOCL.g:2782:2: ( ( RULE_INT ) )
+            // InternalCompleteOCL.g:2783:1: ( RULE_INT )
             {
-            // InternalCompleteOCL.g:2755:1: ( RULE_INT )
-            // InternalCompleteOCL.g:2756:1: RULE_INT
+            // InternalCompleteOCL.g:2783:1: ( RULE_INT )
+            // InternalCompleteOCL.g:2784:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());
@@ -8336,11 +8421,11 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalCompleteOCL.g:2769:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
+    // InternalCompleteOCL.g:2797:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
     public final void entryRuleStringLiteral() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2770:1: ( ruleStringLiteral EOF )
-            // InternalCompleteOCL.g:2771:1: ruleStringLiteral EOF
+            // InternalCompleteOCL.g:2798:1: ( ruleStringLiteral EOF )
+            // InternalCompleteOCL.g:2799:1: ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralRule());
@@ -8370,17 +8455,17 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalCompleteOCL.g:2778:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalCompleteOCL.g:2806:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleStringLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2782:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalCompleteOCL.g:2783:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:2810:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalCompleteOCL.g:2811:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalCompleteOCL.g:2783:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalCompleteOCL.g:2784:1: RULE_SINGLE_QUOTED_STRING
+            // InternalCompleteOCL.g:2811:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:2812:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -8411,11 +8496,11 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalCompleteOCL.g:2797:1: entryRuleUPPER : ruleUPPER EOF ;
+    // InternalCompleteOCL.g:2825:1: entryRuleUPPER : ruleUPPER EOF ;
     public final void entryRuleUPPER() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2798:1: ( ruleUPPER EOF )
-            // InternalCompleteOCL.g:2799:1: ruleUPPER EOF
+            // InternalCompleteOCL.g:2826:1: ( ruleUPPER EOF )
+            // InternalCompleteOCL.g:2827:1: ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERRule());
@@ -8445,23 +8530,23 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalCompleteOCL.g:2806:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
+    // InternalCompleteOCL.g:2834:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
     public final void ruleUPPER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2810:2: ( ( ( rule__UPPER__Alternatives ) ) )
-            // InternalCompleteOCL.g:2811:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalCompleteOCL.g:2838:2: ( ( ( rule__UPPER__Alternatives ) ) )
+            // InternalCompleteOCL.g:2839:1: ( ( rule__UPPER__Alternatives ) )
             {
-            // InternalCompleteOCL.g:2811:1: ( ( rule__UPPER__Alternatives ) )
-            // InternalCompleteOCL.g:2812:1: ( rule__UPPER__Alternatives )
+            // InternalCompleteOCL.g:2839:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalCompleteOCL.g:2840:1: ( rule__UPPER__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERAccess().getAlternatives());
             }
-            // InternalCompleteOCL.g:2813:1: ( rule__UPPER__Alternatives )
-            // InternalCompleteOCL.g:2813:2: rule__UPPER__Alternatives
+            // InternalCompleteOCL.g:2841:1: ( rule__UPPER__Alternatives )
+            // InternalCompleteOCL.g:2841:2: rule__UPPER__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UPPER__Alternatives();
@@ -8496,11 +8581,11 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalCompleteOCL.g:2825:1: entryRuleURI : ruleURI EOF ;
+    // InternalCompleteOCL.g:2853:1: entryRuleURI : ruleURI EOF ;
     public final void entryRuleURI() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:2826:1: ( ruleURI EOF )
-            // InternalCompleteOCL.g:2827:1: ruleURI EOF
+            // InternalCompleteOCL.g:2854:1: ( ruleURI EOF )
+            // InternalCompleteOCL.g:2855:1: ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIRule());
@@ -8530,17 +8615,17 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalCompleteOCL.g:2834:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalCompleteOCL.g:2862:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleURI() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2838:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalCompleteOCL.g:2839:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:2866:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalCompleteOCL.g:2867:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalCompleteOCL.g:2839:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalCompleteOCL.g:2840:1: RULE_SINGLE_QUOTED_STRING
+            // InternalCompleteOCL.g:2867:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:2868:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -8571,13 +8656,13 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__Alternatives_1"
-    // InternalCompleteOCL.g:2853:1: rule__CompleteOCLDocumentCS__Alternatives_1 : ( ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) ) | ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) ) );
+    // InternalCompleteOCL.g:2881:1: rule__CompleteOCLDocumentCS__Alternatives_1 : ( ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) ) | ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) ) );
     public final void rule__CompleteOCLDocumentCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2857:1: ( ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) ) | ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:2885:1: ( ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) ) | ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) ) )
             int alt2=2;
             int LA2_0 = input.LA(1);
 
@@ -8596,16 +8681,16 @@
             }
             switch (alt2) {
                 case 1 :
-                    // InternalCompleteOCL.g:2858:1: ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) )
+                    // InternalCompleteOCL.g:2886:1: ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) )
                     {
-                    // InternalCompleteOCL.g:2858:1: ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) )
-                    // InternalCompleteOCL.g:2859:1: ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 )
+                    // InternalCompleteOCL.g:2886:1: ( ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 ) )
+                    // InternalCompleteOCL.g:2887:1: ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCompleteOCLDocumentCSAccess().getOwnedPackagesAssignment_1_0());
                     }
-                    // InternalCompleteOCL.g:2860:1: ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 )
-                    // InternalCompleteOCL.g:2860:2: rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0
+                    // InternalCompleteOCL.g:2888:1: ( rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 )
+                    // InternalCompleteOCL.g:2888:2: rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0();
@@ -8625,16 +8710,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:2864:6: ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) )
+                    // InternalCompleteOCL.g:2892:6: ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) )
                     {
-                    // InternalCompleteOCL.g:2864:6: ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) )
-                    // InternalCompleteOCL.g:2865:1: ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 )
+                    // InternalCompleteOCL.g:2892:6: ( ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 ) )
+                    // InternalCompleteOCL.g:2893:1: ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCompleteOCLDocumentCSAccess().getOwnedContextsAssignment_1_1());
                     }
-                    // InternalCompleteOCL.g:2866:1: ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 )
-                    // InternalCompleteOCL.g:2866:2: rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1
+                    // InternalCompleteOCL.g:2894:1: ( rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 )
+                    // InternalCompleteOCL.g:2894:2: rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1();
@@ -8671,13 +8756,13 @@
 
 
     // $ANTLR start "rule__CompleteOCLNavigationOperatorName__Alternatives"
-    // InternalCompleteOCL.g:2875:1: rule__CompleteOCLNavigationOperatorName__Alternatives : ( ( '^' ) | ( '^^' ) );
+    // InternalCompleteOCL.g:2903:1: rule__CompleteOCLNavigationOperatorName__Alternatives : ( ( '^' ) | ( '^^' ) );
     public final void rule__CompleteOCLNavigationOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2879:1: ( ( '^' ) | ( '^^' ) )
+            // InternalCompleteOCL.g:2907:1: ( ( '^' ) | ( '^^' ) )
             int alt3=2;
             int LA3_0 = input.LA(1);
 
@@ -8696,10 +8781,10 @@
             }
             switch (alt3) {
                 case 1 :
-                    // InternalCompleteOCL.g:2880:1: ( '^' )
+                    // InternalCompleteOCL.g:2908:1: ( '^' )
                     {
-                    // InternalCompleteOCL.g:2880:1: ( '^' )
-                    // InternalCompleteOCL.g:2881:1: '^'
+                    // InternalCompleteOCL.g:2908:1: ( '^' )
+                    // InternalCompleteOCL.g:2909:1: '^'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCompleteOCLNavigationOperatorNameAccess().getCircumflexAccentKeyword_0());
@@ -8715,10 +8800,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:2888:6: ( '^^' )
+                    // InternalCompleteOCL.g:2916:6: ( '^^' )
                     {
-                    // InternalCompleteOCL.g:2888:6: ( '^^' )
-                    // InternalCompleteOCL.g:2889:1: '^^'
+                    // InternalCompleteOCL.g:2916:6: ( '^^' )
+                    // InternalCompleteOCL.g:2917:1: '^^'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCompleteOCLNavigationOperatorNameAccess().getCircumflexAccentCircumflexAccentKeyword_1());
@@ -8751,13 +8836,13 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Alternatives_4"
-    // InternalCompleteOCL.g:2901:1: rule__ClassifierContextDeclCS__Alternatives_4 : ( ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) ) | ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) ) );
+    // InternalCompleteOCL.g:2929:1: rule__ClassifierContextDeclCS__Alternatives_4 : ( ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) ) | ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) ) );
     public final void rule__ClassifierContextDeclCS__Alternatives_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2905:1: ( ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) ) | ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) ) )
+            // InternalCompleteOCL.g:2933:1: ( ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) ) | ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) ) )
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -8776,16 +8861,16 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalCompleteOCL.g:2906:1: ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) )
+                    // InternalCompleteOCL.g:2934:1: ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:2906:1: ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) )
-                    // InternalCompleteOCL.g:2907:1: ( rule__ClassifierContextDeclCS__Group_4_0__0 )
+                    // InternalCompleteOCL.g:2934:1: ( ( rule__ClassifierContextDeclCS__Group_4_0__0 ) )
+                    // InternalCompleteOCL.g:2935:1: ( rule__ClassifierContextDeclCS__Group_4_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getClassifierContextDeclCSAccess().getGroup_4_0());
                     }
-                    // InternalCompleteOCL.g:2908:1: ( rule__ClassifierContextDeclCS__Group_4_0__0 )
-                    // InternalCompleteOCL.g:2908:2: rule__ClassifierContextDeclCS__Group_4_0__0
+                    // InternalCompleteOCL.g:2936:1: ( rule__ClassifierContextDeclCS__Group_4_0__0 )
+                    // InternalCompleteOCL.g:2936:2: rule__ClassifierContextDeclCS__Group_4_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ClassifierContextDeclCS__Group_4_0__0();
@@ -8805,16 +8890,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:2912:6: ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) )
+                    // InternalCompleteOCL.g:2940:6: ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) )
                     {
-                    // InternalCompleteOCL.g:2912:6: ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) )
-                    // InternalCompleteOCL.g:2913:1: ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 )
+                    // InternalCompleteOCL.g:2940:6: ( ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 ) )
+                    // InternalCompleteOCL.g:2941:1: ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedDefinitionsAssignment_4_1());
                     }
-                    // InternalCompleteOCL.g:2914:1: ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 )
-                    // InternalCompleteOCL.g:2914:2: rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1
+                    // InternalCompleteOCL.g:2942:1: ( rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 )
+                    // InternalCompleteOCL.g:2942:2: rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1();
@@ -8851,13 +8936,13 @@
 
 
     // $ANTLR start "rule__ContextDeclCS__Alternatives"
-    // InternalCompleteOCL.g:2923:1: rule__ContextDeclCS__Alternatives : ( ( rulePropertyContextDeclCS ) | ( ruleClassifierContextDeclCS ) | ( ruleOperationContextDeclCS ) );
+    // InternalCompleteOCL.g:2951:1: rule__ContextDeclCS__Alternatives : ( ( rulePropertyContextDeclCS ) | ( ruleClassifierContextDeclCS ) | ( ruleOperationContextDeclCS ) );
     public final void rule__ContextDeclCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2927:1: ( ( rulePropertyContextDeclCS ) | ( ruleClassifierContextDeclCS ) | ( ruleOperationContextDeclCS ) )
+            // InternalCompleteOCL.g:2955:1: ( ( rulePropertyContextDeclCS ) | ( ruleClassifierContextDeclCS ) | ( ruleOperationContextDeclCS ) )
             int alt5=3;
             int LA5_0 = input.LA(1);
 
@@ -8890,10 +8975,10 @@
             }
             switch (alt5) {
                 case 1 :
-                    // InternalCompleteOCL.g:2928:1: ( rulePropertyContextDeclCS )
+                    // InternalCompleteOCL.g:2956:1: ( rulePropertyContextDeclCS )
                     {
-                    // InternalCompleteOCL.g:2928:1: ( rulePropertyContextDeclCS )
-                    // InternalCompleteOCL.g:2929:1: rulePropertyContextDeclCS
+                    // InternalCompleteOCL.g:2956:1: ( rulePropertyContextDeclCS )
+                    // InternalCompleteOCL.g:2957:1: rulePropertyContextDeclCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getContextDeclCSAccess().getPropertyContextDeclCSParserRuleCall_0());
@@ -8913,10 +8998,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:2934:6: ( ruleClassifierContextDeclCS )
+                    // InternalCompleteOCL.g:2962:6: ( ruleClassifierContextDeclCS )
                     {
-                    // InternalCompleteOCL.g:2934:6: ( ruleClassifierContextDeclCS )
-                    // InternalCompleteOCL.g:2935:1: ruleClassifierContextDeclCS
+                    // InternalCompleteOCL.g:2962:6: ( ruleClassifierContextDeclCS )
+                    // InternalCompleteOCL.g:2963:1: ruleClassifierContextDeclCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getContextDeclCSAccess().getClassifierContextDeclCSParserRuleCall_1());
@@ -8936,10 +9021,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:2940:6: ( ruleOperationContextDeclCS )
+                    // InternalCompleteOCL.g:2968:6: ( ruleOperationContextDeclCS )
                     {
-                    // InternalCompleteOCL.g:2940:6: ( ruleOperationContextDeclCS )
-                    // InternalCompleteOCL.g:2941:1: ruleOperationContextDeclCS
+                    // InternalCompleteOCL.g:2968:6: ( ruleOperationContextDeclCS )
+                    // InternalCompleteOCL.g:2969:1: ruleOperationContextDeclCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getContextDeclCSAccess().getOperationContextDeclCSParserRuleCall_2());
@@ -8976,21 +9061,21 @@
 
 
     // $ANTLR start "rule__DefCS__Alternatives"
-    // InternalCompleteOCL.g:2951:1: rule__DefCS__Alternatives : ( ( ruleDefOperationCS ) | ( ruleDefPropertyCS ) );
+    // InternalCompleteOCL.g:2979:1: rule__DefCS__Alternatives : ( ( ruleDefOperationCS ) | ( ruleDefPropertyCS ) );
     public final void rule__DefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2955:1: ( ( ruleDefOperationCS ) | ( ruleDefPropertyCS ) )
+            // InternalCompleteOCL.g:2983:1: ( ( ruleDefOperationCS ) | ( ruleDefPropertyCS ) )
             int alt6=2;
             alt6 = dfa6.predict(input);
             switch (alt6) {
                 case 1 :
-                    // InternalCompleteOCL.g:2956:1: ( ruleDefOperationCS )
+                    // InternalCompleteOCL.g:2984:1: ( ruleDefOperationCS )
                     {
-                    // InternalCompleteOCL.g:2956:1: ( ruleDefOperationCS )
-                    // InternalCompleteOCL.g:2957:1: ruleDefOperationCS
+                    // InternalCompleteOCL.g:2984:1: ( ruleDefOperationCS )
+                    // InternalCompleteOCL.g:2985:1: ruleDefOperationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDefCSAccess().getDefOperationCSParserRuleCall_0());
@@ -9010,10 +9095,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:2962:6: ( ruleDefPropertyCS )
+                    // InternalCompleteOCL.g:2990:6: ( ruleDefPropertyCS )
                     {
-                    // InternalCompleteOCL.g:2962:6: ( ruleDefPropertyCS )
-                    // InternalCompleteOCL.g:2963:1: ruleDefPropertyCS
+                    // InternalCompleteOCL.g:2990:6: ( ruleDefPropertyCS )
+                    // InternalCompleteOCL.g:2991:1: ruleDefPropertyCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDefCSAccess().getDefPropertyCSParserRuleCall_1());
@@ -9050,13 +9135,13 @@
 
 
     // $ANTLR start "rule__ImportCS__Alternatives_0"
-    // InternalCompleteOCL.g:2973:1: rule__ImportCS__Alternatives_0 : ( ( 'import' ) | ( 'include' ) | ( 'library' ) );
+    // InternalCompleteOCL.g:3001:1: rule__ImportCS__Alternatives_0 : ( ( 'import' ) | ( 'include' ) | ( 'library' ) );
     public final void rule__ImportCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:2977:1: ( ( 'import' ) | ( 'include' ) | ( 'library' ) )
+            // InternalCompleteOCL.g:3005:1: ( ( 'import' ) | ( 'include' ) | ( 'library' ) )
             int alt7=3;
             switch ( input.LA(1) ) {
             case 19:
@@ -9084,10 +9169,10 @@
 
             switch (alt7) {
                 case 1 :
-                    // InternalCompleteOCL.g:2978:1: ( 'import' )
+                    // InternalCompleteOCL.g:3006:1: ( 'import' )
                     {
-                    // InternalCompleteOCL.g:2978:1: ( 'import' )
-                    // InternalCompleteOCL.g:2979:1: 'import'
+                    // InternalCompleteOCL.g:3006:1: ( 'import' )
+                    // InternalCompleteOCL.g:3007:1: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImportCSAccess().getImportKeyword_0_0());
@@ -9103,10 +9188,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:2986:6: ( 'include' )
+                    // InternalCompleteOCL.g:3014:6: ( 'include' )
                     {
-                    // InternalCompleteOCL.g:2986:6: ( 'include' )
-                    // InternalCompleteOCL.g:2987:1: 'include'
+                    // InternalCompleteOCL.g:3014:6: ( 'include' )
+                    // InternalCompleteOCL.g:3015:1: 'include'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImportCSAccess().getIncludeKeyword_0_1());
@@ -9122,10 +9207,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:2994:6: ( 'library' )
+                    // InternalCompleteOCL.g:3022:6: ( 'library' )
                     {
-                    // InternalCompleteOCL.g:2994:6: ( 'library' )
-                    // InternalCompleteOCL.g:2995:1: 'library'
+                    // InternalCompleteOCL.g:3022:6: ( 'library' )
+                    // InternalCompleteOCL.g:3023:1: 'library'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImportCSAccess().getLibraryKeyword_0_2());
@@ -9158,13 +9243,13 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Alternatives_8"
-    // InternalCompleteOCL.g:3007:1: rule__OperationContextDeclCS__Alternatives_8 : ( ( ( rule__OperationContextDeclCS__Group_8_0__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_1__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_2__0 ) ) );
+    // InternalCompleteOCL.g:3035:1: rule__OperationContextDeclCS__Alternatives_8 : ( ( ( rule__OperationContextDeclCS__Group_8_0__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_1__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_2__0 ) ) );
     public final void rule__OperationContextDeclCS__Alternatives_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3011:1: ( ( ( rule__OperationContextDeclCS__Group_8_0__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_1__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_2__0 ) ) )
+            // InternalCompleteOCL.g:3039:1: ( ( ( rule__OperationContextDeclCS__Group_8_0__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_1__0 ) ) | ( ( rule__OperationContextDeclCS__Group_8_2__0 ) ) )
             int alt8=3;
             switch ( input.LA(1) ) {
             case 72:
@@ -9192,16 +9277,16 @@
 
             switch (alt8) {
                 case 1 :
-                    // InternalCompleteOCL.g:3012:1: ( ( rule__OperationContextDeclCS__Group_8_0__0 ) )
+                    // InternalCompleteOCL.g:3040:1: ( ( rule__OperationContextDeclCS__Group_8_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3012:1: ( ( rule__OperationContextDeclCS__Group_8_0__0 ) )
-                    // InternalCompleteOCL.g:3013:1: ( rule__OperationContextDeclCS__Group_8_0__0 )
+                    // InternalCompleteOCL.g:3040:1: ( ( rule__OperationContextDeclCS__Group_8_0__0 ) )
+                    // InternalCompleteOCL.g:3041:1: ( rule__OperationContextDeclCS__Group_8_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationContextDeclCSAccess().getGroup_8_0());
                     }
-                    // InternalCompleteOCL.g:3014:1: ( rule__OperationContextDeclCS__Group_8_0__0 )
-                    // InternalCompleteOCL.g:3014:2: rule__OperationContextDeclCS__Group_8_0__0
+                    // InternalCompleteOCL.g:3042:1: ( rule__OperationContextDeclCS__Group_8_0__0 )
+                    // InternalCompleteOCL.g:3042:2: rule__OperationContextDeclCS__Group_8_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationContextDeclCS__Group_8_0__0();
@@ -9221,16 +9306,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3018:6: ( ( rule__OperationContextDeclCS__Group_8_1__0 ) )
+                    // InternalCompleteOCL.g:3046:6: ( ( rule__OperationContextDeclCS__Group_8_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:3018:6: ( ( rule__OperationContextDeclCS__Group_8_1__0 ) )
-                    // InternalCompleteOCL.g:3019:1: ( rule__OperationContextDeclCS__Group_8_1__0 )
+                    // InternalCompleteOCL.g:3046:6: ( ( rule__OperationContextDeclCS__Group_8_1__0 ) )
+                    // InternalCompleteOCL.g:3047:1: ( rule__OperationContextDeclCS__Group_8_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationContextDeclCSAccess().getGroup_8_1());
                     }
-                    // InternalCompleteOCL.g:3020:1: ( rule__OperationContextDeclCS__Group_8_1__0 )
-                    // InternalCompleteOCL.g:3020:2: rule__OperationContextDeclCS__Group_8_1__0
+                    // InternalCompleteOCL.g:3048:1: ( rule__OperationContextDeclCS__Group_8_1__0 )
+                    // InternalCompleteOCL.g:3048:2: rule__OperationContextDeclCS__Group_8_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationContextDeclCS__Group_8_1__0();
@@ -9250,16 +9335,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3024:6: ( ( rule__OperationContextDeclCS__Group_8_2__0 ) )
+                    // InternalCompleteOCL.g:3052:6: ( ( rule__OperationContextDeclCS__Group_8_2__0 ) )
                     {
-                    // InternalCompleteOCL.g:3024:6: ( ( rule__OperationContextDeclCS__Group_8_2__0 ) )
-                    // InternalCompleteOCL.g:3025:1: ( rule__OperationContextDeclCS__Group_8_2__0 )
+                    // InternalCompleteOCL.g:3052:6: ( ( rule__OperationContextDeclCS__Group_8_2__0 ) )
+                    // InternalCompleteOCL.g:3053:1: ( rule__OperationContextDeclCS__Group_8_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationContextDeclCSAccess().getGroup_8_2());
                     }
-                    // InternalCompleteOCL.g:3026:1: ( rule__OperationContextDeclCS__Group_8_2__0 )
-                    // InternalCompleteOCL.g:3026:2: rule__OperationContextDeclCS__Group_8_2__0
+                    // InternalCompleteOCL.g:3054:1: ( rule__OperationContextDeclCS__Group_8_2__0 )
+                    // InternalCompleteOCL.g:3054:2: rule__OperationContextDeclCS__Group_8_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationContextDeclCS__Group_8_2__0();
@@ -9296,13 +9381,13 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Alternatives_4"
-    // InternalCompleteOCL.g:3035:1: rule__PropertyContextDeclCS__Alternatives_4 : ( ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) ) | ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) ) );
+    // InternalCompleteOCL.g:3063:1: rule__PropertyContextDeclCS__Alternatives_4 : ( ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) ) | ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) ) );
     public final void rule__PropertyContextDeclCS__Alternatives_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3039:1: ( ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) ) | ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) ) )
+            // InternalCompleteOCL.g:3067:1: ( ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) ) | ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) ) )
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -9321,16 +9406,16 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalCompleteOCL.g:3040:1: ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) )
+                    // InternalCompleteOCL.g:3068:1: ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3040:1: ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) )
-                    // InternalCompleteOCL.g:3041:1: ( rule__PropertyContextDeclCS__Group_4_0__0 )
+                    // InternalCompleteOCL.g:3068:1: ( ( rule__PropertyContextDeclCS__Group_4_0__0 ) )
+                    // InternalCompleteOCL.g:3069:1: ( rule__PropertyContextDeclCS__Group_4_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPropertyContextDeclCSAccess().getGroup_4_0());
                     }
-                    // InternalCompleteOCL.g:3042:1: ( rule__PropertyContextDeclCS__Group_4_0__0 )
-                    // InternalCompleteOCL.g:3042:2: rule__PropertyContextDeclCS__Group_4_0__0
+                    // InternalCompleteOCL.g:3070:1: ( rule__PropertyContextDeclCS__Group_4_0__0 )
+                    // InternalCompleteOCL.g:3070:2: rule__PropertyContextDeclCS__Group_4_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PropertyContextDeclCS__Group_4_0__0();
@@ -9350,16 +9435,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3046:6: ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) )
+                    // InternalCompleteOCL.g:3074:6: ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:3046:6: ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) )
-                    // InternalCompleteOCL.g:3047:1: ( rule__PropertyContextDeclCS__Group_4_1__0 )
+                    // InternalCompleteOCL.g:3074:6: ( ( rule__PropertyContextDeclCS__Group_4_1__0 ) )
+                    // InternalCompleteOCL.g:3075:1: ( rule__PropertyContextDeclCS__Group_4_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPropertyContextDeclCSAccess().getGroup_4_1());
                     }
-                    // InternalCompleteOCL.g:3048:1: ( rule__PropertyContextDeclCS__Group_4_1__0 )
-                    // InternalCompleteOCL.g:3048:2: rule__PropertyContextDeclCS__Group_4_1__0
+                    // InternalCompleteOCL.g:3076:1: ( rule__PropertyContextDeclCS__Group_4_1__0 )
+                    // InternalCompleteOCL.g:3076:2: rule__PropertyContextDeclCS__Group_4_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PropertyContextDeclCS__Group_4_1__0();
@@ -9396,13 +9481,13 @@
 
 
     // $ANTLR start "rule__SpecificationCS__Alternatives"
-    // InternalCompleteOCL.g:3057:1: rule__SpecificationCS__Alternatives : ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) );
+    // InternalCompleteOCL.g:3085:1: rule__SpecificationCS__Alternatives : ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) );
     public final void rule__SpecificationCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3061:1: ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) )
+            // InternalCompleteOCL.g:3089:1: ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -9421,16 +9506,16 @@
             }
             switch (alt10) {
                 case 1 :
-                    // InternalCompleteOCL.g:3062:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
+                    // InternalCompleteOCL.g:3090:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
                     {
-                    // InternalCompleteOCL.g:3062:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
-                    // InternalCompleteOCL.g:3063:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
+                    // InternalCompleteOCL.g:3090:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
+                    // InternalCompleteOCL.g:3091:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionAssignment_0());
                     }
-                    // InternalCompleteOCL.g:3064:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
-                    // InternalCompleteOCL.g:3064:2: rule__SpecificationCS__OwnedExpressionAssignment_0
+                    // InternalCompleteOCL.g:3092:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
+                    // InternalCompleteOCL.g:3092:2: rule__SpecificationCS__OwnedExpressionAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__SpecificationCS__OwnedExpressionAssignment_0();
@@ -9450,16 +9535,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3068:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
+                    // InternalCompleteOCL.g:3096:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
                     {
-                    // InternalCompleteOCL.g:3068:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
-                    // InternalCompleteOCL.g:3069:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
+                    // InternalCompleteOCL.g:3096:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
+                    // InternalCompleteOCL.g:3097:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSpecificationCSAccess().getExprStringAssignment_1());
                     }
-                    // InternalCompleteOCL.g:3070:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
-                    // InternalCompleteOCL.g:3070:2: rule__SpecificationCS__ExprStringAssignment_1
+                    // InternalCompleteOCL.g:3098:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
+                    // InternalCompleteOCL.g:3098:2: rule__SpecificationCS__ExprStringAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__SpecificationCS__ExprStringAssignment_1();
@@ -9496,13 +9581,13 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Alternatives"
-    // InternalCompleteOCL.g:3079:1: rule__TemplateSignatureCS__Alternatives : ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) );
+    // InternalCompleteOCL.g:3107:1: rule__TemplateSignatureCS__Alternatives : ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) );
     public final void rule__TemplateSignatureCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3083:1: ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) )
+            // InternalCompleteOCL.g:3111:1: ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) )
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -9521,16 +9606,16 @@
             }
             switch (alt11) {
                 case 1 :
-                    // InternalCompleteOCL.g:3084:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3112:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3084:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3085:1: ( rule__TemplateSignatureCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3112:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3113:1: ( rule__TemplateSignatureCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3086:1: ( rule__TemplateSignatureCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3086:2: rule__TemplateSignatureCS__Group_0__0
+                    // InternalCompleteOCL.g:3114:1: ( rule__TemplateSignatureCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3114:2: rule__TemplateSignatureCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateSignatureCS__Group_0__0();
@@ -9550,16 +9635,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3090:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
+                    // InternalCompleteOCL.g:3118:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:3090:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
-                    // InternalCompleteOCL.g:3091:1: ( rule__TemplateSignatureCS__Group_1__0 )
+                    // InternalCompleteOCL.g:3118:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
+                    // InternalCompleteOCL.g:3119:1: ( rule__TemplateSignatureCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1());
                     }
-                    // InternalCompleteOCL.g:3092:1: ( rule__TemplateSignatureCS__Group_1__0 )
-                    // InternalCompleteOCL.g:3092:2: rule__TemplateSignatureCS__Group_1__0
+                    // InternalCompleteOCL.g:3120:1: ( rule__TemplateSignatureCS__Group_1__0 )
+                    // InternalCompleteOCL.g:3120:2: rule__TemplateSignatureCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateSignatureCS__Group_1__0();
@@ -9596,13 +9681,13 @@
 
 
     // $ANTLR start "rule__TypedRefCS__Alternatives"
-    // InternalCompleteOCL.g:3101:1: rule__TypedRefCS__Alternatives : ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) );
+    // InternalCompleteOCL.g:3129:1: rule__TypedRefCS__Alternatives : ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) );
     public final void rule__TypedRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3105:1: ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) )
+            // InternalCompleteOCL.g:3133:1: ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) )
             int alt12=2;
             int LA12_0 = input.LA(1);
 
@@ -9621,10 +9706,10 @@
             }
             switch (alt12) {
                 case 1 :
-                    // InternalCompleteOCL.g:3106:1: ( ruleTypeLiteralCS )
+                    // InternalCompleteOCL.g:3134:1: ( ruleTypeLiteralCS )
                     {
-                    // InternalCompleteOCL.g:3106:1: ( ruleTypeLiteralCS )
-                    // InternalCompleteOCL.g:3107:1: ruleTypeLiteralCS
+                    // InternalCompleteOCL.g:3134:1: ( ruleTypeLiteralCS )
+                    // InternalCompleteOCL.g:3135:1: ruleTypeLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getTypeLiteralCSParserRuleCall_0());
@@ -9644,10 +9729,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3112:6: ( ruleTypedTypeRefCS )
+                    // InternalCompleteOCL.g:3140:6: ( ruleTypedTypeRefCS )
                     {
-                    // InternalCompleteOCL.g:3112:6: ( ruleTypedTypeRefCS )
-                    // InternalCompleteOCL.g:3113:1: ruleTypedTypeRefCS
+                    // InternalCompleteOCL.g:3140:6: ( ruleTypedTypeRefCS )
+                    // InternalCompleteOCL.g:3141:1: ruleTypedTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_1());
@@ -9684,13 +9769,13 @@
 
 
     // $ANTLR start "rule__UnrestrictedName__Alternatives"
-    // InternalCompleteOCL.g:3123:1: rule__UnrestrictedName__Alternatives : ( ( ruleEssentialOCLUnrestrictedName ) | ( 'import' ) | ( 'include' ) | ( 'library' ) );
+    // InternalCompleteOCL.g:3151:1: rule__UnrestrictedName__Alternatives : ( ( ruleEssentialOCLUnrestrictedName ) | ( 'import' ) | ( 'include' ) | ( 'library' ) );
     public final void rule__UnrestrictedName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3127:1: ( ( ruleEssentialOCLUnrestrictedName ) | ( 'import' ) | ( 'include' ) | ( 'library' ) )
+            // InternalCompleteOCL.g:3155:1: ( ( ruleEssentialOCLUnrestrictedName ) | ( 'import' ) | ( 'include' ) | ( 'library' ) )
             int alt13=4;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -9724,10 +9809,10 @@
 
             switch (alt13) {
                 case 1 :
-                    // InternalCompleteOCL.g:3128:1: ( ruleEssentialOCLUnrestrictedName )
+                    // InternalCompleteOCL.g:3156:1: ( ruleEssentialOCLUnrestrictedName )
                     {
-                    // InternalCompleteOCL.g:3128:1: ( ruleEssentialOCLUnrestrictedName )
-                    // InternalCompleteOCL.g:3129:1: ruleEssentialOCLUnrestrictedName
+                    // InternalCompleteOCL.g:3156:1: ( ruleEssentialOCLUnrestrictedName )
+                    // InternalCompleteOCL.g:3157:1: ruleEssentialOCLUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall_0());
@@ -9747,10 +9832,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3134:6: ( 'import' )
+                    // InternalCompleteOCL.g:3162:6: ( 'import' )
                     {
-                    // InternalCompleteOCL.g:3134:6: ( 'import' )
-                    // InternalCompleteOCL.g:3135:1: 'import'
+                    // InternalCompleteOCL.g:3162:6: ( 'import' )
+                    // InternalCompleteOCL.g:3163:1: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getImportKeyword_1());
@@ -9766,10 +9851,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3142:6: ( 'include' )
+                    // InternalCompleteOCL.g:3170:6: ( 'include' )
                     {
-                    // InternalCompleteOCL.g:3142:6: ( 'include' )
-                    // InternalCompleteOCL.g:3143:1: 'include'
+                    // InternalCompleteOCL.g:3170:6: ( 'include' )
+                    // InternalCompleteOCL.g:3171:1: 'include'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getIncludeKeyword_2());
@@ -9785,10 +9870,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3150:6: ( 'library' )
+                    // InternalCompleteOCL.g:3178:6: ( 'library' )
                     {
-                    // InternalCompleteOCL.g:3150:6: ( 'library' )
-                    // InternalCompleteOCL.g:3151:1: 'library'
+                    // InternalCompleteOCL.g:3178:6: ( 'library' )
+                    // InternalCompleteOCL.g:3179:1: 'library'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getLibraryKeyword_3());
@@ -9821,13 +9906,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgExpCS__Alternatives"
-    // InternalCompleteOCL.g:3163:1: rule__NavigatingArgExpCS__Alternatives : ( ( ( rule__NavigatingArgExpCS__Group_0__0 ) ) | ( ruleExpCS ) );
+    // InternalCompleteOCL.g:3191:1: rule__NavigatingArgExpCS__Alternatives : ( ( ( rule__NavigatingArgExpCS__Group_0__0 ) ) | ( ruleExpCS ) );
     public final void rule__NavigatingArgExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3167:1: ( ( ( rule__NavigatingArgExpCS__Group_0__0 ) ) | ( ruleExpCS ) )
+            // InternalCompleteOCL.g:3195:1: ( ( ( rule__NavigatingArgExpCS__Group_0__0 ) ) | ( ruleExpCS ) )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -9846,16 +9931,16 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalCompleteOCL.g:3168:1: ( ( rule__NavigatingArgExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3196:1: ( ( rule__NavigatingArgExpCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3168:1: ( ( rule__NavigatingArgExpCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3169:1: ( rule__NavigatingArgExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3196:1: ( ( rule__NavigatingArgExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3197:1: ( rule__NavigatingArgExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgExpCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3170:1: ( rule__NavigatingArgExpCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3170:2: rule__NavigatingArgExpCS__Group_0__0
+                    // InternalCompleteOCL.g:3198:1: ( rule__NavigatingArgExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3198:2: rule__NavigatingArgExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgExpCS__Group_0__0();
@@ -9875,10 +9960,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3174:6: ( ruleExpCS )
+                    // InternalCompleteOCL.g:3202:6: ( ruleExpCS )
                     {
-                    // InternalCompleteOCL.g:3174:6: ( ruleExpCS )
-                    // InternalCompleteOCL.g:3175:1: ruleExpCS
+                    // InternalCompleteOCL.g:3202:6: ( ruleExpCS )
+                    // InternalCompleteOCL.g:3203:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgExpCSAccess().getExpCSParserRuleCall_1());
@@ -9915,13 +10000,13 @@
 
 
     // $ANTLR start "rule__NavigationOperatorName__Alternatives"
-    // InternalCompleteOCL.g:3185:1: rule__NavigationOperatorName__Alternatives : ( ( ruleEssentialOCLNavigationOperatorName ) | ( ruleCompleteOCLNavigationOperatorName ) );
+    // InternalCompleteOCL.g:3213:1: rule__NavigationOperatorName__Alternatives : ( ( ruleEssentialOCLNavigationOperatorName ) | ( ruleCompleteOCLNavigationOperatorName ) );
     public final void rule__NavigationOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3189:1: ( ( ruleEssentialOCLNavigationOperatorName ) | ( ruleCompleteOCLNavigationOperatorName ) )
+            // InternalCompleteOCL.g:3217:1: ( ( ruleEssentialOCLNavigationOperatorName ) | ( ruleCompleteOCLNavigationOperatorName ) )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -9940,10 +10025,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalCompleteOCL.g:3190:1: ( ruleEssentialOCLNavigationOperatorName )
+                    // InternalCompleteOCL.g:3218:1: ( ruleEssentialOCLNavigationOperatorName )
                     {
-                    // InternalCompleteOCL.g:3190:1: ( ruleEssentialOCLNavigationOperatorName )
-                    // InternalCompleteOCL.g:3191:1: ruleEssentialOCLNavigationOperatorName
+                    // InternalCompleteOCL.g:3218:1: ( ruleEssentialOCLNavigationOperatorName )
+                    // InternalCompleteOCL.g:3219:1: ruleEssentialOCLNavigationOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigationOperatorNameAccess().getEssentialOCLNavigationOperatorNameParserRuleCall_0());
@@ -9963,10 +10048,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3196:6: ( ruleCompleteOCLNavigationOperatorName )
+                    // InternalCompleteOCL.g:3224:6: ( ruleCompleteOCLNavigationOperatorName )
                     {
-                    // InternalCompleteOCL.g:3196:6: ( ruleCompleteOCLNavigationOperatorName )
-                    // InternalCompleteOCL.g:3197:1: ruleCompleteOCLNavigationOperatorName
+                    // InternalCompleteOCL.g:3224:6: ( ruleCompleteOCLNavigationOperatorName )
+                    // InternalCompleteOCL.g:3225:1: ruleCompleteOCLNavigationOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigationOperatorNameAccess().getCompleteOCLNavigationOperatorNameParserRuleCall_1());
@@ -10003,13 +10088,13 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeIdentifier__Alternatives"
-    // InternalCompleteOCL.g:3207:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclMessage' ) | ( 'OclState' ) | ( 'OclVoid' ) );
+    // InternalCompleteOCL.g:3235:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclMessage' ) | ( 'OclState' ) | ( 'OclVoid' ) );
     public final void rule__PrimitiveTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3211:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclMessage' ) | ( 'OclState' ) | ( 'OclVoid' ) )
+            // InternalCompleteOCL.g:3239:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclMessage' ) | ( 'OclState' ) | ( 'OclVoid' ) )
             int alt16=10;
             switch ( input.LA(1) ) {
             case 22:
@@ -10072,10 +10157,10 @@
 
             switch (alt16) {
                 case 1 :
-                    // InternalCompleteOCL.g:3212:1: ( 'Boolean' )
+                    // InternalCompleteOCL.g:3240:1: ( 'Boolean' )
                     {
-                    // InternalCompleteOCL.g:3212:1: ( 'Boolean' )
-                    // InternalCompleteOCL.g:3213:1: 'Boolean'
+                    // InternalCompleteOCL.g:3240:1: ( 'Boolean' )
+                    // InternalCompleteOCL.g:3241:1: 'Boolean'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
@@ -10091,10 +10176,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3220:6: ( 'Integer' )
+                    // InternalCompleteOCL.g:3248:6: ( 'Integer' )
                     {
-                    // InternalCompleteOCL.g:3220:6: ( 'Integer' )
-                    // InternalCompleteOCL.g:3221:1: 'Integer'
+                    // InternalCompleteOCL.g:3248:6: ( 'Integer' )
+                    // InternalCompleteOCL.g:3249:1: 'Integer'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
@@ -10110,10 +10195,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3228:6: ( 'Real' )
+                    // InternalCompleteOCL.g:3256:6: ( 'Real' )
                     {
-                    // InternalCompleteOCL.g:3228:6: ( 'Real' )
-                    // InternalCompleteOCL.g:3229:1: 'Real'
+                    // InternalCompleteOCL.g:3256:6: ( 'Real' )
+                    // InternalCompleteOCL.g:3257:1: 'Real'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
@@ -10129,10 +10214,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3236:6: ( 'String' )
+                    // InternalCompleteOCL.g:3264:6: ( 'String' )
                     {
-                    // InternalCompleteOCL.g:3236:6: ( 'String' )
-                    // InternalCompleteOCL.g:3237:1: 'String'
+                    // InternalCompleteOCL.g:3264:6: ( 'String' )
+                    // InternalCompleteOCL.g:3265:1: 'String'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
@@ -10148,10 +10233,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalCompleteOCL.g:3244:6: ( 'UnlimitedNatural' )
+                    // InternalCompleteOCL.g:3272:6: ( 'UnlimitedNatural' )
                     {
-                    // InternalCompleteOCL.g:3244:6: ( 'UnlimitedNatural' )
-                    // InternalCompleteOCL.g:3245:1: 'UnlimitedNatural'
+                    // InternalCompleteOCL.g:3272:6: ( 'UnlimitedNatural' )
+                    // InternalCompleteOCL.g:3273:1: 'UnlimitedNatural'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
@@ -10167,10 +10252,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalCompleteOCL.g:3252:6: ( 'OclAny' )
+                    // InternalCompleteOCL.g:3280:6: ( 'OclAny' )
                     {
-                    // InternalCompleteOCL.g:3252:6: ( 'OclAny' )
-                    // InternalCompleteOCL.g:3253:1: 'OclAny'
+                    // InternalCompleteOCL.g:3280:6: ( 'OclAny' )
+                    // InternalCompleteOCL.g:3281:1: 'OclAny'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
@@ -10186,10 +10271,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalCompleteOCL.g:3260:6: ( 'OclInvalid' )
+                    // InternalCompleteOCL.g:3288:6: ( 'OclInvalid' )
                     {
-                    // InternalCompleteOCL.g:3260:6: ( 'OclInvalid' )
-                    // InternalCompleteOCL.g:3261:1: 'OclInvalid'
+                    // InternalCompleteOCL.g:3288:6: ( 'OclInvalid' )
+                    // InternalCompleteOCL.g:3289:1: 'OclInvalid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
@@ -10205,10 +10290,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalCompleteOCL.g:3268:6: ( 'OclMessage' )
+                    // InternalCompleteOCL.g:3296:6: ( 'OclMessage' )
                     {
-                    // InternalCompleteOCL.g:3268:6: ( 'OclMessage' )
-                    // InternalCompleteOCL.g:3269:1: 'OclMessage'
+                    // InternalCompleteOCL.g:3296:6: ( 'OclMessage' )
+                    // InternalCompleteOCL.g:3297:1: 'OclMessage'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclMessageKeyword_7());
@@ -10224,10 +10309,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalCompleteOCL.g:3276:6: ( 'OclState' )
+                    // InternalCompleteOCL.g:3304:6: ( 'OclState' )
                     {
-                    // InternalCompleteOCL.g:3276:6: ( 'OclState' )
-                    // InternalCompleteOCL.g:3277:1: 'OclState'
+                    // InternalCompleteOCL.g:3304:6: ( 'OclState' )
+                    // InternalCompleteOCL.g:3305:1: 'OclState'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclStateKeyword_8());
@@ -10243,10 +10328,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalCompleteOCL.g:3284:6: ( 'OclVoid' )
+                    // InternalCompleteOCL.g:3312:6: ( 'OclVoid' )
                     {
-                    // InternalCompleteOCL.g:3284:6: ( 'OclVoid' )
-                    // InternalCompleteOCL.g:3285:1: 'OclVoid'
+                    // InternalCompleteOCL.g:3312:6: ( 'OclVoid' )
+                    // InternalCompleteOCL.g:3313:1: 'OclVoid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_9());
@@ -10279,13 +10364,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnaryOperatorName__Alternatives"
-    // InternalCompleteOCL.g:3298:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
+    // InternalCompleteOCL.g:3326:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
     public final void rule__EssentialOCLUnaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3302:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
+            // InternalCompleteOCL.g:3330:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
             int alt17=3;
             switch ( input.LA(1) ) {
             case 32:
@@ -10313,10 +10398,10 @@
 
             switch (alt17) {
                 case 1 :
-                    // InternalCompleteOCL.g:3303:1: ( '-' )
+                    // InternalCompleteOCL.g:3331:1: ( '-' )
                     {
-                    // InternalCompleteOCL.g:3303:1: ( '-' )
-                    // InternalCompleteOCL.g:3304:1: '-'
+                    // InternalCompleteOCL.g:3331:1: ( '-' )
+                    // InternalCompleteOCL.g:3332:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
@@ -10332,10 +10417,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3311:6: ( 'not' )
+                    // InternalCompleteOCL.g:3339:6: ( 'not' )
                     {
-                    // InternalCompleteOCL.g:3311:6: ( 'not' )
-                    // InternalCompleteOCL.g:3312:1: 'not'
+                    // InternalCompleteOCL.g:3339:6: ( 'not' )
+                    // InternalCompleteOCL.g:3340:1: 'not'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
@@ -10351,10 +10436,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3319:6: ( 'not2' )
+                    // InternalCompleteOCL.g:3347:6: ( 'not2' )
                     {
-                    // InternalCompleteOCL.g:3319:6: ( 'not2' )
-                    // InternalCompleteOCL.g:3320:1: 'not2'
+                    // InternalCompleteOCL.g:3347:6: ( 'not2' )
+                    // InternalCompleteOCL.g:3348:1: 'not2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());
@@ -10387,13 +10472,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLInfixOperatorName__Alternatives"
-    // InternalCompleteOCL.g:3332:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
+    // InternalCompleteOCL.g:3360:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
     public final void rule__EssentialOCLInfixOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3336:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
+            // InternalCompleteOCL.g:3364:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
             int alt18=18;
             switch ( input.LA(1) ) {
             case 35:
@@ -10496,10 +10581,10 @@
 
             switch (alt18) {
                 case 1 :
-                    // InternalCompleteOCL.g:3337:1: ( '*' )
+                    // InternalCompleteOCL.g:3365:1: ( '*' )
                     {
-                    // InternalCompleteOCL.g:3337:1: ( '*' )
-                    // InternalCompleteOCL.g:3338:1: '*'
+                    // InternalCompleteOCL.g:3365:1: ( '*' )
+                    // InternalCompleteOCL.g:3366:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
@@ -10515,10 +10600,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3345:6: ( '/' )
+                    // InternalCompleteOCL.g:3373:6: ( '/' )
                     {
-                    // InternalCompleteOCL.g:3345:6: ( '/' )
-                    // InternalCompleteOCL.g:3346:1: '/'
+                    // InternalCompleteOCL.g:3373:6: ( '/' )
+                    // InternalCompleteOCL.g:3374:1: '/'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
@@ -10534,10 +10619,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3353:6: ( '+' )
+                    // InternalCompleteOCL.g:3381:6: ( '+' )
                     {
-                    // InternalCompleteOCL.g:3353:6: ( '+' )
-                    // InternalCompleteOCL.g:3354:1: '+'
+                    // InternalCompleteOCL.g:3381:6: ( '+' )
+                    // InternalCompleteOCL.g:3382:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
@@ -10553,10 +10638,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3361:6: ( '-' )
+                    // InternalCompleteOCL.g:3389:6: ( '-' )
                     {
-                    // InternalCompleteOCL.g:3361:6: ( '-' )
-                    // InternalCompleteOCL.g:3362:1: '-'
+                    // InternalCompleteOCL.g:3389:6: ( '-' )
+                    // InternalCompleteOCL.g:3390:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
@@ -10572,10 +10657,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalCompleteOCL.g:3369:6: ( '>' )
+                    // InternalCompleteOCL.g:3397:6: ( '>' )
                     {
-                    // InternalCompleteOCL.g:3369:6: ( '>' )
-                    // InternalCompleteOCL.g:3370:1: '>'
+                    // InternalCompleteOCL.g:3397:6: ( '>' )
+                    // InternalCompleteOCL.g:3398:1: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
@@ -10591,10 +10676,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalCompleteOCL.g:3377:6: ( '<' )
+                    // InternalCompleteOCL.g:3405:6: ( '<' )
                     {
-                    // InternalCompleteOCL.g:3377:6: ( '<' )
-                    // InternalCompleteOCL.g:3378:1: '<'
+                    // InternalCompleteOCL.g:3405:6: ( '<' )
+                    // InternalCompleteOCL.g:3406:1: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
@@ -10610,10 +10695,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalCompleteOCL.g:3385:6: ( '>=' )
+                    // InternalCompleteOCL.g:3413:6: ( '>=' )
                     {
-                    // InternalCompleteOCL.g:3385:6: ( '>=' )
-                    // InternalCompleteOCL.g:3386:1: '>='
+                    // InternalCompleteOCL.g:3413:6: ( '>=' )
+                    // InternalCompleteOCL.g:3414:1: '>='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
@@ -10629,10 +10714,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalCompleteOCL.g:3393:6: ( '<=' )
+                    // InternalCompleteOCL.g:3421:6: ( '<=' )
                     {
-                    // InternalCompleteOCL.g:3393:6: ( '<=' )
-                    // InternalCompleteOCL.g:3394:1: '<='
+                    // InternalCompleteOCL.g:3421:6: ( '<=' )
+                    // InternalCompleteOCL.g:3422:1: '<='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
@@ -10648,10 +10733,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalCompleteOCL.g:3401:6: ( '=' )
+                    // InternalCompleteOCL.g:3429:6: ( '=' )
                     {
-                    // InternalCompleteOCL.g:3401:6: ( '=' )
-                    // InternalCompleteOCL.g:3402:1: '='
+                    // InternalCompleteOCL.g:3429:6: ( '=' )
+                    // InternalCompleteOCL.g:3430:1: '='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
@@ -10667,10 +10752,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalCompleteOCL.g:3409:6: ( '<>' )
+                    // InternalCompleteOCL.g:3437:6: ( '<>' )
                     {
-                    // InternalCompleteOCL.g:3409:6: ( '<>' )
-                    // InternalCompleteOCL.g:3410:1: '<>'
+                    // InternalCompleteOCL.g:3437:6: ( '<>' )
+                    // InternalCompleteOCL.g:3438:1: '<>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
@@ -10686,10 +10771,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalCompleteOCL.g:3417:6: ( 'and' )
+                    // InternalCompleteOCL.g:3445:6: ( 'and' )
                     {
-                    // InternalCompleteOCL.g:3417:6: ( 'and' )
-                    // InternalCompleteOCL.g:3418:1: 'and'
+                    // InternalCompleteOCL.g:3445:6: ( 'and' )
+                    // InternalCompleteOCL.g:3446:1: 'and'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
@@ -10705,10 +10790,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalCompleteOCL.g:3425:6: ( 'and2' )
+                    // InternalCompleteOCL.g:3453:6: ( 'and2' )
                     {
-                    // InternalCompleteOCL.g:3425:6: ( 'and2' )
-                    // InternalCompleteOCL.g:3426:1: 'and2'
+                    // InternalCompleteOCL.g:3453:6: ( 'and2' )
+                    // InternalCompleteOCL.g:3454:1: 'and2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());
@@ -10724,10 +10809,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalCompleteOCL.g:3433:6: ( 'implies' )
+                    // InternalCompleteOCL.g:3461:6: ( 'implies' )
                     {
-                    // InternalCompleteOCL.g:3433:6: ( 'implies' )
-                    // InternalCompleteOCL.g:3434:1: 'implies'
+                    // InternalCompleteOCL.g:3461:6: ( 'implies' )
+                    // InternalCompleteOCL.g:3462:1: 'implies'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());
@@ -10743,10 +10828,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalCompleteOCL.g:3441:6: ( 'implies2' )
+                    // InternalCompleteOCL.g:3469:6: ( 'implies2' )
                     {
-                    // InternalCompleteOCL.g:3441:6: ( 'implies2' )
-                    // InternalCompleteOCL.g:3442:1: 'implies2'
+                    // InternalCompleteOCL.g:3469:6: ( 'implies2' )
+                    // InternalCompleteOCL.g:3470:1: 'implies2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());
@@ -10762,10 +10847,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalCompleteOCL.g:3449:6: ( 'or' )
+                    // InternalCompleteOCL.g:3477:6: ( 'or' )
                     {
-                    // InternalCompleteOCL.g:3449:6: ( 'or' )
-                    // InternalCompleteOCL.g:3450:1: 'or'
+                    // InternalCompleteOCL.g:3477:6: ( 'or' )
+                    // InternalCompleteOCL.g:3478:1: 'or'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());
@@ -10781,10 +10866,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalCompleteOCL.g:3457:6: ( 'or2' )
+                    // InternalCompleteOCL.g:3485:6: ( 'or2' )
                     {
-                    // InternalCompleteOCL.g:3457:6: ( 'or2' )
-                    // InternalCompleteOCL.g:3458:1: 'or2'
+                    // InternalCompleteOCL.g:3485:6: ( 'or2' )
+                    // InternalCompleteOCL.g:3486:1: 'or2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());
@@ -10800,10 +10885,10 @@
                     }
                     break;
                 case 17 :
-                    // InternalCompleteOCL.g:3465:6: ( 'xor' )
+                    // InternalCompleteOCL.g:3493:6: ( 'xor' )
                     {
-                    // InternalCompleteOCL.g:3465:6: ( 'xor' )
-                    // InternalCompleteOCL.g:3466:1: 'xor'
+                    // InternalCompleteOCL.g:3493:6: ( 'xor' )
+                    // InternalCompleteOCL.g:3494:1: 'xor'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());
@@ -10819,10 +10904,10 @@
                     }
                     break;
                 case 18 :
-                    // InternalCompleteOCL.g:3473:6: ( 'xor2' )
+                    // InternalCompleteOCL.g:3501:6: ( 'xor2' )
                     {
-                    // InternalCompleteOCL.g:3473:6: ( 'xor2' )
-                    // InternalCompleteOCL.g:3474:1: 'xor2'
+                    // InternalCompleteOCL.g:3501:6: ( 'xor2' )
+                    // InternalCompleteOCL.g:3502:1: 'xor2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());
@@ -10855,13 +10940,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLNavigationOperatorName__Alternatives"
-    // InternalCompleteOCL.g:3486:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
+    // InternalCompleteOCL.g:3514:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
     public final void rule__EssentialOCLNavigationOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3490:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
+            // InternalCompleteOCL.g:3518:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
             int alt19=4;
             switch ( input.LA(1) ) {
             case 52:
@@ -10894,10 +10979,10 @@
 
             switch (alt19) {
                 case 1 :
-                    // InternalCompleteOCL.g:3491:1: ( '.' )
+                    // InternalCompleteOCL.g:3519:1: ( '.' )
                     {
-                    // InternalCompleteOCL.g:3491:1: ( '.' )
-                    // InternalCompleteOCL.g:3492:1: '.'
+                    // InternalCompleteOCL.g:3519:1: ( '.' )
+                    // InternalCompleteOCL.g:3520:1: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
@@ -10913,10 +10998,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3499:6: ( '->' )
+                    // InternalCompleteOCL.g:3527:6: ( '->' )
                     {
-                    // InternalCompleteOCL.g:3499:6: ( '->' )
-                    // InternalCompleteOCL.g:3500:1: '->'
+                    // InternalCompleteOCL.g:3527:6: ( '->' )
+                    // InternalCompleteOCL.g:3528:1: '->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
@@ -10932,10 +11017,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3507:6: ( '?.' )
+                    // InternalCompleteOCL.g:3535:6: ( '?.' )
                     {
-                    // InternalCompleteOCL.g:3507:6: ( '?.' )
-                    // InternalCompleteOCL.g:3508:1: '?.'
+                    // InternalCompleteOCL.g:3535:6: ( '?.' )
+                    // InternalCompleteOCL.g:3536:1: '?.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
@@ -10951,10 +11036,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3515:6: ( '?->' )
+                    // InternalCompleteOCL.g:3543:6: ( '?->' )
                     {
-                    // InternalCompleteOCL.g:3515:6: ( '?->' )
-                    // InternalCompleteOCL.g:3516:1: '?->'
+                    // InternalCompleteOCL.g:3543:6: ( '?->' )
+                    // InternalCompleteOCL.g:3544:1: '?->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
@@ -10987,13 +11072,13 @@
 
 
     // $ANTLR start "rule__BinaryOperatorName__Alternatives"
-    // InternalCompleteOCL.g:3528:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
+    // InternalCompleteOCL.g:3556:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
     public final void rule__BinaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3532:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
+            // InternalCompleteOCL.g:3560:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
             int alt20=2;
             int LA20_0 = input.LA(1);
 
@@ -11012,10 +11097,10 @@
             }
             switch (alt20) {
                 case 1 :
-                    // InternalCompleteOCL.g:3533:1: ( ruleInfixOperatorName )
+                    // InternalCompleteOCL.g:3561:1: ( ruleInfixOperatorName )
                     {
-                    // InternalCompleteOCL.g:3533:1: ( ruleInfixOperatorName )
-                    // InternalCompleteOCL.g:3534:1: ruleInfixOperatorName
+                    // InternalCompleteOCL.g:3561:1: ( ruleInfixOperatorName )
+                    // InternalCompleteOCL.g:3562:1: ruleInfixOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());
@@ -11035,10 +11120,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3539:6: ( ruleNavigationOperatorName )
+                    // InternalCompleteOCL.g:3567:6: ( ruleNavigationOperatorName )
                     {
-                    // InternalCompleteOCL.g:3539:6: ( ruleNavigationOperatorName )
-                    // InternalCompleteOCL.g:3540:1: ruleNavigationOperatorName
+                    // InternalCompleteOCL.g:3567:6: ( ruleNavigationOperatorName )
+                    // InternalCompleteOCL.g:3568:1: ruleNavigationOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());
@@ -11075,13 +11160,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnreservedName__Alternatives"
-    // InternalCompleteOCL.g:3550:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
+    // InternalCompleteOCL.g:3578:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
     public final void rule__EssentialOCLUnreservedName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3554:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
+            // InternalCompleteOCL.g:3582:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
             int alt21=5;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -11136,10 +11221,10 @@
 
             switch (alt21) {
                 case 1 :
-                    // InternalCompleteOCL.g:3555:1: ( ruleUnrestrictedName )
+                    // InternalCompleteOCL.g:3583:1: ( ruleUnrestrictedName )
                     {
-                    // InternalCompleteOCL.g:3555:1: ( ruleUnrestrictedName )
-                    // InternalCompleteOCL.g:3556:1: ruleUnrestrictedName
+                    // InternalCompleteOCL.g:3583:1: ( ruleUnrestrictedName )
+                    // InternalCompleteOCL.g:3584:1: ruleUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());
@@ -11159,10 +11244,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3561:6: ( ruleCollectionTypeIdentifier )
+                    // InternalCompleteOCL.g:3589:6: ( ruleCollectionTypeIdentifier )
                     {
-                    // InternalCompleteOCL.g:3561:6: ( ruleCollectionTypeIdentifier )
-                    // InternalCompleteOCL.g:3562:1: ruleCollectionTypeIdentifier
+                    // InternalCompleteOCL.g:3589:6: ( ruleCollectionTypeIdentifier )
+                    // InternalCompleteOCL.g:3590:1: ruleCollectionTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());
@@ -11182,10 +11267,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3567:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalCompleteOCL.g:3595:6: ( rulePrimitiveTypeIdentifier )
                     {
-                    // InternalCompleteOCL.g:3567:6: ( rulePrimitiveTypeIdentifier )
-                    // InternalCompleteOCL.g:3568:1: rulePrimitiveTypeIdentifier
+                    // InternalCompleteOCL.g:3595:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalCompleteOCL.g:3596:1: rulePrimitiveTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());
@@ -11205,10 +11290,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3573:6: ( 'Map' )
+                    // InternalCompleteOCL.g:3601:6: ( 'Map' )
                     {
-                    // InternalCompleteOCL.g:3573:6: ( 'Map' )
-                    // InternalCompleteOCL.g:3574:1: 'Map'
+                    // InternalCompleteOCL.g:3601:6: ( 'Map' )
+                    // InternalCompleteOCL.g:3602:1: 'Map'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
@@ -11224,10 +11309,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalCompleteOCL.g:3581:6: ( 'Tuple' )
+                    // InternalCompleteOCL.g:3609:6: ( 'Tuple' )
                     {
-                    // InternalCompleteOCL.g:3581:6: ( 'Tuple' )
-                    // InternalCompleteOCL.g:3582:1: 'Tuple'
+                    // InternalCompleteOCL.g:3609:6: ( 'Tuple' )
+                    // InternalCompleteOCL.g:3610:1: 'Tuple'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
@@ -11260,13 +11345,13 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Alternatives"
-    // InternalCompleteOCL.g:3594:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
+    // InternalCompleteOCL.g:3622:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
     public final void rule__URIFirstPathElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3598:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
+            // InternalCompleteOCL.g:3626:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
             int alt22=2;
             int LA22_0 = input.LA(1);
 
@@ -11285,16 +11370,16 @@
             }
             switch (alt22) {
                 case 1 :
-                    // InternalCompleteOCL.g:3599:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalCompleteOCL.g:3627:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                     {
-                    // InternalCompleteOCL.g:3599:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
-                    // InternalCompleteOCL.g:3600:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalCompleteOCL.g:3627:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalCompleteOCL.g:3628:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                     }
-                    // InternalCompleteOCL.g:3601:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
-                    // InternalCompleteOCL.g:3601:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
+                    // InternalCompleteOCL.g:3629:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalCompleteOCL.g:3629:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__ReferredElementAssignment_0();
@@ -11314,16 +11399,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3605:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalCompleteOCL.g:3633:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:3605:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
-                    // InternalCompleteOCL.g:3606:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalCompleteOCL.g:3633:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalCompleteOCL.g:3634:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                     }
-                    // InternalCompleteOCL.g:3607:1: ( rule__URIFirstPathElementCS__Group_1__0 )
-                    // InternalCompleteOCL.g:3607:2: rule__URIFirstPathElementCS__Group_1__0
+                    // InternalCompleteOCL.g:3635:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalCompleteOCL.g:3635:2: rule__URIFirstPathElementCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__Group_1__0();
@@ -11360,13 +11445,13 @@
 
 
     // $ANTLR start "rule__CollectionTypeIdentifier__Alternatives"
-    // InternalCompleteOCL.g:3616:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
+    // InternalCompleteOCL.g:3644:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
     public final void rule__CollectionTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3620:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
+            // InternalCompleteOCL.g:3648:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
             int alt23=5;
             switch ( input.LA(1) ) {
             case 58:
@@ -11404,10 +11489,10 @@
 
             switch (alt23) {
                 case 1 :
-                    // InternalCompleteOCL.g:3621:1: ( 'Set' )
+                    // InternalCompleteOCL.g:3649:1: ( 'Set' )
                     {
-                    // InternalCompleteOCL.g:3621:1: ( 'Set' )
-                    // InternalCompleteOCL.g:3622:1: 'Set'
+                    // InternalCompleteOCL.g:3649:1: ( 'Set' )
+                    // InternalCompleteOCL.g:3650:1: 'Set'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
@@ -11423,10 +11508,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3629:6: ( 'Bag' )
+                    // InternalCompleteOCL.g:3657:6: ( 'Bag' )
                     {
-                    // InternalCompleteOCL.g:3629:6: ( 'Bag' )
-                    // InternalCompleteOCL.g:3630:1: 'Bag'
+                    // InternalCompleteOCL.g:3657:6: ( 'Bag' )
+                    // InternalCompleteOCL.g:3658:1: 'Bag'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
@@ -11442,10 +11527,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3637:6: ( 'Sequence' )
+                    // InternalCompleteOCL.g:3665:6: ( 'Sequence' )
                     {
-                    // InternalCompleteOCL.g:3637:6: ( 'Sequence' )
-                    // InternalCompleteOCL.g:3638:1: 'Sequence'
+                    // InternalCompleteOCL.g:3665:6: ( 'Sequence' )
+                    // InternalCompleteOCL.g:3666:1: 'Sequence'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
@@ -11461,10 +11546,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3645:6: ( 'Collection' )
+                    // InternalCompleteOCL.g:3673:6: ( 'Collection' )
                     {
-                    // InternalCompleteOCL.g:3645:6: ( 'Collection' )
-                    // InternalCompleteOCL.g:3646:1: 'Collection'
+                    // InternalCompleteOCL.g:3673:6: ( 'Collection' )
+                    // InternalCompleteOCL.g:3674:1: 'Collection'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
@@ -11480,10 +11565,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalCompleteOCL.g:3653:6: ( 'OrderedSet' )
+                    // InternalCompleteOCL.g:3681:6: ( 'OrderedSet' )
                     {
-                    // InternalCompleteOCL.g:3653:6: ( 'OrderedSet' )
-                    // InternalCompleteOCL.g:3654:1: 'OrderedSet'
+                    // InternalCompleteOCL.g:3681:6: ( 'OrderedSet' )
+                    // InternalCompleteOCL.g:3682:1: 'OrderedSet'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
@@ -11516,13 +11601,13 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Alternatives"
-    // InternalCompleteOCL.g:3666:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
+    // InternalCompleteOCL.g:3694:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
     public final void rule__CollectionLiteralPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3670:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:3698:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
             int alt24=2;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -11584,12 +11669,12 @@
                 {
                 int LA24_3 = input.LA(2);
 
-                if ( (LA24_3==67) ) {
-                    alt24=2;
-                }
-                else if ( (LA24_3==EOF||(LA24_3>=17 && LA24_3<=18)||LA24_3==32||(LA24_3>=35 && LA24_3<=55)||LA24_3==68||LA24_3==71||(LA24_3>=79 && LA24_3<=82)||LA24_3==88||LA24_3==104) ) {
+                if ( (LA24_3==EOF||(LA24_3>=17 && LA24_3<=18)||LA24_3==32||(LA24_3>=35 && LA24_3<=55)||LA24_3==68||LA24_3==71||(LA24_3>=79 && LA24_3<=82)||LA24_3==88||LA24_3==104) ) {
                     alt24=1;
                 }
+                else if ( (LA24_3==67) ) {
+                    alt24=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -11603,12 +11688,12 @@
                 {
                 int LA24_4 = input.LA(2);
 
-                if ( (LA24_4==EOF||(LA24_4>=17 && LA24_4<=18)||LA24_4==32||(LA24_4>=35 && LA24_4<=55)||LA24_4==68||LA24_4==71||(LA24_4>=79 && LA24_4<=82)||LA24_4==88||LA24_4==104) ) {
-                    alt24=1;
-                }
-                else if ( (LA24_4==67) ) {
+                if ( (LA24_4==67) ) {
                     alt24=2;
                 }
+                else if ( (LA24_4==EOF||(LA24_4>=17 && LA24_4<=18)||LA24_4==32||(LA24_4>=35 && LA24_4<=55)||LA24_4==68||LA24_4==71||(LA24_4>=79 && LA24_4<=82)||LA24_4==88||LA24_4==104) ) {
+                    alt24=1;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -11622,12 +11707,12 @@
                 {
                 int LA24_5 = input.LA(2);
 
-                if ( (LA24_5==67) ) {
-                    alt24=2;
-                }
-                else if ( (LA24_5==EOF||(LA24_5>=17 && LA24_5<=18)||LA24_5==32||(LA24_5>=35 && LA24_5<=55)||LA24_5==68||LA24_5==71||(LA24_5>=79 && LA24_5<=82)||LA24_5==88||LA24_5==104) ) {
+                if ( (LA24_5==EOF||(LA24_5>=17 && LA24_5<=18)||LA24_5==32||(LA24_5>=35 && LA24_5<=55)||LA24_5==68||LA24_5==71||(LA24_5>=79 && LA24_5<=82)||LA24_5==88||LA24_5==104) ) {
                     alt24=1;
                 }
+                else if ( (LA24_5==67) ) {
+                    alt24=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -11641,12 +11726,12 @@
                 {
                 int LA24_6 = input.LA(2);
 
-                if ( (LA24_6==EOF||(LA24_6>=17 && LA24_6<=18)||LA24_6==32||(LA24_6>=35 && LA24_6<=55)||LA24_6==68||LA24_6==71||(LA24_6>=79 && LA24_6<=82)||LA24_6==88||LA24_6==104) ) {
-                    alt24=1;
-                }
-                else if ( (LA24_6==67) ) {
+                if ( (LA24_6==67) ) {
                     alt24=2;
                 }
+                else if ( (LA24_6==EOF||(LA24_6>=17 && LA24_6<=18)||LA24_6==32||(LA24_6>=35 && LA24_6<=55)||LA24_6==68||LA24_6==71||(LA24_6>=79 && LA24_6<=82)||LA24_6==88||LA24_6==104) ) {
+                    alt24=1;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -11671,16 +11756,16 @@
 
             switch (alt24) {
                 case 1 :
-                    // InternalCompleteOCL.g:3671:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3699:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3671:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3672:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3699:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3700:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3673:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3673:2: rule__CollectionLiteralPartCS__Group_0__0
+                    // InternalCompleteOCL.g:3701:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3701:2: rule__CollectionLiteralPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0__0();
@@ -11700,16 +11785,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3677:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalCompleteOCL.g:3705:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                     {
-                    // InternalCompleteOCL.g:3677:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
-                    // InternalCompleteOCL.g:3678:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalCompleteOCL.g:3705:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalCompleteOCL.g:3706:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                     }
-                    // InternalCompleteOCL.g:3679:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
-                    // InternalCompleteOCL.g:3679:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
+                    // InternalCompleteOCL.g:3707:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalCompleteOCL.g:3707:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1();
@@ -11746,13 +11831,13 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Alternatives"
-    // InternalCompleteOCL.g:3688:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
+    // InternalCompleteOCL.g:3716:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
     public final void rule__ShadowPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3692:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:3720:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
             int alt25=2;
             int LA25_0 = input.LA(1);
 
@@ -11771,16 +11856,16 @@
             }
             switch (alt25) {
                 case 1 :
-                    // InternalCompleteOCL.g:3693:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3721:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3693:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3694:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3721:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3722:1: ( rule__ShadowPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3695:1: ( rule__ShadowPartCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3695:2: rule__ShadowPartCS__Group_0__0
+                    // InternalCompleteOCL.g:3723:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3723:2: rule__ShadowPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__Group_0__0();
@@ -11800,16 +11885,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3699:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalCompleteOCL.g:3727:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
                     {
-                    // InternalCompleteOCL.g:3699:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
-                    // InternalCompleteOCL.g:3700:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalCompleteOCL.g:3727:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalCompleteOCL.g:3728:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_1());
                     }
-                    // InternalCompleteOCL.g:3701:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
-                    // InternalCompleteOCL.g:3701:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
+                    // InternalCompleteOCL.g:3729:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalCompleteOCL.g:3729:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__OwnedInitExpressionAssignment_1();
@@ -11846,13 +11931,13 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0"
-    // InternalCompleteOCL.g:3710:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalCompleteOCL.g:3738:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3714:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalCompleteOCL.g:3742:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt26=2;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -11933,12 +12018,12 @@
                 {
                 int LA26_4 = input.LA(2);
 
-                if ( (LA26_4==67) ) {
-                    alt26=2;
-                }
-                else if ( (LA26_4==EOF||(LA26_4>=17 && LA26_4<=18)||LA26_4==32||(LA26_4>=35 && LA26_4<=55)||LA26_4==68||LA26_4==71||(LA26_4>=79 && LA26_4<=81)||LA26_4==88||LA26_4==104) ) {
+                if ( (LA26_4==EOF||(LA26_4>=17 && LA26_4<=18)||LA26_4==32||(LA26_4>=35 && LA26_4<=55)||LA26_4==68||LA26_4==71||(LA26_4>=79 && LA26_4<=81)||LA26_4==88||LA26_4==104) ) {
                     alt26=1;
                 }
+                else if ( (LA26_4==67) ) {
+                    alt26=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -11971,12 +12056,12 @@
                 {
                 int LA26_6 = input.LA(2);
 
-                if ( (LA26_6==67) ) {
-                    alt26=2;
-                }
-                else if ( (LA26_6==EOF||(LA26_6>=17 && LA26_6<=18)||LA26_6==32||(LA26_6>=35 && LA26_6<=55)||LA26_6==68||LA26_6==71||(LA26_6>=79 && LA26_6<=81)||LA26_6==88||LA26_6==104) ) {
+                if ( (LA26_6==EOF||(LA26_6>=17 && LA26_6<=18)||LA26_6==32||(LA26_6>=35 && LA26_6<=55)||LA26_6==68||LA26_6==71||(LA26_6>=79 && LA26_6<=81)||LA26_6==88||LA26_6==104) ) {
                     alt26=1;
                 }
+                else if ( (LA26_6==67) ) {
+                    alt26=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -12001,10 +12086,10 @@
 
             switch (alt26) {
                 case 1 :
-                    // InternalCompleteOCL.g:3715:1: ( ruleExpCS )
+                    // InternalCompleteOCL.g:3743:1: ( ruleExpCS )
                     {
-                    // InternalCompleteOCL.g:3715:1: ( ruleExpCS )
-                    // InternalCompleteOCL.g:3716:1: ruleExpCS
+                    // InternalCompleteOCL.g:3743:1: ( ruleExpCS )
+                    // InternalCompleteOCL.g:3744:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());
@@ -12024,10 +12109,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3721:6: ( rulePatternExpCS )
+                    // InternalCompleteOCL.g:3749:6: ( rulePatternExpCS )
                     {
-                    // InternalCompleteOCL.g:3721:6: ( rulePatternExpCS )
-                    // InternalCompleteOCL.g:3722:1: rulePatternExpCS
+                    // InternalCompleteOCL.g:3749:6: ( rulePatternExpCS )
+                    // InternalCompleteOCL.g:3750:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());
@@ -12064,13 +12149,13 @@
 
 
     // $ANTLR start "rule__PrimitiveLiteralExpCS__Alternatives"
-    // InternalCompleteOCL.g:3732:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
+    // InternalCompleteOCL.g:3760:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
     public final void rule__PrimitiveLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3736:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
+            // InternalCompleteOCL.g:3764:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
             int alt27=6;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -12114,10 +12199,10 @@
 
             switch (alt27) {
                 case 1 :
-                    // InternalCompleteOCL.g:3737:1: ( ruleNumberLiteralExpCS )
+                    // InternalCompleteOCL.g:3765:1: ( ruleNumberLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3737:1: ( ruleNumberLiteralExpCS )
-                    // InternalCompleteOCL.g:3738:1: ruleNumberLiteralExpCS
+                    // InternalCompleteOCL.g:3765:1: ( ruleNumberLiteralExpCS )
+                    // InternalCompleteOCL.g:3766:1: ruleNumberLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());
@@ -12137,10 +12222,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3743:6: ( ruleStringLiteralExpCS )
+                    // InternalCompleteOCL.g:3771:6: ( ruleStringLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3743:6: ( ruleStringLiteralExpCS )
-                    // InternalCompleteOCL.g:3744:1: ruleStringLiteralExpCS
+                    // InternalCompleteOCL.g:3771:6: ( ruleStringLiteralExpCS )
+                    // InternalCompleteOCL.g:3772:1: ruleStringLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());
@@ -12160,10 +12245,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3749:6: ( ruleBooleanLiteralExpCS )
+                    // InternalCompleteOCL.g:3777:6: ( ruleBooleanLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3749:6: ( ruleBooleanLiteralExpCS )
-                    // InternalCompleteOCL.g:3750:1: ruleBooleanLiteralExpCS
+                    // InternalCompleteOCL.g:3777:6: ( ruleBooleanLiteralExpCS )
+                    // InternalCompleteOCL.g:3778:1: ruleBooleanLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());
@@ -12183,10 +12268,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3755:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalCompleteOCL.g:3783:6: ( ruleUnlimitedNaturalLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3755:6: ( ruleUnlimitedNaturalLiteralExpCS )
-                    // InternalCompleteOCL.g:3756:1: ruleUnlimitedNaturalLiteralExpCS
+                    // InternalCompleteOCL.g:3783:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalCompleteOCL.g:3784:1: ruleUnlimitedNaturalLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());
@@ -12206,10 +12291,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalCompleteOCL.g:3761:6: ( ruleInvalidLiteralExpCS )
+                    // InternalCompleteOCL.g:3789:6: ( ruleInvalidLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3761:6: ( ruleInvalidLiteralExpCS )
-                    // InternalCompleteOCL.g:3762:1: ruleInvalidLiteralExpCS
+                    // InternalCompleteOCL.g:3789:6: ( ruleInvalidLiteralExpCS )
+                    // InternalCompleteOCL.g:3790:1: ruleInvalidLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());
@@ -12229,10 +12314,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalCompleteOCL.g:3767:6: ( ruleNullLiteralExpCS )
+                    // InternalCompleteOCL.g:3795:6: ( ruleNullLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3767:6: ( ruleNullLiteralExpCS )
-                    // InternalCompleteOCL.g:3768:1: ruleNullLiteralExpCS
+                    // InternalCompleteOCL.g:3795:6: ( ruleNullLiteralExpCS )
+                    // InternalCompleteOCL.g:3796:1: ruleNullLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());
@@ -12269,13 +12354,13 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__Alternatives"
-    // InternalCompleteOCL.g:3778:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
+    // InternalCompleteOCL.g:3806:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
     public final void rule__BooleanLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3782:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
+            // InternalCompleteOCL.g:3810:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
             int alt28=2;
             int LA28_0 = input.LA(1);
 
@@ -12294,16 +12379,16 @@
             }
             switch (alt28) {
                 case 1 :
-                    // InternalCompleteOCL.g:3783:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalCompleteOCL.g:3811:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                     {
-                    // InternalCompleteOCL.g:3783:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
-                    // InternalCompleteOCL.g:3784:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalCompleteOCL.g:3811:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalCompleteOCL.g:3812:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                     }
-                    // InternalCompleteOCL.g:3785:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
-                    // InternalCompleteOCL.g:3785:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
+                    // InternalCompleteOCL.g:3813:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalCompleteOCL.g:3813:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_0();
@@ -12323,16 +12408,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3789:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalCompleteOCL.g:3817:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                     {
-                    // InternalCompleteOCL.g:3789:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
-                    // InternalCompleteOCL.g:3790:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalCompleteOCL.g:3817:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalCompleteOCL.g:3818:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                     }
-                    // InternalCompleteOCL.g:3791:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
-                    // InternalCompleteOCL.g:3791:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
+                    // InternalCompleteOCL.g:3819:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalCompleteOCL.g:3819:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_1();
@@ -12369,13 +12454,13 @@
 
 
     // $ANTLR start "rule__TypeLiteralCS__Alternatives"
-    // InternalCompleteOCL.g:3800:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
+    // InternalCompleteOCL.g:3828:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
     public final void rule__TypeLiteralCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3804:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
+            // InternalCompleteOCL.g:3832:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
             int alt29=4;
             switch ( input.LA(1) ) {
             case 22:
@@ -12421,10 +12506,10 @@
 
             switch (alt29) {
                 case 1 :
-                    // InternalCompleteOCL.g:3805:1: ( rulePrimitiveTypeCS )
+                    // InternalCompleteOCL.g:3833:1: ( rulePrimitiveTypeCS )
                     {
-                    // InternalCompleteOCL.g:3805:1: ( rulePrimitiveTypeCS )
-                    // InternalCompleteOCL.g:3806:1: rulePrimitiveTypeCS
+                    // InternalCompleteOCL.g:3833:1: ( rulePrimitiveTypeCS )
+                    // InternalCompleteOCL.g:3834:1: rulePrimitiveTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());
@@ -12444,10 +12529,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3811:6: ( ruleCollectionTypeCS )
+                    // InternalCompleteOCL.g:3839:6: ( ruleCollectionTypeCS )
                     {
-                    // InternalCompleteOCL.g:3811:6: ( ruleCollectionTypeCS )
-                    // InternalCompleteOCL.g:3812:1: ruleCollectionTypeCS
+                    // InternalCompleteOCL.g:3839:6: ( ruleCollectionTypeCS )
+                    // InternalCompleteOCL.g:3840:1: ruleCollectionTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());
@@ -12467,10 +12552,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3817:6: ( ruleMapTypeCS )
+                    // InternalCompleteOCL.g:3845:6: ( ruleMapTypeCS )
                     {
-                    // InternalCompleteOCL.g:3817:6: ( ruleMapTypeCS )
-                    // InternalCompleteOCL.g:3818:1: ruleMapTypeCS
+                    // InternalCompleteOCL.g:3845:6: ( ruleMapTypeCS )
+                    // InternalCompleteOCL.g:3846:1: ruleMapTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());
@@ -12490,10 +12575,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3823:6: ( ruleTupleTypeCS )
+                    // InternalCompleteOCL.g:3851:6: ( ruleTupleTypeCS )
                     {
-                    // InternalCompleteOCL.g:3823:6: ( ruleTupleTypeCS )
-                    // InternalCompleteOCL.g:3824:1: ruleTupleTypeCS
+                    // InternalCompleteOCL.g:3851:6: ( ruleTupleTypeCS )
+                    // InternalCompleteOCL.g:3852:1: ruleTupleTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());
@@ -12530,21 +12615,21 @@
 
 
     // $ANTLR start "rule__TypeExpWithoutMultiplicityCS__Alternatives"
-    // InternalCompleteOCL.g:3834:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
+    // InternalCompleteOCL.g:3862:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
     public final void rule__TypeExpWithoutMultiplicityCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3838:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
+            // InternalCompleteOCL.g:3866:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
             int alt30=3;
             alt30 = dfa30.predict(input);
             switch (alt30) {
                 case 1 :
-                    // InternalCompleteOCL.g:3839:1: ( ruleTypeNameExpCS )
+                    // InternalCompleteOCL.g:3867:1: ( ruleTypeNameExpCS )
                     {
-                    // InternalCompleteOCL.g:3839:1: ( ruleTypeNameExpCS )
-                    // InternalCompleteOCL.g:3840:1: ruleTypeNameExpCS
+                    // InternalCompleteOCL.g:3867:1: ( ruleTypeNameExpCS )
+                    // InternalCompleteOCL.g:3868:1: ruleTypeNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());
@@ -12564,10 +12649,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3845:6: ( ruleTypeLiteralCS )
+                    // InternalCompleteOCL.g:3873:6: ( ruleTypeLiteralCS )
                     {
-                    // InternalCompleteOCL.g:3845:6: ( ruleTypeLiteralCS )
-                    // InternalCompleteOCL.g:3846:1: ruleTypeLiteralCS
+                    // InternalCompleteOCL.g:3873:6: ( ruleTypeLiteralCS )
+                    // InternalCompleteOCL.g:3874:1: ruleTypeLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -12587,10 +12672,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3851:6: ( ruleCollectionPatternCS )
+                    // InternalCompleteOCL.g:3879:6: ( ruleCollectionPatternCS )
                     {
-                    // InternalCompleteOCL.g:3851:6: ( ruleCollectionPatternCS )
-                    // InternalCompleteOCL.g:3852:1: ruleCollectionPatternCS
+                    // InternalCompleteOCL.g:3879:6: ( ruleCollectionPatternCS )
+                    // InternalCompleteOCL.g:3880:1: ruleCollectionPatternCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());
@@ -12627,27 +12712,27 @@
 
 
     // $ANTLR start "rule__ExpCS__Alternatives"
-    // InternalCompleteOCL.g:3862:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
+    // InternalCompleteOCL.g:3890:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
     public final void rule__ExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3866:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
+            // InternalCompleteOCL.g:3894:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
             int alt31=2;
             alt31 = dfa31.predict(input);
             switch (alt31) {
                 case 1 :
-                    // InternalCompleteOCL.g:3867:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3895:1: ( ( rule__ExpCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3867:1: ( ( rule__ExpCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3868:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3895:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3896:1: ( rule__ExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3869:1: ( rule__ExpCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3869:2: rule__ExpCS__Group_0__0
+                    // InternalCompleteOCL.g:3897:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3897:2: rule__ExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0__0();
@@ -12667,10 +12752,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3873:6: ( rulePrefixedLetExpCS )
+                    // InternalCompleteOCL.g:3901:6: ( rulePrefixedLetExpCS )
                     {
-                    // InternalCompleteOCL.g:3873:6: ( rulePrefixedLetExpCS )
-                    // InternalCompleteOCL.g:3874:1: rulePrefixedLetExpCS
+                    // InternalCompleteOCL.g:3901:6: ( rulePrefixedLetExpCS )
+                    // InternalCompleteOCL.g:3902:1: rulePrefixedLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());
@@ -12707,13 +12792,13 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Alternatives"
-    // InternalCompleteOCL.g:3884:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
+    // InternalCompleteOCL.g:3912:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
     public final void rule__PrefixedLetExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3888:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
+            // InternalCompleteOCL.g:3916:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
             int alt32=2;
             int LA32_0 = input.LA(1);
 
@@ -12732,16 +12817,16 @@
             }
             switch (alt32) {
                 case 1 :
-                    // InternalCompleteOCL.g:3889:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3917:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3889:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3890:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3917:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3918:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3891:1: ( rule__PrefixedLetExpCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3891:2: rule__PrefixedLetExpCS__Group_0__0
+                    // InternalCompleteOCL.g:3919:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3919:2: rule__PrefixedLetExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedLetExpCS__Group_0__0();
@@ -12761,10 +12846,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3895:6: ( ruleLetExpCS )
+                    // InternalCompleteOCL.g:3923:6: ( ruleLetExpCS )
                     {
-                    // InternalCompleteOCL.g:3895:6: ( ruleLetExpCS )
-                    // InternalCompleteOCL.g:3896:1: ruleLetExpCS
+                    // InternalCompleteOCL.g:3923:6: ( ruleLetExpCS )
+                    // InternalCompleteOCL.g:3924:1: ruleLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());
@@ -12801,13 +12886,13 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Alternatives"
-    // InternalCompleteOCL.g:3906:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
+    // InternalCompleteOCL.g:3934:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
     public final void rule__PrefixedPrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3910:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
+            // InternalCompleteOCL.g:3938:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
             int alt33=2;
             int LA33_0 = input.LA(1);
 
@@ -12826,16 +12911,16 @@
             }
             switch (alt33) {
                 case 1 :
-                    // InternalCompleteOCL.g:3911:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3939:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:3911:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:3912:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3939:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:3940:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:3913:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
-                    // InternalCompleteOCL.g:3913:2: rule__PrefixedPrimaryExpCS__Group_0__0
+                    // InternalCompleteOCL.g:3941:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalCompleteOCL.g:3941:2: rule__PrefixedPrimaryExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedPrimaryExpCS__Group_0__0();
@@ -12855,10 +12940,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3917:6: ( rulePrimaryExpCS )
+                    // InternalCompleteOCL.g:3945:6: ( rulePrimaryExpCS )
                     {
-                    // InternalCompleteOCL.g:3917:6: ( rulePrimaryExpCS )
-                    // InternalCompleteOCL.g:3918:1: rulePrimaryExpCS
+                    // InternalCompleteOCL.g:3945:6: ( rulePrimaryExpCS )
+                    // InternalCompleteOCL.g:3946:1: rulePrimaryExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());
@@ -12895,21 +12980,21 @@
 
 
     // $ANTLR start "rule__PrimaryExpCS__Alternatives"
-    // InternalCompleteOCL.g:3928:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
+    // InternalCompleteOCL.g:3956:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
     public final void rule__PrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:3932:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
+            // InternalCompleteOCL.g:3960:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
             int alt34=10;
             alt34 = dfa34.predict(input);
             switch (alt34) {
                 case 1 :
-                    // InternalCompleteOCL.g:3933:1: ( ruleNestedExpCS )
+                    // InternalCompleteOCL.g:3961:1: ( ruleNestedExpCS )
                     {
-                    // InternalCompleteOCL.g:3933:1: ( ruleNestedExpCS )
-                    // InternalCompleteOCL.g:3934:1: ruleNestedExpCS
+                    // InternalCompleteOCL.g:3961:1: ( ruleNestedExpCS )
+                    // InternalCompleteOCL.g:3962:1: ruleNestedExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());
@@ -12929,10 +13014,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:3939:6: ( ruleIfExpCS )
+                    // InternalCompleteOCL.g:3967:6: ( ruleIfExpCS )
                     {
-                    // InternalCompleteOCL.g:3939:6: ( ruleIfExpCS )
-                    // InternalCompleteOCL.g:3940:1: ruleIfExpCS
+                    // InternalCompleteOCL.g:3967:6: ( ruleIfExpCS )
+                    // InternalCompleteOCL.g:3968:1: ruleIfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());
@@ -12952,10 +13037,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:3945:6: ( ruleSelfExpCS )
+                    // InternalCompleteOCL.g:3973:6: ( ruleSelfExpCS )
                     {
-                    // InternalCompleteOCL.g:3945:6: ( ruleSelfExpCS )
-                    // InternalCompleteOCL.g:3946:1: ruleSelfExpCS
+                    // InternalCompleteOCL.g:3973:6: ( ruleSelfExpCS )
+                    // InternalCompleteOCL.g:3974:1: ruleSelfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());
@@ -12975,10 +13060,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalCompleteOCL.g:3951:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalCompleteOCL.g:3979:6: ( rulePrimitiveLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3951:6: ( rulePrimitiveLiteralExpCS )
-                    // InternalCompleteOCL.g:3952:1: rulePrimitiveLiteralExpCS
+                    // InternalCompleteOCL.g:3979:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalCompleteOCL.g:3980:1: rulePrimitiveLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());
@@ -12998,10 +13083,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalCompleteOCL.g:3957:6: ( ruleTupleLiteralExpCS )
+                    // InternalCompleteOCL.g:3985:6: ( ruleTupleLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3957:6: ( ruleTupleLiteralExpCS )
-                    // InternalCompleteOCL.g:3958:1: ruleTupleLiteralExpCS
+                    // InternalCompleteOCL.g:3985:6: ( ruleTupleLiteralExpCS )
+                    // InternalCompleteOCL.g:3986:1: ruleTupleLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -13021,10 +13106,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalCompleteOCL.g:3963:6: ( ruleMapLiteralExpCS )
+                    // InternalCompleteOCL.g:3991:6: ( ruleMapLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3963:6: ( ruleMapLiteralExpCS )
-                    // InternalCompleteOCL.g:3964:1: ruleMapLiteralExpCS
+                    // InternalCompleteOCL.g:3991:6: ( ruleMapLiteralExpCS )
+                    // InternalCompleteOCL.g:3992:1: ruleMapLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -13044,10 +13129,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalCompleteOCL.g:3969:6: ( ruleCollectionLiteralExpCS )
+                    // InternalCompleteOCL.g:3997:6: ( ruleCollectionLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3969:6: ( ruleCollectionLiteralExpCS )
-                    // InternalCompleteOCL.g:3970:1: ruleCollectionLiteralExpCS
+                    // InternalCompleteOCL.g:3997:6: ( ruleCollectionLiteralExpCS )
+                    // InternalCompleteOCL.g:3998:1: ruleCollectionLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -13067,10 +13152,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalCompleteOCL.g:3975:6: ( ruleLambdaLiteralExpCS )
+                    // InternalCompleteOCL.g:4003:6: ( ruleLambdaLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3975:6: ( ruleLambdaLiteralExpCS )
-                    // InternalCompleteOCL.g:3976:1: ruleLambdaLiteralExpCS
+                    // InternalCompleteOCL.g:4003:6: ( ruleLambdaLiteralExpCS )
+                    // InternalCompleteOCL.g:4004:1: ruleLambdaLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());
@@ -13090,10 +13175,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalCompleteOCL.g:3981:6: ( ruleTypeLiteralExpCS )
+                    // InternalCompleteOCL.g:4009:6: ( ruleTypeLiteralExpCS )
                     {
-                    // InternalCompleteOCL.g:3981:6: ( ruleTypeLiteralExpCS )
-                    // InternalCompleteOCL.g:3982:1: ruleTypeLiteralExpCS
+                    // InternalCompleteOCL.g:4009:6: ( ruleTypeLiteralExpCS )
+                    // InternalCompleteOCL.g:4010:1: ruleTypeLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -13113,10 +13198,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalCompleteOCL.g:3987:6: ( ruleNameExpCS )
+                    // InternalCompleteOCL.g:4015:6: ( ruleNameExpCS )
                     {
-                    // InternalCompleteOCL.g:3987:6: ( ruleNameExpCS )
-                    // InternalCompleteOCL.g:3988:1: ruleNameExpCS
+                    // InternalCompleteOCL.g:4015:6: ( ruleNameExpCS )
+                    // InternalCompleteOCL.g:4016:1: ruleNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());
@@ -13153,13 +13238,13 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0"
-    // InternalCompleteOCL.g:3998:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
+    // InternalCompleteOCL.g:4026:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4002:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
+            // InternalCompleteOCL.g:4030:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
             int alt35=3;
             switch ( input.LA(1) ) {
             case 71:
@@ -13187,10 +13272,10 @@
 
             switch (alt35) {
                 case 1 :
-                    // InternalCompleteOCL.g:4003:1: ( ruleNavigatingCommaArgCS )
+                    // InternalCompleteOCL.g:4031:1: ( ruleNavigatingCommaArgCS )
                     {
-                    // InternalCompleteOCL.g:4003:1: ( ruleNavigatingCommaArgCS )
-                    // InternalCompleteOCL.g:4004:1: ruleNavigatingCommaArgCS
+                    // InternalCompleteOCL.g:4031:1: ( ruleNavigatingCommaArgCS )
+                    // InternalCompleteOCL.g:4032:1: ruleNavigatingCommaArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
@@ -13210,10 +13295,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4009:6: ( ruleNavigatingSemiArgCS )
+                    // InternalCompleteOCL.g:4037:6: ( ruleNavigatingSemiArgCS )
                     {
-                    // InternalCompleteOCL.g:4009:6: ( ruleNavigatingSemiArgCS )
-                    // InternalCompleteOCL.g:4010:1: ruleNavigatingSemiArgCS
+                    // InternalCompleteOCL.g:4037:6: ( ruleNavigatingSemiArgCS )
+                    // InternalCompleteOCL.g:4038:1: ruleNavigatingSemiArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
@@ -13233,10 +13318,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:4015:6: ( ruleNavigatingBarArgCS )
+                    // InternalCompleteOCL.g:4043:6: ( ruleNavigatingBarArgCS )
                     {
-                    // InternalCompleteOCL.g:4015:6: ( ruleNavigatingBarArgCS )
-                    // InternalCompleteOCL.g:4016:1: ruleNavigatingBarArgCS
+                    // InternalCompleteOCL.g:4043:6: ( ruleNavigatingBarArgCS )
+                    // InternalCompleteOCL.g:4044:1: ruleNavigatingBarArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
@@ -13273,13 +13358,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives"
-    // InternalCompleteOCL.g:4026:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
+    // InternalCompleteOCL.g:4054:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4030:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
+            // InternalCompleteOCL.g:4058:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
             int alt36=2;
             int LA36_0 = input.LA(1);
 
@@ -13298,16 +13383,16 @@
             }
             switch (alt36) {
                 case 1 :
-                    // InternalCompleteOCL.g:4031:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:4059:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:4031:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
-                    // InternalCompleteOCL.g:4032:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalCompleteOCL.g:4059:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalCompleteOCL.g:4060:1: ( rule__NavigatingArgCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                     }
-                    // InternalCompleteOCL.g:4033:1: ( rule__NavigatingArgCS__Group_0__0 )
-                    // InternalCompleteOCL.g:4033:2: rule__NavigatingArgCS__Group_0__0
+                    // InternalCompleteOCL.g:4061:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalCompleteOCL.g:4061:2: rule__NavigatingArgCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0__0();
@@ -13327,16 +13412,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4037:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalCompleteOCL.g:4065:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:4037:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
-                    // InternalCompleteOCL.g:4038:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalCompleteOCL.g:4065:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalCompleteOCL.g:4066:1: ( rule__NavigatingArgCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                     }
-                    // InternalCompleteOCL.g:4039:1: ( rule__NavigatingArgCS__Group_1__0 )
-                    // InternalCompleteOCL.g:4039:2: rule__NavigatingArgCS__Group_1__0
+                    // InternalCompleteOCL.g:4067:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalCompleteOCL.g:4067:2: rule__NavigatingArgCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_1__0();
@@ -13373,13 +13458,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives_0_1"
-    // InternalCompleteOCL.g:4048:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
+    // InternalCompleteOCL.g:4076:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4052:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
+            // InternalCompleteOCL.g:4080:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
             int alt37=3;
             switch ( input.LA(1) ) {
             case 85:
@@ -13435,16 +13520,16 @@
 
             switch (alt37) {
                 case 1 :
-                    // InternalCompleteOCL.g:4053:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:4053:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-                    // InternalCompleteOCL.g:4054:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalCompleteOCL.g:4082:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                     }
-                    // InternalCompleteOCL.g:4055:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-                    // InternalCompleteOCL.g:4055:2: rule__NavigatingArgCS__Group_0_1_0__0
+                    // InternalCompleteOCL.g:4083:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalCompleteOCL.g:4083:2: rule__NavigatingArgCS__Group_0_1_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0__0();
@@ -13464,16 +13549,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4059:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:4059:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-                    // InternalCompleteOCL.g:4060:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalCompleteOCL.g:4088:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                     }
-                    // InternalCompleteOCL.g:4061:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-                    // InternalCompleteOCL.g:4061:2: rule__NavigatingArgCS__Group_0_1_1__0
+                    // InternalCompleteOCL.g:4089:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalCompleteOCL.g:4089:2: rule__NavigatingArgCS__Group_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1__0();
@@ -13493,16 +13578,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:4065:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalCompleteOCL.g:4093:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
                     {
-                    // InternalCompleteOCL.g:4065:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
-                    // InternalCompleteOCL.g:4066:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalCompleteOCL.g:4093:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalCompleteOCL.g:4094:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2());
                     }
-                    // InternalCompleteOCL.g:4067:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
-                    // InternalCompleteOCL.g:4067:2: rule__NavigatingArgCS__Group_0_1_2__0
+                    // InternalCompleteOCL.g:4095:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalCompleteOCL.g:4095:2: rule__NavigatingArgCS__Group_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2__0();
@@ -13539,13 +13624,13 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Alternatives_2"
-    // InternalCompleteOCL.g:4076:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
+    // InternalCompleteOCL.g:4104:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
     public final void rule__NavigatingCommaArgCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4080:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
+            // InternalCompleteOCL.g:4108:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
             int alt38=3;
             switch ( input.LA(1) ) {
             case 85:
@@ -13601,16 +13686,16 @@
 
             switch (alt38) {
                 case 1 :
-                    // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalCompleteOCL.g:4109:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                     {
-                    // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-                    // InternalCompleteOCL.g:4082:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalCompleteOCL.g:4109:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalCompleteOCL.g:4110:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                     }
-                    // InternalCompleteOCL.g:4083:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-                    // InternalCompleteOCL.g:4083:2: rule__NavigatingCommaArgCS__Group_2_0__0
+                    // InternalCompleteOCL.g:4111:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalCompleteOCL.g:4111:2: rule__NavigatingCommaArgCS__Group_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -13630,16 +13715,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalCompleteOCL.g:4115:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                     {
-                    // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-                    // InternalCompleteOCL.g:4088:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalCompleteOCL.g:4115:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalCompleteOCL.g:4116:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                     }
-                    // InternalCompleteOCL.g:4089:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-                    // InternalCompleteOCL.g:4089:2: rule__NavigatingCommaArgCS__Group_2_1__0
+                    // InternalCompleteOCL.g:4117:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalCompleteOCL.g:4117:2: rule__NavigatingCommaArgCS__Group_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -13659,16 +13744,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:4093:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalCompleteOCL.g:4121:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
                     {
-                    // InternalCompleteOCL.g:4093:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
-                    // InternalCompleteOCL.g:4094:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalCompleteOCL.g:4121:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalCompleteOCL.g:4122:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2());
                     }
-                    // InternalCompleteOCL.g:4095:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
-                    // InternalCompleteOCL.g:4095:2: rule__NavigatingCommaArgCS__Group_2_2__0
+                    // InternalCompleteOCL.g:4123:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalCompleteOCL.g:4123:2: rule__NavigatingCommaArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2__0();
@@ -13705,13 +13790,13 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAlternatives_1_0"
-    // InternalCompleteOCL.g:4104:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalCompleteOCL.g:4132:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__IfExpCS__OwnedConditionAlternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4108:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalCompleteOCL.g:4136:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt39=2;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -13811,12 +13896,12 @@
                 {
                 int LA39_5 = input.LA(2);
 
-                if ( (LA39_5==67) ) {
-                    alt39=2;
-                }
-                else if ( ((LA39_5>=17 && LA39_5<=18)||LA39_5==32||(LA39_5>=35 && LA39_5<=55)||LA39_5==68||(LA39_5>=79 && LA39_5<=80)||LA39_5==88||LA39_5==92||LA39_5==104) ) {
+                if ( ((LA39_5>=17 && LA39_5<=18)||LA39_5==32||(LA39_5>=35 && LA39_5<=55)||LA39_5==68||(LA39_5>=79 && LA39_5<=80)||LA39_5==88||LA39_5==92||LA39_5==104) ) {
                     alt39=1;
                 }
+                else if ( (LA39_5==67) ) {
+                    alt39=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
@@ -13860,10 +13945,10 @@
 
             switch (alt39) {
                 case 1 :
-                    // InternalCompleteOCL.g:4109:1: ( ruleExpCS )
+                    // InternalCompleteOCL.g:4137:1: ( ruleExpCS )
                     {
-                    // InternalCompleteOCL.g:4109:1: ( ruleExpCS )
-                    // InternalCompleteOCL.g:4110:1: ruleExpCS
+                    // InternalCompleteOCL.g:4137:1: ( ruleExpCS )
+                    // InternalCompleteOCL.g:4138:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
@@ -13883,10 +13968,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4115:6: ( rulePatternExpCS )
+                    // InternalCompleteOCL.g:4143:6: ( rulePatternExpCS )
                     {
-                    // InternalCompleteOCL.g:4115:6: ( rulePatternExpCS )
-                    // InternalCompleteOCL.g:4116:1: rulePatternExpCS
+                    // InternalCompleteOCL.g:4143:6: ( rulePatternExpCS )
+                    // InternalCompleteOCL.g:4144:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
@@ -13923,13 +14008,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_1"
-    // InternalCompleteOCL.g:4126:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
+    // InternalCompleteOCL.g:4154:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
     public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4130:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
+            // InternalCompleteOCL.g:4158:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
             int alt40=2;
             int LA40_0 = input.LA(1);
 
@@ -13948,10 +14033,10 @@
             }
             switch (alt40) {
                 case 1 :
-                    // InternalCompleteOCL.g:4131:1: ( ruleMultiplicityBoundsCS )
+                    // InternalCompleteOCL.g:4159:1: ( ruleMultiplicityBoundsCS )
                     {
-                    // InternalCompleteOCL.g:4131:1: ( ruleMultiplicityBoundsCS )
-                    // InternalCompleteOCL.g:4132:1: ruleMultiplicityBoundsCS
+                    // InternalCompleteOCL.g:4159:1: ( ruleMultiplicityBoundsCS )
+                    // InternalCompleteOCL.g:4160:1: ruleMultiplicityBoundsCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
@@ -13971,10 +14056,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4137:6: ( ruleMultiplicityStringCS )
+                    // InternalCompleteOCL.g:4165:6: ( ruleMultiplicityStringCS )
                     {
-                    // InternalCompleteOCL.g:4137:6: ( ruleMultiplicityStringCS )
-                    // InternalCompleteOCL.g:4138:1: ruleMultiplicityStringCS
+                    // InternalCompleteOCL.g:4165:6: ( ruleMultiplicityStringCS )
+                    // InternalCompleteOCL.g:4166:1: ruleMultiplicityStringCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
@@ -14011,13 +14096,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_2"
-    // InternalCompleteOCL.g:4148:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
+    // InternalCompleteOCL.g:4176:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
     public final void rule__MultiplicityCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4152:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:4180:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
             int alt41=2;
             int LA41_0 = input.LA(1);
 
@@ -14036,10 +14121,10 @@
             }
             switch (alt41) {
                 case 1 :
-                    // InternalCompleteOCL.g:4153:1: ( '|?' )
+                    // InternalCompleteOCL.g:4181:1: ( '|?' )
                     {
-                    // InternalCompleteOCL.g:4153:1: ( '|?' )
-                    // InternalCompleteOCL.g:4154:1: '|?'
+                    // InternalCompleteOCL.g:4181:1: ( '|?' )
+                    // InternalCompleteOCL.g:4182:1: '|?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
@@ -14055,16 +14140,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4161:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalCompleteOCL.g:4189:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                     {
-                    // InternalCompleteOCL.g:4161:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
-                    // InternalCompleteOCL.g:4162:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalCompleteOCL.g:4189:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalCompleteOCL.g:4190:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                     }
-                    // InternalCompleteOCL.g:4163:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
-                    // InternalCompleteOCL.g:4163:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
+                    // InternalCompleteOCL.g:4191:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalCompleteOCL.g:4191:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__IsNullFreeAssignment_2_1();
@@ -14101,13 +14186,13 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAlternatives_0"
-    // InternalCompleteOCL.g:4172:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
+    // InternalCompleteOCL.g:4200:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
     public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4176:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
+            // InternalCompleteOCL.g:4204:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
             int alt42=3;
             switch ( input.LA(1) ) {
             case 35:
@@ -14135,10 +14220,10 @@
 
             switch (alt42) {
                 case 1 :
-                    // InternalCompleteOCL.g:4177:1: ( '*' )
+                    // InternalCompleteOCL.g:4205:1: ( '*' )
                     {
-                    // InternalCompleteOCL.g:4177:1: ( '*' )
-                    // InternalCompleteOCL.g:4178:1: '*'
+                    // InternalCompleteOCL.g:4205:1: ( '*' )
+                    // InternalCompleteOCL.g:4206:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
@@ -14154,10 +14239,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4185:6: ( '+' )
+                    // InternalCompleteOCL.g:4213:6: ( '+' )
                     {
-                    // InternalCompleteOCL.g:4185:6: ( '+' )
-                    // InternalCompleteOCL.g:4186:1: '+'
+                    // InternalCompleteOCL.g:4213:6: ( '+' )
+                    // InternalCompleteOCL.g:4214:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
@@ -14173,10 +14258,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalCompleteOCL.g:4193:6: ( '?' )
+                    // InternalCompleteOCL.g:4221:6: ( '?' )
                     {
-                    // InternalCompleteOCL.g:4193:6: ( '?' )
-                    // InternalCompleteOCL.g:4194:1: '?'
+                    // InternalCompleteOCL.g:4221:6: ( '?' )
+                    // InternalCompleteOCL.g:4222:1: '?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
@@ -14209,13 +14294,13 @@
 
 
     // $ANTLR start "rule__TypeRefCS__Alternatives"
-    // InternalCompleteOCL.g:4206:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
+    // InternalCompleteOCL.g:4234:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
     public final void rule__TypeRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4210:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
+            // InternalCompleteOCL.g:4238:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
             int alt43=2;
             int LA43_0 = input.LA(1);
 
@@ -14234,10 +14319,10 @@
             }
             switch (alt43) {
                 case 1 :
-                    // InternalCompleteOCL.g:4211:1: ( ruleTypedRefCS )
+                    // InternalCompleteOCL.g:4239:1: ( ruleTypedRefCS )
                     {
-                    // InternalCompleteOCL.g:4211:1: ( ruleTypedRefCS )
-                    // InternalCompleteOCL.g:4212:1: ruleTypedRefCS
+                    // InternalCompleteOCL.g:4239:1: ( ruleTypedRefCS )
+                    // InternalCompleteOCL.g:4240:1: ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
@@ -14257,10 +14342,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4217:6: ( ruleWildcardTypeRefCS )
+                    // InternalCompleteOCL.g:4245:6: ( ruleWildcardTypeRefCS )
                     {
-                    // InternalCompleteOCL.g:4217:6: ( ruleWildcardTypeRefCS )
-                    // InternalCompleteOCL.g:4218:1: ruleWildcardTypeRefCS
+                    // InternalCompleteOCL.g:4245:6: ( ruleWildcardTypeRefCS )
+                    // InternalCompleteOCL.g:4246:1: ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
@@ -14297,13 +14382,13 @@
 
 
     // $ANTLR start "rule__ID__Alternatives"
-    // InternalCompleteOCL.g:4228:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
+    // InternalCompleteOCL.g:4256:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
     public final void rule__ID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4232:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
+            // InternalCompleteOCL.g:4260:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
             int alt44=2;
             int LA44_0 = input.LA(1);
 
@@ -14322,10 +14407,10 @@
             }
             switch (alt44) {
                 case 1 :
-                    // InternalCompleteOCL.g:4233:1: ( RULE_SIMPLE_ID )
+                    // InternalCompleteOCL.g:4261:1: ( RULE_SIMPLE_ID )
                     {
-                    // InternalCompleteOCL.g:4233:1: ( RULE_SIMPLE_ID )
-                    // InternalCompleteOCL.g:4234:1: RULE_SIMPLE_ID
+                    // InternalCompleteOCL.g:4261:1: ( RULE_SIMPLE_ID )
+                    // InternalCompleteOCL.g:4262:1: RULE_SIMPLE_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
@@ -14341,10 +14426,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4239:6: ( RULE_ESCAPED_ID )
+                    // InternalCompleteOCL.g:4267:6: ( RULE_ESCAPED_ID )
                     {
-                    // InternalCompleteOCL.g:4239:6: ( RULE_ESCAPED_ID )
-                    // InternalCompleteOCL.g:4240:1: RULE_ESCAPED_ID
+                    // InternalCompleteOCL.g:4267:6: ( RULE_ESCAPED_ID )
+                    // InternalCompleteOCL.g:4268:1: RULE_ESCAPED_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
@@ -14377,13 +14462,13 @@
 
 
     // $ANTLR start "rule__UPPER__Alternatives"
-    // InternalCompleteOCL.g:4250:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
+    // InternalCompleteOCL.g:4278:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
     public final void rule__UPPER__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4254:1: ( ( RULE_INT ) | ( '*' ) )
+            // InternalCompleteOCL.g:4282:1: ( ( RULE_INT ) | ( '*' ) )
             int alt45=2;
             int LA45_0 = input.LA(1);
 
@@ -14402,10 +14487,10 @@
             }
             switch (alt45) {
                 case 1 :
-                    // InternalCompleteOCL.g:4255:1: ( RULE_INT )
+                    // InternalCompleteOCL.g:4283:1: ( RULE_INT )
                     {
-                    // InternalCompleteOCL.g:4255:1: ( RULE_INT )
-                    // InternalCompleteOCL.g:4256:1: RULE_INT
+                    // InternalCompleteOCL.g:4283:1: ( RULE_INT )
+                    // InternalCompleteOCL.g:4284:1: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
@@ -14421,10 +14506,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:4261:6: ( '*' )
+                    // InternalCompleteOCL.g:4289:6: ( '*' )
                     {
-                    // InternalCompleteOCL.g:4261:6: ( '*' )
-                    // InternalCompleteOCL.g:4262:1: '*'
+                    // InternalCompleteOCL.g:4289:6: ( '*' )
+                    // InternalCompleteOCL.g:4290:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
@@ -14457,14 +14542,14 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__Group__0"
-    // InternalCompleteOCL.g:4276:1: rule__CompleteOCLDocumentCS__Group__0 : rule__CompleteOCLDocumentCS__Group__0__Impl rule__CompleteOCLDocumentCS__Group__1 ;
+    // InternalCompleteOCL.g:4304:1: rule__CompleteOCLDocumentCS__Group__0 : rule__CompleteOCLDocumentCS__Group__0__Impl rule__CompleteOCLDocumentCS__Group__1 ;
     public final void rule__CompleteOCLDocumentCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4280:1: ( rule__CompleteOCLDocumentCS__Group__0__Impl rule__CompleteOCLDocumentCS__Group__1 )
-            // InternalCompleteOCL.g:4281:2: rule__CompleteOCLDocumentCS__Group__0__Impl rule__CompleteOCLDocumentCS__Group__1
+            // InternalCompleteOCL.g:4308:1: ( rule__CompleteOCLDocumentCS__Group__0__Impl rule__CompleteOCLDocumentCS__Group__1 )
+            // InternalCompleteOCL.g:4309:2: rule__CompleteOCLDocumentCS__Group__0__Impl rule__CompleteOCLDocumentCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__CompleteOCLDocumentCS__Group__0__Impl();
@@ -14495,22 +14580,22 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__Group__0__Impl"
-    // InternalCompleteOCL.g:4288:1: rule__CompleteOCLDocumentCS__Group__0__Impl : ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* ) ;
+    // InternalCompleteOCL.g:4316:1: rule__CompleteOCLDocumentCS__Group__0__Impl : ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* ) ;
     public final void rule__CompleteOCLDocumentCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4292:1: ( ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* ) )
-            // InternalCompleteOCL.g:4293:1: ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* )
+            // InternalCompleteOCL.g:4320:1: ( ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* ) )
+            // InternalCompleteOCL.g:4321:1: ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* )
             {
-            // InternalCompleteOCL.g:4293:1: ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* )
-            // InternalCompleteOCL.g:4294:1: ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )*
+            // InternalCompleteOCL.g:4321:1: ( ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )* )
+            // InternalCompleteOCL.g:4322:1: ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCompleteOCLDocumentCSAccess().getOwnedImportsAssignment_0());
             }
-            // InternalCompleteOCL.g:4295:1: ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )*
+            // InternalCompleteOCL.g:4323:1: ( rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 )*
             loop46:
             do {
                 int alt46=2;
@@ -14523,7 +14608,7 @@
 
                 switch (alt46) {
             	case 1 :
-            	    // InternalCompleteOCL.g:4295:2: rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0
+            	    // InternalCompleteOCL.g:4323:2: rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_5);
             	    rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0();
@@ -14564,14 +14649,14 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__Group__1"
-    // InternalCompleteOCL.g:4305:1: rule__CompleteOCLDocumentCS__Group__1 : rule__CompleteOCLDocumentCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:4333:1: rule__CompleteOCLDocumentCS__Group__1 : rule__CompleteOCLDocumentCS__Group__1__Impl ;
     public final void rule__CompleteOCLDocumentCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4309:1: ( rule__CompleteOCLDocumentCS__Group__1__Impl )
-            // InternalCompleteOCL.g:4310:2: rule__CompleteOCLDocumentCS__Group__1__Impl
+            // InternalCompleteOCL.g:4337:1: ( rule__CompleteOCLDocumentCS__Group__1__Impl )
+            // InternalCompleteOCL.g:4338:2: rule__CompleteOCLDocumentCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CompleteOCLDocumentCS__Group__1__Impl();
@@ -14597,22 +14682,22 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__Group__1__Impl"
-    // InternalCompleteOCL.g:4316:1: rule__CompleteOCLDocumentCS__Group__1__Impl : ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* ) ;
+    // InternalCompleteOCL.g:4344:1: rule__CompleteOCLDocumentCS__Group__1__Impl : ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* ) ;
     public final void rule__CompleteOCLDocumentCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4320:1: ( ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* ) )
-            // InternalCompleteOCL.g:4321:1: ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* )
+            // InternalCompleteOCL.g:4348:1: ( ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* ) )
+            // InternalCompleteOCL.g:4349:1: ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* )
             {
-            // InternalCompleteOCL.g:4321:1: ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* )
-            // InternalCompleteOCL.g:4322:1: ( rule__CompleteOCLDocumentCS__Alternatives_1 )*
+            // InternalCompleteOCL.g:4349:1: ( ( rule__CompleteOCLDocumentCS__Alternatives_1 )* )
+            // InternalCompleteOCL.g:4350:1: ( rule__CompleteOCLDocumentCS__Alternatives_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCompleteOCLDocumentCSAccess().getAlternatives_1());
             }
-            // InternalCompleteOCL.g:4323:1: ( rule__CompleteOCLDocumentCS__Alternatives_1 )*
+            // InternalCompleteOCL.g:4351:1: ( rule__CompleteOCLDocumentCS__Alternatives_1 )*
             loop47:
             do {
                 int alt47=2;
@@ -14625,7 +14710,7 @@
 
                 switch (alt47) {
             	case 1 :
-            	    // InternalCompleteOCL.g:4323:2: rule__CompleteOCLDocumentCS__Alternatives_1
+            	    // InternalCompleteOCL.g:4351:2: rule__CompleteOCLDocumentCS__Alternatives_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_6);
             	    rule__CompleteOCLDocumentCS__Alternatives_1();
@@ -14666,14 +14751,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__0"
-    // InternalCompleteOCL.g:4337:1: rule__ClassifierContextDeclCS__Group__0 : rule__ClassifierContextDeclCS__Group__0__Impl rule__ClassifierContextDeclCS__Group__1 ;
+    // InternalCompleteOCL.g:4365:1: rule__ClassifierContextDeclCS__Group__0 : rule__ClassifierContextDeclCS__Group__0__Impl rule__ClassifierContextDeclCS__Group__1 ;
     public final void rule__ClassifierContextDeclCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4341:1: ( rule__ClassifierContextDeclCS__Group__0__Impl rule__ClassifierContextDeclCS__Group__1 )
-            // InternalCompleteOCL.g:4342:2: rule__ClassifierContextDeclCS__Group__0__Impl rule__ClassifierContextDeclCS__Group__1
+            // InternalCompleteOCL.g:4369:1: ( rule__ClassifierContextDeclCS__Group__0__Impl rule__ClassifierContextDeclCS__Group__1 )
+            // InternalCompleteOCL.g:4370:2: rule__ClassifierContextDeclCS__Group__0__Impl rule__ClassifierContextDeclCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ClassifierContextDeclCS__Group__0__Impl();
@@ -14704,17 +14789,17 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__0__Impl"
-    // InternalCompleteOCL.g:4349:1: rule__ClassifierContextDeclCS__Group__0__Impl : ( 'context' ) ;
+    // InternalCompleteOCL.g:4377:1: rule__ClassifierContextDeclCS__Group__0__Impl : ( 'context' ) ;
     public final void rule__ClassifierContextDeclCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4353:1: ( ( 'context' ) )
-            // InternalCompleteOCL.g:4354:1: ( 'context' )
+            // InternalCompleteOCL.g:4381:1: ( ( 'context' ) )
+            // InternalCompleteOCL.g:4382:1: ( 'context' )
             {
-            // InternalCompleteOCL.g:4354:1: ( 'context' )
-            // InternalCompleteOCL.g:4355:1: 'context'
+            // InternalCompleteOCL.g:4382:1: ( 'context' )
+            // InternalCompleteOCL.g:4383:1: 'context'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getContextKeyword_0());
@@ -14745,14 +14830,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__1"
-    // InternalCompleteOCL.g:4368:1: rule__ClassifierContextDeclCS__Group__1 : rule__ClassifierContextDeclCS__Group__1__Impl rule__ClassifierContextDeclCS__Group__2 ;
+    // InternalCompleteOCL.g:4396:1: rule__ClassifierContextDeclCS__Group__1 : rule__ClassifierContextDeclCS__Group__1__Impl rule__ClassifierContextDeclCS__Group__2 ;
     public final void rule__ClassifierContextDeclCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4372:1: ( rule__ClassifierContextDeclCS__Group__1__Impl rule__ClassifierContextDeclCS__Group__2 )
-            // InternalCompleteOCL.g:4373:2: rule__ClassifierContextDeclCS__Group__1__Impl rule__ClassifierContextDeclCS__Group__2
+            // InternalCompleteOCL.g:4400:1: ( rule__ClassifierContextDeclCS__Group__1__Impl rule__ClassifierContextDeclCS__Group__2 )
+            // InternalCompleteOCL.g:4401:2: rule__ClassifierContextDeclCS__Group__1__Impl rule__ClassifierContextDeclCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ClassifierContextDeclCS__Group__1__Impl();
@@ -14783,22 +14868,22 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__1__Impl"
-    // InternalCompleteOCL.g:4380:1: rule__ClassifierContextDeclCS__Group__1__Impl : ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? ) ;
+    // InternalCompleteOCL.g:4408:1: rule__ClassifierContextDeclCS__Group__1__Impl : ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? ) ;
     public final void rule__ClassifierContextDeclCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4384:1: ( ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? ) )
-            // InternalCompleteOCL.g:4385:1: ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? )
+            // InternalCompleteOCL.g:4412:1: ( ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? ) )
+            // InternalCompleteOCL.g:4413:1: ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? )
             {
-            // InternalCompleteOCL.g:4385:1: ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? )
-            // InternalCompleteOCL.g:4386:1: ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )?
+            // InternalCompleteOCL.g:4413:1: ( ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )? )
+            // InternalCompleteOCL.g:4414:1: ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedSignatureAssignment_1());
             }
-            // InternalCompleteOCL.g:4387:1: ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )?
+            // InternalCompleteOCL.g:4415:1: ( rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 )?
             int alt48=2;
             int LA48_0 = input.LA(1);
 
@@ -14807,7 +14892,7 @@
             }
             switch (alt48) {
                 case 1 :
-                    // InternalCompleteOCL.g:4387:2: rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1
+                    // InternalCompleteOCL.g:4415:2: rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1();
@@ -14845,14 +14930,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__2"
-    // InternalCompleteOCL.g:4397:1: rule__ClassifierContextDeclCS__Group__2 : rule__ClassifierContextDeclCS__Group__2__Impl rule__ClassifierContextDeclCS__Group__3 ;
+    // InternalCompleteOCL.g:4425:1: rule__ClassifierContextDeclCS__Group__2 : rule__ClassifierContextDeclCS__Group__2__Impl rule__ClassifierContextDeclCS__Group__3 ;
     public final void rule__ClassifierContextDeclCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4401:1: ( rule__ClassifierContextDeclCS__Group__2__Impl rule__ClassifierContextDeclCS__Group__3 )
-            // InternalCompleteOCL.g:4402:2: rule__ClassifierContextDeclCS__Group__2__Impl rule__ClassifierContextDeclCS__Group__3
+            // InternalCompleteOCL.g:4429:1: ( rule__ClassifierContextDeclCS__Group__2__Impl rule__ClassifierContextDeclCS__Group__3 )
+            // InternalCompleteOCL.g:4430:2: rule__ClassifierContextDeclCS__Group__2__Impl rule__ClassifierContextDeclCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ClassifierContextDeclCS__Group__2__Impl();
@@ -14883,29 +14968,29 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__2__Impl"
-    // InternalCompleteOCL.g:4409:1: rule__ClassifierContextDeclCS__Group__2__Impl : ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? ) ;
+    // InternalCompleteOCL.g:4437:1: rule__ClassifierContextDeclCS__Group__2__Impl : ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? ) ;
     public final void rule__ClassifierContextDeclCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4413:1: ( ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? ) )
-            // InternalCompleteOCL.g:4414:1: ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? )
+            // InternalCompleteOCL.g:4441:1: ( ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? ) )
+            // InternalCompleteOCL.g:4442:1: ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? )
             {
-            // InternalCompleteOCL.g:4414:1: ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? )
-            // InternalCompleteOCL.g:4415:1: ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )?
+            // InternalCompleteOCL.g:4442:1: ( ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )? )
+            // InternalCompleteOCL.g:4443:1: ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getSelfNameAssignment_2());
             }
-            // InternalCompleteOCL.g:4416:1: ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )?
+            // InternalCompleteOCL.g:4444:1: ( rule__ClassifierContextDeclCS__SelfNameAssignment_2 )?
             int alt49=2;
             switch ( input.LA(1) ) {
                 case RULE_SIMPLE_ID:
                     {
                     int LA49_1 = input.LA(2);
 
-                    if ( ((LA49_1>=RULE_SIMPLE_ID && LA49_1<=RULE_ESCAPED_ID)||(LA49_1>=19 && LA49_1<=21)) ) {
+                    if ( ((LA49_1>=RULE_SIMPLE_ID && LA49_1<=RULE_ESCAPED_ID)||(LA49_1>=19 && LA49_1<=31)||(LA49_1>=56 && LA49_1<=62)) ) {
                         alt49=1;
                     }
                     }
@@ -14914,7 +14999,7 @@
                     {
                     int LA49_2 = input.LA(2);
 
-                    if ( ((LA49_2>=RULE_SIMPLE_ID && LA49_2<=RULE_ESCAPED_ID)||(LA49_2>=19 && LA49_2<=21)) ) {
+                    if ( ((LA49_2>=RULE_SIMPLE_ID && LA49_2<=RULE_ESCAPED_ID)||(LA49_2>=19 && LA49_2<=31)||(LA49_2>=56 && LA49_2<=62)) ) {
                         alt49=1;
                     }
                     }
@@ -14923,7 +15008,7 @@
                     {
                     int LA49_3 = input.LA(2);
 
-                    if ( ((LA49_3>=RULE_SIMPLE_ID && LA49_3<=RULE_ESCAPED_ID)||(LA49_3>=19 && LA49_3<=21)) ) {
+                    if ( ((LA49_3>=RULE_SIMPLE_ID && LA49_3<=RULE_ESCAPED_ID)||(LA49_3>=19 && LA49_3<=31)||(LA49_3>=56 && LA49_3<=62)) ) {
                         alt49=1;
                     }
                     }
@@ -14932,7 +15017,7 @@
                     {
                     int LA49_4 = input.LA(2);
 
-                    if ( ((LA49_4>=RULE_SIMPLE_ID && LA49_4<=RULE_ESCAPED_ID)||(LA49_4>=19 && LA49_4<=21)) ) {
+                    if ( ((LA49_4>=RULE_SIMPLE_ID && LA49_4<=RULE_ESCAPED_ID)||(LA49_4>=19 && LA49_4<=31)||(LA49_4>=56 && LA49_4<=62)) ) {
                         alt49=1;
                     }
                     }
@@ -14941,7 +15026,7 @@
                     {
                     int LA49_5 = input.LA(2);
 
-                    if ( ((LA49_5>=RULE_SIMPLE_ID && LA49_5<=RULE_ESCAPED_ID)||(LA49_5>=19 && LA49_5<=21)) ) {
+                    if ( ((LA49_5>=RULE_SIMPLE_ID && LA49_5<=RULE_ESCAPED_ID)||(LA49_5>=19 && LA49_5<=31)||(LA49_5>=56 && LA49_5<=62)) ) {
                         alt49=1;
                     }
                     }
@@ -14950,7 +15035,7 @@
 
             switch (alt49) {
                 case 1 :
-                    // InternalCompleteOCL.g:4416:2: rule__ClassifierContextDeclCS__SelfNameAssignment_2
+                    // InternalCompleteOCL.g:4444:2: rule__ClassifierContextDeclCS__SelfNameAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ClassifierContextDeclCS__SelfNameAssignment_2();
@@ -14988,14 +15073,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__3"
-    // InternalCompleteOCL.g:4426:1: rule__ClassifierContextDeclCS__Group__3 : rule__ClassifierContextDeclCS__Group__3__Impl rule__ClassifierContextDeclCS__Group__4 ;
+    // InternalCompleteOCL.g:4454:1: rule__ClassifierContextDeclCS__Group__3 : rule__ClassifierContextDeclCS__Group__3__Impl rule__ClassifierContextDeclCS__Group__4 ;
     public final void rule__ClassifierContextDeclCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4430:1: ( rule__ClassifierContextDeclCS__Group__3__Impl rule__ClassifierContextDeclCS__Group__4 )
-            // InternalCompleteOCL.g:4431:2: rule__ClassifierContextDeclCS__Group__3__Impl rule__ClassifierContextDeclCS__Group__4
+            // InternalCompleteOCL.g:4458:1: ( rule__ClassifierContextDeclCS__Group__3__Impl rule__ClassifierContextDeclCS__Group__4 )
+            // InternalCompleteOCL.g:4459:2: rule__ClassifierContextDeclCS__Group__3__Impl rule__ClassifierContextDeclCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__ClassifierContextDeclCS__Group__3__Impl();
@@ -15026,23 +15111,23 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__3__Impl"
-    // InternalCompleteOCL.g:4438:1: rule__ClassifierContextDeclCS__Group__3__Impl : ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) ) ;
+    // InternalCompleteOCL.g:4466:1: rule__ClassifierContextDeclCS__Group__3__Impl : ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) ) ;
     public final void rule__ClassifierContextDeclCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4442:1: ( ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) ) )
-            // InternalCompleteOCL.g:4443:1: ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) )
+            // InternalCompleteOCL.g:4470:1: ( ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) ) )
+            // InternalCompleteOCL.g:4471:1: ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) )
             {
-            // InternalCompleteOCL.g:4443:1: ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) )
-            // InternalCompleteOCL.g:4444:1: ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 )
+            // InternalCompleteOCL.g:4471:1: ( ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 ) )
+            // InternalCompleteOCL.g:4472:1: ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameAssignment_3());
             }
-            // InternalCompleteOCL.g:4445:1: ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 )
-            // InternalCompleteOCL.g:4445:2: rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3
+            // InternalCompleteOCL.g:4473:1: ( rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 )
+            // InternalCompleteOCL.g:4473:2: rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3();
@@ -15077,14 +15162,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__4"
-    // InternalCompleteOCL.g:4455:1: rule__ClassifierContextDeclCS__Group__4 : rule__ClassifierContextDeclCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:4483:1: rule__ClassifierContextDeclCS__Group__4 : rule__ClassifierContextDeclCS__Group__4__Impl ;
     public final void rule__ClassifierContextDeclCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4459:1: ( rule__ClassifierContextDeclCS__Group__4__Impl )
-            // InternalCompleteOCL.g:4460:2: rule__ClassifierContextDeclCS__Group__4__Impl
+            // InternalCompleteOCL.g:4487:1: ( rule__ClassifierContextDeclCS__Group__4__Impl )
+            // InternalCompleteOCL.g:4488:2: rule__ClassifierContextDeclCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ClassifierContextDeclCS__Group__4__Impl();
@@ -15110,26 +15195,26 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group__4__Impl"
-    // InternalCompleteOCL.g:4466:1: rule__ClassifierContextDeclCS__Group__4__Impl : ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) ) ;
+    // InternalCompleteOCL.g:4494:1: rule__ClassifierContextDeclCS__Group__4__Impl : ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) ) ;
     public final void rule__ClassifierContextDeclCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4470:1: ( ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) ) )
-            // InternalCompleteOCL.g:4471:1: ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) )
+            // InternalCompleteOCL.g:4498:1: ( ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) ) )
+            // InternalCompleteOCL.g:4499:1: ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) )
             {
-            // InternalCompleteOCL.g:4471:1: ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) )
-            // InternalCompleteOCL.g:4472:1: ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* )
+            // InternalCompleteOCL.g:4499:1: ( ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* ) )
+            // InternalCompleteOCL.g:4500:1: ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) ) ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* )
             {
-            // InternalCompleteOCL.g:4472:1: ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) )
-            // InternalCompleteOCL.g:4473:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )
+            // InternalCompleteOCL.g:4500:1: ( ( rule__ClassifierContextDeclCS__Alternatives_4 ) )
+            // InternalCompleteOCL.g:4501:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getAlternatives_4());
             }
-            // InternalCompleteOCL.g:4474:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )
-            // InternalCompleteOCL.g:4474:2: rule__ClassifierContextDeclCS__Alternatives_4
+            // InternalCompleteOCL.g:4502:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )
+            // InternalCompleteOCL.g:4502:2: rule__ClassifierContextDeclCS__Alternatives_4
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__ClassifierContextDeclCS__Alternatives_4();
@@ -15145,13 +15230,13 @@
 
             }
 
-            // InternalCompleteOCL.g:4477:1: ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* )
-            // InternalCompleteOCL.g:4478:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )*
+            // InternalCompleteOCL.g:4505:1: ( ( rule__ClassifierContextDeclCS__Alternatives_4 )* )
+            // InternalCompleteOCL.g:4506:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getAlternatives_4());
             }
-            // InternalCompleteOCL.g:4479:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )*
+            // InternalCompleteOCL.g:4507:1: ( rule__ClassifierContextDeclCS__Alternatives_4 )*
             loop50:
             do {
                 int alt50=2;
@@ -15164,7 +15249,7 @@
 
                 switch (alt50) {
             	case 1 :
-            	    // InternalCompleteOCL.g:4479:2: rule__ClassifierContextDeclCS__Alternatives_4
+            	    // InternalCompleteOCL.g:4507:2: rule__ClassifierContextDeclCS__Alternatives_4
             	    {
             	    pushFollow(FollowSets000.FOLLOW_9);
             	    rule__ClassifierContextDeclCS__Alternatives_4();
@@ -15208,14 +15293,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group_4_0__0"
-    // InternalCompleteOCL.g:4500:1: rule__ClassifierContextDeclCS__Group_4_0__0 : rule__ClassifierContextDeclCS__Group_4_0__0__Impl rule__ClassifierContextDeclCS__Group_4_0__1 ;
+    // InternalCompleteOCL.g:4528:1: rule__ClassifierContextDeclCS__Group_4_0__0 : rule__ClassifierContextDeclCS__Group_4_0__0__Impl rule__ClassifierContextDeclCS__Group_4_0__1 ;
     public final void rule__ClassifierContextDeclCS__Group_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4504:1: ( rule__ClassifierContextDeclCS__Group_4_0__0__Impl rule__ClassifierContextDeclCS__Group_4_0__1 )
-            // InternalCompleteOCL.g:4505:2: rule__ClassifierContextDeclCS__Group_4_0__0__Impl rule__ClassifierContextDeclCS__Group_4_0__1
+            // InternalCompleteOCL.g:4532:1: ( rule__ClassifierContextDeclCS__Group_4_0__0__Impl rule__ClassifierContextDeclCS__Group_4_0__1 )
+            // InternalCompleteOCL.g:4533:2: rule__ClassifierContextDeclCS__Group_4_0__0__Impl rule__ClassifierContextDeclCS__Group_4_0__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__ClassifierContextDeclCS__Group_4_0__0__Impl();
@@ -15246,17 +15331,17 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group_4_0__0__Impl"
-    // InternalCompleteOCL.g:4512:1: rule__ClassifierContextDeclCS__Group_4_0__0__Impl : ( 'inv' ) ;
+    // InternalCompleteOCL.g:4540:1: rule__ClassifierContextDeclCS__Group_4_0__0__Impl : ( 'inv' ) ;
     public final void rule__ClassifierContextDeclCS__Group_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4516:1: ( ( 'inv' ) )
-            // InternalCompleteOCL.g:4517:1: ( 'inv' )
+            // InternalCompleteOCL.g:4544:1: ( ( 'inv' ) )
+            // InternalCompleteOCL.g:4545:1: ( 'inv' )
             {
-            // InternalCompleteOCL.g:4517:1: ( 'inv' )
-            // InternalCompleteOCL.g:4518:1: 'inv'
+            // InternalCompleteOCL.g:4545:1: ( 'inv' )
+            // InternalCompleteOCL.g:4546:1: 'inv'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getInvKeyword_4_0_0());
@@ -15287,14 +15372,14 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group_4_0__1"
-    // InternalCompleteOCL.g:4531:1: rule__ClassifierContextDeclCS__Group_4_0__1 : rule__ClassifierContextDeclCS__Group_4_0__1__Impl ;
+    // InternalCompleteOCL.g:4559:1: rule__ClassifierContextDeclCS__Group_4_0__1 : rule__ClassifierContextDeclCS__Group_4_0__1__Impl ;
     public final void rule__ClassifierContextDeclCS__Group_4_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4535:1: ( rule__ClassifierContextDeclCS__Group_4_0__1__Impl )
-            // InternalCompleteOCL.g:4536:2: rule__ClassifierContextDeclCS__Group_4_0__1__Impl
+            // InternalCompleteOCL.g:4563:1: ( rule__ClassifierContextDeclCS__Group_4_0__1__Impl )
+            // InternalCompleteOCL.g:4564:2: rule__ClassifierContextDeclCS__Group_4_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ClassifierContextDeclCS__Group_4_0__1__Impl();
@@ -15320,23 +15405,23 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__Group_4_0__1__Impl"
-    // InternalCompleteOCL.g:4542:1: rule__ClassifierContextDeclCS__Group_4_0__1__Impl : ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) ) ;
+    // InternalCompleteOCL.g:4570:1: rule__ClassifierContextDeclCS__Group_4_0__1__Impl : ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) ) ;
     public final void rule__ClassifierContextDeclCS__Group_4_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4546:1: ( ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) ) )
-            // InternalCompleteOCL.g:4547:1: ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) )
+            // InternalCompleteOCL.g:4574:1: ( ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) ) )
+            // InternalCompleteOCL.g:4575:1: ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) )
             {
-            // InternalCompleteOCL.g:4547:1: ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) )
-            // InternalCompleteOCL.g:4548:1: ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 )
+            // InternalCompleteOCL.g:4575:1: ( ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 ) )
+            // InternalCompleteOCL.g:4576:1: ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedInvariantsAssignment_4_0_1());
             }
-            // InternalCompleteOCL.g:4549:1: ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 )
-            // InternalCompleteOCL.g:4549:2: rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1
+            // InternalCompleteOCL.g:4577:1: ( rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 )
+            // InternalCompleteOCL.g:4577:2: rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1();
@@ -15371,14 +15456,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group__0"
-    // InternalCompleteOCL.g:4563:1: rule__ConstraintCS__Group__0 : rule__ConstraintCS__Group__0__Impl rule__ConstraintCS__Group__1 ;
+    // InternalCompleteOCL.g:4591:1: rule__ConstraintCS__Group__0 : rule__ConstraintCS__Group__0__Impl rule__ConstraintCS__Group__1 ;
     public final void rule__ConstraintCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4567:1: ( rule__ConstraintCS__Group__0__Impl rule__ConstraintCS__Group__1 )
-            // InternalCompleteOCL.g:4568:2: rule__ConstraintCS__Group__0__Impl rule__ConstraintCS__Group__1
+            // InternalCompleteOCL.g:4595:1: ( rule__ConstraintCS__Group__0__Impl rule__ConstraintCS__Group__1 )
+            // InternalCompleteOCL.g:4596:2: rule__ConstraintCS__Group__0__Impl rule__ConstraintCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__ConstraintCS__Group__0__Impl();
@@ -15409,22 +15494,22 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group__0__Impl"
-    // InternalCompleteOCL.g:4575:1: rule__ConstraintCS__Group__0__Impl : ( ( rule__ConstraintCS__Group_0__0 )? ) ;
+    // InternalCompleteOCL.g:4603:1: rule__ConstraintCS__Group__0__Impl : ( ( rule__ConstraintCS__Group_0__0 )? ) ;
     public final void rule__ConstraintCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4579:1: ( ( ( rule__ConstraintCS__Group_0__0 )? ) )
-            // InternalCompleteOCL.g:4580:1: ( ( rule__ConstraintCS__Group_0__0 )? )
+            // InternalCompleteOCL.g:4607:1: ( ( ( rule__ConstraintCS__Group_0__0 )? ) )
+            // InternalCompleteOCL.g:4608:1: ( ( rule__ConstraintCS__Group_0__0 )? )
             {
-            // InternalCompleteOCL.g:4580:1: ( ( rule__ConstraintCS__Group_0__0 )? )
-            // InternalCompleteOCL.g:4581:1: ( rule__ConstraintCS__Group_0__0 )?
+            // InternalCompleteOCL.g:4608:1: ( ( rule__ConstraintCS__Group_0__0 )? )
+            // InternalCompleteOCL.g:4609:1: ( rule__ConstraintCS__Group_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getGroup_0());
             }
-            // InternalCompleteOCL.g:4582:1: ( rule__ConstraintCS__Group_0__0 )?
+            // InternalCompleteOCL.g:4610:1: ( rule__ConstraintCS__Group_0__0 )?
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -15433,7 +15518,7 @@
             }
             switch (alt51) {
                 case 1 :
-                    // InternalCompleteOCL.g:4582:2: rule__ConstraintCS__Group_0__0
+                    // InternalCompleteOCL.g:4610:2: rule__ConstraintCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ConstraintCS__Group_0__0();
@@ -15471,14 +15556,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group__1"
-    // InternalCompleteOCL.g:4592:1: rule__ConstraintCS__Group__1 : rule__ConstraintCS__Group__1__Impl rule__ConstraintCS__Group__2 ;
+    // InternalCompleteOCL.g:4620:1: rule__ConstraintCS__Group__1 : rule__ConstraintCS__Group__1__Impl rule__ConstraintCS__Group__2 ;
     public final void rule__ConstraintCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4596:1: ( rule__ConstraintCS__Group__1__Impl rule__ConstraintCS__Group__2 )
-            // InternalCompleteOCL.g:4597:2: rule__ConstraintCS__Group__1__Impl rule__ConstraintCS__Group__2
+            // InternalCompleteOCL.g:4624:1: ( rule__ConstraintCS__Group__1__Impl rule__ConstraintCS__Group__2 )
+            // InternalCompleteOCL.g:4625:2: rule__ConstraintCS__Group__1__Impl rule__ConstraintCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__ConstraintCS__Group__1__Impl();
@@ -15509,17 +15594,17 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group__1__Impl"
-    // InternalCompleteOCL.g:4604:1: rule__ConstraintCS__Group__1__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:4632:1: rule__ConstraintCS__Group__1__Impl : ( ':' ) ;
     public final void rule__ConstraintCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4608:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:4609:1: ( ':' )
+            // InternalCompleteOCL.g:4636:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:4637:1: ( ':' )
             {
-            // InternalCompleteOCL.g:4609:1: ( ':' )
-            // InternalCompleteOCL.g:4610:1: ':'
+            // InternalCompleteOCL.g:4637:1: ( ':' )
+            // InternalCompleteOCL.g:4638:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getColonKeyword_1());
@@ -15550,14 +15635,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group__2"
-    // InternalCompleteOCL.g:4623:1: rule__ConstraintCS__Group__2 : rule__ConstraintCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:4651:1: rule__ConstraintCS__Group__2 : rule__ConstraintCS__Group__2__Impl ;
     public final void rule__ConstraintCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4627:1: ( rule__ConstraintCS__Group__2__Impl )
-            // InternalCompleteOCL.g:4628:2: rule__ConstraintCS__Group__2__Impl
+            // InternalCompleteOCL.g:4655:1: ( rule__ConstraintCS__Group__2__Impl )
+            // InternalCompleteOCL.g:4656:2: rule__ConstraintCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ConstraintCS__Group__2__Impl();
@@ -15583,23 +15668,23 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group__2__Impl"
-    // InternalCompleteOCL.g:4634:1: rule__ConstraintCS__Group__2__Impl : ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:4662:1: rule__ConstraintCS__Group__2__Impl : ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) ) ;
     public final void rule__ConstraintCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4638:1: ( ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) ) )
-            // InternalCompleteOCL.g:4639:1: ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) )
+            // InternalCompleteOCL.g:4666:1: ( ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) ) )
+            // InternalCompleteOCL.g:4667:1: ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:4639:1: ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) )
-            // InternalCompleteOCL.g:4640:1: ( rule__ConstraintCS__OwnedSpecificationAssignment_2 )
+            // InternalCompleteOCL.g:4667:1: ( ( rule__ConstraintCS__OwnedSpecificationAssignment_2 ) )
+            // InternalCompleteOCL.g:4668:1: ( rule__ConstraintCS__OwnedSpecificationAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getOwnedSpecificationAssignment_2());
             }
-            // InternalCompleteOCL.g:4641:1: ( rule__ConstraintCS__OwnedSpecificationAssignment_2 )
-            // InternalCompleteOCL.g:4641:2: rule__ConstraintCS__OwnedSpecificationAssignment_2
+            // InternalCompleteOCL.g:4669:1: ( rule__ConstraintCS__OwnedSpecificationAssignment_2 )
+            // InternalCompleteOCL.g:4669:2: rule__ConstraintCS__OwnedSpecificationAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ConstraintCS__OwnedSpecificationAssignment_2();
@@ -15634,14 +15719,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0__0"
-    // InternalCompleteOCL.g:4657:1: rule__ConstraintCS__Group_0__0 : rule__ConstraintCS__Group_0__0__Impl rule__ConstraintCS__Group_0__1 ;
+    // InternalCompleteOCL.g:4685:1: rule__ConstraintCS__Group_0__0 : rule__ConstraintCS__Group_0__0__Impl rule__ConstraintCS__Group_0__1 ;
     public final void rule__ConstraintCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4661:1: ( rule__ConstraintCS__Group_0__0__Impl rule__ConstraintCS__Group_0__1 )
-            // InternalCompleteOCL.g:4662:2: rule__ConstraintCS__Group_0__0__Impl rule__ConstraintCS__Group_0__1
+            // InternalCompleteOCL.g:4689:1: ( rule__ConstraintCS__Group_0__0__Impl rule__ConstraintCS__Group_0__1 )
+            // InternalCompleteOCL.g:4690:2: rule__ConstraintCS__Group_0__0__Impl rule__ConstraintCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__ConstraintCS__Group_0__0__Impl();
@@ -15672,23 +15757,23 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:4669:1: rule__ConstraintCS__Group_0__0__Impl : ( ( rule__ConstraintCS__NameAssignment_0_0 ) ) ;
+    // InternalCompleteOCL.g:4697:1: rule__ConstraintCS__Group_0__0__Impl : ( ( rule__ConstraintCS__NameAssignment_0_0 ) ) ;
     public final void rule__ConstraintCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4673:1: ( ( ( rule__ConstraintCS__NameAssignment_0_0 ) ) )
-            // InternalCompleteOCL.g:4674:1: ( ( rule__ConstraintCS__NameAssignment_0_0 ) )
+            // InternalCompleteOCL.g:4701:1: ( ( ( rule__ConstraintCS__NameAssignment_0_0 ) ) )
+            // InternalCompleteOCL.g:4702:1: ( ( rule__ConstraintCS__NameAssignment_0_0 ) )
             {
-            // InternalCompleteOCL.g:4674:1: ( ( rule__ConstraintCS__NameAssignment_0_0 ) )
-            // InternalCompleteOCL.g:4675:1: ( rule__ConstraintCS__NameAssignment_0_0 )
+            // InternalCompleteOCL.g:4702:1: ( ( rule__ConstraintCS__NameAssignment_0_0 ) )
+            // InternalCompleteOCL.g:4703:1: ( rule__ConstraintCS__NameAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getNameAssignment_0_0());
             }
-            // InternalCompleteOCL.g:4676:1: ( rule__ConstraintCS__NameAssignment_0_0 )
-            // InternalCompleteOCL.g:4676:2: rule__ConstraintCS__NameAssignment_0_0
+            // InternalCompleteOCL.g:4704:1: ( rule__ConstraintCS__NameAssignment_0_0 )
+            // InternalCompleteOCL.g:4704:2: rule__ConstraintCS__NameAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ConstraintCS__NameAssignment_0_0();
@@ -15723,14 +15808,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0__1"
-    // InternalCompleteOCL.g:4686:1: rule__ConstraintCS__Group_0__1 : rule__ConstraintCS__Group_0__1__Impl ;
+    // InternalCompleteOCL.g:4714:1: rule__ConstraintCS__Group_0__1 : rule__ConstraintCS__Group_0__1__Impl ;
     public final void rule__ConstraintCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4690:1: ( rule__ConstraintCS__Group_0__1__Impl )
-            // InternalCompleteOCL.g:4691:2: rule__ConstraintCS__Group_0__1__Impl
+            // InternalCompleteOCL.g:4718:1: ( rule__ConstraintCS__Group_0__1__Impl )
+            // InternalCompleteOCL.g:4719:2: rule__ConstraintCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ConstraintCS__Group_0__1__Impl();
@@ -15756,22 +15841,22 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:4697:1: rule__ConstraintCS__Group_0__1__Impl : ( ( rule__ConstraintCS__Group_0_1__0 )? ) ;
+    // InternalCompleteOCL.g:4725:1: rule__ConstraintCS__Group_0__1__Impl : ( ( rule__ConstraintCS__Group_0_1__0 )? ) ;
     public final void rule__ConstraintCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4701:1: ( ( ( rule__ConstraintCS__Group_0_1__0 )? ) )
-            // InternalCompleteOCL.g:4702:1: ( ( rule__ConstraintCS__Group_0_1__0 )? )
+            // InternalCompleteOCL.g:4729:1: ( ( ( rule__ConstraintCS__Group_0_1__0 )? ) )
+            // InternalCompleteOCL.g:4730:1: ( ( rule__ConstraintCS__Group_0_1__0 )? )
             {
-            // InternalCompleteOCL.g:4702:1: ( ( rule__ConstraintCS__Group_0_1__0 )? )
-            // InternalCompleteOCL.g:4703:1: ( rule__ConstraintCS__Group_0_1__0 )?
+            // InternalCompleteOCL.g:4730:1: ( ( rule__ConstraintCS__Group_0_1__0 )? )
+            // InternalCompleteOCL.g:4731:1: ( rule__ConstraintCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getGroup_0_1());
             }
-            // InternalCompleteOCL.g:4704:1: ( rule__ConstraintCS__Group_0_1__0 )?
+            // InternalCompleteOCL.g:4732:1: ( rule__ConstraintCS__Group_0_1__0 )?
             int alt52=2;
             int LA52_0 = input.LA(1);
 
@@ -15780,7 +15865,7 @@
             }
             switch (alt52) {
                 case 1 :
-                    // InternalCompleteOCL.g:4704:2: rule__ConstraintCS__Group_0_1__0
+                    // InternalCompleteOCL.g:4732:2: rule__ConstraintCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ConstraintCS__Group_0_1__0();
@@ -15818,14 +15903,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0_1__0"
-    // InternalCompleteOCL.g:4718:1: rule__ConstraintCS__Group_0_1__0 : rule__ConstraintCS__Group_0_1__0__Impl rule__ConstraintCS__Group_0_1__1 ;
+    // InternalCompleteOCL.g:4746:1: rule__ConstraintCS__Group_0_1__0 : rule__ConstraintCS__Group_0_1__0__Impl rule__ConstraintCS__Group_0_1__1 ;
     public final void rule__ConstraintCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4722:1: ( rule__ConstraintCS__Group_0_1__0__Impl rule__ConstraintCS__Group_0_1__1 )
-            // InternalCompleteOCL.g:4723:2: rule__ConstraintCS__Group_0_1__0__Impl rule__ConstraintCS__Group_0_1__1
+            // InternalCompleteOCL.g:4750:1: ( rule__ConstraintCS__Group_0_1__0__Impl rule__ConstraintCS__Group_0_1__1 )
+            // InternalCompleteOCL.g:4751:2: rule__ConstraintCS__Group_0_1__0__Impl rule__ConstraintCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__ConstraintCS__Group_0_1__0__Impl();
@@ -15856,17 +15941,17 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0_1__0__Impl"
-    // InternalCompleteOCL.g:4730:1: rule__ConstraintCS__Group_0_1__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:4758:1: rule__ConstraintCS__Group_0_1__0__Impl : ( '(' ) ;
     public final void rule__ConstraintCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4734:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:4735:1: ( '(' )
+            // InternalCompleteOCL.g:4762:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:4763:1: ( '(' )
             {
-            // InternalCompleteOCL.g:4735:1: ( '(' )
-            // InternalCompleteOCL.g:4736:1: '('
+            // InternalCompleteOCL.g:4763:1: ( '(' )
+            // InternalCompleteOCL.g:4764:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getLeftParenthesisKeyword_0_1_0());
@@ -15897,14 +15982,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0_1__1"
-    // InternalCompleteOCL.g:4749:1: rule__ConstraintCS__Group_0_1__1 : rule__ConstraintCS__Group_0_1__1__Impl rule__ConstraintCS__Group_0_1__2 ;
+    // InternalCompleteOCL.g:4777:1: rule__ConstraintCS__Group_0_1__1 : rule__ConstraintCS__Group_0_1__1__Impl rule__ConstraintCS__Group_0_1__2 ;
     public final void rule__ConstraintCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4753:1: ( rule__ConstraintCS__Group_0_1__1__Impl rule__ConstraintCS__Group_0_1__2 )
-            // InternalCompleteOCL.g:4754:2: rule__ConstraintCS__Group_0_1__1__Impl rule__ConstraintCS__Group_0_1__2
+            // InternalCompleteOCL.g:4781:1: ( rule__ConstraintCS__Group_0_1__1__Impl rule__ConstraintCS__Group_0_1__2 )
+            // InternalCompleteOCL.g:4782:2: rule__ConstraintCS__Group_0_1__1__Impl rule__ConstraintCS__Group_0_1__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__ConstraintCS__Group_0_1__1__Impl();
@@ -15935,23 +16020,23 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0_1__1__Impl"
-    // InternalCompleteOCL.g:4761:1: rule__ConstraintCS__Group_0_1__1__Impl : ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) ) ;
+    // InternalCompleteOCL.g:4789:1: rule__ConstraintCS__Group_0_1__1__Impl : ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) ) ;
     public final void rule__ConstraintCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4765:1: ( ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) ) )
-            // InternalCompleteOCL.g:4766:1: ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) )
+            // InternalCompleteOCL.g:4793:1: ( ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) ) )
+            // InternalCompleteOCL.g:4794:1: ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) )
             {
-            // InternalCompleteOCL.g:4766:1: ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) )
-            // InternalCompleteOCL.g:4767:1: ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 )
+            // InternalCompleteOCL.g:4794:1: ( ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 ) )
+            // InternalCompleteOCL.g:4795:1: ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getOwnedMessageSpecificationAssignment_0_1_1());
             }
-            // InternalCompleteOCL.g:4768:1: ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 )
-            // InternalCompleteOCL.g:4768:2: rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1
+            // InternalCompleteOCL.g:4796:1: ( rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 )
+            // InternalCompleteOCL.g:4796:2: rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1();
@@ -15986,14 +16071,14 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0_1__2"
-    // InternalCompleteOCL.g:4778:1: rule__ConstraintCS__Group_0_1__2 : rule__ConstraintCS__Group_0_1__2__Impl ;
+    // InternalCompleteOCL.g:4806:1: rule__ConstraintCS__Group_0_1__2 : rule__ConstraintCS__Group_0_1__2__Impl ;
     public final void rule__ConstraintCS__Group_0_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4782:1: ( rule__ConstraintCS__Group_0_1__2__Impl )
-            // InternalCompleteOCL.g:4783:2: rule__ConstraintCS__Group_0_1__2__Impl
+            // InternalCompleteOCL.g:4810:1: ( rule__ConstraintCS__Group_0_1__2__Impl )
+            // InternalCompleteOCL.g:4811:2: rule__ConstraintCS__Group_0_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ConstraintCS__Group_0_1__2__Impl();
@@ -16019,17 +16104,17 @@
 
 
     // $ANTLR start "rule__ConstraintCS__Group_0_1__2__Impl"
-    // InternalCompleteOCL.g:4789:1: rule__ConstraintCS__Group_0_1__2__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:4817:1: rule__ConstraintCS__Group_0_1__2__Impl : ( ')' ) ;
     public final void rule__ConstraintCS__Group_0_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4793:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:4794:1: ( ')' )
+            // InternalCompleteOCL.g:4821:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:4822:1: ( ')' )
             {
-            // InternalCompleteOCL.g:4794:1: ( ')' )
-            // InternalCompleteOCL.g:4795:1: ')'
+            // InternalCompleteOCL.g:4822:1: ( ')' )
+            // InternalCompleteOCL.g:4823:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getRightParenthesisKeyword_0_1_2());
@@ -16060,14 +16145,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__0"
-    // InternalCompleteOCL.g:4814:1: rule__DefOperationCS__Group__0 : rule__DefOperationCS__Group__0__Impl rule__DefOperationCS__Group__1 ;
+    // InternalCompleteOCL.g:4842:1: rule__DefOperationCS__Group__0 : rule__DefOperationCS__Group__0__Impl rule__DefOperationCS__Group__1 ;
     public final void rule__DefOperationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4818:1: ( rule__DefOperationCS__Group__0__Impl rule__DefOperationCS__Group__1 )
-            // InternalCompleteOCL.g:4819:2: rule__DefOperationCS__Group__0__Impl rule__DefOperationCS__Group__1
+            // InternalCompleteOCL.g:4846:1: ( rule__DefOperationCS__Group__0__Impl rule__DefOperationCS__Group__1 )
+            // InternalCompleteOCL.g:4847:2: rule__DefOperationCS__Group__0__Impl rule__DefOperationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__DefOperationCS__Group__0__Impl();
@@ -16098,22 +16183,22 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__0__Impl"
-    // InternalCompleteOCL.g:4826:1: rule__DefOperationCS__Group__0__Impl : ( ( rule__DefOperationCS__IsStaticAssignment_0 )? ) ;
+    // InternalCompleteOCL.g:4854:1: rule__DefOperationCS__Group__0__Impl : ( ( rule__DefOperationCS__IsStaticAssignment_0 )? ) ;
     public final void rule__DefOperationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4830:1: ( ( ( rule__DefOperationCS__IsStaticAssignment_0 )? ) )
-            // InternalCompleteOCL.g:4831:1: ( ( rule__DefOperationCS__IsStaticAssignment_0 )? )
+            // InternalCompleteOCL.g:4858:1: ( ( ( rule__DefOperationCS__IsStaticAssignment_0 )? ) )
+            // InternalCompleteOCL.g:4859:1: ( ( rule__DefOperationCS__IsStaticAssignment_0 )? )
             {
-            // InternalCompleteOCL.g:4831:1: ( ( rule__DefOperationCS__IsStaticAssignment_0 )? )
-            // InternalCompleteOCL.g:4832:1: ( rule__DefOperationCS__IsStaticAssignment_0 )?
+            // InternalCompleteOCL.g:4859:1: ( ( rule__DefOperationCS__IsStaticAssignment_0 )? )
+            // InternalCompleteOCL.g:4860:1: ( rule__DefOperationCS__IsStaticAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getIsStaticAssignment_0());
             }
-            // InternalCompleteOCL.g:4833:1: ( rule__DefOperationCS__IsStaticAssignment_0 )?
+            // InternalCompleteOCL.g:4861:1: ( rule__DefOperationCS__IsStaticAssignment_0 )?
             int alt53=2;
             int LA53_0 = input.LA(1);
 
@@ -16122,7 +16207,7 @@
             }
             switch (alt53) {
                 case 1 :
-                    // InternalCompleteOCL.g:4833:2: rule__DefOperationCS__IsStaticAssignment_0
+                    // InternalCompleteOCL.g:4861:2: rule__DefOperationCS__IsStaticAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DefOperationCS__IsStaticAssignment_0();
@@ -16160,14 +16245,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__1"
-    // InternalCompleteOCL.g:4843:1: rule__DefOperationCS__Group__1 : rule__DefOperationCS__Group__1__Impl rule__DefOperationCS__Group__2 ;
+    // InternalCompleteOCL.g:4871:1: rule__DefOperationCS__Group__1 : rule__DefOperationCS__Group__1__Impl rule__DefOperationCS__Group__2 ;
     public final void rule__DefOperationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4847:1: ( rule__DefOperationCS__Group__1__Impl rule__DefOperationCS__Group__2 )
-            // InternalCompleteOCL.g:4848:2: rule__DefOperationCS__Group__1__Impl rule__DefOperationCS__Group__2
+            // InternalCompleteOCL.g:4875:1: ( rule__DefOperationCS__Group__1__Impl rule__DefOperationCS__Group__2 )
+            // InternalCompleteOCL.g:4876:2: rule__DefOperationCS__Group__1__Impl rule__DefOperationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__DefOperationCS__Group__1__Impl();
@@ -16198,17 +16283,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__1__Impl"
-    // InternalCompleteOCL.g:4855:1: rule__DefOperationCS__Group__1__Impl : ( 'def' ) ;
+    // InternalCompleteOCL.g:4883:1: rule__DefOperationCS__Group__1__Impl : ( 'def' ) ;
     public final void rule__DefOperationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4859:1: ( ( 'def' ) )
-            // InternalCompleteOCL.g:4860:1: ( 'def' )
+            // InternalCompleteOCL.g:4887:1: ( ( 'def' ) )
+            // InternalCompleteOCL.g:4888:1: ( 'def' )
             {
-            // InternalCompleteOCL.g:4860:1: ( 'def' )
-            // InternalCompleteOCL.g:4861:1: 'def'
+            // InternalCompleteOCL.g:4888:1: ( 'def' )
+            // InternalCompleteOCL.g:4889:1: 'def'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getDefKeyword_1());
@@ -16239,14 +16324,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__2"
-    // InternalCompleteOCL.g:4874:1: rule__DefOperationCS__Group__2 : rule__DefOperationCS__Group__2__Impl rule__DefOperationCS__Group__3 ;
+    // InternalCompleteOCL.g:4902:1: rule__DefOperationCS__Group__2 : rule__DefOperationCS__Group__2__Impl rule__DefOperationCS__Group__3 ;
     public final void rule__DefOperationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4878:1: ( rule__DefOperationCS__Group__2__Impl rule__DefOperationCS__Group__3 )
-            // InternalCompleteOCL.g:4879:2: rule__DefOperationCS__Group__2__Impl rule__DefOperationCS__Group__3
+            // InternalCompleteOCL.g:4906:1: ( rule__DefOperationCS__Group__2__Impl rule__DefOperationCS__Group__3 )
+            // InternalCompleteOCL.g:4907:2: rule__DefOperationCS__Group__2__Impl rule__DefOperationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__DefOperationCS__Group__2__Impl();
@@ -16277,22 +16362,22 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__2__Impl"
-    // InternalCompleteOCL.g:4886:1: rule__DefOperationCS__Group__2__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalCompleteOCL.g:4914:1: rule__DefOperationCS__Group__2__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__DefOperationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4890:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalCompleteOCL.g:4891:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:4918:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalCompleteOCL.g:4919:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalCompleteOCL.g:4891:1: ( ( ruleUnrestrictedName )? )
-            // InternalCompleteOCL.g:4892:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:4919:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:4920:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getUnrestrictedNameParserRuleCall_2());
             }
-            // InternalCompleteOCL.g:4893:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:4921:1: ( ruleUnrestrictedName )?
             int alt54=2;
             int LA54_0 = input.LA(1);
 
@@ -16301,7 +16386,7 @@
             }
             switch (alt54) {
                 case 1 :
-                    // InternalCompleteOCL.g:4893:3: ruleUnrestrictedName
+                    // InternalCompleteOCL.g:4921:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -16339,16 +16424,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__3"
-    // InternalCompleteOCL.g:4903:1: rule__DefOperationCS__Group__3 : rule__DefOperationCS__Group__3__Impl rule__DefOperationCS__Group__4 ;
+    // InternalCompleteOCL.g:4931:1: rule__DefOperationCS__Group__3 : rule__DefOperationCS__Group__3__Impl rule__DefOperationCS__Group__4 ;
     public final void rule__DefOperationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4907:1: ( rule__DefOperationCS__Group__3__Impl rule__DefOperationCS__Group__4 )
-            // InternalCompleteOCL.g:4908:2: rule__DefOperationCS__Group__3__Impl rule__DefOperationCS__Group__4
+            // InternalCompleteOCL.g:4935:1: ( rule__DefOperationCS__Group__3__Impl rule__DefOperationCS__Group__4 )
+            // InternalCompleteOCL.g:4936:2: rule__DefOperationCS__Group__3__Impl rule__DefOperationCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_7);
+            pushFollow(FollowSets000.FOLLOW_15);
             rule__DefOperationCS__Group__3__Impl();
 
             state._fsp--;
@@ -16377,17 +16462,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__3__Impl"
-    // InternalCompleteOCL.g:4915:1: rule__DefOperationCS__Group__3__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:4943:1: rule__DefOperationCS__Group__3__Impl : ( ':' ) ;
     public final void rule__DefOperationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4919:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:4920:1: ( ':' )
+            // InternalCompleteOCL.g:4947:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:4948:1: ( ':' )
             {
-            // InternalCompleteOCL.g:4920:1: ( ':' )
-            // InternalCompleteOCL.g:4921:1: ':'
+            // InternalCompleteOCL.g:4948:1: ( ':' )
+            // InternalCompleteOCL.g:4949:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getColonKeyword_3());
@@ -16418,16 +16503,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__4"
-    // InternalCompleteOCL.g:4934:1: rule__DefOperationCS__Group__4 : rule__DefOperationCS__Group__4__Impl rule__DefOperationCS__Group__5 ;
+    // InternalCompleteOCL.g:4962:1: rule__DefOperationCS__Group__4 : rule__DefOperationCS__Group__4__Impl rule__DefOperationCS__Group__5 ;
     public final void rule__DefOperationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4938:1: ( rule__DefOperationCS__Group__4__Impl rule__DefOperationCS__Group__5 )
-            // InternalCompleteOCL.g:4939:2: rule__DefOperationCS__Group__4__Impl rule__DefOperationCS__Group__5
+            // InternalCompleteOCL.g:4966:1: ( rule__DefOperationCS__Group__4__Impl rule__DefOperationCS__Group__5 )
+            // InternalCompleteOCL.g:4967:2: rule__DefOperationCS__Group__4__Impl rule__DefOperationCS__Group__5
             {
-            pushFollow(FollowSets000.FOLLOW_7);
+            pushFollow(FollowSets000.FOLLOW_15);
             rule__DefOperationCS__Group__4__Impl();
 
             state._fsp--;
@@ -16456,22 +16541,22 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__4__Impl"
-    // InternalCompleteOCL.g:4946:1: rule__DefOperationCS__Group__4__Impl : ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? ) ;
+    // InternalCompleteOCL.g:4974:1: rule__DefOperationCS__Group__4__Impl : ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? ) ;
     public final void rule__DefOperationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4950:1: ( ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? ) )
-            // InternalCompleteOCL.g:4951:1: ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? )
+            // InternalCompleteOCL.g:4978:1: ( ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? ) )
+            // InternalCompleteOCL.g:4979:1: ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? )
             {
-            // InternalCompleteOCL.g:4951:1: ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? )
-            // InternalCompleteOCL.g:4952:1: ( rule__DefOperationCS__OwnedSignatureAssignment_4 )?
+            // InternalCompleteOCL.g:4979:1: ( ( rule__DefOperationCS__OwnedSignatureAssignment_4 )? )
+            // InternalCompleteOCL.g:4980:1: ( rule__DefOperationCS__OwnedSignatureAssignment_4 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedSignatureAssignment_4());
             }
-            // InternalCompleteOCL.g:4953:1: ( rule__DefOperationCS__OwnedSignatureAssignment_4 )?
+            // InternalCompleteOCL.g:4981:1: ( rule__DefOperationCS__OwnedSignatureAssignment_4 )?
             int alt55=2;
             int LA55_0 = input.LA(1);
 
@@ -16480,7 +16565,7 @@
             }
             switch (alt55) {
                 case 1 :
-                    // InternalCompleteOCL.g:4953:2: rule__DefOperationCS__OwnedSignatureAssignment_4
+                    // InternalCompleteOCL.g:4981:2: rule__DefOperationCS__OwnedSignatureAssignment_4
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DefOperationCS__OwnedSignatureAssignment_4();
@@ -16518,14 +16603,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__5"
-    // InternalCompleteOCL.g:4963:1: rule__DefOperationCS__Group__5 : rule__DefOperationCS__Group__5__Impl rule__DefOperationCS__Group__6 ;
+    // InternalCompleteOCL.g:4991:1: rule__DefOperationCS__Group__5 : rule__DefOperationCS__Group__5__Impl rule__DefOperationCS__Group__6 ;
     public final void rule__DefOperationCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4967:1: ( rule__DefOperationCS__Group__5__Impl rule__DefOperationCS__Group__6 )
-            // InternalCompleteOCL.g:4968:2: rule__DefOperationCS__Group__5__Impl rule__DefOperationCS__Group__6
+            // InternalCompleteOCL.g:4995:1: ( rule__DefOperationCS__Group__5__Impl rule__DefOperationCS__Group__6 )
+            // InternalCompleteOCL.g:4996:2: rule__DefOperationCS__Group__5__Impl rule__DefOperationCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__DefOperationCS__Group__5__Impl();
@@ -16556,23 +16641,23 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__5__Impl"
-    // InternalCompleteOCL.g:4975:1: rule__DefOperationCS__Group__5__Impl : ( ( rule__DefOperationCS__NameAssignment_5 ) ) ;
+    // InternalCompleteOCL.g:5003:1: rule__DefOperationCS__Group__5__Impl : ( ( rule__DefOperationCS__NameAssignment_5 ) ) ;
     public final void rule__DefOperationCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4979:1: ( ( ( rule__DefOperationCS__NameAssignment_5 ) ) )
-            // InternalCompleteOCL.g:4980:1: ( ( rule__DefOperationCS__NameAssignment_5 ) )
+            // InternalCompleteOCL.g:5007:1: ( ( ( rule__DefOperationCS__NameAssignment_5 ) ) )
+            // InternalCompleteOCL.g:5008:1: ( ( rule__DefOperationCS__NameAssignment_5 ) )
             {
-            // InternalCompleteOCL.g:4980:1: ( ( rule__DefOperationCS__NameAssignment_5 ) )
-            // InternalCompleteOCL.g:4981:1: ( rule__DefOperationCS__NameAssignment_5 )
+            // InternalCompleteOCL.g:5008:1: ( ( rule__DefOperationCS__NameAssignment_5 ) )
+            // InternalCompleteOCL.g:5009:1: ( rule__DefOperationCS__NameAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getNameAssignment_5());
             }
-            // InternalCompleteOCL.g:4982:1: ( rule__DefOperationCS__NameAssignment_5 )
-            // InternalCompleteOCL.g:4982:2: rule__DefOperationCS__NameAssignment_5
+            // InternalCompleteOCL.g:5010:1: ( rule__DefOperationCS__NameAssignment_5 )
+            // InternalCompleteOCL.g:5010:2: rule__DefOperationCS__NameAssignment_5
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__NameAssignment_5();
@@ -16607,16 +16692,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__6"
-    // InternalCompleteOCL.g:4992:1: rule__DefOperationCS__Group__6 : rule__DefOperationCS__Group__6__Impl rule__DefOperationCS__Group__7 ;
+    // InternalCompleteOCL.g:5020:1: rule__DefOperationCS__Group__6 : rule__DefOperationCS__Group__6__Impl rule__DefOperationCS__Group__7 ;
     public final void rule__DefOperationCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:4996:1: ( rule__DefOperationCS__Group__6__Impl rule__DefOperationCS__Group__7 )
-            // InternalCompleteOCL.g:4997:2: rule__DefOperationCS__Group__6__Impl rule__DefOperationCS__Group__7
+            // InternalCompleteOCL.g:5024:1: ( rule__DefOperationCS__Group__6__Impl rule__DefOperationCS__Group__7 )
+            // InternalCompleteOCL.g:5025:2: rule__DefOperationCS__Group__6__Impl rule__DefOperationCS__Group__7
             {
-            pushFollow(FollowSets000.FOLLOW_15);
+            pushFollow(FollowSets000.FOLLOW_16);
             rule__DefOperationCS__Group__6__Impl();
 
             state._fsp--;
@@ -16645,17 +16730,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__6__Impl"
-    // InternalCompleteOCL.g:5004:1: rule__DefOperationCS__Group__6__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:5032:1: rule__DefOperationCS__Group__6__Impl : ( '(' ) ;
     public final void rule__DefOperationCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5008:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:5009:1: ( '(' )
+            // InternalCompleteOCL.g:5036:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:5037:1: ( '(' )
             {
-            // InternalCompleteOCL.g:5009:1: ( '(' )
-            // InternalCompleteOCL.g:5010:1: '('
+            // InternalCompleteOCL.g:5037:1: ( '(' )
+            // InternalCompleteOCL.g:5038:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getLeftParenthesisKeyword_6());
@@ -16686,16 +16771,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__7"
-    // InternalCompleteOCL.g:5023:1: rule__DefOperationCS__Group__7 : rule__DefOperationCS__Group__7__Impl rule__DefOperationCS__Group__8 ;
+    // InternalCompleteOCL.g:5051:1: rule__DefOperationCS__Group__7 : rule__DefOperationCS__Group__7__Impl rule__DefOperationCS__Group__8 ;
     public final void rule__DefOperationCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5027:1: ( rule__DefOperationCS__Group__7__Impl rule__DefOperationCS__Group__8 )
-            // InternalCompleteOCL.g:5028:2: rule__DefOperationCS__Group__7__Impl rule__DefOperationCS__Group__8
+            // InternalCompleteOCL.g:5055:1: ( rule__DefOperationCS__Group__7__Impl rule__DefOperationCS__Group__8 )
+            // InternalCompleteOCL.g:5056:2: rule__DefOperationCS__Group__7__Impl rule__DefOperationCS__Group__8
             {
-            pushFollow(FollowSets000.FOLLOW_15);
+            pushFollow(FollowSets000.FOLLOW_16);
             rule__DefOperationCS__Group__7__Impl();
 
             state._fsp--;
@@ -16724,22 +16809,22 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__7__Impl"
-    // InternalCompleteOCL.g:5035:1: rule__DefOperationCS__Group__7__Impl : ( ( rule__DefOperationCS__Group_7__0 )? ) ;
+    // InternalCompleteOCL.g:5063:1: rule__DefOperationCS__Group__7__Impl : ( ( rule__DefOperationCS__Group_7__0 )? ) ;
     public final void rule__DefOperationCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5039:1: ( ( ( rule__DefOperationCS__Group_7__0 )? ) )
-            // InternalCompleteOCL.g:5040:1: ( ( rule__DefOperationCS__Group_7__0 )? )
+            // InternalCompleteOCL.g:5067:1: ( ( ( rule__DefOperationCS__Group_7__0 )? ) )
+            // InternalCompleteOCL.g:5068:1: ( ( rule__DefOperationCS__Group_7__0 )? )
             {
-            // InternalCompleteOCL.g:5040:1: ( ( rule__DefOperationCS__Group_7__0 )? )
-            // InternalCompleteOCL.g:5041:1: ( rule__DefOperationCS__Group_7__0 )?
+            // InternalCompleteOCL.g:5068:1: ( ( rule__DefOperationCS__Group_7__0 )? )
+            // InternalCompleteOCL.g:5069:1: ( rule__DefOperationCS__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getGroup_7());
             }
-            // InternalCompleteOCL.g:5042:1: ( rule__DefOperationCS__Group_7__0 )?
+            // InternalCompleteOCL.g:5070:1: ( rule__DefOperationCS__Group_7__0 )?
             int alt56=2;
             int LA56_0 = input.LA(1);
 
@@ -16748,7 +16833,7 @@
             }
             switch (alt56) {
                 case 1 :
-                    // InternalCompleteOCL.g:5042:2: rule__DefOperationCS__Group_7__0
+                    // InternalCompleteOCL.g:5070:2: rule__DefOperationCS__Group_7__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DefOperationCS__Group_7__0();
@@ -16786,16 +16871,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__8"
-    // InternalCompleteOCL.g:5052:1: rule__DefOperationCS__Group__8 : rule__DefOperationCS__Group__8__Impl rule__DefOperationCS__Group__9 ;
+    // InternalCompleteOCL.g:5080:1: rule__DefOperationCS__Group__8 : rule__DefOperationCS__Group__8__Impl rule__DefOperationCS__Group__9 ;
     public final void rule__DefOperationCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5056:1: ( rule__DefOperationCS__Group__8__Impl rule__DefOperationCS__Group__9 )
-            // InternalCompleteOCL.g:5057:2: rule__DefOperationCS__Group__8__Impl rule__DefOperationCS__Group__9
+            // InternalCompleteOCL.g:5084:1: ( rule__DefOperationCS__Group__8__Impl rule__DefOperationCS__Group__9 )
+            // InternalCompleteOCL.g:5085:2: rule__DefOperationCS__Group__8__Impl rule__DefOperationCS__Group__9
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__DefOperationCS__Group__8__Impl();
 
             state._fsp--;
@@ -16824,17 +16909,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__8__Impl"
-    // InternalCompleteOCL.g:5064:1: rule__DefOperationCS__Group__8__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:5092:1: rule__DefOperationCS__Group__8__Impl : ( ')' ) ;
     public final void rule__DefOperationCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5068:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:5069:1: ( ')' )
+            // InternalCompleteOCL.g:5096:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:5097:1: ( ')' )
             {
-            // InternalCompleteOCL.g:5069:1: ( ')' )
-            // InternalCompleteOCL.g:5070:1: ')'
+            // InternalCompleteOCL.g:5097:1: ( ')' )
+            // InternalCompleteOCL.g:5098:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getRightParenthesisKeyword_8());
@@ -16865,16 +16950,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__9"
-    // InternalCompleteOCL.g:5083:1: rule__DefOperationCS__Group__9 : rule__DefOperationCS__Group__9__Impl rule__DefOperationCS__Group__10 ;
+    // InternalCompleteOCL.g:5111:1: rule__DefOperationCS__Group__9 : rule__DefOperationCS__Group__9__Impl rule__DefOperationCS__Group__10 ;
     public final void rule__DefOperationCS__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5087:1: ( rule__DefOperationCS__Group__9__Impl rule__DefOperationCS__Group__10 )
-            // InternalCompleteOCL.g:5088:2: rule__DefOperationCS__Group__9__Impl rule__DefOperationCS__Group__10
+            // InternalCompleteOCL.g:5115:1: ( rule__DefOperationCS__Group__9__Impl rule__DefOperationCS__Group__10 )
+            // InternalCompleteOCL.g:5116:2: rule__DefOperationCS__Group__9__Impl rule__DefOperationCS__Group__10
             {
-            pushFollow(FollowSets000.FOLLOW_17);
+            pushFollow(FollowSets000.FOLLOW_18);
             rule__DefOperationCS__Group__9__Impl();
 
             state._fsp--;
@@ -16903,17 +16988,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__9__Impl"
-    // InternalCompleteOCL.g:5095:1: rule__DefOperationCS__Group__9__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:5123:1: rule__DefOperationCS__Group__9__Impl : ( ':' ) ;
     public final void rule__DefOperationCS__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5099:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:5100:1: ( ':' )
+            // InternalCompleteOCL.g:5127:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:5128:1: ( ':' )
             {
-            // InternalCompleteOCL.g:5100:1: ( ':' )
-            // InternalCompleteOCL.g:5101:1: ':'
+            // InternalCompleteOCL.g:5128:1: ( ':' )
+            // InternalCompleteOCL.g:5129:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getColonKeyword_9());
@@ -16944,16 +17029,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__10"
-    // InternalCompleteOCL.g:5114:1: rule__DefOperationCS__Group__10 : rule__DefOperationCS__Group__10__Impl rule__DefOperationCS__Group__11 ;
+    // InternalCompleteOCL.g:5142:1: rule__DefOperationCS__Group__10 : rule__DefOperationCS__Group__10__Impl rule__DefOperationCS__Group__11 ;
     public final void rule__DefOperationCS__Group__10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5118:1: ( rule__DefOperationCS__Group__10__Impl rule__DefOperationCS__Group__11 )
-            // InternalCompleteOCL.g:5119:2: rule__DefOperationCS__Group__10__Impl rule__DefOperationCS__Group__11
+            // InternalCompleteOCL.g:5146:1: ( rule__DefOperationCS__Group__10__Impl rule__DefOperationCS__Group__11 )
+            // InternalCompleteOCL.g:5147:2: rule__DefOperationCS__Group__10__Impl rule__DefOperationCS__Group__11
             {
-            pushFollow(FollowSets000.FOLLOW_17);
+            pushFollow(FollowSets000.FOLLOW_18);
             rule__DefOperationCS__Group__10__Impl();
 
             state._fsp--;
@@ -16982,22 +17067,22 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__10__Impl"
-    // InternalCompleteOCL.g:5126:1: rule__DefOperationCS__Group__10__Impl : ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? ) ;
+    // InternalCompleteOCL.g:5154:1: rule__DefOperationCS__Group__10__Impl : ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? ) ;
     public final void rule__DefOperationCS__Group__10__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5130:1: ( ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? ) )
-            // InternalCompleteOCL.g:5131:1: ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? )
+            // InternalCompleteOCL.g:5158:1: ( ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? ) )
+            // InternalCompleteOCL.g:5159:1: ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? )
             {
-            // InternalCompleteOCL.g:5131:1: ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? )
-            // InternalCompleteOCL.g:5132:1: ( rule__DefOperationCS__OwnedTypeAssignment_10 )?
+            // InternalCompleteOCL.g:5159:1: ( ( rule__DefOperationCS__OwnedTypeAssignment_10 )? )
+            // InternalCompleteOCL.g:5160:1: ( rule__DefOperationCS__OwnedTypeAssignment_10 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedTypeAssignment_10());
             }
-            // InternalCompleteOCL.g:5133:1: ( rule__DefOperationCS__OwnedTypeAssignment_10 )?
+            // InternalCompleteOCL.g:5161:1: ( rule__DefOperationCS__OwnedTypeAssignment_10 )?
             int alt57=2;
             int LA57_0 = input.LA(1);
 
@@ -17006,7 +17091,7 @@
             }
             switch (alt57) {
                 case 1 :
-                    // InternalCompleteOCL.g:5133:2: rule__DefOperationCS__OwnedTypeAssignment_10
+                    // InternalCompleteOCL.g:5161:2: rule__DefOperationCS__OwnedTypeAssignment_10
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DefOperationCS__OwnedTypeAssignment_10();
@@ -17044,14 +17129,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__11"
-    // InternalCompleteOCL.g:5143:1: rule__DefOperationCS__Group__11 : rule__DefOperationCS__Group__11__Impl rule__DefOperationCS__Group__12 ;
+    // InternalCompleteOCL.g:5171:1: rule__DefOperationCS__Group__11 : rule__DefOperationCS__Group__11__Impl rule__DefOperationCS__Group__12 ;
     public final void rule__DefOperationCS__Group__11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5147:1: ( rule__DefOperationCS__Group__11__Impl rule__DefOperationCS__Group__12 )
-            // InternalCompleteOCL.g:5148:2: rule__DefOperationCS__Group__11__Impl rule__DefOperationCS__Group__12
+            // InternalCompleteOCL.g:5175:1: ( rule__DefOperationCS__Group__11__Impl rule__DefOperationCS__Group__12 )
+            // InternalCompleteOCL.g:5176:2: rule__DefOperationCS__Group__11__Impl rule__DefOperationCS__Group__12
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__DefOperationCS__Group__11__Impl();
@@ -17082,17 +17167,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__11__Impl"
-    // InternalCompleteOCL.g:5155:1: rule__DefOperationCS__Group__11__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:5183:1: rule__DefOperationCS__Group__11__Impl : ( '=' ) ;
     public final void rule__DefOperationCS__Group__11__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5159:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:5160:1: ( '=' )
+            // InternalCompleteOCL.g:5187:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:5188:1: ( '=' )
             {
-            // InternalCompleteOCL.g:5160:1: ( '=' )
-            // InternalCompleteOCL.g:5161:1: '='
+            // InternalCompleteOCL.g:5188:1: ( '=' )
+            // InternalCompleteOCL.g:5189:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getEqualsSignKeyword_11());
@@ -17123,14 +17208,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__12"
-    // InternalCompleteOCL.g:5174:1: rule__DefOperationCS__Group__12 : rule__DefOperationCS__Group__12__Impl ;
+    // InternalCompleteOCL.g:5202:1: rule__DefOperationCS__Group__12 : rule__DefOperationCS__Group__12__Impl ;
     public final void rule__DefOperationCS__Group__12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5178:1: ( rule__DefOperationCS__Group__12__Impl )
-            // InternalCompleteOCL.g:5179:2: rule__DefOperationCS__Group__12__Impl
+            // InternalCompleteOCL.g:5206:1: ( rule__DefOperationCS__Group__12__Impl )
+            // InternalCompleteOCL.g:5207:2: rule__DefOperationCS__Group__12__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__Group__12__Impl();
@@ -17156,23 +17241,23 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group__12__Impl"
-    // InternalCompleteOCL.g:5185:1: rule__DefOperationCS__Group__12__Impl : ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) ) ;
+    // InternalCompleteOCL.g:5213:1: rule__DefOperationCS__Group__12__Impl : ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) ) ;
     public final void rule__DefOperationCS__Group__12__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5189:1: ( ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) ) )
-            // InternalCompleteOCL.g:5190:1: ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) )
+            // InternalCompleteOCL.g:5217:1: ( ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) ) )
+            // InternalCompleteOCL.g:5218:1: ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) )
             {
-            // InternalCompleteOCL.g:5190:1: ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) )
-            // InternalCompleteOCL.g:5191:1: ( rule__DefOperationCS__OwnedSpecificationAssignment_12 )
+            // InternalCompleteOCL.g:5218:1: ( ( rule__DefOperationCS__OwnedSpecificationAssignment_12 ) )
+            // InternalCompleteOCL.g:5219:1: ( rule__DefOperationCS__OwnedSpecificationAssignment_12 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedSpecificationAssignment_12());
             }
-            // InternalCompleteOCL.g:5192:1: ( rule__DefOperationCS__OwnedSpecificationAssignment_12 )
-            // InternalCompleteOCL.g:5192:2: rule__DefOperationCS__OwnedSpecificationAssignment_12
+            // InternalCompleteOCL.g:5220:1: ( rule__DefOperationCS__OwnedSpecificationAssignment_12 )
+            // InternalCompleteOCL.g:5220:2: rule__DefOperationCS__OwnedSpecificationAssignment_12
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__OwnedSpecificationAssignment_12();
@@ -17207,16 +17292,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7__0"
-    // InternalCompleteOCL.g:5228:1: rule__DefOperationCS__Group_7__0 : rule__DefOperationCS__Group_7__0__Impl rule__DefOperationCS__Group_7__1 ;
+    // InternalCompleteOCL.g:5256:1: rule__DefOperationCS__Group_7__0 : rule__DefOperationCS__Group_7__0__Impl rule__DefOperationCS__Group_7__1 ;
     public final void rule__DefOperationCS__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5232:1: ( rule__DefOperationCS__Group_7__0__Impl rule__DefOperationCS__Group_7__1 )
-            // InternalCompleteOCL.g:5233:2: rule__DefOperationCS__Group_7__0__Impl rule__DefOperationCS__Group_7__1
+            // InternalCompleteOCL.g:5260:1: ( rule__DefOperationCS__Group_7__0__Impl rule__DefOperationCS__Group_7__1 )
+            // InternalCompleteOCL.g:5261:2: rule__DefOperationCS__Group_7__0__Impl rule__DefOperationCS__Group_7__1
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__DefOperationCS__Group_7__0__Impl();
 
             state._fsp--;
@@ -17245,23 +17330,23 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7__0__Impl"
-    // InternalCompleteOCL.g:5240:1: rule__DefOperationCS__Group_7__0__Impl : ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) ) ;
+    // InternalCompleteOCL.g:5268:1: rule__DefOperationCS__Group_7__0__Impl : ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) ) ;
     public final void rule__DefOperationCS__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5244:1: ( ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) ) )
-            // InternalCompleteOCL.g:5245:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) )
+            // InternalCompleteOCL.g:5272:1: ( ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) ) )
+            // InternalCompleteOCL.g:5273:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) )
             {
-            // InternalCompleteOCL.g:5245:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) )
-            // InternalCompleteOCL.g:5246:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_0 )
+            // InternalCompleteOCL.g:5273:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_0 ) )
+            // InternalCompleteOCL.g:5274:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedParametersAssignment_7_0());
             }
-            // InternalCompleteOCL.g:5247:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_0 )
-            // InternalCompleteOCL.g:5247:2: rule__DefOperationCS__OwnedParametersAssignment_7_0
+            // InternalCompleteOCL.g:5275:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_0 )
+            // InternalCompleteOCL.g:5275:2: rule__DefOperationCS__OwnedParametersAssignment_7_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__OwnedParametersAssignment_7_0();
@@ -17296,14 +17381,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7__1"
-    // InternalCompleteOCL.g:5257:1: rule__DefOperationCS__Group_7__1 : rule__DefOperationCS__Group_7__1__Impl ;
+    // InternalCompleteOCL.g:5285:1: rule__DefOperationCS__Group_7__1 : rule__DefOperationCS__Group_7__1__Impl ;
     public final void rule__DefOperationCS__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5261:1: ( rule__DefOperationCS__Group_7__1__Impl )
-            // InternalCompleteOCL.g:5262:2: rule__DefOperationCS__Group_7__1__Impl
+            // InternalCompleteOCL.g:5289:1: ( rule__DefOperationCS__Group_7__1__Impl )
+            // InternalCompleteOCL.g:5290:2: rule__DefOperationCS__Group_7__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__Group_7__1__Impl();
@@ -17329,22 +17414,22 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7__1__Impl"
-    // InternalCompleteOCL.g:5268:1: rule__DefOperationCS__Group_7__1__Impl : ( ( rule__DefOperationCS__Group_7_1__0 )* ) ;
+    // InternalCompleteOCL.g:5296:1: rule__DefOperationCS__Group_7__1__Impl : ( ( rule__DefOperationCS__Group_7_1__0 )* ) ;
     public final void rule__DefOperationCS__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5272:1: ( ( ( rule__DefOperationCS__Group_7_1__0 )* ) )
-            // InternalCompleteOCL.g:5273:1: ( ( rule__DefOperationCS__Group_7_1__0 )* )
+            // InternalCompleteOCL.g:5300:1: ( ( ( rule__DefOperationCS__Group_7_1__0 )* ) )
+            // InternalCompleteOCL.g:5301:1: ( ( rule__DefOperationCS__Group_7_1__0 )* )
             {
-            // InternalCompleteOCL.g:5273:1: ( ( rule__DefOperationCS__Group_7_1__0 )* )
-            // InternalCompleteOCL.g:5274:1: ( rule__DefOperationCS__Group_7_1__0 )*
+            // InternalCompleteOCL.g:5301:1: ( ( rule__DefOperationCS__Group_7_1__0 )* )
+            // InternalCompleteOCL.g:5302:1: ( rule__DefOperationCS__Group_7_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getGroup_7_1());
             }
-            // InternalCompleteOCL.g:5275:1: ( rule__DefOperationCS__Group_7_1__0 )*
+            // InternalCompleteOCL.g:5303:1: ( rule__DefOperationCS__Group_7_1__0 )*
             loop58:
             do {
                 int alt58=2;
@@ -17357,9 +17442,9 @@
 
                 switch (alt58) {
             	case 1 :
-            	    // InternalCompleteOCL.g:5275:2: rule__DefOperationCS__Group_7_1__0
+            	    // InternalCompleteOCL.g:5303:2: rule__DefOperationCS__Group_7_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__DefOperationCS__Group_7_1__0();
 
             	    state._fsp--;
@@ -17398,16 +17483,16 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7_1__0"
-    // InternalCompleteOCL.g:5289:1: rule__DefOperationCS__Group_7_1__0 : rule__DefOperationCS__Group_7_1__0__Impl rule__DefOperationCS__Group_7_1__1 ;
+    // InternalCompleteOCL.g:5317:1: rule__DefOperationCS__Group_7_1__0 : rule__DefOperationCS__Group_7_1__0__Impl rule__DefOperationCS__Group_7_1__1 ;
     public final void rule__DefOperationCS__Group_7_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5293:1: ( rule__DefOperationCS__Group_7_1__0__Impl rule__DefOperationCS__Group_7_1__1 )
-            // InternalCompleteOCL.g:5294:2: rule__DefOperationCS__Group_7_1__0__Impl rule__DefOperationCS__Group_7_1__1
+            // InternalCompleteOCL.g:5321:1: ( rule__DefOperationCS__Group_7_1__0__Impl rule__DefOperationCS__Group_7_1__1 )
+            // InternalCompleteOCL.g:5322:2: rule__DefOperationCS__Group_7_1__0__Impl rule__DefOperationCS__Group_7_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__DefOperationCS__Group_7_1__0__Impl();
 
             state._fsp--;
@@ -17436,17 +17521,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7_1__0__Impl"
-    // InternalCompleteOCL.g:5301:1: rule__DefOperationCS__Group_7_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:5329:1: rule__DefOperationCS__Group_7_1__0__Impl : ( ',' ) ;
     public final void rule__DefOperationCS__Group_7_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5305:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:5306:1: ( ',' )
+            // InternalCompleteOCL.g:5333:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:5334:1: ( ',' )
             {
-            // InternalCompleteOCL.g:5306:1: ( ',' )
-            // InternalCompleteOCL.g:5307:1: ','
+            // InternalCompleteOCL.g:5334:1: ( ',' )
+            // InternalCompleteOCL.g:5335:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getCommaKeyword_7_1_0());
@@ -17477,14 +17562,14 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7_1__1"
-    // InternalCompleteOCL.g:5320:1: rule__DefOperationCS__Group_7_1__1 : rule__DefOperationCS__Group_7_1__1__Impl ;
+    // InternalCompleteOCL.g:5348:1: rule__DefOperationCS__Group_7_1__1 : rule__DefOperationCS__Group_7_1__1__Impl ;
     public final void rule__DefOperationCS__Group_7_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5324:1: ( rule__DefOperationCS__Group_7_1__1__Impl )
-            // InternalCompleteOCL.g:5325:2: rule__DefOperationCS__Group_7_1__1__Impl
+            // InternalCompleteOCL.g:5352:1: ( rule__DefOperationCS__Group_7_1__1__Impl )
+            // InternalCompleteOCL.g:5353:2: rule__DefOperationCS__Group_7_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__Group_7_1__1__Impl();
@@ -17510,23 +17595,23 @@
 
 
     // $ANTLR start "rule__DefOperationCS__Group_7_1__1__Impl"
-    // InternalCompleteOCL.g:5331:1: rule__DefOperationCS__Group_7_1__1__Impl : ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) ) ;
+    // InternalCompleteOCL.g:5359:1: rule__DefOperationCS__Group_7_1__1__Impl : ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) ) ;
     public final void rule__DefOperationCS__Group_7_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5335:1: ( ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) ) )
-            // InternalCompleteOCL.g:5336:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) )
+            // InternalCompleteOCL.g:5363:1: ( ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) ) )
+            // InternalCompleteOCL.g:5364:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) )
             {
-            // InternalCompleteOCL.g:5336:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) )
-            // InternalCompleteOCL.g:5337:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 )
+            // InternalCompleteOCL.g:5364:1: ( ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 ) )
+            // InternalCompleteOCL.g:5365:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedParametersAssignment_7_1_1());
             }
-            // InternalCompleteOCL.g:5338:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 )
-            // InternalCompleteOCL.g:5338:2: rule__DefOperationCS__OwnedParametersAssignment_7_1_1
+            // InternalCompleteOCL.g:5366:1: ( rule__DefOperationCS__OwnedParametersAssignment_7_1_1 )
+            // InternalCompleteOCL.g:5366:2: rule__DefOperationCS__OwnedParametersAssignment_7_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefOperationCS__OwnedParametersAssignment_7_1_1();
@@ -17561,16 +17646,16 @@
 
 
     // $ANTLR start "rule__DefParameterCS__Group__0"
-    // InternalCompleteOCL.g:5352:1: rule__DefParameterCS__Group__0 : rule__DefParameterCS__Group__0__Impl rule__DefParameterCS__Group__1 ;
+    // InternalCompleteOCL.g:5380:1: rule__DefParameterCS__Group__0 : rule__DefParameterCS__Group__0__Impl rule__DefParameterCS__Group__1 ;
     public final void rule__DefParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5356:1: ( rule__DefParameterCS__Group__0__Impl rule__DefParameterCS__Group__1 )
-            // InternalCompleteOCL.g:5357:2: rule__DefParameterCS__Group__0__Impl rule__DefParameterCS__Group__1
+            // InternalCompleteOCL.g:5384:1: ( rule__DefParameterCS__Group__0__Impl rule__DefParameterCS__Group__1 )
+            // InternalCompleteOCL.g:5385:2: rule__DefParameterCS__Group__0__Impl rule__DefParameterCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__DefParameterCS__Group__0__Impl();
 
             state._fsp--;
@@ -17599,23 +17684,23 @@
 
 
     // $ANTLR start "rule__DefParameterCS__Group__0__Impl"
-    // InternalCompleteOCL.g:5364:1: rule__DefParameterCS__Group__0__Impl : ( ( rule__DefParameterCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:5392:1: rule__DefParameterCS__Group__0__Impl : ( ( rule__DefParameterCS__NameAssignment_0 ) ) ;
     public final void rule__DefParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5368:1: ( ( ( rule__DefParameterCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:5369:1: ( ( rule__DefParameterCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:5396:1: ( ( ( rule__DefParameterCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:5397:1: ( ( rule__DefParameterCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:5369:1: ( ( rule__DefParameterCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:5370:1: ( rule__DefParameterCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:5397:1: ( ( rule__DefParameterCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:5398:1: ( rule__DefParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefParameterCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:5371:1: ( rule__DefParameterCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:5371:2: rule__DefParameterCS__NameAssignment_0
+            // InternalCompleteOCL.g:5399:1: ( rule__DefParameterCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:5399:2: rule__DefParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefParameterCS__NameAssignment_0();
@@ -17650,16 +17735,16 @@
 
 
     // $ANTLR start "rule__DefParameterCS__Group__1"
-    // InternalCompleteOCL.g:5381:1: rule__DefParameterCS__Group__1 : rule__DefParameterCS__Group__1__Impl rule__DefParameterCS__Group__2 ;
+    // InternalCompleteOCL.g:5409:1: rule__DefParameterCS__Group__1 : rule__DefParameterCS__Group__1__Impl rule__DefParameterCS__Group__2 ;
     public final void rule__DefParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5385:1: ( rule__DefParameterCS__Group__1__Impl rule__DefParameterCS__Group__2 )
-            // InternalCompleteOCL.g:5386:2: rule__DefParameterCS__Group__1__Impl rule__DefParameterCS__Group__2
+            // InternalCompleteOCL.g:5413:1: ( rule__DefParameterCS__Group__1__Impl rule__DefParameterCS__Group__2 )
+            // InternalCompleteOCL.g:5414:2: rule__DefParameterCS__Group__1__Impl rule__DefParameterCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__DefParameterCS__Group__1__Impl();
 
             state._fsp--;
@@ -17688,17 +17773,17 @@
 
 
     // $ANTLR start "rule__DefParameterCS__Group__1__Impl"
-    // InternalCompleteOCL.g:5393:1: rule__DefParameterCS__Group__1__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:5421:1: rule__DefParameterCS__Group__1__Impl : ( ':' ) ;
     public final void rule__DefParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5397:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:5398:1: ( ':' )
+            // InternalCompleteOCL.g:5425:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:5426:1: ( ':' )
             {
-            // InternalCompleteOCL.g:5398:1: ( ':' )
-            // InternalCompleteOCL.g:5399:1: ':'
+            // InternalCompleteOCL.g:5426:1: ( ':' )
+            // InternalCompleteOCL.g:5427:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefParameterCSAccess().getColonKeyword_1());
@@ -17729,14 +17814,14 @@
 
 
     // $ANTLR start "rule__DefParameterCS__Group__2"
-    // InternalCompleteOCL.g:5412:1: rule__DefParameterCS__Group__2 : rule__DefParameterCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:5440:1: rule__DefParameterCS__Group__2 : rule__DefParameterCS__Group__2__Impl ;
     public final void rule__DefParameterCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5416:1: ( rule__DefParameterCS__Group__2__Impl )
-            // InternalCompleteOCL.g:5417:2: rule__DefParameterCS__Group__2__Impl
+            // InternalCompleteOCL.g:5444:1: ( rule__DefParameterCS__Group__2__Impl )
+            // InternalCompleteOCL.g:5445:2: rule__DefParameterCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefParameterCS__Group__2__Impl();
@@ -17762,23 +17847,23 @@
 
 
     // $ANTLR start "rule__DefParameterCS__Group__2__Impl"
-    // InternalCompleteOCL.g:5423:1: rule__DefParameterCS__Group__2__Impl : ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:5451:1: rule__DefParameterCS__Group__2__Impl : ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__DefParameterCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5427:1: ( ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) ) )
-            // InternalCompleteOCL.g:5428:1: ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) )
+            // InternalCompleteOCL.g:5455:1: ( ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) ) )
+            // InternalCompleteOCL.g:5456:1: ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:5428:1: ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) )
-            // InternalCompleteOCL.g:5429:1: ( rule__DefParameterCS__OwnedTypeAssignment_2 )
+            // InternalCompleteOCL.g:5456:1: ( ( rule__DefParameterCS__OwnedTypeAssignment_2 ) )
+            // InternalCompleteOCL.g:5457:1: ( rule__DefParameterCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefParameterCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalCompleteOCL.g:5430:1: ( rule__DefParameterCS__OwnedTypeAssignment_2 )
-            // InternalCompleteOCL.g:5430:2: rule__DefParameterCS__OwnedTypeAssignment_2
+            // InternalCompleteOCL.g:5458:1: ( rule__DefParameterCS__OwnedTypeAssignment_2 )
+            // InternalCompleteOCL.g:5458:2: rule__DefParameterCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefParameterCS__OwnedTypeAssignment_2();
@@ -17813,14 +17898,14 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__0"
-    // InternalCompleteOCL.g:5446:1: rule__DefPropertyCS__Group__0 : rule__DefPropertyCS__Group__0__Impl rule__DefPropertyCS__Group__1 ;
+    // InternalCompleteOCL.g:5474:1: rule__DefPropertyCS__Group__0 : rule__DefPropertyCS__Group__0__Impl rule__DefPropertyCS__Group__1 ;
     public final void rule__DefPropertyCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5450:1: ( rule__DefPropertyCS__Group__0__Impl rule__DefPropertyCS__Group__1 )
-            // InternalCompleteOCL.g:5451:2: rule__DefPropertyCS__Group__0__Impl rule__DefPropertyCS__Group__1
+            // InternalCompleteOCL.g:5478:1: ( rule__DefPropertyCS__Group__0__Impl rule__DefPropertyCS__Group__1 )
+            // InternalCompleteOCL.g:5479:2: rule__DefPropertyCS__Group__0__Impl rule__DefPropertyCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__DefPropertyCS__Group__0__Impl();
@@ -17851,22 +17936,22 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__0__Impl"
-    // InternalCompleteOCL.g:5458:1: rule__DefPropertyCS__Group__0__Impl : ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? ) ;
+    // InternalCompleteOCL.g:5486:1: rule__DefPropertyCS__Group__0__Impl : ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? ) ;
     public final void rule__DefPropertyCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5462:1: ( ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? ) )
-            // InternalCompleteOCL.g:5463:1: ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? )
+            // InternalCompleteOCL.g:5490:1: ( ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? ) )
+            // InternalCompleteOCL.g:5491:1: ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? )
             {
-            // InternalCompleteOCL.g:5463:1: ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? )
-            // InternalCompleteOCL.g:5464:1: ( rule__DefPropertyCS__IsStaticAssignment_0 )?
+            // InternalCompleteOCL.g:5491:1: ( ( rule__DefPropertyCS__IsStaticAssignment_0 )? )
+            // InternalCompleteOCL.g:5492:1: ( rule__DefPropertyCS__IsStaticAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getIsStaticAssignment_0());
             }
-            // InternalCompleteOCL.g:5465:1: ( rule__DefPropertyCS__IsStaticAssignment_0 )?
+            // InternalCompleteOCL.g:5493:1: ( rule__DefPropertyCS__IsStaticAssignment_0 )?
             int alt59=2;
             int LA59_0 = input.LA(1);
 
@@ -17875,7 +17960,7 @@
             }
             switch (alt59) {
                 case 1 :
-                    // InternalCompleteOCL.g:5465:2: rule__DefPropertyCS__IsStaticAssignment_0
+                    // InternalCompleteOCL.g:5493:2: rule__DefPropertyCS__IsStaticAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DefPropertyCS__IsStaticAssignment_0();
@@ -17913,14 +17998,14 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__1"
-    // InternalCompleteOCL.g:5475:1: rule__DefPropertyCS__Group__1 : rule__DefPropertyCS__Group__1__Impl rule__DefPropertyCS__Group__2 ;
+    // InternalCompleteOCL.g:5503:1: rule__DefPropertyCS__Group__1 : rule__DefPropertyCS__Group__1__Impl rule__DefPropertyCS__Group__2 ;
     public final void rule__DefPropertyCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5479:1: ( rule__DefPropertyCS__Group__1__Impl rule__DefPropertyCS__Group__2 )
-            // InternalCompleteOCL.g:5480:2: rule__DefPropertyCS__Group__1__Impl rule__DefPropertyCS__Group__2
+            // InternalCompleteOCL.g:5507:1: ( rule__DefPropertyCS__Group__1__Impl rule__DefPropertyCS__Group__2 )
+            // InternalCompleteOCL.g:5508:2: rule__DefPropertyCS__Group__1__Impl rule__DefPropertyCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__DefPropertyCS__Group__1__Impl();
@@ -17951,17 +18036,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__1__Impl"
-    // InternalCompleteOCL.g:5487:1: rule__DefPropertyCS__Group__1__Impl : ( 'def' ) ;
+    // InternalCompleteOCL.g:5515:1: rule__DefPropertyCS__Group__1__Impl : ( 'def' ) ;
     public final void rule__DefPropertyCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5491:1: ( ( 'def' ) )
-            // InternalCompleteOCL.g:5492:1: ( 'def' )
+            // InternalCompleteOCL.g:5519:1: ( ( 'def' ) )
+            // InternalCompleteOCL.g:5520:1: ( 'def' )
             {
-            // InternalCompleteOCL.g:5492:1: ( 'def' )
-            // InternalCompleteOCL.g:5493:1: 'def'
+            // InternalCompleteOCL.g:5520:1: ( 'def' )
+            // InternalCompleteOCL.g:5521:1: 'def'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getDefKeyword_1());
@@ -17992,14 +18077,14 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__2"
-    // InternalCompleteOCL.g:5506:1: rule__DefPropertyCS__Group__2 : rule__DefPropertyCS__Group__2__Impl rule__DefPropertyCS__Group__3 ;
+    // InternalCompleteOCL.g:5534:1: rule__DefPropertyCS__Group__2 : rule__DefPropertyCS__Group__2__Impl rule__DefPropertyCS__Group__3 ;
     public final void rule__DefPropertyCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5510:1: ( rule__DefPropertyCS__Group__2__Impl rule__DefPropertyCS__Group__3 )
-            // InternalCompleteOCL.g:5511:2: rule__DefPropertyCS__Group__2__Impl rule__DefPropertyCS__Group__3
+            // InternalCompleteOCL.g:5538:1: ( rule__DefPropertyCS__Group__2__Impl rule__DefPropertyCS__Group__3 )
+            // InternalCompleteOCL.g:5539:2: rule__DefPropertyCS__Group__2__Impl rule__DefPropertyCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__DefPropertyCS__Group__2__Impl();
@@ -18030,22 +18115,22 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__2__Impl"
-    // InternalCompleteOCL.g:5518:1: rule__DefPropertyCS__Group__2__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalCompleteOCL.g:5546:1: rule__DefPropertyCS__Group__2__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__DefPropertyCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5522:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalCompleteOCL.g:5523:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:5550:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalCompleteOCL.g:5551:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalCompleteOCL.g:5523:1: ( ( ruleUnrestrictedName )? )
-            // InternalCompleteOCL.g:5524:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:5551:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:5552:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getUnrestrictedNameParserRuleCall_2());
             }
-            // InternalCompleteOCL.g:5525:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:5553:1: ( ruleUnrestrictedName )?
             int alt60=2;
             int LA60_0 = input.LA(1);
 
@@ -18054,7 +18139,7 @@
             }
             switch (alt60) {
                 case 1 :
-                    // InternalCompleteOCL.g:5525:3: ruleUnrestrictedName
+                    // InternalCompleteOCL.g:5553:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -18092,16 +18177,16 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__3"
-    // InternalCompleteOCL.g:5535:1: rule__DefPropertyCS__Group__3 : rule__DefPropertyCS__Group__3__Impl rule__DefPropertyCS__Group__4 ;
+    // InternalCompleteOCL.g:5563:1: rule__DefPropertyCS__Group__3 : rule__DefPropertyCS__Group__3__Impl rule__DefPropertyCS__Group__4 ;
     public final void rule__DefPropertyCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5539:1: ( rule__DefPropertyCS__Group__3__Impl rule__DefPropertyCS__Group__4 )
-            // InternalCompleteOCL.g:5540:2: rule__DefPropertyCS__Group__3__Impl rule__DefPropertyCS__Group__4
+            // InternalCompleteOCL.g:5567:1: ( rule__DefPropertyCS__Group__3__Impl rule__DefPropertyCS__Group__4 )
+            // InternalCompleteOCL.g:5568:2: rule__DefPropertyCS__Group__3__Impl rule__DefPropertyCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__DefPropertyCS__Group__3__Impl();
 
             state._fsp--;
@@ -18130,17 +18215,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__3__Impl"
-    // InternalCompleteOCL.g:5547:1: rule__DefPropertyCS__Group__3__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:5575:1: rule__DefPropertyCS__Group__3__Impl : ( ':' ) ;
     public final void rule__DefPropertyCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5551:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:5552:1: ( ':' )
+            // InternalCompleteOCL.g:5579:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:5580:1: ( ':' )
             {
-            // InternalCompleteOCL.g:5552:1: ( ':' )
-            // InternalCompleteOCL.g:5553:1: ':'
+            // InternalCompleteOCL.g:5580:1: ( ':' )
+            // InternalCompleteOCL.g:5581:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getColonKeyword_3());
@@ -18171,16 +18256,16 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__4"
-    // InternalCompleteOCL.g:5566:1: rule__DefPropertyCS__Group__4 : rule__DefPropertyCS__Group__4__Impl rule__DefPropertyCS__Group__5 ;
+    // InternalCompleteOCL.g:5594:1: rule__DefPropertyCS__Group__4 : rule__DefPropertyCS__Group__4__Impl rule__DefPropertyCS__Group__5 ;
     public final void rule__DefPropertyCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5570:1: ( rule__DefPropertyCS__Group__4__Impl rule__DefPropertyCS__Group__5 )
-            // InternalCompleteOCL.g:5571:2: rule__DefPropertyCS__Group__4__Impl rule__DefPropertyCS__Group__5
+            // InternalCompleteOCL.g:5598:1: ( rule__DefPropertyCS__Group__4__Impl rule__DefPropertyCS__Group__5 )
+            // InternalCompleteOCL.g:5599:2: rule__DefPropertyCS__Group__4__Impl rule__DefPropertyCS__Group__5
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__DefPropertyCS__Group__4__Impl();
 
             state._fsp--;
@@ -18209,23 +18294,23 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__4__Impl"
-    // InternalCompleteOCL.g:5578:1: rule__DefPropertyCS__Group__4__Impl : ( ( rule__DefPropertyCS__NameAssignment_4 ) ) ;
+    // InternalCompleteOCL.g:5606:1: rule__DefPropertyCS__Group__4__Impl : ( ( rule__DefPropertyCS__NameAssignment_4 ) ) ;
     public final void rule__DefPropertyCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5582:1: ( ( ( rule__DefPropertyCS__NameAssignment_4 ) ) )
-            // InternalCompleteOCL.g:5583:1: ( ( rule__DefPropertyCS__NameAssignment_4 ) )
+            // InternalCompleteOCL.g:5610:1: ( ( ( rule__DefPropertyCS__NameAssignment_4 ) ) )
+            // InternalCompleteOCL.g:5611:1: ( ( rule__DefPropertyCS__NameAssignment_4 ) )
             {
-            // InternalCompleteOCL.g:5583:1: ( ( rule__DefPropertyCS__NameAssignment_4 ) )
-            // InternalCompleteOCL.g:5584:1: ( rule__DefPropertyCS__NameAssignment_4 )
+            // InternalCompleteOCL.g:5611:1: ( ( rule__DefPropertyCS__NameAssignment_4 ) )
+            // InternalCompleteOCL.g:5612:1: ( rule__DefPropertyCS__NameAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getNameAssignment_4());
             }
-            // InternalCompleteOCL.g:5585:1: ( rule__DefPropertyCS__NameAssignment_4 )
-            // InternalCompleteOCL.g:5585:2: rule__DefPropertyCS__NameAssignment_4
+            // InternalCompleteOCL.g:5613:1: ( rule__DefPropertyCS__NameAssignment_4 )
+            // InternalCompleteOCL.g:5613:2: rule__DefPropertyCS__NameAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefPropertyCS__NameAssignment_4();
@@ -18260,16 +18345,16 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__5"
-    // InternalCompleteOCL.g:5595:1: rule__DefPropertyCS__Group__5 : rule__DefPropertyCS__Group__5__Impl rule__DefPropertyCS__Group__6 ;
+    // InternalCompleteOCL.g:5623:1: rule__DefPropertyCS__Group__5 : rule__DefPropertyCS__Group__5__Impl rule__DefPropertyCS__Group__6 ;
     public final void rule__DefPropertyCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5599:1: ( rule__DefPropertyCS__Group__5__Impl rule__DefPropertyCS__Group__6 )
-            // InternalCompleteOCL.g:5600:2: rule__DefPropertyCS__Group__5__Impl rule__DefPropertyCS__Group__6
+            // InternalCompleteOCL.g:5627:1: ( rule__DefPropertyCS__Group__5__Impl rule__DefPropertyCS__Group__6 )
+            // InternalCompleteOCL.g:5628:2: rule__DefPropertyCS__Group__5__Impl rule__DefPropertyCS__Group__6
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__DefPropertyCS__Group__5__Impl();
 
             state._fsp--;
@@ -18298,17 +18383,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__5__Impl"
-    // InternalCompleteOCL.g:5607:1: rule__DefPropertyCS__Group__5__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:5635:1: rule__DefPropertyCS__Group__5__Impl : ( ':' ) ;
     public final void rule__DefPropertyCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5611:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:5612:1: ( ':' )
+            // InternalCompleteOCL.g:5639:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:5640:1: ( ':' )
             {
-            // InternalCompleteOCL.g:5612:1: ( ':' )
-            // InternalCompleteOCL.g:5613:1: ':'
+            // InternalCompleteOCL.g:5640:1: ( ':' )
+            // InternalCompleteOCL.g:5641:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getColonKeyword_5());
@@ -18339,16 +18424,16 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__6"
-    // InternalCompleteOCL.g:5626:1: rule__DefPropertyCS__Group__6 : rule__DefPropertyCS__Group__6__Impl rule__DefPropertyCS__Group__7 ;
+    // InternalCompleteOCL.g:5654:1: rule__DefPropertyCS__Group__6 : rule__DefPropertyCS__Group__6__Impl rule__DefPropertyCS__Group__7 ;
     public final void rule__DefPropertyCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5630:1: ( rule__DefPropertyCS__Group__6__Impl rule__DefPropertyCS__Group__7 )
-            // InternalCompleteOCL.g:5631:2: rule__DefPropertyCS__Group__6__Impl rule__DefPropertyCS__Group__7
+            // InternalCompleteOCL.g:5658:1: ( rule__DefPropertyCS__Group__6__Impl rule__DefPropertyCS__Group__7 )
+            // InternalCompleteOCL.g:5659:2: rule__DefPropertyCS__Group__6__Impl rule__DefPropertyCS__Group__7
             {
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             rule__DefPropertyCS__Group__6__Impl();
 
             state._fsp--;
@@ -18377,23 +18462,23 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__6__Impl"
-    // InternalCompleteOCL.g:5638:1: rule__DefPropertyCS__Group__6__Impl : ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) ) ;
+    // InternalCompleteOCL.g:5666:1: rule__DefPropertyCS__Group__6__Impl : ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) ) ;
     public final void rule__DefPropertyCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5642:1: ( ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) ) )
-            // InternalCompleteOCL.g:5643:1: ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) )
+            // InternalCompleteOCL.g:5670:1: ( ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) ) )
+            // InternalCompleteOCL.g:5671:1: ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) )
             {
-            // InternalCompleteOCL.g:5643:1: ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) )
-            // InternalCompleteOCL.g:5644:1: ( rule__DefPropertyCS__OwnedTypeAssignment_6 )
+            // InternalCompleteOCL.g:5671:1: ( ( rule__DefPropertyCS__OwnedTypeAssignment_6 ) )
+            // InternalCompleteOCL.g:5672:1: ( rule__DefPropertyCS__OwnedTypeAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getOwnedTypeAssignment_6());
             }
-            // InternalCompleteOCL.g:5645:1: ( rule__DefPropertyCS__OwnedTypeAssignment_6 )
-            // InternalCompleteOCL.g:5645:2: rule__DefPropertyCS__OwnedTypeAssignment_6
+            // InternalCompleteOCL.g:5673:1: ( rule__DefPropertyCS__OwnedTypeAssignment_6 )
+            // InternalCompleteOCL.g:5673:2: rule__DefPropertyCS__OwnedTypeAssignment_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefPropertyCS__OwnedTypeAssignment_6();
@@ -18428,14 +18513,14 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__7"
-    // InternalCompleteOCL.g:5655:1: rule__DefPropertyCS__Group__7 : rule__DefPropertyCS__Group__7__Impl rule__DefPropertyCS__Group__8 ;
+    // InternalCompleteOCL.g:5683:1: rule__DefPropertyCS__Group__7 : rule__DefPropertyCS__Group__7__Impl rule__DefPropertyCS__Group__8 ;
     public final void rule__DefPropertyCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5659:1: ( rule__DefPropertyCS__Group__7__Impl rule__DefPropertyCS__Group__8 )
-            // InternalCompleteOCL.g:5660:2: rule__DefPropertyCS__Group__7__Impl rule__DefPropertyCS__Group__8
+            // InternalCompleteOCL.g:5687:1: ( rule__DefPropertyCS__Group__7__Impl rule__DefPropertyCS__Group__8 )
+            // InternalCompleteOCL.g:5688:2: rule__DefPropertyCS__Group__7__Impl rule__DefPropertyCS__Group__8
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__DefPropertyCS__Group__7__Impl();
@@ -18466,17 +18551,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__7__Impl"
-    // InternalCompleteOCL.g:5667:1: rule__DefPropertyCS__Group__7__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:5695:1: rule__DefPropertyCS__Group__7__Impl : ( '=' ) ;
     public final void rule__DefPropertyCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5671:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:5672:1: ( '=' )
+            // InternalCompleteOCL.g:5699:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:5700:1: ( '=' )
             {
-            // InternalCompleteOCL.g:5672:1: ( '=' )
-            // InternalCompleteOCL.g:5673:1: '='
+            // InternalCompleteOCL.g:5700:1: ( '=' )
+            // InternalCompleteOCL.g:5701:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getEqualsSignKeyword_7());
@@ -18507,14 +18592,14 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__8"
-    // InternalCompleteOCL.g:5686:1: rule__DefPropertyCS__Group__8 : rule__DefPropertyCS__Group__8__Impl ;
+    // InternalCompleteOCL.g:5714:1: rule__DefPropertyCS__Group__8 : rule__DefPropertyCS__Group__8__Impl ;
     public final void rule__DefPropertyCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5690:1: ( rule__DefPropertyCS__Group__8__Impl )
-            // InternalCompleteOCL.g:5691:2: rule__DefPropertyCS__Group__8__Impl
+            // InternalCompleteOCL.g:5718:1: ( rule__DefPropertyCS__Group__8__Impl )
+            // InternalCompleteOCL.g:5719:2: rule__DefPropertyCS__Group__8__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefPropertyCS__Group__8__Impl();
@@ -18540,23 +18625,23 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__Group__8__Impl"
-    // InternalCompleteOCL.g:5697:1: rule__DefPropertyCS__Group__8__Impl : ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) ) ;
+    // InternalCompleteOCL.g:5725:1: rule__DefPropertyCS__Group__8__Impl : ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) ) ;
     public final void rule__DefPropertyCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5701:1: ( ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) ) )
-            // InternalCompleteOCL.g:5702:1: ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) )
+            // InternalCompleteOCL.g:5729:1: ( ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) ) )
+            // InternalCompleteOCL.g:5730:1: ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) )
             {
-            // InternalCompleteOCL.g:5702:1: ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) )
-            // InternalCompleteOCL.g:5703:1: ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 )
+            // InternalCompleteOCL.g:5730:1: ( ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 ) )
+            // InternalCompleteOCL.g:5731:1: ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getOwnedSpecificationAssignment_8());
             }
-            // InternalCompleteOCL.g:5704:1: ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 )
-            // InternalCompleteOCL.g:5704:2: rule__DefPropertyCS__OwnedSpecificationAssignment_8
+            // InternalCompleteOCL.g:5732:1: ( rule__DefPropertyCS__OwnedSpecificationAssignment_8 )
+            // InternalCompleteOCL.g:5732:2: rule__DefPropertyCS__OwnedSpecificationAssignment_8
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DefPropertyCS__OwnedSpecificationAssignment_8();
@@ -18591,16 +18676,16 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__0"
-    // InternalCompleteOCL.g:5732:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
+    // InternalCompleteOCL.g:5760:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
     public final void rule__ImportCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5736:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
-            // InternalCompleteOCL.g:5737:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
+            // InternalCompleteOCL.g:5764:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
+            // InternalCompleteOCL.g:5765:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_23);
+            pushFollow(FollowSets000.FOLLOW_24);
             rule__ImportCS__Group__0__Impl();
 
             state._fsp--;
@@ -18629,23 +18714,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__0__Impl"
-    // InternalCompleteOCL.g:5744:1: rule__ImportCS__Group__0__Impl : ( ( rule__ImportCS__Alternatives_0 ) ) ;
+    // InternalCompleteOCL.g:5772:1: rule__ImportCS__Group__0__Impl : ( ( rule__ImportCS__Alternatives_0 ) ) ;
     public final void rule__ImportCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5748:1: ( ( ( rule__ImportCS__Alternatives_0 ) ) )
-            // InternalCompleteOCL.g:5749:1: ( ( rule__ImportCS__Alternatives_0 ) )
+            // InternalCompleteOCL.g:5776:1: ( ( ( rule__ImportCS__Alternatives_0 ) ) )
+            // InternalCompleteOCL.g:5777:1: ( ( rule__ImportCS__Alternatives_0 ) )
             {
-            // InternalCompleteOCL.g:5749:1: ( ( rule__ImportCS__Alternatives_0 ) )
-            // InternalCompleteOCL.g:5750:1: ( rule__ImportCS__Alternatives_0 )
+            // InternalCompleteOCL.g:5777:1: ( ( rule__ImportCS__Alternatives_0 ) )
+            // InternalCompleteOCL.g:5778:1: ( rule__ImportCS__Alternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getAlternatives_0());
             }
-            // InternalCompleteOCL.g:5751:1: ( rule__ImportCS__Alternatives_0 )
-            // InternalCompleteOCL.g:5751:2: rule__ImportCS__Alternatives_0
+            // InternalCompleteOCL.g:5779:1: ( rule__ImportCS__Alternatives_0 )
+            // InternalCompleteOCL.g:5779:2: rule__ImportCS__Alternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Alternatives_0();
@@ -18680,16 +18765,16 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__1"
-    // InternalCompleteOCL.g:5761:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
+    // InternalCompleteOCL.g:5789:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
     public final void rule__ImportCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5765:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
-            // InternalCompleteOCL.g:5766:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
+            // InternalCompleteOCL.g:5793:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
+            // InternalCompleteOCL.g:5794:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_23);
+            pushFollow(FollowSets000.FOLLOW_24);
             rule__ImportCS__Group__1__Impl();
 
             state._fsp--;
@@ -18718,22 +18803,22 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__1__Impl"
-    // InternalCompleteOCL.g:5773:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:5801:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
     public final void rule__ImportCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5777:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:5778:1: ( ( rule__ImportCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:5805:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:5806:1: ( ( rule__ImportCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:5778:1: ( ( rule__ImportCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:5779:1: ( rule__ImportCS__Group_1__0 )?
+            // InternalCompleteOCL.g:5806:1: ( ( rule__ImportCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:5807:1: ( rule__ImportCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:5780:1: ( rule__ImportCS__Group_1__0 )?
+            // InternalCompleteOCL.g:5808:1: ( rule__ImportCS__Group_1__0 )?
             int alt61=2;
             int LA61_0 = input.LA(1);
 
@@ -18753,7 +18838,7 @@
             }
             switch (alt61) {
                 case 1 :
-                    // InternalCompleteOCL.g:5780:2: rule__ImportCS__Group_1__0
+                    // InternalCompleteOCL.g:5808:2: rule__ImportCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImportCS__Group_1__0();
@@ -18791,16 +18876,16 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__2"
-    // InternalCompleteOCL.g:5790:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
+    // InternalCompleteOCL.g:5818:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
     public final void rule__ImportCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5794:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
-            // InternalCompleteOCL.g:5795:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
+            // InternalCompleteOCL.g:5822:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
+            // InternalCompleteOCL.g:5823:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_24);
+            pushFollow(FollowSets000.FOLLOW_25);
             rule__ImportCS__Group__2__Impl();
 
             state._fsp--;
@@ -18829,23 +18914,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__2__Impl"
-    // InternalCompleteOCL.g:5802:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:5830:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
     public final void rule__ImportCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5806:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
-            // InternalCompleteOCL.g:5807:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
+            // InternalCompleteOCL.g:5834:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
+            // InternalCompleteOCL.g:5835:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:5807:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
-            // InternalCompleteOCL.g:5808:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
+            // InternalCompleteOCL.g:5835:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
+            // InternalCompleteOCL.g:5836:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getOwnedPathNameAssignment_2());
             }
-            // InternalCompleteOCL.g:5809:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
-            // InternalCompleteOCL.g:5809:2: rule__ImportCS__OwnedPathNameAssignment_2
+            // InternalCompleteOCL.g:5837:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
+            // InternalCompleteOCL.g:5837:2: rule__ImportCS__OwnedPathNameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__OwnedPathNameAssignment_2();
@@ -18880,14 +18965,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__3"
-    // InternalCompleteOCL.g:5819:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:5847:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl ;
     public final void rule__ImportCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5823:1: ( rule__ImportCS__Group__3__Impl )
-            // InternalCompleteOCL.g:5824:2: rule__ImportCS__Group__3__Impl
+            // InternalCompleteOCL.g:5851:1: ( rule__ImportCS__Group__3__Impl )
+            // InternalCompleteOCL.g:5852:2: rule__ImportCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Group__3__Impl();
@@ -18913,22 +18998,22 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__3__Impl"
-    // InternalCompleteOCL.g:5830:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
+    // InternalCompleteOCL.g:5858:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
     public final void rule__ImportCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5834:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
-            // InternalCompleteOCL.g:5835:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
+            // InternalCompleteOCL.g:5862:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
+            // InternalCompleteOCL.g:5863:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
             {
-            // InternalCompleteOCL.g:5835:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
-            // InternalCompleteOCL.g:5836:1: ( rule__ImportCS__IsAllAssignment_3 )?
+            // InternalCompleteOCL.g:5863:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
+            // InternalCompleteOCL.g:5864:1: ( rule__ImportCS__IsAllAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllAssignment_3());
             }
-            // InternalCompleteOCL.g:5837:1: ( rule__ImportCS__IsAllAssignment_3 )?
+            // InternalCompleteOCL.g:5865:1: ( rule__ImportCS__IsAllAssignment_3 )?
             int alt62=2;
             int LA62_0 = input.LA(1);
 
@@ -18937,7 +19022,7 @@
             }
             switch (alt62) {
                 case 1 :
-                    // InternalCompleteOCL.g:5837:2: rule__ImportCS__IsAllAssignment_3
+                    // InternalCompleteOCL.g:5865:2: rule__ImportCS__IsAllAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImportCS__IsAllAssignment_3();
@@ -18975,16 +19060,16 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__0"
-    // InternalCompleteOCL.g:5855:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
+    // InternalCompleteOCL.g:5883:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
     public final void rule__ImportCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5859:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
-            // InternalCompleteOCL.g:5860:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
+            // InternalCompleteOCL.g:5887:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
+            // InternalCompleteOCL.g:5888:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__ImportCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -19013,23 +19098,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:5867:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
+    // InternalCompleteOCL.g:5895:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
     public final void rule__ImportCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5871:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
-            // InternalCompleteOCL.g:5872:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
+            // InternalCompleteOCL.g:5899:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
+            // InternalCompleteOCL.g:5900:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
             {
-            // InternalCompleteOCL.g:5872:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
-            // InternalCompleteOCL.g:5873:1: ( rule__ImportCS__NameAssignment_1_0 )
+            // InternalCompleteOCL.g:5900:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
+            // InternalCompleteOCL.g:5901:1: ( rule__ImportCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getNameAssignment_1_0());
             }
-            // InternalCompleteOCL.g:5874:1: ( rule__ImportCS__NameAssignment_1_0 )
-            // InternalCompleteOCL.g:5874:2: rule__ImportCS__NameAssignment_1_0
+            // InternalCompleteOCL.g:5902:1: ( rule__ImportCS__NameAssignment_1_0 )
+            // InternalCompleteOCL.g:5902:2: rule__ImportCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__NameAssignment_1_0();
@@ -19064,14 +19149,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__1"
-    // InternalCompleteOCL.g:5884:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:5912:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
     public final void rule__ImportCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5888:1: ( rule__ImportCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:5889:2: rule__ImportCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:5916:1: ( rule__ImportCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:5917:2: rule__ImportCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Group_1__1__Impl();
@@ -19097,17 +19182,17 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:5895:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:5923:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
     public final void rule__ImportCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5899:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:5900:1: ( ':' )
+            // InternalCompleteOCL.g:5927:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:5928:1: ( ':' )
             {
-            // InternalCompleteOCL.g:5900:1: ( ':' )
-            // InternalCompleteOCL.g:5901:1: ':'
+            // InternalCompleteOCL.g:5928:1: ( ':' )
+            // InternalCompleteOCL.g:5929:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getColonKeyword_1_1());
@@ -19138,14 +19223,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__0"
-    // InternalCompleteOCL.g:5918:1: rule__OperationContextDeclCS__Group__0 : rule__OperationContextDeclCS__Group__0__Impl rule__OperationContextDeclCS__Group__1 ;
+    // InternalCompleteOCL.g:5946:1: rule__OperationContextDeclCS__Group__0 : rule__OperationContextDeclCS__Group__0__Impl rule__OperationContextDeclCS__Group__1 ;
     public final void rule__OperationContextDeclCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5922:1: ( rule__OperationContextDeclCS__Group__0__Impl rule__OperationContextDeclCS__Group__1 )
-            // InternalCompleteOCL.g:5923:2: rule__OperationContextDeclCS__Group__0__Impl rule__OperationContextDeclCS__Group__1
+            // InternalCompleteOCL.g:5950:1: ( rule__OperationContextDeclCS__Group__0__Impl rule__OperationContextDeclCS__Group__1 )
+            // InternalCompleteOCL.g:5951:2: rule__OperationContextDeclCS__Group__0__Impl rule__OperationContextDeclCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__OperationContextDeclCS__Group__0__Impl();
@@ -19176,17 +19261,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__0__Impl"
-    // InternalCompleteOCL.g:5930:1: rule__OperationContextDeclCS__Group__0__Impl : ( 'context' ) ;
+    // InternalCompleteOCL.g:5958:1: rule__OperationContextDeclCS__Group__0__Impl : ( 'context' ) ;
     public final void rule__OperationContextDeclCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5934:1: ( ( 'context' ) )
-            // InternalCompleteOCL.g:5935:1: ( 'context' )
+            // InternalCompleteOCL.g:5962:1: ( ( 'context' ) )
+            // InternalCompleteOCL.g:5963:1: ( 'context' )
             {
-            // InternalCompleteOCL.g:5935:1: ( 'context' )
-            // InternalCompleteOCL.g:5936:1: 'context'
+            // InternalCompleteOCL.g:5963:1: ( 'context' )
+            // InternalCompleteOCL.g:5964:1: 'context'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getContextKeyword_0());
@@ -19217,14 +19302,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__1"
-    // InternalCompleteOCL.g:5949:1: rule__OperationContextDeclCS__Group__1 : rule__OperationContextDeclCS__Group__1__Impl rule__OperationContextDeclCS__Group__2 ;
+    // InternalCompleteOCL.g:5977:1: rule__OperationContextDeclCS__Group__1 : rule__OperationContextDeclCS__Group__1__Impl rule__OperationContextDeclCS__Group__2 ;
     public final void rule__OperationContextDeclCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5953:1: ( rule__OperationContextDeclCS__Group__1__Impl rule__OperationContextDeclCS__Group__2 )
-            // InternalCompleteOCL.g:5954:2: rule__OperationContextDeclCS__Group__1__Impl rule__OperationContextDeclCS__Group__2
+            // InternalCompleteOCL.g:5981:1: ( rule__OperationContextDeclCS__Group__1__Impl rule__OperationContextDeclCS__Group__2 )
+            // InternalCompleteOCL.g:5982:2: rule__OperationContextDeclCS__Group__1__Impl rule__OperationContextDeclCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__OperationContextDeclCS__Group__1__Impl();
@@ -19255,22 +19340,22 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__1__Impl"
-    // InternalCompleteOCL.g:5961:1: rule__OperationContextDeclCS__Group__1__Impl : ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? ) ;
+    // InternalCompleteOCL.g:5989:1: rule__OperationContextDeclCS__Group__1__Impl : ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? ) ;
     public final void rule__OperationContextDeclCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5965:1: ( ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? ) )
-            // InternalCompleteOCL.g:5966:1: ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? )
+            // InternalCompleteOCL.g:5993:1: ( ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? ) )
+            // InternalCompleteOCL.g:5994:1: ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? )
             {
-            // InternalCompleteOCL.g:5966:1: ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? )
-            // InternalCompleteOCL.g:5967:1: ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )?
+            // InternalCompleteOCL.g:5994:1: ( ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )? )
+            // InternalCompleteOCL.g:5995:1: ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedSignatureAssignment_1());
             }
-            // InternalCompleteOCL.g:5968:1: ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )?
+            // InternalCompleteOCL.g:5996:1: ( rule__OperationContextDeclCS__OwnedSignatureAssignment_1 )?
             int alt63=2;
             int LA63_0 = input.LA(1);
 
@@ -19279,7 +19364,7 @@
             }
             switch (alt63) {
                 case 1 :
-                    // InternalCompleteOCL.g:5968:2: rule__OperationContextDeclCS__OwnedSignatureAssignment_1
+                    // InternalCompleteOCL.g:5996:2: rule__OperationContextDeclCS__OwnedSignatureAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationContextDeclCS__OwnedSignatureAssignment_1();
@@ -19317,14 +19402,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__2"
-    // InternalCompleteOCL.g:5978:1: rule__OperationContextDeclCS__Group__2 : rule__OperationContextDeclCS__Group__2__Impl rule__OperationContextDeclCS__Group__3 ;
+    // InternalCompleteOCL.g:6006:1: rule__OperationContextDeclCS__Group__2 : rule__OperationContextDeclCS__Group__2__Impl rule__OperationContextDeclCS__Group__3 ;
     public final void rule__OperationContextDeclCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5982:1: ( rule__OperationContextDeclCS__Group__2__Impl rule__OperationContextDeclCS__Group__3 )
-            // InternalCompleteOCL.g:5983:2: rule__OperationContextDeclCS__Group__2__Impl rule__OperationContextDeclCS__Group__3
+            // InternalCompleteOCL.g:6010:1: ( rule__OperationContextDeclCS__Group__2__Impl rule__OperationContextDeclCS__Group__3 )
+            // InternalCompleteOCL.g:6011:2: rule__OperationContextDeclCS__Group__2__Impl rule__OperationContextDeclCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__OperationContextDeclCS__Group__2__Impl();
@@ -19355,23 +19440,23 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__2__Impl"
-    // InternalCompleteOCL.g:5990:1: rule__OperationContextDeclCS__Group__2__Impl : ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:6018:1: rule__OperationContextDeclCS__Group__2__Impl : ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) ) ;
     public final void rule__OperationContextDeclCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:5994:1: ( ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) ) )
-            // InternalCompleteOCL.g:5995:1: ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) )
+            // InternalCompleteOCL.g:6022:1: ( ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) ) )
+            // InternalCompleteOCL.g:6023:1: ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:5995:1: ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) )
-            // InternalCompleteOCL.g:5996:1: ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 )
+            // InternalCompleteOCL.g:6023:1: ( ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 ) )
+            // InternalCompleteOCL.g:6024:1: ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameAssignment_2());
             }
-            // InternalCompleteOCL.g:5997:1: ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 )
-            // InternalCompleteOCL.g:5997:2: rule__OperationContextDeclCS__OwnedPathNameAssignment_2
+            // InternalCompleteOCL.g:6025:1: ( rule__OperationContextDeclCS__OwnedPathNameAssignment_2 )
+            // InternalCompleteOCL.g:6025:2: rule__OperationContextDeclCS__OwnedPathNameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__OwnedPathNameAssignment_2();
@@ -19406,16 +19491,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__3"
-    // InternalCompleteOCL.g:6007:1: rule__OperationContextDeclCS__Group__3 : rule__OperationContextDeclCS__Group__3__Impl rule__OperationContextDeclCS__Group__4 ;
+    // InternalCompleteOCL.g:6035:1: rule__OperationContextDeclCS__Group__3 : rule__OperationContextDeclCS__Group__3__Impl rule__OperationContextDeclCS__Group__4 ;
     public final void rule__OperationContextDeclCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6011:1: ( rule__OperationContextDeclCS__Group__3__Impl rule__OperationContextDeclCS__Group__4 )
-            // InternalCompleteOCL.g:6012:2: rule__OperationContextDeclCS__Group__3__Impl rule__OperationContextDeclCS__Group__4
+            // InternalCompleteOCL.g:6039:1: ( rule__OperationContextDeclCS__Group__3__Impl rule__OperationContextDeclCS__Group__4 )
+            // InternalCompleteOCL.g:6040:2: rule__OperationContextDeclCS__Group__3__Impl rule__OperationContextDeclCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_25);
+            pushFollow(FollowSets000.FOLLOW_26);
             rule__OperationContextDeclCS__Group__3__Impl();
 
             state._fsp--;
@@ -19444,17 +19529,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__3__Impl"
-    // InternalCompleteOCL.g:6019:1: rule__OperationContextDeclCS__Group__3__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:6047:1: rule__OperationContextDeclCS__Group__3__Impl : ( '(' ) ;
     public final void rule__OperationContextDeclCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6023:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:6024:1: ( '(' )
+            // InternalCompleteOCL.g:6051:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:6052:1: ( '(' )
             {
-            // InternalCompleteOCL.g:6024:1: ( '(' )
-            // InternalCompleteOCL.g:6025:1: '('
+            // InternalCompleteOCL.g:6052:1: ( '(' )
+            // InternalCompleteOCL.g:6053:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getLeftParenthesisKeyword_3());
@@ -19485,16 +19570,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__4"
-    // InternalCompleteOCL.g:6038:1: rule__OperationContextDeclCS__Group__4 : rule__OperationContextDeclCS__Group__4__Impl rule__OperationContextDeclCS__Group__5 ;
+    // InternalCompleteOCL.g:6066:1: rule__OperationContextDeclCS__Group__4 : rule__OperationContextDeclCS__Group__4__Impl rule__OperationContextDeclCS__Group__5 ;
     public final void rule__OperationContextDeclCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6042:1: ( rule__OperationContextDeclCS__Group__4__Impl rule__OperationContextDeclCS__Group__5 )
-            // InternalCompleteOCL.g:6043:2: rule__OperationContextDeclCS__Group__4__Impl rule__OperationContextDeclCS__Group__5
+            // InternalCompleteOCL.g:6070:1: ( rule__OperationContextDeclCS__Group__4__Impl rule__OperationContextDeclCS__Group__5 )
+            // InternalCompleteOCL.g:6071:2: rule__OperationContextDeclCS__Group__4__Impl rule__OperationContextDeclCS__Group__5
             {
-            pushFollow(FollowSets000.FOLLOW_25);
+            pushFollow(FollowSets000.FOLLOW_26);
             rule__OperationContextDeclCS__Group__4__Impl();
 
             state._fsp--;
@@ -19523,22 +19608,22 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__4__Impl"
-    // InternalCompleteOCL.g:6050:1: rule__OperationContextDeclCS__Group__4__Impl : ( ( rule__OperationContextDeclCS__Group_4__0 )? ) ;
+    // InternalCompleteOCL.g:6078:1: rule__OperationContextDeclCS__Group__4__Impl : ( ( rule__OperationContextDeclCS__Group_4__0 )? ) ;
     public final void rule__OperationContextDeclCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6054:1: ( ( ( rule__OperationContextDeclCS__Group_4__0 )? ) )
-            // InternalCompleteOCL.g:6055:1: ( ( rule__OperationContextDeclCS__Group_4__0 )? )
+            // InternalCompleteOCL.g:6082:1: ( ( ( rule__OperationContextDeclCS__Group_4__0 )? ) )
+            // InternalCompleteOCL.g:6083:1: ( ( rule__OperationContextDeclCS__Group_4__0 )? )
             {
-            // InternalCompleteOCL.g:6055:1: ( ( rule__OperationContextDeclCS__Group_4__0 )? )
-            // InternalCompleteOCL.g:6056:1: ( rule__OperationContextDeclCS__Group_4__0 )?
+            // InternalCompleteOCL.g:6083:1: ( ( rule__OperationContextDeclCS__Group_4__0 )? )
+            // InternalCompleteOCL.g:6084:1: ( rule__OperationContextDeclCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getGroup_4());
             }
-            // InternalCompleteOCL.g:6057:1: ( rule__OperationContextDeclCS__Group_4__0 )?
+            // InternalCompleteOCL.g:6085:1: ( rule__OperationContextDeclCS__Group_4__0 )?
             int alt64=2;
             int LA64_0 = input.LA(1);
 
@@ -19547,7 +19632,7 @@
             }
             switch (alt64) {
                 case 1 :
-                    // InternalCompleteOCL.g:6057:2: rule__OperationContextDeclCS__Group_4__0
+                    // InternalCompleteOCL.g:6085:2: rule__OperationContextDeclCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationContextDeclCS__Group_4__0();
@@ -19585,16 +19670,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__5"
-    // InternalCompleteOCL.g:6067:1: rule__OperationContextDeclCS__Group__5 : rule__OperationContextDeclCS__Group__5__Impl rule__OperationContextDeclCS__Group__6 ;
+    // InternalCompleteOCL.g:6095:1: rule__OperationContextDeclCS__Group__5 : rule__OperationContextDeclCS__Group__5__Impl rule__OperationContextDeclCS__Group__6 ;
     public final void rule__OperationContextDeclCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6071:1: ( rule__OperationContextDeclCS__Group__5__Impl rule__OperationContextDeclCS__Group__6 )
-            // InternalCompleteOCL.g:6072:2: rule__OperationContextDeclCS__Group__5__Impl rule__OperationContextDeclCS__Group__6
+            // InternalCompleteOCL.g:6099:1: ( rule__OperationContextDeclCS__Group__5__Impl rule__OperationContextDeclCS__Group__6 )
+            // InternalCompleteOCL.g:6100:2: rule__OperationContextDeclCS__Group__5__Impl rule__OperationContextDeclCS__Group__6
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__OperationContextDeclCS__Group__5__Impl();
 
             state._fsp--;
@@ -19623,17 +19708,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__5__Impl"
-    // InternalCompleteOCL.g:6079:1: rule__OperationContextDeclCS__Group__5__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:6107:1: rule__OperationContextDeclCS__Group__5__Impl : ( ')' ) ;
     public final void rule__OperationContextDeclCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6083:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:6084:1: ( ')' )
+            // InternalCompleteOCL.g:6111:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:6112:1: ( ')' )
             {
-            // InternalCompleteOCL.g:6084:1: ( ')' )
-            // InternalCompleteOCL.g:6085:1: ')'
+            // InternalCompleteOCL.g:6112:1: ( ')' )
+            // InternalCompleteOCL.g:6113:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getRightParenthesisKeyword_5());
@@ -19664,16 +19749,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__6"
-    // InternalCompleteOCL.g:6098:1: rule__OperationContextDeclCS__Group__6 : rule__OperationContextDeclCS__Group__6__Impl rule__OperationContextDeclCS__Group__7 ;
+    // InternalCompleteOCL.g:6126:1: rule__OperationContextDeclCS__Group__6 : rule__OperationContextDeclCS__Group__6__Impl rule__OperationContextDeclCS__Group__7 ;
     public final void rule__OperationContextDeclCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6102:1: ( rule__OperationContextDeclCS__Group__6__Impl rule__OperationContextDeclCS__Group__7 )
-            // InternalCompleteOCL.g:6103:2: rule__OperationContextDeclCS__Group__6__Impl rule__OperationContextDeclCS__Group__7
+            // InternalCompleteOCL.g:6130:1: ( rule__OperationContextDeclCS__Group__6__Impl rule__OperationContextDeclCS__Group__7 )
+            // InternalCompleteOCL.g:6131:2: rule__OperationContextDeclCS__Group__6__Impl rule__OperationContextDeclCS__Group__7
             {
-            pushFollow(FollowSets000.FOLLOW_26);
+            pushFollow(FollowSets000.FOLLOW_27);
             rule__OperationContextDeclCS__Group__6__Impl();
 
             state._fsp--;
@@ -19702,17 +19787,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__6__Impl"
-    // InternalCompleteOCL.g:6110:1: rule__OperationContextDeclCS__Group__6__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:6138:1: rule__OperationContextDeclCS__Group__6__Impl : ( ':' ) ;
     public final void rule__OperationContextDeclCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6114:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:6115:1: ( ':' )
+            // InternalCompleteOCL.g:6142:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:6143:1: ( ':' )
             {
-            // InternalCompleteOCL.g:6115:1: ( ':' )
-            // InternalCompleteOCL.g:6116:1: ':'
+            // InternalCompleteOCL.g:6143:1: ( ':' )
+            // InternalCompleteOCL.g:6144:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getColonKeyword_6());
@@ -19743,16 +19828,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__7"
-    // InternalCompleteOCL.g:6129:1: rule__OperationContextDeclCS__Group__7 : rule__OperationContextDeclCS__Group__7__Impl rule__OperationContextDeclCS__Group__8 ;
+    // InternalCompleteOCL.g:6157:1: rule__OperationContextDeclCS__Group__7 : rule__OperationContextDeclCS__Group__7__Impl rule__OperationContextDeclCS__Group__8 ;
     public final void rule__OperationContextDeclCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6133:1: ( rule__OperationContextDeclCS__Group__7__Impl rule__OperationContextDeclCS__Group__8 )
-            // InternalCompleteOCL.g:6134:2: rule__OperationContextDeclCS__Group__7__Impl rule__OperationContextDeclCS__Group__8
+            // InternalCompleteOCL.g:6161:1: ( rule__OperationContextDeclCS__Group__7__Impl rule__OperationContextDeclCS__Group__8 )
+            // InternalCompleteOCL.g:6162:2: rule__OperationContextDeclCS__Group__7__Impl rule__OperationContextDeclCS__Group__8
             {
-            pushFollow(FollowSets000.FOLLOW_26);
+            pushFollow(FollowSets000.FOLLOW_27);
             rule__OperationContextDeclCS__Group__7__Impl();
 
             state._fsp--;
@@ -19781,22 +19866,22 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__7__Impl"
-    // InternalCompleteOCL.g:6141:1: rule__OperationContextDeclCS__Group__7__Impl : ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? ) ;
+    // InternalCompleteOCL.g:6169:1: rule__OperationContextDeclCS__Group__7__Impl : ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? ) ;
     public final void rule__OperationContextDeclCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6145:1: ( ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? ) )
-            // InternalCompleteOCL.g:6146:1: ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? )
+            // InternalCompleteOCL.g:6173:1: ( ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? ) )
+            // InternalCompleteOCL.g:6174:1: ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? )
             {
-            // InternalCompleteOCL.g:6146:1: ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? )
-            // InternalCompleteOCL.g:6147:1: ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )?
+            // InternalCompleteOCL.g:6174:1: ( ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )? )
+            // InternalCompleteOCL.g:6175:1: ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedTypeAssignment_7());
             }
-            // InternalCompleteOCL.g:6148:1: ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )?
+            // InternalCompleteOCL.g:6176:1: ( rule__OperationContextDeclCS__OwnedTypeAssignment_7 )?
             int alt65=2;
             int LA65_0 = input.LA(1);
 
@@ -19805,7 +19890,7 @@
             }
             switch (alt65) {
                 case 1 :
-                    // InternalCompleteOCL.g:6148:2: rule__OperationContextDeclCS__OwnedTypeAssignment_7
+                    // InternalCompleteOCL.g:6176:2: rule__OperationContextDeclCS__OwnedTypeAssignment_7
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationContextDeclCS__OwnedTypeAssignment_7();
@@ -19843,14 +19928,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__8"
-    // InternalCompleteOCL.g:6158:1: rule__OperationContextDeclCS__Group__8 : rule__OperationContextDeclCS__Group__8__Impl ;
+    // InternalCompleteOCL.g:6186:1: rule__OperationContextDeclCS__Group__8 : rule__OperationContextDeclCS__Group__8__Impl ;
     public final void rule__OperationContextDeclCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6162:1: ( rule__OperationContextDeclCS__Group__8__Impl )
-            // InternalCompleteOCL.g:6163:2: rule__OperationContextDeclCS__Group__8__Impl
+            // InternalCompleteOCL.g:6190:1: ( rule__OperationContextDeclCS__Group__8__Impl )
+            // InternalCompleteOCL.g:6191:2: rule__OperationContextDeclCS__Group__8__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__Group__8__Impl();
@@ -19876,22 +19961,22 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group__8__Impl"
-    // InternalCompleteOCL.g:6169:1: rule__OperationContextDeclCS__Group__8__Impl : ( ( rule__OperationContextDeclCS__Alternatives_8 )* ) ;
+    // InternalCompleteOCL.g:6197:1: rule__OperationContextDeclCS__Group__8__Impl : ( ( rule__OperationContextDeclCS__Alternatives_8 )* ) ;
     public final void rule__OperationContextDeclCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6173:1: ( ( ( rule__OperationContextDeclCS__Alternatives_8 )* ) )
-            // InternalCompleteOCL.g:6174:1: ( ( rule__OperationContextDeclCS__Alternatives_8 )* )
+            // InternalCompleteOCL.g:6201:1: ( ( ( rule__OperationContextDeclCS__Alternatives_8 )* ) )
+            // InternalCompleteOCL.g:6202:1: ( ( rule__OperationContextDeclCS__Alternatives_8 )* )
             {
-            // InternalCompleteOCL.g:6174:1: ( ( rule__OperationContextDeclCS__Alternatives_8 )* )
-            // InternalCompleteOCL.g:6175:1: ( rule__OperationContextDeclCS__Alternatives_8 )*
+            // InternalCompleteOCL.g:6202:1: ( ( rule__OperationContextDeclCS__Alternatives_8 )* )
+            // InternalCompleteOCL.g:6203:1: ( rule__OperationContextDeclCS__Alternatives_8 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getAlternatives_8());
             }
-            // InternalCompleteOCL.g:6176:1: ( rule__OperationContextDeclCS__Alternatives_8 )*
+            // InternalCompleteOCL.g:6204:1: ( rule__OperationContextDeclCS__Alternatives_8 )*
             loop66:
             do {
                 int alt66=2;
@@ -19904,9 +19989,9 @@
 
                 switch (alt66) {
             	case 1 :
-            	    // InternalCompleteOCL.g:6176:2: rule__OperationContextDeclCS__Alternatives_8
+            	    // InternalCompleteOCL.g:6204:2: rule__OperationContextDeclCS__Alternatives_8
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_27);
+            	    pushFollow(FollowSets000.FOLLOW_28);
             	    rule__OperationContextDeclCS__Alternatives_8();
 
             	    state._fsp--;
@@ -19945,16 +20030,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4__0"
-    // InternalCompleteOCL.g:6204:1: rule__OperationContextDeclCS__Group_4__0 : rule__OperationContextDeclCS__Group_4__0__Impl rule__OperationContextDeclCS__Group_4__1 ;
+    // InternalCompleteOCL.g:6232:1: rule__OperationContextDeclCS__Group_4__0 : rule__OperationContextDeclCS__Group_4__0__Impl rule__OperationContextDeclCS__Group_4__1 ;
     public final void rule__OperationContextDeclCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6208:1: ( rule__OperationContextDeclCS__Group_4__0__Impl rule__OperationContextDeclCS__Group_4__1 )
-            // InternalCompleteOCL.g:6209:2: rule__OperationContextDeclCS__Group_4__0__Impl rule__OperationContextDeclCS__Group_4__1
+            // InternalCompleteOCL.g:6236:1: ( rule__OperationContextDeclCS__Group_4__0__Impl rule__OperationContextDeclCS__Group_4__1 )
+            // InternalCompleteOCL.g:6237:2: rule__OperationContextDeclCS__Group_4__0__Impl rule__OperationContextDeclCS__Group_4__1
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__OperationContextDeclCS__Group_4__0__Impl();
 
             state._fsp--;
@@ -19983,23 +20068,23 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4__0__Impl"
-    // InternalCompleteOCL.g:6216:1: rule__OperationContextDeclCS__Group_4__0__Impl : ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) ) ;
+    // InternalCompleteOCL.g:6244:1: rule__OperationContextDeclCS__Group_4__0__Impl : ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) ) ;
     public final void rule__OperationContextDeclCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6220:1: ( ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) ) )
-            // InternalCompleteOCL.g:6221:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) )
+            // InternalCompleteOCL.g:6248:1: ( ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) ) )
+            // InternalCompleteOCL.g:6249:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) )
             {
-            // InternalCompleteOCL.g:6221:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) )
-            // InternalCompleteOCL.g:6222:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 )
+            // InternalCompleteOCL.g:6249:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 ) )
+            // InternalCompleteOCL.g:6250:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedParametersAssignment_4_0());
             }
-            // InternalCompleteOCL.g:6223:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 )
-            // InternalCompleteOCL.g:6223:2: rule__OperationContextDeclCS__OwnedParametersAssignment_4_0
+            // InternalCompleteOCL.g:6251:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 )
+            // InternalCompleteOCL.g:6251:2: rule__OperationContextDeclCS__OwnedParametersAssignment_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__OwnedParametersAssignment_4_0();
@@ -20034,14 +20119,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4__1"
-    // InternalCompleteOCL.g:6233:1: rule__OperationContextDeclCS__Group_4__1 : rule__OperationContextDeclCS__Group_4__1__Impl ;
+    // InternalCompleteOCL.g:6261:1: rule__OperationContextDeclCS__Group_4__1 : rule__OperationContextDeclCS__Group_4__1__Impl ;
     public final void rule__OperationContextDeclCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6237:1: ( rule__OperationContextDeclCS__Group_4__1__Impl )
-            // InternalCompleteOCL.g:6238:2: rule__OperationContextDeclCS__Group_4__1__Impl
+            // InternalCompleteOCL.g:6265:1: ( rule__OperationContextDeclCS__Group_4__1__Impl )
+            // InternalCompleteOCL.g:6266:2: rule__OperationContextDeclCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__Group_4__1__Impl();
@@ -20067,22 +20152,22 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4__1__Impl"
-    // InternalCompleteOCL.g:6244:1: rule__OperationContextDeclCS__Group_4__1__Impl : ( ( rule__OperationContextDeclCS__Group_4_1__0 )* ) ;
+    // InternalCompleteOCL.g:6272:1: rule__OperationContextDeclCS__Group_4__1__Impl : ( ( rule__OperationContextDeclCS__Group_4_1__0 )* ) ;
     public final void rule__OperationContextDeclCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6248:1: ( ( ( rule__OperationContextDeclCS__Group_4_1__0 )* ) )
-            // InternalCompleteOCL.g:6249:1: ( ( rule__OperationContextDeclCS__Group_4_1__0 )* )
+            // InternalCompleteOCL.g:6276:1: ( ( ( rule__OperationContextDeclCS__Group_4_1__0 )* ) )
+            // InternalCompleteOCL.g:6277:1: ( ( rule__OperationContextDeclCS__Group_4_1__0 )* )
             {
-            // InternalCompleteOCL.g:6249:1: ( ( rule__OperationContextDeclCS__Group_4_1__0 )* )
-            // InternalCompleteOCL.g:6250:1: ( rule__OperationContextDeclCS__Group_4_1__0 )*
+            // InternalCompleteOCL.g:6277:1: ( ( rule__OperationContextDeclCS__Group_4_1__0 )* )
+            // InternalCompleteOCL.g:6278:1: ( rule__OperationContextDeclCS__Group_4_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getGroup_4_1());
             }
-            // InternalCompleteOCL.g:6251:1: ( rule__OperationContextDeclCS__Group_4_1__0 )*
+            // InternalCompleteOCL.g:6279:1: ( rule__OperationContextDeclCS__Group_4_1__0 )*
             loop67:
             do {
                 int alt67=2;
@@ -20095,9 +20180,9 @@
 
                 switch (alt67) {
             	case 1 :
-            	    // InternalCompleteOCL.g:6251:2: rule__OperationContextDeclCS__Group_4_1__0
+            	    // InternalCompleteOCL.g:6279:2: rule__OperationContextDeclCS__Group_4_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__OperationContextDeclCS__Group_4_1__0();
 
             	    state._fsp--;
@@ -20136,16 +20221,16 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4_1__0"
-    // InternalCompleteOCL.g:6265:1: rule__OperationContextDeclCS__Group_4_1__0 : rule__OperationContextDeclCS__Group_4_1__0__Impl rule__OperationContextDeclCS__Group_4_1__1 ;
+    // InternalCompleteOCL.g:6293:1: rule__OperationContextDeclCS__Group_4_1__0 : rule__OperationContextDeclCS__Group_4_1__0__Impl rule__OperationContextDeclCS__Group_4_1__1 ;
     public final void rule__OperationContextDeclCS__Group_4_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6269:1: ( rule__OperationContextDeclCS__Group_4_1__0__Impl rule__OperationContextDeclCS__Group_4_1__1 )
-            // InternalCompleteOCL.g:6270:2: rule__OperationContextDeclCS__Group_4_1__0__Impl rule__OperationContextDeclCS__Group_4_1__1
+            // InternalCompleteOCL.g:6297:1: ( rule__OperationContextDeclCS__Group_4_1__0__Impl rule__OperationContextDeclCS__Group_4_1__1 )
+            // InternalCompleteOCL.g:6298:2: rule__OperationContextDeclCS__Group_4_1__0__Impl rule__OperationContextDeclCS__Group_4_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__OperationContextDeclCS__Group_4_1__0__Impl();
 
             state._fsp--;
@@ -20174,17 +20259,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4_1__0__Impl"
-    // InternalCompleteOCL.g:6277:1: rule__OperationContextDeclCS__Group_4_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:6305:1: rule__OperationContextDeclCS__Group_4_1__0__Impl : ( ',' ) ;
     public final void rule__OperationContextDeclCS__Group_4_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6281:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:6282:1: ( ',' )
+            // InternalCompleteOCL.g:6309:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:6310:1: ( ',' )
             {
-            // InternalCompleteOCL.g:6282:1: ( ',' )
-            // InternalCompleteOCL.g:6283:1: ','
+            // InternalCompleteOCL.g:6310:1: ( ',' )
+            // InternalCompleteOCL.g:6311:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getCommaKeyword_4_1_0());
@@ -20215,14 +20300,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4_1__1"
-    // InternalCompleteOCL.g:6296:1: rule__OperationContextDeclCS__Group_4_1__1 : rule__OperationContextDeclCS__Group_4_1__1__Impl ;
+    // InternalCompleteOCL.g:6324:1: rule__OperationContextDeclCS__Group_4_1__1 : rule__OperationContextDeclCS__Group_4_1__1__Impl ;
     public final void rule__OperationContextDeclCS__Group_4_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6300:1: ( rule__OperationContextDeclCS__Group_4_1__1__Impl )
-            // InternalCompleteOCL.g:6301:2: rule__OperationContextDeclCS__Group_4_1__1__Impl
+            // InternalCompleteOCL.g:6328:1: ( rule__OperationContextDeclCS__Group_4_1__1__Impl )
+            // InternalCompleteOCL.g:6329:2: rule__OperationContextDeclCS__Group_4_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__Group_4_1__1__Impl();
@@ -20248,23 +20333,23 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_4_1__1__Impl"
-    // InternalCompleteOCL.g:6307:1: rule__OperationContextDeclCS__Group_4_1__1__Impl : ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) ) ;
+    // InternalCompleteOCL.g:6335:1: rule__OperationContextDeclCS__Group_4_1__1__Impl : ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) ) ;
     public final void rule__OperationContextDeclCS__Group_4_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6311:1: ( ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) ) )
-            // InternalCompleteOCL.g:6312:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) )
+            // InternalCompleteOCL.g:6339:1: ( ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) ) )
+            // InternalCompleteOCL.g:6340:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) )
             {
-            // InternalCompleteOCL.g:6312:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) )
-            // InternalCompleteOCL.g:6313:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 )
+            // InternalCompleteOCL.g:6340:1: ( ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 ) )
+            // InternalCompleteOCL.g:6341:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedParametersAssignment_4_1_1());
             }
-            // InternalCompleteOCL.g:6314:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 )
-            // InternalCompleteOCL.g:6314:2: rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1
+            // InternalCompleteOCL.g:6342:1: ( rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 )
+            // InternalCompleteOCL.g:6342:2: rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1();
@@ -20299,14 +20384,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_0__0"
-    // InternalCompleteOCL.g:6328:1: rule__OperationContextDeclCS__Group_8_0__0 : rule__OperationContextDeclCS__Group_8_0__0__Impl rule__OperationContextDeclCS__Group_8_0__1 ;
+    // InternalCompleteOCL.g:6356:1: rule__OperationContextDeclCS__Group_8_0__0 : rule__OperationContextDeclCS__Group_8_0__0__Impl rule__OperationContextDeclCS__Group_8_0__1 ;
     public final void rule__OperationContextDeclCS__Group_8_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6332:1: ( rule__OperationContextDeclCS__Group_8_0__0__Impl rule__OperationContextDeclCS__Group_8_0__1 )
-            // InternalCompleteOCL.g:6333:2: rule__OperationContextDeclCS__Group_8_0__0__Impl rule__OperationContextDeclCS__Group_8_0__1
+            // InternalCompleteOCL.g:6360:1: ( rule__OperationContextDeclCS__Group_8_0__0__Impl rule__OperationContextDeclCS__Group_8_0__1 )
+            // InternalCompleteOCL.g:6361:2: rule__OperationContextDeclCS__Group_8_0__0__Impl rule__OperationContextDeclCS__Group_8_0__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__OperationContextDeclCS__Group_8_0__0__Impl();
@@ -20337,17 +20422,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_0__0__Impl"
-    // InternalCompleteOCL.g:6340:1: rule__OperationContextDeclCS__Group_8_0__0__Impl : ( 'pre' ) ;
+    // InternalCompleteOCL.g:6368:1: rule__OperationContextDeclCS__Group_8_0__0__Impl : ( 'pre' ) ;
     public final void rule__OperationContextDeclCS__Group_8_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6344:1: ( ( 'pre' ) )
-            // InternalCompleteOCL.g:6345:1: ( 'pre' )
+            // InternalCompleteOCL.g:6372:1: ( ( 'pre' ) )
+            // InternalCompleteOCL.g:6373:1: ( 'pre' )
             {
-            // InternalCompleteOCL.g:6345:1: ( 'pre' )
-            // InternalCompleteOCL.g:6346:1: 'pre'
+            // InternalCompleteOCL.g:6373:1: ( 'pre' )
+            // InternalCompleteOCL.g:6374:1: 'pre'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getPreKeyword_8_0_0());
@@ -20378,14 +20463,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_0__1"
-    // InternalCompleteOCL.g:6359:1: rule__OperationContextDeclCS__Group_8_0__1 : rule__OperationContextDeclCS__Group_8_0__1__Impl ;
+    // InternalCompleteOCL.g:6387:1: rule__OperationContextDeclCS__Group_8_0__1 : rule__OperationContextDeclCS__Group_8_0__1__Impl ;
     public final void rule__OperationContextDeclCS__Group_8_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6363:1: ( rule__OperationContextDeclCS__Group_8_0__1__Impl )
-            // InternalCompleteOCL.g:6364:2: rule__OperationContextDeclCS__Group_8_0__1__Impl
+            // InternalCompleteOCL.g:6391:1: ( rule__OperationContextDeclCS__Group_8_0__1__Impl )
+            // InternalCompleteOCL.g:6392:2: rule__OperationContextDeclCS__Group_8_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__Group_8_0__1__Impl();
@@ -20411,23 +20496,23 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_0__1__Impl"
-    // InternalCompleteOCL.g:6370:1: rule__OperationContextDeclCS__Group_8_0__1__Impl : ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) ) ;
+    // InternalCompleteOCL.g:6398:1: rule__OperationContextDeclCS__Group_8_0__1__Impl : ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) ) ;
     public final void rule__OperationContextDeclCS__Group_8_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6374:1: ( ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) ) )
-            // InternalCompleteOCL.g:6375:1: ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) )
+            // InternalCompleteOCL.g:6402:1: ( ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) ) )
+            // InternalCompleteOCL.g:6403:1: ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) )
             {
-            // InternalCompleteOCL.g:6375:1: ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) )
-            // InternalCompleteOCL.g:6376:1: ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 )
+            // InternalCompleteOCL.g:6403:1: ( ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 ) )
+            // InternalCompleteOCL.g:6404:1: ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPreconditionsAssignment_8_0_1());
             }
-            // InternalCompleteOCL.g:6377:1: ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 )
-            // InternalCompleteOCL.g:6377:2: rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1
+            // InternalCompleteOCL.g:6405:1: ( rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 )
+            // InternalCompleteOCL.g:6405:2: rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1();
@@ -20462,14 +20547,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_1__0"
-    // InternalCompleteOCL.g:6391:1: rule__OperationContextDeclCS__Group_8_1__0 : rule__OperationContextDeclCS__Group_8_1__0__Impl rule__OperationContextDeclCS__Group_8_1__1 ;
+    // InternalCompleteOCL.g:6419:1: rule__OperationContextDeclCS__Group_8_1__0 : rule__OperationContextDeclCS__Group_8_1__0__Impl rule__OperationContextDeclCS__Group_8_1__1 ;
     public final void rule__OperationContextDeclCS__Group_8_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6395:1: ( rule__OperationContextDeclCS__Group_8_1__0__Impl rule__OperationContextDeclCS__Group_8_1__1 )
-            // InternalCompleteOCL.g:6396:2: rule__OperationContextDeclCS__Group_8_1__0__Impl rule__OperationContextDeclCS__Group_8_1__1
+            // InternalCompleteOCL.g:6423:1: ( rule__OperationContextDeclCS__Group_8_1__0__Impl rule__OperationContextDeclCS__Group_8_1__1 )
+            // InternalCompleteOCL.g:6424:2: rule__OperationContextDeclCS__Group_8_1__0__Impl rule__OperationContextDeclCS__Group_8_1__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__OperationContextDeclCS__Group_8_1__0__Impl();
@@ -20500,17 +20585,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_1__0__Impl"
-    // InternalCompleteOCL.g:6403:1: rule__OperationContextDeclCS__Group_8_1__0__Impl : ( 'post' ) ;
+    // InternalCompleteOCL.g:6431:1: rule__OperationContextDeclCS__Group_8_1__0__Impl : ( 'post' ) ;
     public final void rule__OperationContextDeclCS__Group_8_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6407:1: ( ( 'post' ) )
-            // InternalCompleteOCL.g:6408:1: ( 'post' )
+            // InternalCompleteOCL.g:6435:1: ( ( 'post' ) )
+            // InternalCompleteOCL.g:6436:1: ( 'post' )
             {
-            // InternalCompleteOCL.g:6408:1: ( 'post' )
-            // InternalCompleteOCL.g:6409:1: 'post'
+            // InternalCompleteOCL.g:6436:1: ( 'post' )
+            // InternalCompleteOCL.g:6437:1: 'post'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getPostKeyword_8_1_0());
@@ -20541,14 +20626,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_1__1"
-    // InternalCompleteOCL.g:6422:1: rule__OperationContextDeclCS__Group_8_1__1 : rule__OperationContextDeclCS__Group_8_1__1__Impl ;
+    // InternalCompleteOCL.g:6450:1: rule__OperationContextDeclCS__Group_8_1__1 : rule__OperationContextDeclCS__Group_8_1__1__Impl ;
     public final void rule__OperationContextDeclCS__Group_8_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6426:1: ( rule__OperationContextDeclCS__Group_8_1__1__Impl )
-            // InternalCompleteOCL.g:6427:2: rule__OperationContextDeclCS__Group_8_1__1__Impl
+            // InternalCompleteOCL.g:6454:1: ( rule__OperationContextDeclCS__Group_8_1__1__Impl )
+            // InternalCompleteOCL.g:6455:2: rule__OperationContextDeclCS__Group_8_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__Group_8_1__1__Impl();
@@ -20574,23 +20659,23 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_1__1__Impl"
-    // InternalCompleteOCL.g:6433:1: rule__OperationContextDeclCS__Group_8_1__1__Impl : ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) ) ;
+    // InternalCompleteOCL.g:6461:1: rule__OperationContextDeclCS__Group_8_1__1__Impl : ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) ) ;
     public final void rule__OperationContextDeclCS__Group_8_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6437:1: ( ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) ) )
-            // InternalCompleteOCL.g:6438:1: ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) )
+            // InternalCompleteOCL.g:6465:1: ( ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) ) )
+            // InternalCompleteOCL.g:6466:1: ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) )
             {
-            // InternalCompleteOCL.g:6438:1: ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) )
-            // InternalCompleteOCL.g:6439:1: ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 )
+            // InternalCompleteOCL.g:6466:1: ( ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 ) )
+            // InternalCompleteOCL.g:6467:1: ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPostconditionsAssignment_8_1_1());
             }
-            // InternalCompleteOCL.g:6440:1: ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 )
-            // InternalCompleteOCL.g:6440:2: rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1
+            // InternalCompleteOCL.g:6468:1: ( rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 )
+            // InternalCompleteOCL.g:6468:2: rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1();
@@ -20625,14 +20710,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__0"
-    // InternalCompleteOCL.g:6454:1: rule__OperationContextDeclCS__Group_8_2__0 : rule__OperationContextDeclCS__Group_8_2__0__Impl rule__OperationContextDeclCS__Group_8_2__1 ;
+    // InternalCompleteOCL.g:6482:1: rule__OperationContextDeclCS__Group_8_2__0 : rule__OperationContextDeclCS__Group_8_2__0__Impl rule__OperationContextDeclCS__Group_8_2__1 ;
     public final void rule__OperationContextDeclCS__Group_8_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6458:1: ( rule__OperationContextDeclCS__Group_8_2__0__Impl rule__OperationContextDeclCS__Group_8_2__1 )
-            // InternalCompleteOCL.g:6459:2: rule__OperationContextDeclCS__Group_8_2__0__Impl rule__OperationContextDeclCS__Group_8_2__1
+            // InternalCompleteOCL.g:6486:1: ( rule__OperationContextDeclCS__Group_8_2__0__Impl rule__OperationContextDeclCS__Group_8_2__1 )
+            // InternalCompleteOCL.g:6487:2: rule__OperationContextDeclCS__Group_8_2__0__Impl rule__OperationContextDeclCS__Group_8_2__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__OperationContextDeclCS__Group_8_2__0__Impl();
@@ -20663,17 +20748,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__0__Impl"
-    // InternalCompleteOCL.g:6466:1: rule__OperationContextDeclCS__Group_8_2__0__Impl : ( 'body' ) ;
+    // InternalCompleteOCL.g:6494:1: rule__OperationContextDeclCS__Group_8_2__0__Impl : ( 'body' ) ;
     public final void rule__OperationContextDeclCS__Group_8_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6470:1: ( ( 'body' ) )
-            // InternalCompleteOCL.g:6471:1: ( 'body' )
+            // InternalCompleteOCL.g:6498:1: ( ( 'body' ) )
+            // InternalCompleteOCL.g:6499:1: ( 'body' )
             {
-            // InternalCompleteOCL.g:6471:1: ( 'body' )
-            // InternalCompleteOCL.g:6472:1: 'body'
+            // InternalCompleteOCL.g:6499:1: ( 'body' )
+            // InternalCompleteOCL.g:6500:1: 'body'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getBodyKeyword_8_2_0());
@@ -20704,14 +20789,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__1"
-    // InternalCompleteOCL.g:6485:1: rule__OperationContextDeclCS__Group_8_2__1 : rule__OperationContextDeclCS__Group_8_2__1__Impl rule__OperationContextDeclCS__Group_8_2__2 ;
+    // InternalCompleteOCL.g:6513:1: rule__OperationContextDeclCS__Group_8_2__1 : rule__OperationContextDeclCS__Group_8_2__1__Impl rule__OperationContextDeclCS__Group_8_2__2 ;
     public final void rule__OperationContextDeclCS__Group_8_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6489:1: ( rule__OperationContextDeclCS__Group_8_2__1__Impl rule__OperationContextDeclCS__Group_8_2__2 )
-            // InternalCompleteOCL.g:6490:2: rule__OperationContextDeclCS__Group_8_2__1__Impl rule__OperationContextDeclCS__Group_8_2__2
+            // InternalCompleteOCL.g:6517:1: ( rule__OperationContextDeclCS__Group_8_2__1__Impl rule__OperationContextDeclCS__Group_8_2__2 )
+            // InternalCompleteOCL.g:6518:2: rule__OperationContextDeclCS__Group_8_2__1__Impl rule__OperationContextDeclCS__Group_8_2__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__OperationContextDeclCS__Group_8_2__1__Impl();
@@ -20742,22 +20827,22 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__1__Impl"
-    // InternalCompleteOCL.g:6497:1: rule__OperationContextDeclCS__Group_8_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalCompleteOCL.g:6525:1: rule__OperationContextDeclCS__Group_8_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__OperationContextDeclCS__Group_8_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6501:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalCompleteOCL.g:6502:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:6529:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalCompleteOCL.g:6530:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalCompleteOCL.g:6502:1: ( ( ruleUnrestrictedName )? )
-            // InternalCompleteOCL.g:6503:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:6530:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:6531:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getUnrestrictedNameParserRuleCall_8_2_1());
             }
-            // InternalCompleteOCL.g:6504:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:6532:1: ( ruleUnrestrictedName )?
             int alt68=2;
             int LA68_0 = input.LA(1);
 
@@ -20766,7 +20851,7 @@
             }
             switch (alt68) {
                 case 1 :
-                    // InternalCompleteOCL.g:6504:3: ruleUnrestrictedName
+                    // InternalCompleteOCL.g:6532:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -20804,14 +20889,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__2"
-    // InternalCompleteOCL.g:6514:1: rule__OperationContextDeclCS__Group_8_2__2 : rule__OperationContextDeclCS__Group_8_2__2__Impl rule__OperationContextDeclCS__Group_8_2__3 ;
+    // InternalCompleteOCL.g:6542:1: rule__OperationContextDeclCS__Group_8_2__2 : rule__OperationContextDeclCS__Group_8_2__2__Impl rule__OperationContextDeclCS__Group_8_2__3 ;
     public final void rule__OperationContextDeclCS__Group_8_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6518:1: ( rule__OperationContextDeclCS__Group_8_2__2__Impl rule__OperationContextDeclCS__Group_8_2__3 )
-            // InternalCompleteOCL.g:6519:2: rule__OperationContextDeclCS__Group_8_2__2__Impl rule__OperationContextDeclCS__Group_8_2__3
+            // InternalCompleteOCL.g:6546:1: ( rule__OperationContextDeclCS__Group_8_2__2__Impl rule__OperationContextDeclCS__Group_8_2__3 )
+            // InternalCompleteOCL.g:6547:2: rule__OperationContextDeclCS__Group_8_2__2__Impl rule__OperationContextDeclCS__Group_8_2__3
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__OperationContextDeclCS__Group_8_2__2__Impl();
@@ -20842,17 +20927,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__2__Impl"
-    // InternalCompleteOCL.g:6526:1: rule__OperationContextDeclCS__Group_8_2__2__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:6554:1: rule__OperationContextDeclCS__Group_8_2__2__Impl : ( ':' ) ;
     public final void rule__OperationContextDeclCS__Group_8_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6530:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:6531:1: ( ':' )
+            // InternalCompleteOCL.g:6558:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:6559:1: ( ':' )
             {
-            // InternalCompleteOCL.g:6531:1: ( ':' )
-            // InternalCompleteOCL.g:6532:1: ':'
+            // InternalCompleteOCL.g:6559:1: ( ':' )
+            // InternalCompleteOCL.g:6560:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getColonKeyword_8_2_2());
@@ -20883,14 +20968,14 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__3"
-    // InternalCompleteOCL.g:6545:1: rule__OperationContextDeclCS__Group_8_2__3 : rule__OperationContextDeclCS__Group_8_2__3__Impl ;
+    // InternalCompleteOCL.g:6573:1: rule__OperationContextDeclCS__Group_8_2__3 : rule__OperationContextDeclCS__Group_8_2__3__Impl ;
     public final void rule__OperationContextDeclCS__Group_8_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6549:1: ( rule__OperationContextDeclCS__Group_8_2__3__Impl )
-            // InternalCompleteOCL.g:6550:2: rule__OperationContextDeclCS__Group_8_2__3__Impl
+            // InternalCompleteOCL.g:6577:1: ( rule__OperationContextDeclCS__Group_8_2__3__Impl )
+            // InternalCompleteOCL.g:6578:2: rule__OperationContextDeclCS__Group_8_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__Group_8_2__3__Impl();
@@ -20916,23 +21001,23 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__Group_8_2__3__Impl"
-    // InternalCompleteOCL.g:6556:1: rule__OperationContextDeclCS__Group_8_2__3__Impl : ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) ) ;
+    // InternalCompleteOCL.g:6584:1: rule__OperationContextDeclCS__Group_8_2__3__Impl : ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) ) ;
     public final void rule__OperationContextDeclCS__Group_8_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6560:1: ( ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) ) )
-            // InternalCompleteOCL.g:6561:1: ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) )
+            // InternalCompleteOCL.g:6588:1: ( ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) ) )
+            // InternalCompleteOCL.g:6589:1: ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) )
             {
-            // InternalCompleteOCL.g:6561:1: ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) )
-            // InternalCompleteOCL.g:6562:1: ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 )
+            // InternalCompleteOCL.g:6589:1: ( ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 ) )
+            // InternalCompleteOCL.g:6590:1: ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedBodiesAssignment_8_2_3());
             }
-            // InternalCompleteOCL.g:6563:1: ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 )
-            // InternalCompleteOCL.g:6563:2: rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3
+            // InternalCompleteOCL.g:6591:1: ( rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 )
+            // InternalCompleteOCL.g:6591:2: rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3();
@@ -20967,14 +21052,14 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__0"
-    // InternalCompleteOCL.g:6581:1: rule__PackageDeclarationCS__Group__0 : rule__PackageDeclarationCS__Group__0__Impl rule__PackageDeclarationCS__Group__1 ;
+    // InternalCompleteOCL.g:6609:1: rule__PackageDeclarationCS__Group__0 : rule__PackageDeclarationCS__Group__0__Impl rule__PackageDeclarationCS__Group__1 ;
     public final void rule__PackageDeclarationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6585:1: ( rule__PackageDeclarationCS__Group__0__Impl rule__PackageDeclarationCS__Group__1 )
-            // InternalCompleteOCL.g:6586:2: rule__PackageDeclarationCS__Group__0__Impl rule__PackageDeclarationCS__Group__1
+            // InternalCompleteOCL.g:6613:1: ( rule__PackageDeclarationCS__Group__0__Impl rule__PackageDeclarationCS__Group__1 )
+            // InternalCompleteOCL.g:6614:2: rule__PackageDeclarationCS__Group__0__Impl rule__PackageDeclarationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PackageDeclarationCS__Group__0__Impl();
@@ -21005,17 +21090,17 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__0__Impl"
-    // InternalCompleteOCL.g:6593:1: rule__PackageDeclarationCS__Group__0__Impl : ( 'package' ) ;
+    // InternalCompleteOCL.g:6621:1: rule__PackageDeclarationCS__Group__0__Impl : ( 'package' ) ;
     public final void rule__PackageDeclarationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6597:1: ( ( 'package' ) )
-            // InternalCompleteOCL.g:6598:1: ( 'package' )
+            // InternalCompleteOCL.g:6625:1: ( ( 'package' ) )
+            // InternalCompleteOCL.g:6626:1: ( 'package' )
             {
-            // InternalCompleteOCL.g:6598:1: ( 'package' )
-            // InternalCompleteOCL.g:6599:1: 'package'
+            // InternalCompleteOCL.g:6626:1: ( 'package' )
+            // InternalCompleteOCL.g:6627:1: 'package'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getPackageKeyword_0());
@@ -21046,16 +21131,16 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__1"
-    // InternalCompleteOCL.g:6612:1: rule__PackageDeclarationCS__Group__1 : rule__PackageDeclarationCS__Group__1__Impl rule__PackageDeclarationCS__Group__2 ;
+    // InternalCompleteOCL.g:6640:1: rule__PackageDeclarationCS__Group__1 : rule__PackageDeclarationCS__Group__1__Impl rule__PackageDeclarationCS__Group__2 ;
     public final void rule__PackageDeclarationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6616:1: ( rule__PackageDeclarationCS__Group__1__Impl rule__PackageDeclarationCS__Group__2 )
-            // InternalCompleteOCL.g:6617:2: rule__PackageDeclarationCS__Group__1__Impl rule__PackageDeclarationCS__Group__2
+            // InternalCompleteOCL.g:6644:1: ( rule__PackageDeclarationCS__Group__1__Impl rule__PackageDeclarationCS__Group__2 )
+            // InternalCompleteOCL.g:6645:2: rule__PackageDeclarationCS__Group__1__Impl rule__PackageDeclarationCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_28);
+            pushFollow(FollowSets000.FOLLOW_29);
             rule__PackageDeclarationCS__Group__1__Impl();
 
             state._fsp--;
@@ -21084,23 +21169,23 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__1__Impl"
-    // InternalCompleteOCL.g:6624:1: rule__PackageDeclarationCS__Group__1__Impl : ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:6652:1: rule__PackageDeclarationCS__Group__1__Impl : ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) ) ;
     public final void rule__PackageDeclarationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6628:1: ( ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) ) )
-            // InternalCompleteOCL.g:6629:1: ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) )
+            // InternalCompleteOCL.g:6656:1: ( ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) ) )
+            // InternalCompleteOCL.g:6657:1: ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:6629:1: ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) )
-            // InternalCompleteOCL.g:6630:1: ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 )
+            // InternalCompleteOCL.g:6657:1: ( ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 ) )
+            // InternalCompleteOCL.g:6658:1: ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameAssignment_1());
             }
-            // InternalCompleteOCL.g:6631:1: ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 )
-            // InternalCompleteOCL.g:6631:2: rule__PackageDeclarationCS__OwnedPathNameAssignment_1
+            // InternalCompleteOCL.g:6659:1: ( rule__PackageDeclarationCS__OwnedPathNameAssignment_1 )
+            // InternalCompleteOCL.g:6659:2: rule__PackageDeclarationCS__OwnedPathNameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageDeclarationCS__OwnedPathNameAssignment_1();
@@ -21135,16 +21220,16 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__2"
-    // InternalCompleteOCL.g:6641:1: rule__PackageDeclarationCS__Group__2 : rule__PackageDeclarationCS__Group__2__Impl rule__PackageDeclarationCS__Group__3 ;
+    // InternalCompleteOCL.g:6669:1: rule__PackageDeclarationCS__Group__2 : rule__PackageDeclarationCS__Group__2__Impl rule__PackageDeclarationCS__Group__3 ;
     public final void rule__PackageDeclarationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6645:1: ( rule__PackageDeclarationCS__Group__2__Impl rule__PackageDeclarationCS__Group__3 )
-            // InternalCompleteOCL.g:6646:2: rule__PackageDeclarationCS__Group__2__Impl rule__PackageDeclarationCS__Group__3
+            // InternalCompleteOCL.g:6673:1: ( rule__PackageDeclarationCS__Group__2__Impl rule__PackageDeclarationCS__Group__3 )
+            // InternalCompleteOCL.g:6674:2: rule__PackageDeclarationCS__Group__2__Impl rule__PackageDeclarationCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_28);
+            pushFollow(FollowSets000.FOLLOW_29);
             rule__PackageDeclarationCS__Group__2__Impl();
 
             state._fsp--;
@@ -21173,22 +21258,22 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__2__Impl"
-    // InternalCompleteOCL.g:6653:1: rule__PackageDeclarationCS__Group__2__Impl : ( ( rule__PackageDeclarationCS__Group_2__0 )* ) ;
+    // InternalCompleteOCL.g:6681:1: rule__PackageDeclarationCS__Group__2__Impl : ( ( rule__PackageDeclarationCS__Group_2__0 )* ) ;
     public final void rule__PackageDeclarationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6657:1: ( ( ( rule__PackageDeclarationCS__Group_2__0 )* ) )
-            // InternalCompleteOCL.g:6658:1: ( ( rule__PackageDeclarationCS__Group_2__0 )* )
+            // InternalCompleteOCL.g:6685:1: ( ( ( rule__PackageDeclarationCS__Group_2__0 )* ) )
+            // InternalCompleteOCL.g:6686:1: ( ( rule__PackageDeclarationCS__Group_2__0 )* )
             {
-            // InternalCompleteOCL.g:6658:1: ( ( rule__PackageDeclarationCS__Group_2__0 )* )
-            // InternalCompleteOCL.g:6659:1: ( rule__PackageDeclarationCS__Group_2__0 )*
+            // InternalCompleteOCL.g:6686:1: ( ( rule__PackageDeclarationCS__Group_2__0 )* )
+            // InternalCompleteOCL.g:6687:1: ( rule__PackageDeclarationCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:6660:1: ( rule__PackageDeclarationCS__Group_2__0 )*
+            // InternalCompleteOCL.g:6688:1: ( rule__PackageDeclarationCS__Group_2__0 )*
             loop69:
             do {
                 int alt69=2;
@@ -21201,9 +21286,9 @@
 
                 switch (alt69) {
             	case 1 :
-            	    // InternalCompleteOCL.g:6660:2: rule__PackageDeclarationCS__Group_2__0
+            	    // InternalCompleteOCL.g:6688:2: rule__PackageDeclarationCS__Group_2__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_29);
+            	    pushFollow(FollowSets000.FOLLOW_30);
             	    rule__PackageDeclarationCS__Group_2__0();
 
             	    state._fsp--;
@@ -21242,16 +21327,16 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__3"
-    // InternalCompleteOCL.g:6670:1: rule__PackageDeclarationCS__Group__3 : rule__PackageDeclarationCS__Group__3__Impl rule__PackageDeclarationCS__Group__4 ;
+    // InternalCompleteOCL.g:6698:1: rule__PackageDeclarationCS__Group__3 : rule__PackageDeclarationCS__Group__3__Impl rule__PackageDeclarationCS__Group__4 ;
     public final void rule__PackageDeclarationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6674:1: ( rule__PackageDeclarationCS__Group__3__Impl rule__PackageDeclarationCS__Group__4 )
-            // InternalCompleteOCL.g:6675:2: rule__PackageDeclarationCS__Group__3__Impl rule__PackageDeclarationCS__Group__4
+            // InternalCompleteOCL.g:6702:1: ( rule__PackageDeclarationCS__Group__3__Impl rule__PackageDeclarationCS__Group__4 )
+            // InternalCompleteOCL.g:6703:2: rule__PackageDeclarationCS__Group__3__Impl rule__PackageDeclarationCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_28);
+            pushFollow(FollowSets000.FOLLOW_29);
             rule__PackageDeclarationCS__Group__3__Impl();
 
             state._fsp--;
@@ -21280,22 +21365,22 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__3__Impl"
-    // InternalCompleteOCL.g:6682:1: rule__PackageDeclarationCS__Group__3__Impl : ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* ) ;
+    // InternalCompleteOCL.g:6710:1: rule__PackageDeclarationCS__Group__3__Impl : ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* ) ;
     public final void rule__PackageDeclarationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6686:1: ( ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* ) )
-            // InternalCompleteOCL.g:6687:1: ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* )
+            // InternalCompleteOCL.g:6714:1: ( ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* ) )
+            // InternalCompleteOCL.g:6715:1: ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* )
             {
-            // InternalCompleteOCL.g:6687:1: ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* )
-            // InternalCompleteOCL.g:6688:1: ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )*
+            // InternalCompleteOCL.g:6715:1: ( ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )* )
+            // InternalCompleteOCL.g:6716:1: ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getOwnedContextsAssignment_3());
             }
-            // InternalCompleteOCL.g:6689:1: ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )*
+            // InternalCompleteOCL.g:6717:1: ( rule__PackageDeclarationCS__OwnedContextsAssignment_3 )*
             loop70:
             do {
                 int alt70=2;
@@ -21308,7 +21393,7 @@
 
                 switch (alt70) {
             	case 1 :
-            	    // InternalCompleteOCL.g:6689:2: rule__PackageDeclarationCS__OwnedContextsAssignment_3
+            	    // InternalCompleteOCL.g:6717:2: rule__PackageDeclarationCS__OwnedContextsAssignment_3
             	    {
             	    pushFollow(FollowSets000.FOLLOW_6);
             	    rule__PackageDeclarationCS__OwnedContextsAssignment_3();
@@ -21349,14 +21434,14 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__4"
-    // InternalCompleteOCL.g:6699:1: rule__PackageDeclarationCS__Group__4 : rule__PackageDeclarationCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:6727:1: rule__PackageDeclarationCS__Group__4 : rule__PackageDeclarationCS__Group__4__Impl ;
     public final void rule__PackageDeclarationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6703:1: ( rule__PackageDeclarationCS__Group__4__Impl )
-            // InternalCompleteOCL.g:6704:2: rule__PackageDeclarationCS__Group__4__Impl
+            // InternalCompleteOCL.g:6731:1: ( rule__PackageDeclarationCS__Group__4__Impl )
+            // InternalCompleteOCL.g:6732:2: rule__PackageDeclarationCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageDeclarationCS__Group__4__Impl();
@@ -21382,17 +21467,17 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group__4__Impl"
-    // InternalCompleteOCL.g:6710:1: rule__PackageDeclarationCS__Group__4__Impl : ( 'endpackage' ) ;
+    // InternalCompleteOCL.g:6738:1: rule__PackageDeclarationCS__Group__4__Impl : ( 'endpackage' ) ;
     public final void rule__PackageDeclarationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6714:1: ( ( 'endpackage' ) )
-            // InternalCompleteOCL.g:6715:1: ( 'endpackage' )
+            // InternalCompleteOCL.g:6742:1: ( ( 'endpackage' ) )
+            // InternalCompleteOCL.g:6743:1: ( 'endpackage' )
             {
-            // InternalCompleteOCL.g:6715:1: ( 'endpackage' )
-            // InternalCompleteOCL.g:6716:1: 'endpackage'
+            // InternalCompleteOCL.g:6743:1: ( 'endpackage' )
+            // InternalCompleteOCL.g:6744:1: 'endpackage'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getEndpackageKeyword_4());
@@ -21423,14 +21508,14 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group_2__0"
-    // InternalCompleteOCL.g:6739:1: rule__PackageDeclarationCS__Group_2__0 : rule__PackageDeclarationCS__Group_2__0__Impl rule__PackageDeclarationCS__Group_2__1 ;
+    // InternalCompleteOCL.g:6767:1: rule__PackageDeclarationCS__Group_2__0 : rule__PackageDeclarationCS__Group_2__0__Impl rule__PackageDeclarationCS__Group_2__1 ;
     public final void rule__PackageDeclarationCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6743:1: ( rule__PackageDeclarationCS__Group_2__0__Impl rule__PackageDeclarationCS__Group_2__1 )
-            // InternalCompleteOCL.g:6744:2: rule__PackageDeclarationCS__Group_2__0__Impl rule__PackageDeclarationCS__Group_2__1
+            // InternalCompleteOCL.g:6771:1: ( rule__PackageDeclarationCS__Group_2__0__Impl rule__PackageDeclarationCS__Group_2__1 )
+            // InternalCompleteOCL.g:6772:2: rule__PackageDeclarationCS__Group_2__0__Impl rule__PackageDeclarationCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PackageDeclarationCS__Group_2__0__Impl();
@@ -21461,17 +21546,17 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:6751:1: rule__PackageDeclarationCS__Group_2__0__Impl : ( 'inv' ) ;
+    // InternalCompleteOCL.g:6779:1: rule__PackageDeclarationCS__Group_2__0__Impl : ( 'inv' ) ;
     public final void rule__PackageDeclarationCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6755:1: ( ( 'inv' ) )
-            // InternalCompleteOCL.g:6756:1: ( 'inv' )
+            // InternalCompleteOCL.g:6783:1: ( ( 'inv' ) )
+            // InternalCompleteOCL.g:6784:1: ( 'inv' )
             {
-            // InternalCompleteOCL.g:6756:1: ( 'inv' )
-            // InternalCompleteOCL.g:6757:1: 'inv'
+            // InternalCompleteOCL.g:6784:1: ( 'inv' )
+            // InternalCompleteOCL.g:6785:1: 'inv'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getInvKeyword_2_0());
@@ -21502,14 +21587,14 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group_2__1"
-    // InternalCompleteOCL.g:6770:1: rule__PackageDeclarationCS__Group_2__1 : rule__PackageDeclarationCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:6798:1: rule__PackageDeclarationCS__Group_2__1 : rule__PackageDeclarationCS__Group_2__1__Impl ;
     public final void rule__PackageDeclarationCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6774:1: ( rule__PackageDeclarationCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:6775:2: rule__PackageDeclarationCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:6802:1: ( rule__PackageDeclarationCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:6803:2: rule__PackageDeclarationCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageDeclarationCS__Group_2__1__Impl();
@@ -21535,23 +21620,23 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:6781:1: rule__PackageDeclarationCS__Group_2__1__Impl : ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:6809:1: rule__PackageDeclarationCS__Group_2__1__Impl : ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) ) ;
     public final void rule__PackageDeclarationCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6785:1: ( ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:6786:1: ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) )
+            // InternalCompleteOCL.g:6813:1: ( ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:6814:1: ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:6786:1: ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) )
-            // InternalCompleteOCL.g:6787:1: ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 )
+            // InternalCompleteOCL.g:6814:1: ( ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 ) )
+            // InternalCompleteOCL.g:6815:1: ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getOwnedInvariantsAssignment_2_1());
             }
-            // InternalCompleteOCL.g:6788:1: ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 )
-            // InternalCompleteOCL.g:6788:2: rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1
+            // InternalCompleteOCL.g:6816:1: ( rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 )
+            // InternalCompleteOCL.g:6816:2: rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1();
@@ -21586,16 +21671,16 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__0"
-    // InternalCompleteOCL.g:6802:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
+    // InternalCompleteOCL.g:6830:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
     public final void rule__ParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6806:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
-            // InternalCompleteOCL.g:6807:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
+            // InternalCompleteOCL.g:6834:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
+            // InternalCompleteOCL.g:6835:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__ParameterCS__Group__0__Impl();
 
             state._fsp--;
@@ -21624,22 +21709,22 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__0__Impl"
-    // InternalCompleteOCL.g:6814:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__Group_0__0 )? ) ;
+    // InternalCompleteOCL.g:6842:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__Group_0__0 )? ) ;
     public final void rule__ParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6818:1: ( ( ( rule__ParameterCS__Group_0__0 )? ) )
-            // InternalCompleteOCL.g:6819:1: ( ( rule__ParameterCS__Group_0__0 )? )
+            // InternalCompleteOCL.g:6846:1: ( ( ( rule__ParameterCS__Group_0__0 )? ) )
+            // InternalCompleteOCL.g:6847:1: ( ( rule__ParameterCS__Group_0__0 )? )
             {
-            // InternalCompleteOCL.g:6819:1: ( ( rule__ParameterCS__Group_0__0 )? )
-            // InternalCompleteOCL.g:6820:1: ( rule__ParameterCS__Group_0__0 )?
+            // InternalCompleteOCL.g:6847:1: ( ( rule__ParameterCS__Group_0__0 )? )
+            // InternalCompleteOCL.g:6848:1: ( rule__ParameterCS__Group_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getGroup_0());
             }
-            // InternalCompleteOCL.g:6821:1: ( rule__ParameterCS__Group_0__0 )?
+            // InternalCompleteOCL.g:6849:1: ( rule__ParameterCS__Group_0__0 )?
             int alt71=2;
             switch ( input.LA(1) ) {
                 case RULE_SIMPLE_ID:
@@ -21691,7 +21776,7 @@
 
             switch (alt71) {
                 case 1 :
-                    // InternalCompleteOCL.g:6821:2: rule__ParameterCS__Group_0__0
+                    // InternalCompleteOCL.g:6849:2: rule__ParameterCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__Group_0__0();
@@ -21729,14 +21814,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__1"
-    // InternalCompleteOCL.g:6831:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:6859:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl ;
     public final void rule__ParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6835:1: ( rule__ParameterCS__Group__1__Impl )
-            // InternalCompleteOCL.g:6836:2: rule__ParameterCS__Group__1__Impl
+            // InternalCompleteOCL.g:6863:1: ( rule__ParameterCS__Group__1__Impl )
+            // InternalCompleteOCL.g:6864:2: rule__ParameterCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group__1__Impl();
@@ -21762,23 +21847,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__1__Impl"
-    // InternalCompleteOCL.g:6842:1: rule__ParameterCS__Group__1__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:6870:1: rule__ParameterCS__Group__1__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) ) ;
     public final void rule__ParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6846:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) ) )
-            // InternalCompleteOCL.g:6847:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) )
+            // InternalCompleteOCL.g:6874:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) ) )
+            // InternalCompleteOCL.g:6875:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:6847:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) )
-            // InternalCompleteOCL.g:6848:1: ( rule__ParameterCS__OwnedTypeAssignment_1 )
+            // InternalCompleteOCL.g:6875:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1 ) )
+            // InternalCompleteOCL.g:6876:1: ( rule__ParameterCS__OwnedTypeAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedTypeAssignment_1());
             }
-            // InternalCompleteOCL.g:6849:1: ( rule__ParameterCS__OwnedTypeAssignment_1 )
-            // InternalCompleteOCL.g:6849:2: rule__ParameterCS__OwnedTypeAssignment_1
+            // InternalCompleteOCL.g:6877:1: ( rule__ParameterCS__OwnedTypeAssignment_1 )
+            // InternalCompleteOCL.g:6877:2: rule__ParameterCS__OwnedTypeAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__OwnedTypeAssignment_1();
@@ -21813,16 +21898,16 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_0__0"
-    // InternalCompleteOCL.g:6863:1: rule__ParameterCS__Group_0__0 : rule__ParameterCS__Group_0__0__Impl rule__ParameterCS__Group_0__1 ;
+    // InternalCompleteOCL.g:6891:1: rule__ParameterCS__Group_0__0 : rule__ParameterCS__Group_0__0__Impl rule__ParameterCS__Group_0__1 ;
     public final void rule__ParameterCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6867:1: ( rule__ParameterCS__Group_0__0__Impl rule__ParameterCS__Group_0__1 )
-            // InternalCompleteOCL.g:6868:2: rule__ParameterCS__Group_0__0__Impl rule__ParameterCS__Group_0__1
+            // InternalCompleteOCL.g:6895:1: ( rule__ParameterCS__Group_0__0__Impl rule__ParameterCS__Group_0__1 )
+            // InternalCompleteOCL.g:6896:2: rule__ParameterCS__Group_0__0__Impl rule__ParameterCS__Group_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__ParameterCS__Group_0__0__Impl();
 
             state._fsp--;
@@ -21851,23 +21936,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:6875:1: rule__ParameterCS__Group_0__0__Impl : ( ( rule__ParameterCS__NameAssignment_0_0 ) ) ;
+    // InternalCompleteOCL.g:6903:1: rule__ParameterCS__Group_0__0__Impl : ( ( rule__ParameterCS__NameAssignment_0_0 ) ) ;
     public final void rule__ParameterCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6879:1: ( ( ( rule__ParameterCS__NameAssignment_0_0 ) ) )
-            // InternalCompleteOCL.g:6880:1: ( ( rule__ParameterCS__NameAssignment_0_0 ) )
+            // InternalCompleteOCL.g:6907:1: ( ( ( rule__ParameterCS__NameAssignment_0_0 ) ) )
+            // InternalCompleteOCL.g:6908:1: ( ( rule__ParameterCS__NameAssignment_0_0 ) )
             {
-            // InternalCompleteOCL.g:6880:1: ( ( rule__ParameterCS__NameAssignment_0_0 ) )
-            // InternalCompleteOCL.g:6881:1: ( rule__ParameterCS__NameAssignment_0_0 )
+            // InternalCompleteOCL.g:6908:1: ( ( rule__ParameterCS__NameAssignment_0_0 ) )
+            // InternalCompleteOCL.g:6909:1: ( rule__ParameterCS__NameAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getNameAssignment_0_0());
             }
-            // InternalCompleteOCL.g:6882:1: ( rule__ParameterCS__NameAssignment_0_0 )
-            // InternalCompleteOCL.g:6882:2: rule__ParameterCS__NameAssignment_0_0
+            // InternalCompleteOCL.g:6910:1: ( rule__ParameterCS__NameAssignment_0_0 )
+            // InternalCompleteOCL.g:6910:2: rule__ParameterCS__NameAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__NameAssignment_0_0();
@@ -21902,14 +21987,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_0__1"
-    // InternalCompleteOCL.g:6892:1: rule__ParameterCS__Group_0__1 : rule__ParameterCS__Group_0__1__Impl ;
+    // InternalCompleteOCL.g:6920:1: rule__ParameterCS__Group_0__1 : rule__ParameterCS__Group_0__1__Impl ;
     public final void rule__ParameterCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6896:1: ( rule__ParameterCS__Group_0__1__Impl )
-            // InternalCompleteOCL.g:6897:2: rule__ParameterCS__Group_0__1__Impl
+            // InternalCompleteOCL.g:6924:1: ( rule__ParameterCS__Group_0__1__Impl )
+            // InternalCompleteOCL.g:6925:2: rule__ParameterCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group_0__1__Impl();
@@ -21935,17 +22020,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:6903:1: rule__ParameterCS__Group_0__1__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:6931:1: rule__ParameterCS__Group_0__1__Impl : ( ':' ) ;
     public final void rule__ParameterCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6907:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:6908:1: ( ':' )
+            // InternalCompleteOCL.g:6935:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:6936:1: ( ':' )
             {
-            // InternalCompleteOCL.g:6908:1: ( ':' )
-            // InternalCompleteOCL.g:6909:1: ':'
+            // InternalCompleteOCL.g:6936:1: ( ':' )
+            // InternalCompleteOCL.g:6937:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getColonKeyword_0_1());
@@ -21976,14 +22061,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__0"
-    // InternalCompleteOCL.g:6926:1: rule__PropertyContextDeclCS__Group__0 : rule__PropertyContextDeclCS__Group__0__Impl rule__PropertyContextDeclCS__Group__1 ;
+    // InternalCompleteOCL.g:6954:1: rule__PropertyContextDeclCS__Group__0 : rule__PropertyContextDeclCS__Group__0__Impl rule__PropertyContextDeclCS__Group__1 ;
     public final void rule__PropertyContextDeclCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6930:1: ( rule__PropertyContextDeclCS__Group__0__Impl rule__PropertyContextDeclCS__Group__1 )
-            // InternalCompleteOCL.g:6931:2: rule__PropertyContextDeclCS__Group__0__Impl rule__PropertyContextDeclCS__Group__1
+            // InternalCompleteOCL.g:6958:1: ( rule__PropertyContextDeclCS__Group__0__Impl rule__PropertyContextDeclCS__Group__1 )
+            // InternalCompleteOCL.g:6959:2: rule__PropertyContextDeclCS__Group__0__Impl rule__PropertyContextDeclCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PropertyContextDeclCS__Group__0__Impl();
@@ -22014,17 +22099,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__0__Impl"
-    // InternalCompleteOCL.g:6938:1: rule__PropertyContextDeclCS__Group__0__Impl : ( 'context' ) ;
+    // InternalCompleteOCL.g:6966:1: rule__PropertyContextDeclCS__Group__0__Impl : ( 'context' ) ;
     public final void rule__PropertyContextDeclCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6942:1: ( ( 'context' ) )
-            // InternalCompleteOCL.g:6943:1: ( 'context' )
+            // InternalCompleteOCL.g:6970:1: ( ( 'context' ) )
+            // InternalCompleteOCL.g:6971:1: ( 'context' )
             {
-            // InternalCompleteOCL.g:6943:1: ( 'context' )
-            // InternalCompleteOCL.g:6944:1: 'context'
+            // InternalCompleteOCL.g:6971:1: ( 'context' )
+            // InternalCompleteOCL.g:6972:1: 'context'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getContextKeyword_0());
@@ -22055,16 +22140,16 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__1"
-    // InternalCompleteOCL.g:6957:1: rule__PropertyContextDeclCS__Group__1 : rule__PropertyContextDeclCS__Group__1__Impl rule__PropertyContextDeclCS__Group__2 ;
+    // InternalCompleteOCL.g:6985:1: rule__PropertyContextDeclCS__Group__1 : rule__PropertyContextDeclCS__Group__1__Impl rule__PropertyContextDeclCS__Group__2 ;
     public final void rule__PropertyContextDeclCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6961:1: ( rule__PropertyContextDeclCS__Group__1__Impl rule__PropertyContextDeclCS__Group__2 )
-            // InternalCompleteOCL.g:6962:2: rule__PropertyContextDeclCS__Group__1__Impl rule__PropertyContextDeclCS__Group__2
+            // InternalCompleteOCL.g:6989:1: ( rule__PropertyContextDeclCS__Group__1__Impl rule__PropertyContextDeclCS__Group__2 )
+            // InternalCompleteOCL.g:6990:2: rule__PropertyContextDeclCS__Group__1__Impl rule__PropertyContextDeclCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__PropertyContextDeclCS__Group__1__Impl();
 
             state._fsp--;
@@ -22093,23 +22178,23 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__1__Impl"
-    // InternalCompleteOCL.g:6969:1: rule__PropertyContextDeclCS__Group__1__Impl : ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:6997:1: rule__PropertyContextDeclCS__Group__1__Impl : ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) ) ;
     public final void rule__PropertyContextDeclCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6973:1: ( ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) ) )
-            // InternalCompleteOCL.g:6974:1: ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) )
+            // InternalCompleteOCL.g:7001:1: ( ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) ) )
+            // InternalCompleteOCL.g:7002:1: ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:6974:1: ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) )
-            // InternalCompleteOCL.g:6975:1: ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 )
+            // InternalCompleteOCL.g:7002:1: ( ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 ) )
+            // InternalCompleteOCL.g:7003:1: ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameAssignment_1());
             }
-            // InternalCompleteOCL.g:6976:1: ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 )
-            // InternalCompleteOCL.g:6976:2: rule__PropertyContextDeclCS__OwnedPathNameAssignment_1
+            // InternalCompleteOCL.g:7004:1: ( rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 )
+            // InternalCompleteOCL.g:7004:2: rule__PropertyContextDeclCS__OwnedPathNameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__OwnedPathNameAssignment_1();
@@ -22144,16 +22229,16 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__2"
-    // InternalCompleteOCL.g:6986:1: rule__PropertyContextDeclCS__Group__2 : rule__PropertyContextDeclCS__Group__2__Impl rule__PropertyContextDeclCS__Group__3 ;
+    // InternalCompleteOCL.g:7014:1: rule__PropertyContextDeclCS__Group__2 : rule__PropertyContextDeclCS__Group__2__Impl rule__PropertyContextDeclCS__Group__3 ;
     public final void rule__PropertyContextDeclCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:6990:1: ( rule__PropertyContextDeclCS__Group__2__Impl rule__PropertyContextDeclCS__Group__3 )
-            // InternalCompleteOCL.g:6991:2: rule__PropertyContextDeclCS__Group__2__Impl rule__PropertyContextDeclCS__Group__3
+            // InternalCompleteOCL.g:7018:1: ( rule__PropertyContextDeclCS__Group__2__Impl rule__PropertyContextDeclCS__Group__3 )
+            // InternalCompleteOCL.g:7019:2: rule__PropertyContextDeclCS__Group__2__Impl rule__PropertyContextDeclCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__PropertyContextDeclCS__Group__2__Impl();
 
             state._fsp--;
@@ -22182,17 +22267,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__2__Impl"
-    // InternalCompleteOCL.g:6998:1: rule__PropertyContextDeclCS__Group__2__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:7026:1: rule__PropertyContextDeclCS__Group__2__Impl : ( ':' ) ;
     public final void rule__PropertyContextDeclCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7002:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:7003:1: ( ':' )
+            // InternalCompleteOCL.g:7030:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:7031:1: ( ':' )
             {
-            // InternalCompleteOCL.g:7003:1: ( ':' )
-            // InternalCompleteOCL.g:7004:1: ':'
+            // InternalCompleteOCL.g:7031:1: ( ':' )
+            // InternalCompleteOCL.g:7032:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getColonKeyword_2());
@@ -22223,16 +22308,16 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__3"
-    // InternalCompleteOCL.g:7017:1: rule__PropertyContextDeclCS__Group__3 : rule__PropertyContextDeclCS__Group__3__Impl rule__PropertyContextDeclCS__Group__4 ;
+    // InternalCompleteOCL.g:7045:1: rule__PropertyContextDeclCS__Group__3 : rule__PropertyContextDeclCS__Group__3__Impl rule__PropertyContextDeclCS__Group__4 ;
     public final void rule__PropertyContextDeclCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7021:1: ( rule__PropertyContextDeclCS__Group__3__Impl rule__PropertyContextDeclCS__Group__4 )
-            // InternalCompleteOCL.g:7022:2: rule__PropertyContextDeclCS__Group__3__Impl rule__PropertyContextDeclCS__Group__4
+            // InternalCompleteOCL.g:7049:1: ( rule__PropertyContextDeclCS__Group__3__Impl rule__PropertyContextDeclCS__Group__4 )
+            // InternalCompleteOCL.g:7050:2: rule__PropertyContextDeclCS__Group__3__Impl rule__PropertyContextDeclCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_30);
+            pushFollow(FollowSets000.FOLLOW_31);
             rule__PropertyContextDeclCS__Group__3__Impl();
 
             state._fsp--;
@@ -22261,23 +22346,23 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__3__Impl"
-    // InternalCompleteOCL.g:7029:1: rule__PropertyContextDeclCS__Group__3__Impl : ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) ) ;
+    // InternalCompleteOCL.g:7057:1: rule__PropertyContextDeclCS__Group__3__Impl : ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) ) ;
     public final void rule__PropertyContextDeclCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7033:1: ( ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) ) )
-            // InternalCompleteOCL.g:7034:1: ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) )
+            // InternalCompleteOCL.g:7061:1: ( ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) ) )
+            // InternalCompleteOCL.g:7062:1: ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) )
             {
-            // InternalCompleteOCL.g:7034:1: ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) )
-            // InternalCompleteOCL.g:7035:1: ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 )
+            // InternalCompleteOCL.g:7062:1: ( ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 ) )
+            // InternalCompleteOCL.g:7063:1: ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedTypeAssignment_3());
             }
-            // InternalCompleteOCL.g:7036:1: ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 )
-            // InternalCompleteOCL.g:7036:2: rule__PropertyContextDeclCS__OwnedTypeAssignment_3
+            // InternalCompleteOCL.g:7064:1: ( rule__PropertyContextDeclCS__OwnedTypeAssignment_3 )
+            // InternalCompleteOCL.g:7064:2: rule__PropertyContextDeclCS__OwnedTypeAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__OwnedTypeAssignment_3();
@@ -22312,14 +22397,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__4"
-    // InternalCompleteOCL.g:7046:1: rule__PropertyContextDeclCS__Group__4 : rule__PropertyContextDeclCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:7074:1: rule__PropertyContextDeclCS__Group__4 : rule__PropertyContextDeclCS__Group__4__Impl ;
     public final void rule__PropertyContextDeclCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7050:1: ( rule__PropertyContextDeclCS__Group__4__Impl )
-            // InternalCompleteOCL.g:7051:2: rule__PropertyContextDeclCS__Group__4__Impl
+            // InternalCompleteOCL.g:7078:1: ( rule__PropertyContextDeclCS__Group__4__Impl )
+            // InternalCompleteOCL.g:7079:2: rule__PropertyContextDeclCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__Group__4__Impl();
@@ -22345,22 +22430,22 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group__4__Impl"
-    // InternalCompleteOCL.g:7057:1: rule__PropertyContextDeclCS__Group__4__Impl : ( ( rule__PropertyContextDeclCS__Alternatives_4 )* ) ;
+    // InternalCompleteOCL.g:7085:1: rule__PropertyContextDeclCS__Group__4__Impl : ( ( rule__PropertyContextDeclCS__Alternatives_4 )* ) ;
     public final void rule__PropertyContextDeclCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7061:1: ( ( ( rule__PropertyContextDeclCS__Alternatives_4 )* ) )
-            // InternalCompleteOCL.g:7062:1: ( ( rule__PropertyContextDeclCS__Alternatives_4 )* )
+            // InternalCompleteOCL.g:7089:1: ( ( ( rule__PropertyContextDeclCS__Alternatives_4 )* ) )
+            // InternalCompleteOCL.g:7090:1: ( ( rule__PropertyContextDeclCS__Alternatives_4 )* )
             {
-            // InternalCompleteOCL.g:7062:1: ( ( rule__PropertyContextDeclCS__Alternatives_4 )* )
-            // InternalCompleteOCL.g:7063:1: ( rule__PropertyContextDeclCS__Alternatives_4 )*
+            // InternalCompleteOCL.g:7090:1: ( ( rule__PropertyContextDeclCS__Alternatives_4 )* )
+            // InternalCompleteOCL.g:7091:1: ( rule__PropertyContextDeclCS__Alternatives_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getAlternatives_4());
             }
-            // InternalCompleteOCL.g:7064:1: ( rule__PropertyContextDeclCS__Alternatives_4 )*
+            // InternalCompleteOCL.g:7092:1: ( rule__PropertyContextDeclCS__Alternatives_4 )*
             loop72:
             do {
                 int alt72=2;
@@ -22373,9 +22458,9 @@
 
                 switch (alt72) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7064:2: rule__PropertyContextDeclCS__Alternatives_4
+            	    // InternalCompleteOCL.g:7092:2: rule__PropertyContextDeclCS__Alternatives_4
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_31);
+            	    pushFollow(FollowSets000.FOLLOW_32);
             	    rule__PropertyContextDeclCS__Alternatives_4();
 
             	    state._fsp--;
@@ -22414,14 +22499,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__0"
-    // InternalCompleteOCL.g:7084:1: rule__PropertyContextDeclCS__Group_4_0__0 : rule__PropertyContextDeclCS__Group_4_0__0__Impl rule__PropertyContextDeclCS__Group_4_0__1 ;
+    // InternalCompleteOCL.g:7112:1: rule__PropertyContextDeclCS__Group_4_0__0 : rule__PropertyContextDeclCS__Group_4_0__0__Impl rule__PropertyContextDeclCS__Group_4_0__1 ;
     public final void rule__PropertyContextDeclCS__Group_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7088:1: ( rule__PropertyContextDeclCS__Group_4_0__0__Impl rule__PropertyContextDeclCS__Group_4_0__1 )
-            // InternalCompleteOCL.g:7089:2: rule__PropertyContextDeclCS__Group_4_0__0__Impl rule__PropertyContextDeclCS__Group_4_0__1
+            // InternalCompleteOCL.g:7116:1: ( rule__PropertyContextDeclCS__Group_4_0__0__Impl rule__PropertyContextDeclCS__Group_4_0__1 )
+            // InternalCompleteOCL.g:7117:2: rule__PropertyContextDeclCS__Group_4_0__0__Impl rule__PropertyContextDeclCS__Group_4_0__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PropertyContextDeclCS__Group_4_0__0__Impl();
@@ -22452,17 +22537,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__0__Impl"
-    // InternalCompleteOCL.g:7096:1: rule__PropertyContextDeclCS__Group_4_0__0__Impl : ( 'derive' ) ;
+    // InternalCompleteOCL.g:7124:1: rule__PropertyContextDeclCS__Group_4_0__0__Impl : ( 'derive' ) ;
     public final void rule__PropertyContextDeclCS__Group_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7100:1: ( ( 'derive' ) )
-            // InternalCompleteOCL.g:7101:1: ( 'derive' )
+            // InternalCompleteOCL.g:7128:1: ( ( 'derive' ) )
+            // InternalCompleteOCL.g:7129:1: ( 'derive' )
             {
-            // InternalCompleteOCL.g:7101:1: ( 'derive' )
-            // InternalCompleteOCL.g:7102:1: 'derive'
+            // InternalCompleteOCL.g:7129:1: ( 'derive' )
+            // InternalCompleteOCL.g:7130:1: 'derive'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getDeriveKeyword_4_0_0());
@@ -22493,14 +22578,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__1"
-    // InternalCompleteOCL.g:7115:1: rule__PropertyContextDeclCS__Group_4_0__1 : rule__PropertyContextDeclCS__Group_4_0__1__Impl rule__PropertyContextDeclCS__Group_4_0__2 ;
+    // InternalCompleteOCL.g:7143:1: rule__PropertyContextDeclCS__Group_4_0__1 : rule__PropertyContextDeclCS__Group_4_0__1__Impl rule__PropertyContextDeclCS__Group_4_0__2 ;
     public final void rule__PropertyContextDeclCS__Group_4_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7119:1: ( rule__PropertyContextDeclCS__Group_4_0__1__Impl rule__PropertyContextDeclCS__Group_4_0__2 )
-            // InternalCompleteOCL.g:7120:2: rule__PropertyContextDeclCS__Group_4_0__1__Impl rule__PropertyContextDeclCS__Group_4_0__2
+            // InternalCompleteOCL.g:7147:1: ( rule__PropertyContextDeclCS__Group_4_0__1__Impl rule__PropertyContextDeclCS__Group_4_0__2 )
+            // InternalCompleteOCL.g:7148:2: rule__PropertyContextDeclCS__Group_4_0__1__Impl rule__PropertyContextDeclCS__Group_4_0__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PropertyContextDeclCS__Group_4_0__1__Impl();
@@ -22531,22 +22616,22 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__1__Impl"
-    // InternalCompleteOCL.g:7127:1: rule__PropertyContextDeclCS__Group_4_0__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalCompleteOCL.g:7155:1: rule__PropertyContextDeclCS__Group_4_0__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__PropertyContextDeclCS__Group_4_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7131:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalCompleteOCL.g:7132:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:7159:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalCompleteOCL.g:7160:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalCompleteOCL.g:7132:1: ( ( ruleUnrestrictedName )? )
-            // InternalCompleteOCL.g:7133:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:7160:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:7161:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getUnrestrictedNameParserRuleCall_4_0_1());
             }
-            // InternalCompleteOCL.g:7134:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:7162:1: ( ruleUnrestrictedName )?
             int alt73=2;
             int LA73_0 = input.LA(1);
 
@@ -22555,7 +22640,7 @@
             }
             switch (alt73) {
                 case 1 :
-                    // InternalCompleteOCL.g:7134:3: ruleUnrestrictedName
+                    // InternalCompleteOCL.g:7162:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -22593,14 +22678,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__2"
-    // InternalCompleteOCL.g:7144:1: rule__PropertyContextDeclCS__Group_4_0__2 : rule__PropertyContextDeclCS__Group_4_0__2__Impl rule__PropertyContextDeclCS__Group_4_0__3 ;
+    // InternalCompleteOCL.g:7172:1: rule__PropertyContextDeclCS__Group_4_0__2 : rule__PropertyContextDeclCS__Group_4_0__2__Impl rule__PropertyContextDeclCS__Group_4_0__3 ;
     public final void rule__PropertyContextDeclCS__Group_4_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7148:1: ( rule__PropertyContextDeclCS__Group_4_0__2__Impl rule__PropertyContextDeclCS__Group_4_0__3 )
-            // InternalCompleteOCL.g:7149:2: rule__PropertyContextDeclCS__Group_4_0__2__Impl rule__PropertyContextDeclCS__Group_4_0__3
+            // InternalCompleteOCL.g:7176:1: ( rule__PropertyContextDeclCS__Group_4_0__2__Impl rule__PropertyContextDeclCS__Group_4_0__3 )
+            // InternalCompleteOCL.g:7177:2: rule__PropertyContextDeclCS__Group_4_0__2__Impl rule__PropertyContextDeclCS__Group_4_0__3
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__PropertyContextDeclCS__Group_4_0__2__Impl();
@@ -22631,17 +22716,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__2__Impl"
-    // InternalCompleteOCL.g:7156:1: rule__PropertyContextDeclCS__Group_4_0__2__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:7184:1: rule__PropertyContextDeclCS__Group_4_0__2__Impl : ( ':' ) ;
     public final void rule__PropertyContextDeclCS__Group_4_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7160:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:7161:1: ( ':' )
+            // InternalCompleteOCL.g:7188:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:7189:1: ( ':' )
             {
-            // InternalCompleteOCL.g:7161:1: ( ':' )
-            // InternalCompleteOCL.g:7162:1: ':'
+            // InternalCompleteOCL.g:7189:1: ( ':' )
+            // InternalCompleteOCL.g:7190:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getColonKeyword_4_0_2());
@@ -22672,14 +22757,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__3"
-    // InternalCompleteOCL.g:7175:1: rule__PropertyContextDeclCS__Group_4_0__3 : rule__PropertyContextDeclCS__Group_4_0__3__Impl ;
+    // InternalCompleteOCL.g:7203:1: rule__PropertyContextDeclCS__Group_4_0__3 : rule__PropertyContextDeclCS__Group_4_0__3__Impl ;
     public final void rule__PropertyContextDeclCS__Group_4_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7179:1: ( rule__PropertyContextDeclCS__Group_4_0__3__Impl )
-            // InternalCompleteOCL.g:7180:2: rule__PropertyContextDeclCS__Group_4_0__3__Impl
+            // InternalCompleteOCL.g:7207:1: ( rule__PropertyContextDeclCS__Group_4_0__3__Impl )
+            // InternalCompleteOCL.g:7208:2: rule__PropertyContextDeclCS__Group_4_0__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__Group_4_0__3__Impl();
@@ -22705,23 +22790,23 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_0__3__Impl"
-    // InternalCompleteOCL.g:7186:1: rule__PropertyContextDeclCS__Group_4_0__3__Impl : ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) ) ;
+    // InternalCompleteOCL.g:7214:1: rule__PropertyContextDeclCS__Group_4_0__3__Impl : ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) ) ;
     public final void rule__PropertyContextDeclCS__Group_4_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7190:1: ( ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) ) )
-            // InternalCompleteOCL.g:7191:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) )
+            // InternalCompleteOCL.g:7218:1: ( ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) ) )
+            // InternalCompleteOCL.g:7219:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) )
             {
-            // InternalCompleteOCL.g:7191:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) )
-            // InternalCompleteOCL.g:7192:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 )
+            // InternalCompleteOCL.g:7219:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 ) )
+            // InternalCompleteOCL.g:7220:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedDefaultExpressionsAssignment_4_0_3());
             }
-            // InternalCompleteOCL.g:7193:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 )
-            // InternalCompleteOCL.g:7193:2: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3
+            // InternalCompleteOCL.g:7221:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 )
+            // InternalCompleteOCL.g:7221:2: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3();
@@ -22756,14 +22841,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__0"
-    // InternalCompleteOCL.g:7211:1: rule__PropertyContextDeclCS__Group_4_1__0 : rule__PropertyContextDeclCS__Group_4_1__0__Impl rule__PropertyContextDeclCS__Group_4_1__1 ;
+    // InternalCompleteOCL.g:7239:1: rule__PropertyContextDeclCS__Group_4_1__0 : rule__PropertyContextDeclCS__Group_4_1__0__Impl rule__PropertyContextDeclCS__Group_4_1__1 ;
     public final void rule__PropertyContextDeclCS__Group_4_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7215:1: ( rule__PropertyContextDeclCS__Group_4_1__0__Impl rule__PropertyContextDeclCS__Group_4_1__1 )
-            // InternalCompleteOCL.g:7216:2: rule__PropertyContextDeclCS__Group_4_1__0__Impl rule__PropertyContextDeclCS__Group_4_1__1
+            // InternalCompleteOCL.g:7243:1: ( rule__PropertyContextDeclCS__Group_4_1__0__Impl rule__PropertyContextDeclCS__Group_4_1__1 )
+            // InternalCompleteOCL.g:7244:2: rule__PropertyContextDeclCS__Group_4_1__0__Impl rule__PropertyContextDeclCS__Group_4_1__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PropertyContextDeclCS__Group_4_1__0__Impl();
@@ -22794,17 +22879,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__0__Impl"
-    // InternalCompleteOCL.g:7223:1: rule__PropertyContextDeclCS__Group_4_1__0__Impl : ( 'init' ) ;
+    // InternalCompleteOCL.g:7251:1: rule__PropertyContextDeclCS__Group_4_1__0__Impl : ( 'init' ) ;
     public final void rule__PropertyContextDeclCS__Group_4_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7227:1: ( ( 'init' ) )
-            // InternalCompleteOCL.g:7228:1: ( 'init' )
+            // InternalCompleteOCL.g:7255:1: ( ( 'init' ) )
+            // InternalCompleteOCL.g:7256:1: ( 'init' )
             {
-            // InternalCompleteOCL.g:7228:1: ( 'init' )
-            // InternalCompleteOCL.g:7229:1: 'init'
+            // InternalCompleteOCL.g:7256:1: ( 'init' )
+            // InternalCompleteOCL.g:7257:1: 'init'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getInitKeyword_4_1_0());
@@ -22835,14 +22920,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__1"
-    // InternalCompleteOCL.g:7242:1: rule__PropertyContextDeclCS__Group_4_1__1 : rule__PropertyContextDeclCS__Group_4_1__1__Impl rule__PropertyContextDeclCS__Group_4_1__2 ;
+    // InternalCompleteOCL.g:7270:1: rule__PropertyContextDeclCS__Group_4_1__1 : rule__PropertyContextDeclCS__Group_4_1__1__Impl rule__PropertyContextDeclCS__Group_4_1__2 ;
     public final void rule__PropertyContextDeclCS__Group_4_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7246:1: ( rule__PropertyContextDeclCS__Group_4_1__1__Impl rule__PropertyContextDeclCS__Group_4_1__2 )
-            // InternalCompleteOCL.g:7247:2: rule__PropertyContextDeclCS__Group_4_1__1__Impl rule__PropertyContextDeclCS__Group_4_1__2
+            // InternalCompleteOCL.g:7274:1: ( rule__PropertyContextDeclCS__Group_4_1__1__Impl rule__PropertyContextDeclCS__Group_4_1__2 )
+            // InternalCompleteOCL.g:7275:2: rule__PropertyContextDeclCS__Group_4_1__1__Impl rule__PropertyContextDeclCS__Group_4_1__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PropertyContextDeclCS__Group_4_1__1__Impl();
@@ -22873,22 +22958,22 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__1__Impl"
-    // InternalCompleteOCL.g:7254:1: rule__PropertyContextDeclCS__Group_4_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalCompleteOCL.g:7282:1: rule__PropertyContextDeclCS__Group_4_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__PropertyContextDeclCS__Group_4_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7258:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalCompleteOCL.g:7259:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:7286:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalCompleteOCL.g:7287:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalCompleteOCL.g:7259:1: ( ( ruleUnrestrictedName )? )
-            // InternalCompleteOCL.g:7260:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:7287:1: ( ( ruleUnrestrictedName )? )
+            // InternalCompleteOCL.g:7288:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getUnrestrictedNameParserRuleCall_4_1_1());
             }
-            // InternalCompleteOCL.g:7261:1: ( ruleUnrestrictedName )?
+            // InternalCompleteOCL.g:7289:1: ( ruleUnrestrictedName )?
             int alt74=2;
             int LA74_0 = input.LA(1);
 
@@ -22897,7 +22982,7 @@
             }
             switch (alt74) {
                 case 1 :
-                    // InternalCompleteOCL.g:7261:3: ruleUnrestrictedName
+                    // InternalCompleteOCL.g:7289:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -22935,14 +23020,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__2"
-    // InternalCompleteOCL.g:7271:1: rule__PropertyContextDeclCS__Group_4_1__2 : rule__PropertyContextDeclCS__Group_4_1__2__Impl rule__PropertyContextDeclCS__Group_4_1__3 ;
+    // InternalCompleteOCL.g:7299:1: rule__PropertyContextDeclCS__Group_4_1__2 : rule__PropertyContextDeclCS__Group_4_1__2__Impl rule__PropertyContextDeclCS__Group_4_1__3 ;
     public final void rule__PropertyContextDeclCS__Group_4_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7275:1: ( rule__PropertyContextDeclCS__Group_4_1__2__Impl rule__PropertyContextDeclCS__Group_4_1__3 )
-            // InternalCompleteOCL.g:7276:2: rule__PropertyContextDeclCS__Group_4_1__2__Impl rule__PropertyContextDeclCS__Group_4_1__3
+            // InternalCompleteOCL.g:7303:1: ( rule__PropertyContextDeclCS__Group_4_1__2__Impl rule__PropertyContextDeclCS__Group_4_1__3 )
+            // InternalCompleteOCL.g:7304:2: rule__PropertyContextDeclCS__Group_4_1__2__Impl rule__PropertyContextDeclCS__Group_4_1__3
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__PropertyContextDeclCS__Group_4_1__2__Impl();
@@ -22973,17 +23058,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__2__Impl"
-    // InternalCompleteOCL.g:7283:1: rule__PropertyContextDeclCS__Group_4_1__2__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:7311:1: rule__PropertyContextDeclCS__Group_4_1__2__Impl : ( ':' ) ;
     public final void rule__PropertyContextDeclCS__Group_4_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7287:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:7288:1: ( ':' )
+            // InternalCompleteOCL.g:7315:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:7316:1: ( ':' )
             {
-            // InternalCompleteOCL.g:7288:1: ( ':' )
-            // InternalCompleteOCL.g:7289:1: ':'
+            // InternalCompleteOCL.g:7316:1: ( ':' )
+            // InternalCompleteOCL.g:7317:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getColonKeyword_4_1_2());
@@ -23014,14 +23099,14 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__3"
-    // InternalCompleteOCL.g:7302:1: rule__PropertyContextDeclCS__Group_4_1__3 : rule__PropertyContextDeclCS__Group_4_1__3__Impl ;
+    // InternalCompleteOCL.g:7330:1: rule__PropertyContextDeclCS__Group_4_1__3 : rule__PropertyContextDeclCS__Group_4_1__3__Impl ;
     public final void rule__PropertyContextDeclCS__Group_4_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7306:1: ( rule__PropertyContextDeclCS__Group_4_1__3__Impl )
-            // InternalCompleteOCL.g:7307:2: rule__PropertyContextDeclCS__Group_4_1__3__Impl
+            // InternalCompleteOCL.g:7334:1: ( rule__PropertyContextDeclCS__Group_4_1__3__Impl )
+            // InternalCompleteOCL.g:7335:2: rule__PropertyContextDeclCS__Group_4_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__Group_4_1__3__Impl();
@@ -23047,23 +23132,23 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__Group_4_1__3__Impl"
-    // InternalCompleteOCL.g:7313:1: rule__PropertyContextDeclCS__Group_4_1__3__Impl : ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) ) ;
+    // InternalCompleteOCL.g:7341:1: rule__PropertyContextDeclCS__Group_4_1__3__Impl : ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) ) ;
     public final void rule__PropertyContextDeclCS__Group_4_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7317:1: ( ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) ) )
-            // InternalCompleteOCL.g:7318:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) )
+            // InternalCompleteOCL.g:7345:1: ( ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) ) )
+            // InternalCompleteOCL.g:7346:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) )
             {
-            // InternalCompleteOCL.g:7318:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) )
-            // InternalCompleteOCL.g:7319:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 )
+            // InternalCompleteOCL.g:7346:1: ( ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 ) )
+            // InternalCompleteOCL.g:7347:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedDefaultExpressionsAssignment_4_1_3());
             }
-            // InternalCompleteOCL.g:7320:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 )
-            // InternalCompleteOCL.g:7320:2: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3
+            // InternalCompleteOCL.g:7348:1: ( rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 )
+            // InternalCompleteOCL.g:7348:2: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3();
@@ -23098,16 +23183,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__0"
-    // InternalCompleteOCL.g:7338:1: rule__TemplateSignatureCS__Group_0__0 : rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 ;
+    // InternalCompleteOCL.g:7366:1: rule__TemplateSignatureCS__Group_0__0 : rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 ;
     public final void rule__TemplateSignatureCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7342:1: ( rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 )
-            // InternalCompleteOCL.g:7343:2: rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1
+            // InternalCompleteOCL.g:7370:1: ( rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 )
+            // InternalCompleteOCL.g:7371:2: rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TemplateSignatureCS__Group_0__0__Impl();
 
             state._fsp--;
@@ -23136,17 +23221,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:7350:1: rule__TemplateSignatureCS__Group_0__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:7378:1: rule__TemplateSignatureCS__Group_0__0__Impl : ( '(' ) ;
     public final void rule__TemplateSignatureCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7354:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:7355:1: ( '(' )
+            // InternalCompleteOCL.g:7382:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:7383:1: ( '(' )
             {
-            // InternalCompleteOCL.g:7355:1: ( '(' )
-            // InternalCompleteOCL.g:7356:1: '('
+            // InternalCompleteOCL.g:7383:1: ( '(' )
+            // InternalCompleteOCL.g:7384:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());
@@ -23177,16 +23262,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__1"
-    // InternalCompleteOCL.g:7369:1: rule__TemplateSignatureCS__Group_0__1 : rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 ;
+    // InternalCompleteOCL.g:7397:1: rule__TemplateSignatureCS__Group_0__1 : rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 ;
     public final void rule__TemplateSignatureCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7373:1: ( rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 )
-            // InternalCompleteOCL.g:7374:2: rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2
+            // InternalCompleteOCL.g:7401:1: ( rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 )
+            // InternalCompleteOCL.g:7402:2: rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2
             {
-            pushFollow(FollowSets000.FOLLOW_32);
+            pushFollow(FollowSets000.FOLLOW_33);
             rule__TemplateSignatureCS__Group_0__1__Impl();
 
             state._fsp--;
@@ -23215,23 +23300,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:7381:1: rule__TemplateSignatureCS__Group_0__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) ;
+    // InternalCompleteOCL.g:7409:1: rule__TemplateSignatureCS__Group_0__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7385:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) )
-            // InternalCompleteOCL.g:7386:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
+            // InternalCompleteOCL.g:7413:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) )
+            // InternalCompleteOCL.g:7414:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
             {
-            // InternalCompleteOCL.g:7386:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
-            // InternalCompleteOCL.g:7387:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
+            // InternalCompleteOCL.g:7414:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
+            // InternalCompleteOCL.g:7415:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_1());
             }
-            // InternalCompleteOCL.g:7388:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
-            // InternalCompleteOCL.g:7388:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1
+            // InternalCompleteOCL.g:7416:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
+            // InternalCompleteOCL.g:7416:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_0_1();
@@ -23266,16 +23351,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__2"
-    // InternalCompleteOCL.g:7398:1: rule__TemplateSignatureCS__Group_0__2 : rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 ;
+    // InternalCompleteOCL.g:7426:1: rule__TemplateSignatureCS__Group_0__2 : rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 ;
     public final void rule__TemplateSignatureCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7402:1: ( rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 )
-            // InternalCompleteOCL.g:7403:2: rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3
+            // InternalCompleteOCL.g:7430:1: ( rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 )
+            // InternalCompleteOCL.g:7431:2: rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3
             {
-            pushFollow(FollowSets000.FOLLOW_32);
+            pushFollow(FollowSets000.FOLLOW_33);
             rule__TemplateSignatureCS__Group_0__2__Impl();
 
             state._fsp--;
@@ -23304,22 +23389,22 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__2__Impl"
-    // InternalCompleteOCL.g:7410:1: rule__TemplateSignatureCS__Group_0__2__Impl : ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) ;
+    // InternalCompleteOCL.g:7438:1: rule__TemplateSignatureCS__Group_0__2__Impl : ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) ;
     public final void rule__TemplateSignatureCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7414:1: ( ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) )
-            // InternalCompleteOCL.g:7415:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
+            // InternalCompleteOCL.g:7442:1: ( ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) )
+            // InternalCompleteOCL.g:7443:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
             {
-            // InternalCompleteOCL.g:7415:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
-            // InternalCompleteOCL.g:7416:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
+            // InternalCompleteOCL.g:7443:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
+            // InternalCompleteOCL.g:7444:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0_2());
             }
-            // InternalCompleteOCL.g:7417:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
+            // InternalCompleteOCL.g:7445:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
             loop75:
             do {
                 int alt75=2;
@@ -23332,9 +23417,9 @@
 
                 switch (alt75) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7417:2: rule__TemplateSignatureCS__Group_0_2__0
+            	    // InternalCompleteOCL.g:7445:2: rule__TemplateSignatureCS__Group_0_2__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TemplateSignatureCS__Group_0_2__0();
 
             	    state._fsp--;
@@ -23373,14 +23458,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__3"
-    // InternalCompleteOCL.g:7427:1: rule__TemplateSignatureCS__Group_0__3 : rule__TemplateSignatureCS__Group_0__3__Impl ;
+    // InternalCompleteOCL.g:7455:1: rule__TemplateSignatureCS__Group_0__3 : rule__TemplateSignatureCS__Group_0__3__Impl ;
     public final void rule__TemplateSignatureCS__Group_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7431:1: ( rule__TemplateSignatureCS__Group_0__3__Impl )
-            // InternalCompleteOCL.g:7432:2: rule__TemplateSignatureCS__Group_0__3__Impl
+            // InternalCompleteOCL.g:7459:1: ( rule__TemplateSignatureCS__Group_0__3__Impl )
+            // InternalCompleteOCL.g:7460:2: rule__TemplateSignatureCS__Group_0__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_0__3__Impl();
@@ -23406,17 +23491,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__3__Impl"
-    // InternalCompleteOCL.g:7438:1: rule__TemplateSignatureCS__Group_0__3__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:7466:1: rule__TemplateSignatureCS__Group_0__3__Impl : ( ')' ) ;
     public final void rule__TemplateSignatureCS__Group_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7442:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:7443:1: ( ')' )
+            // InternalCompleteOCL.g:7470:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:7471:1: ( ')' )
             {
-            // InternalCompleteOCL.g:7443:1: ( ')' )
-            // InternalCompleteOCL.g:7444:1: ')'
+            // InternalCompleteOCL.g:7471:1: ( ')' )
+            // InternalCompleteOCL.g:7472:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_0_3());
@@ -23447,16 +23532,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__0"
-    // InternalCompleteOCL.g:7465:1: rule__TemplateSignatureCS__Group_0_2__0 : rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 ;
+    // InternalCompleteOCL.g:7493:1: rule__TemplateSignatureCS__Group_0_2__0 : rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 ;
     public final void rule__TemplateSignatureCS__Group_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7469:1: ( rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 )
-            // InternalCompleteOCL.g:7470:2: rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1
+            // InternalCompleteOCL.g:7497:1: ( rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 )
+            // InternalCompleteOCL.g:7498:2: rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TemplateSignatureCS__Group_0_2__0__Impl();
 
             state._fsp--;
@@ -23485,17 +23570,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__0__Impl"
-    // InternalCompleteOCL.g:7477:1: rule__TemplateSignatureCS__Group_0_2__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:7505:1: rule__TemplateSignatureCS__Group_0_2__0__Impl : ( ',' ) ;
     public final void rule__TemplateSignatureCS__Group_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7481:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:7482:1: ( ',' )
+            // InternalCompleteOCL.g:7509:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:7510:1: ( ',' )
             {
-            // InternalCompleteOCL.g:7482:1: ( ',' )
-            // InternalCompleteOCL.g:7483:1: ','
+            // InternalCompleteOCL.g:7510:1: ( ',' )
+            // InternalCompleteOCL.g:7511:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_0_2_0());
@@ -23526,14 +23611,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__1"
-    // InternalCompleteOCL.g:7496:1: rule__TemplateSignatureCS__Group_0_2__1 : rule__TemplateSignatureCS__Group_0_2__1__Impl ;
+    // InternalCompleteOCL.g:7524:1: rule__TemplateSignatureCS__Group_0_2__1 : rule__TemplateSignatureCS__Group_0_2__1__Impl ;
     public final void rule__TemplateSignatureCS__Group_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7500:1: ( rule__TemplateSignatureCS__Group_0_2__1__Impl )
-            // InternalCompleteOCL.g:7501:2: rule__TemplateSignatureCS__Group_0_2__1__Impl
+            // InternalCompleteOCL.g:7528:1: ( rule__TemplateSignatureCS__Group_0_2__1__Impl )
+            // InternalCompleteOCL.g:7529:2: rule__TemplateSignatureCS__Group_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_0_2__1__Impl();
@@ -23559,23 +23644,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__1__Impl"
-    // InternalCompleteOCL.g:7507:1: rule__TemplateSignatureCS__Group_0_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) ;
+    // InternalCompleteOCL.g:7535:1: rule__TemplateSignatureCS__Group_0_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7511:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) )
-            // InternalCompleteOCL.g:7512:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
+            // InternalCompleteOCL.g:7539:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) )
+            // InternalCompleteOCL.g:7540:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
             {
-            // InternalCompleteOCL.g:7512:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
-            // InternalCompleteOCL.g:7513:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
+            // InternalCompleteOCL.g:7540:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
+            // InternalCompleteOCL.g:7541:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_2_1());
             }
-            // InternalCompleteOCL.g:7514:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
-            // InternalCompleteOCL.g:7514:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1
+            // InternalCompleteOCL.g:7542:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
+            // InternalCompleteOCL.g:7542:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1();
@@ -23610,16 +23695,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__0"
-    // InternalCompleteOCL.g:7528:1: rule__TemplateSignatureCS__Group_1__0 : rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 ;
+    // InternalCompleteOCL.g:7556:1: rule__TemplateSignatureCS__Group_1__0 : rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 ;
     public final void rule__TemplateSignatureCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7532:1: ( rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 )
-            // InternalCompleteOCL.g:7533:2: rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1
+            // InternalCompleteOCL.g:7560:1: ( rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 )
+            // InternalCompleteOCL.g:7561:2: rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TemplateSignatureCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -23648,17 +23733,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:7540:1: rule__TemplateSignatureCS__Group_1__0__Impl : ( '<' ) ;
+    // InternalCompleteOCL.g:7568:1: rule__TemplateSignatureCS__Group_1__0__Impl : ( '<' ) ;
     public final void rule__TemplateSignatureCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7544:1: ( ( '<' ) )
-            // InternalCompleteOCL.g:7545:1: ( '<' )
+            // InternalCompleteOCL.g:7572:1: ( ( '<' ) )
+            // InternalCompleteOCL.g:7573:1: ( '<' )
             {
-            // InternalCompleteOCL.g:7545:1: ( '<' )
-            // InternalCompleteOCL.g:7546:1: '<'
+            // InternalCompleteOCL.g:7573:1: ( '<' )
+            // InternalCompleteOCL.g:7574:1: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());
@@ -23689,16 +23774,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__1"
-    // InternalCompleteOCL.g:7559:1: rule__TemplateSignatureCS__Group_1__1 : rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 ;
+    // InternalCompleteOCL.g:7587:1: rule__TemplateSignatureCS__Group_1__1 : rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 ;
     public final void rule__TemplateSignatureCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7563:1: ( rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 )
-            // InternalCompleteOCL.g:7564:2: rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2
+            // InternalCompleteOCL.g:7591:1: ( rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 )
+            // InternalCompleteOCL.g:7592:2: rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2
             {
-            pushFollow(FollowSets000.FOLLOW_33);
+            pushFollow(FollowSets000.FOLLOW_34);
             rule__TemplateSignatureCS__Group_1__1__Impl();
 
             state._fsp--;
@@ -23727,23 +23812,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:7571:1: rule__TemplateSignatureCS__Group_1__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:7599:1: rule__TemplateSignatureCS__Group_1__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7575:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:7576:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
+            // InternalCompleteOCL.g:7603:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:7604:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:7576:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
-            // InternalCompleteOCL.g:7577:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
+            // InternalCompleteOCL.g:7604:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
+            // InternalCompleteOCL.g:7605:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_1());
             }
-            // InternalCompleteOCL.g:7578:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
-            // InternalCompleteOCL.g:7578:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1
+            // InternalCompleteOCL.g:7606:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
+            // InternalCompleteOCL.g:7606:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_1_1();
@@ -23778,16 +23863,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__2"
-    // InternalCompleteOCL.g:7588:1: rule__TemplateSignatureCS__Group_1__2 : rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 ;
+    // InternalCompleteOCL.g:7616:1: rule__TemplateSignatureCS__Group_1__2 : rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 ;
     public final void rule__TemplateSignatureCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7592:1: ( rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 )
-            // InternalCompleteOCL.g:7593:2: rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3
+            // InternalCompleteOCL.g:7620:1: ( rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 )
+            // InternalCompleteOCL.g:7621:2: rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3
             {
-            pushFollow(FollowSets000.FOLLOW_33);
+            pushFollow(FollowSets000.FOLLOW_34);
             rule__TemplateSignatureCS__Group_1__2__Impl();
 
             state._fsp--;
@@ -23816,22 +23901,22 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__2__Impl"
-    // InternalCompleteOCL.g:7600:1: rule__TemplateSignatureCS__Group_1__2__Impl : ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) ;
+    // InternalCompleteOCL.g:7628:1: rule__TemplateSignatureCS__Group_1__2__Impl : ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) ;
     public final void rule__TemplateSignatureCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7604:1: ( ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) )
-            // InternalCompleteOCL.g:7605:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
+            // InternalCompleteOCL.g:7632:1: ( ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) )
+            // InternalCompleteOCL.g:7633:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
             {
-            // InternalCompleteOCL.g:7605:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
-            // InternalCompleteOCL.g:7606:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
+            // InternalCompleteOCL.g:7633:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
+            // InternalCompleteOCL.g:7634:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1_2());
             }
-            // InternalCompleteOCL.g:7607:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
+            // InternalCompleteOCL.g:7635:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
             loop76:
             do {
                 int alt76=2;
@@ -23844,9 +23929,9 @@
 
                 switch (alt76) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7607:2: rule__TemplateSignatureCS__Group_1_2__0
+            	    // InternalCompleteOCL.g:7635:2: rule__TemplateSignatureCS__Group_1_2__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TemplateSignatureCS__Group_1_2__0();
 
             	    state._fsp--;
@@ -23885,14 +23970,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__3"
-    // InternalCompleteOCL.g:7617:1: rule__TemplateSignatureCS__Group_1__3 : rule__TemplateSignatureCS__Group_1__3__Impl ;
+    // InternalCompleteOCL.g:7645:1: rule__TemplateSignatureCS__Group_1__3 : rule__TemplateSignatureCS__Group_1__3__Impl ;
     public final void rule__TemplateSignatureCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7621:1: ( rule__TemplateSignatureCS__Group_1__3__Impl )
-            // InternalCompleteOCL.g:7622:2: rule__TemplateSignatureCS__Group_1__3__Impl
+            // InternalCompleteOCL.g:7649:1: ( rule__TemplateSignatureCS__Group_1__3__Impl )
+            // InternalCompleteOCL.g:7650:2: rule__TemplateSignatureCS__Group_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_1__3__Impl();
@@ -23918,17 +24003,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__3__Impl"
-    // InternalCompleteOCL.g:7628:1: rule__TemplateSignatureCS__Group_1__3__Impl : ( '>' ) ;
+    // InternalCompleteOCL.g:7656:1: rule__TemplateSignatureCS__Group_1__3__Impl : ( '>' ) ;
     public final void rule__TemplateSignatureCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7632:1: ( ( '>' ) )
-            // InternalCompleteOCL.g:7633:1: ( '>' )
+            // InternalCompleteOCL.g:7660:1: ( ( '>' ) )
+            // InternalCompleteOCL.g:7661:1: ( '>' )
             {
-            // InternalCompleteOCL.g:7633:1: ( '>' )
-            // InternalCompleteOCL.g:7634:1: '>'
+            // InternalCompleteOCL.g:7661:1: ( '>' )
+            // InternalCompleteOCL.g:7662:1: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGreaterThanSignKeyword_1_3());
@@ -23959,16 +24044,16 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__0"
-    // InternalCompleteOCL.g:7655:1: rule__TemplateSignatureCS__Group_1_2__0 : rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 ;
+    // InternalCompleteOCL.g:7683:1: rule__TemplateSignatureCS__Group_1_2__0 : rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 ;
     public final void rule__TemplateSignatureCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7659:1: ( rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 )
-            // InternalCompleteOCL.g:7660:2: rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1
+            // InternalCompleteOCL.g:7687:1: ( rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 )
+            // InternalCompleteOCL.g:7688:2: rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TemplateSignatureCS__Group_1_2__0__Impl();
 
             state._fsp--;
@@ -23997,17 +24082,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__0__Impl"
-    // InternalCompleteOCL.g:7667:1: rule__TemplateSignatureCS__Group_1_2__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:7695:1: rule__TemplateSignatureCS__Group_1_2__0__Impl : ( ',' ) ;
     public final void rule__TemplateSignatureCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7671:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:7672:1: ( ',' )
+            // InternalCompleteOCL.g:7699:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:7700:1: ( ',' )
             {
-            // InternalCompleteOCL.g:7672:1: ( ',' )
-            // InternalCompleteOCL.g:7673:1: ','
+            // InternalCompleteOCL.g:7700:1: ( ',' )
+            // InternalCompleteOCL.g:7701:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());
@@ -24038,14 +24123,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__1"
-    // InternalCompleteOCL.g:7686:1: rule__TemplateSignatureCS__Group_1_2__1 : rule__TemplateSignatureCS__Group_1_2__1__Impl ;
+    // InternalCompleteOCL.g:7714:1: rule__TemplateSignatureCS__Group_1_2__1 : rule__TemplateSignatureCS__Group_1_2__1__Impl ;
     public final void rule__TemplateSignatureCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7690:1: ( rule__TemplateSignatureCS__Group_1_2__1__Impl )
-            // InternalCompleteOCL.g:7691:2: rule__TemplateSignatureCS__Group_1_2__1__Impl
+            // InternalCompleteOCL.g:7718:1: ( rule__TemplateSignatureCS__Group_1_2__1__Impl )
+            // InternalCompleteOCL.g:7719:2: rule__TemplateSignatureCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_1_2__1__Impl();
@@ -24071,23 +24156,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__1__Impl"
-    // InternalCompleteOCL.g:7697:1: rule__TemplateSignatureCS__Group_1_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) ;
+    // InternalCompleteOCL.g:7725:1: rule__TemplateSignatureCS__Group_1_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7701:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) )
-            // InternalCompleteOCL.g:7702:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
+            // InternalCompleteOCL.g:7729:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) )
+            // InternalCompleteOCL.g:7730:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
             {
-            // InternalCompleteOCL.g:7702:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
-            // InternalCompleteOCL.g:7703:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
+            // InternalCompleteOCL.g:7730:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
+            // InternalCompleteOCL.g:7731:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_2_1());
             }
-            // InternalCompleteOCL.g:7704:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
-            // InternalCompleteOCL.g:7704:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1
+            // InternalCompleteOCL.g:7732:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
+            // InternalCompleteOCL.g:7732:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1();
@@ -24122,16 +24207,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgExpCS__Group_0__0"
-    // InternalCompleteOCL.g:7718:1: rule__NavigatingArgExpCS__Group_0__0 : rule__NavigatingArgExpCS__Group_0__0__Impl rule__NavigatingArgExpCS__Group_0__1 ;
+    // InternalCompleteOCL.g:7746:1: rule__NavigatingArgExpCS__Group_0__0 : rule__NavigatingArgExpCS__Group_0__0__Impl rule__NavigatingArgExpCS__Group_0__1 ;
     public final void rule__NavigatingArgExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7722:1: ( rule__NavigatingArgExpCS__Group_0__0__Impl rule__NavigatingArgExpCS__Group_0__1 )
-            // InternalCompleteOCL.g:7723:2: rule__NavigatingArgExpCS__Group_0__0__Impl rule__NavigatingArgExpCS__Group_0__1
+            // InternalCompleteOCL.g:7750:1: ( rule__NavigatingArgExpCS__Group_0__0__Impl rule__NavigatingArgExpCS__Group_0__1 )
+            // InternalCompleteOCL.g:7751:2: rule__NavigatingArgExpCS__Group_0__0__Impl rule__NavigatingArgExpCS__Group_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_34);
+            pushFollow(FollowSets000.FOLLOW_35);
             rule__NavigatingArgExpCS__Group_0__0__Impl();
 
             state._fsp--;
@@ -24160,23 +24245,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgExpCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:7730:1: rule__NavigatingArgExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:7758:1: rule__NavigatingArgExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__NavigatingArgExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7734:1: ( ( () ) )
-            // InternalCompleteOCL.g:7735:1: ( () )
+            // InternalCompleteOCL.g:7762:1: ( ( () ) )
+            // InternalCompleteOCL.g:7763:1: ( () )
             {
-            // InternalCompleteOCL.g:7735:1: ( () )
-            // InternalCompleteOCL.g:7736:1: ()
+            // InternalCompleteOCL.g:7763:1: ( () )
+            // InternalCompleteOCL.g:7764:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgExpCSAccess().getOCLMessageArgCSAction_0_0());
             }
-            // InternalCompleteOCL.g:7737:1: ()
-            // InternalCompleteOCL.g:7739:1:
+            // InternalCompleteOCL.g:7765:1: ()
+            // InternalCompleteOCL.g:7767:1:
             {
             }
 
@@ -24201,14 +24286,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgExpCS__Group_0__1"
-    // InternalCompleteOCL.g:7749:1: rule__NavigatingArgExpCS__Group_0__1 : rule__NavigatingArgExpCS__Group_0__1__Impl ;
+    // InternalCompleteOCL.g:7777:1: rule__NavigatingArgExpCS__Group_0__1 : rule__NavigatingArgExpCS__Group_0__1__Impl ;
     public final void rule__NavigatingArgExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7753:1: ( rule__NavigatingArgExpCS__Group_0__1__Impl )
-            // InternalCompleteOCL.g:7754:2: rule__NavigatingArgExpCS__Group_0__1__Impl
+            // InternalCompleteOCL.g:7781:1: ( rule__NavigatingArgExpCS__Group_0__1__Impl )
+            // InternalCompleteOCL.g:7782:2: rule__NavigatingArgExpCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgExpCS__Group_0__1__Impl();
@@ -24234,17 +24319,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgExpCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:7760:1: rule__NavigatingArgExpCS__Group_0__1__Impl : ( '?' ) ;
+    // InternalCompleteOCL.g:7788:1: rule__NavigatingArgExpCS__Group_0__1__Impl : ( '?' ) ;
     public final void rule__NavigatingArgExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7764:1: ( ( '?' ) )
-            // InternalCompleteOCL.g:7765:1: ( '?' )
+            // InternalCompleteOCL.g:7792:1: ( ( '?' ) )
+            // InternalCompleteOCL.g:7793:1: ( '?' )
             {
-            // InternalCompleteOCL.g:7765:1: ( '?' )
-            // InternalCompleteOCL.g:7766:1: '?'
+            // InternalCompleteOCL.g:7793:1: ( '?' )
+            // InternalCompleteOCL.g:7794:1: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgExpCSAccess().getQuestionMarkKeyword_0_1());
@@ -24275,16 +24360,16 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__0"
-    // InternalCompleteOCL.g:7783:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
+    // InternalCompleteOCL.g:7811:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
     public final void rule__URIPathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7787:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
-            // InternalCompleteOCL.g:7788:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
+            // InternalCompleteOCL.g:7815:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
+            // InternalCompleteOCL.g:7816:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_35);
+            pushFollow(FollowSets000.FOLLOW_36);
             rule__URIPathNameCS__Group__0__Impl();
 
             state._fsp--;
@@ -24313,23 +24398,23 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__0__Impl"
-    // InternalCompleteOCL.g:7795:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:7823:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__URIPathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7799:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalCompleteOCL.g:7800:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalCompleteOCL.g:7827:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalCompleteOCL.g:7828:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:7800:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalCompleteOCL.g:7801:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalCompleteOCL.g:7828:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalCompleteOCL.g:7829:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalCompleteOCL.g:7802:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalCompleteOCL.g:7802:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
+            // InternalCompleteOCL.g:7830:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalCompleteOCL.g:7830:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__OwnedPathElementsAssignment_0();
@@ -24364,14 +24449,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__1"
-    // InternalCompleteOCL.g:7812:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:7840:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
     public final void rule__URIPathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7816:1: ( rule__URIPathNameCS__Group__1__Impl )
-            // InternalCompleteOCL.g:7817:2: rule__URIPathNameCS__Group__1__Impl
+            // InternalCompleteOCL.g:7844:1: ( rule__URIPathNameCS__Group__1__Impl )
+            // InternalCompleteOCL.g:7845:2: rule__URIPathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__Group__1__Impl();
@@ -24397,22 +24482,22 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__1__Impl"
-    // InternalCompleteOCL.g:7823:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
+    // InternalCompleteOCL.g:7851:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
     public final void rule__URIPathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7827:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
-            // InternalCompleteOCL.g:7828:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:7855:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
+            // InternalCompleteOCL.g:7856:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
             {
-            // InternalCompleteOCL.g:7828:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
-            // InternalCompleteOCL.g:7829:1: ( rule__URIPathNameCS__Group_1__0 )*
+            // InternalCompleteOCL.g:7856:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:7857:1: ( rule__URIPathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:7830:1: ( rule__URIPathNameCS__Group_1__0 )*
+            // InternalCompleteOCL.g:7858:1: ( rule__URIPathNameCS__Group_1__0 )*
             loop77:
             do {
                 int alt77=2;
@@ -24425,9 +24510,9 @@
 
                 switch (alt77) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7830:2: rule__URIPathNameCS__Group_1__0
+            	    // InternalCompleteOCL.g:7858:2: rule__URIPathNameCS__Group_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_36);
+            	    pushFollow(FollowSets000.FOLLOW_37);
             	    rule__URIPathNameCS__Group_1__0();
 
             	    state._fsp--;
@@ -24466,16 +24551,16 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__0"
-    // InternalCompleteOCL.g:7844:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
+    // InternalCompleteOCL.g:7872:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
     public final void rule__URIPathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7848:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
-            // InternalCompleteOCL.g:7849:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
+            // InternalCompleteOCL.g:7876:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
+            // InternalCompleteOCL.g:7877:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_37);
+            pushFollow(FollowSets000.FOLLOW_7);
             rule__URIPathNameCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -24504,17 +24589,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:7856:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalCompleteOCL.g:7884:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__URIPathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7860:1: ( ( '::' ) )
-            // InternalCompleteOCL.g:7861:1: ( '::' )
+            // InternalCompleteOCL.g:7888:1: ( ( '::' ) )
+            // InternalCompleteOCL.g:7889:1: ( '::' )
             {
-            // InternalCompleteOCL.g:7861:1: ( '::' )
-            // InternalCompleteOCL.g:7862:1: '::'
+            // InternalCompleteOCL.g:7889:1: ( '::' )
+            // InternalCompleteOCL.g:7890:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
@@ -24545,14 +24630,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__1"
-    // InternalCompleteOCL.g:7875:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:7903:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
     public final void rule__URIPathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7879:1: ( rule__URIPathNameCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:7880:2: rule__URIPathNameCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:7907:1: ( rule__URIPathNameCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:7908:2: rule__URIPathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__Group_1__1__Impl();
@@ -24578,23 +24663,23 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:7886:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:7914:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__URIPathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7890:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:7891:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:7918:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:7919:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:7891:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalCompleteOCL.g:7892:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalCompleteOCL.g:7919:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:7920:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalCompleteOCL.g:7893:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalCompleteOCL.g:7893:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalCompleteOCL.g:7921:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalCompleteOCL.g:7921:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__OwnedPathElementsAssignment_1_1();
@@ -24629,16 +24714,16 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0"
-    // InternalCompleteOCL.g:7907:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
+    // InternalCompleteOCL.g:7935:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
     public final void rule__URIFirstPathElementCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7911:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
-            // InternalCompleteOCL.g:7912:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
+            // InternalCompleteOCL.g:7939:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
+            // InternalCompleteOCL.g:7940:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_23);
+            pushFollow(FollowSets000.FOLLOW_24);
             rule__URIFirstPathElementCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -24667,23 +24752,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:7919:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:7947:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
     public final void rule__URIFirstPathElementCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7923:1: ( ( () ) )
-            // InternalCompleteOCL.g:7924:1: ( () )
+            // InternalCompleteOCL.g:7951:1: ( ( () ) )
+            // InternalCompleteOCL.g:7952:1: ( () )
             {
-            // InternalCompleteOCL.g:7924:1: ( () )
-            // InternalCompleteOCL.g:7925:1: ()
+            // InternalCompleteOCL.g:7952:1: ( () )
+            // InternalCompleteOCL.g:7953:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
             }
-            // InternalCompleteOCL.g:7926:1: ()
-            // InternalCompleteOCL.g:7928:1:
+            // InternalCompleteOCL.g:7954:1: ()
+            // InternalCompleteOCL.g:7956:1:
             {
             }
 
@@ -24708,14 +24793,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1"
-    // InternalCompleteOCL.g:7938:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:7966:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
     public final void rule__URIFirstPathElementCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7942:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:7943:2: rule__URIFirstPathElementCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:7970:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:7971:2: rule__URIFirstPathElementCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__Group_1__1__Impl();
@@ -24741,23 +24826,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:7949:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:7977:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
     public final void rule__URIFirstPathElementCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7953:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:7954:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalCompleteOCL.g:7981:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:7982:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:7954:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
-            // InternalCompleteOCL.g:7955:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalCompleteOCL.g:7982:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalCompleteOCL.g:7983:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
             }
-            // InternalCompleteOCL.g:7956:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
-            // InternalCompleteOCL.g:7956:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
+            // InternalCompleteOCL.g:7984:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalCompleteOCL.g:7984:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__ReferredElementAssignment_1_1();
@@ -24792,14 +24877,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0"
-    // InternalCompleteOCL.g:7970:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
+    // InternalCompleteOCL.g:7998:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
     public final void rule__CollectionTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7974:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
-            // InternalCompleteOCL.g:7975:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
+            // InternalCompleteOCL.g:8002:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
+            // InternalCompleteOCL.g:8003:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__CollectionTypeCS__Group__0__Impl();
@@ -24830,23 +24915,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0__Impl"
-    // InternalCompleteOCL.g:7982:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:8010:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
     public final void rule__CollectionTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:7986:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:7987:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8014:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:8015:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:7987:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:7988:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8015:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8016:1: ( rule__CollectionTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:7989:1: ( rule__CollectionTypeCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:7989:2: rule__CollectionTypeCS__NameAssignment_0
+            // InternalCompleteOCL.g:8017:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8017:2: rule__CollectionTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__NameAssignment_0();
@@ -24881,14 +24966,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1"
-    // InternalCompleteOCL.g:7999:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:8027:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
     public final void rule__CollectionTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8003:1: ( rule__CollectionTypeCS__Group__1__Impl )
-            // InternalCompleteOCL.g:8004:2: rule__CollectionTypeCS__Group__1__Impl
+            // InternalCompleteOCL.g:8031:1: ( rule__CollectionTypeCS__Group__1__Impl )
+            // InternalCompleteOCL.g:8032:2: rule__CollectionTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group__1__Impl();
@@ -24914,22 +24999,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1__Impl"
-    // InternalCompleteOCL.g:8010:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:8038:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
     public final void rule__CollectionTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8014:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:8015:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:8042:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:8043:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:8015:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:8016:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalCompleteOCL.g:8043:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:8044:1: ( rule__CollectionTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:8017:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalCompleteOCL.g:8045:1: ( rule__CollectionTypeCS__Group_1__0 )?
             int alt78=2;
             int LA78_0 = input.LA(1);
 
@@ -24938,7 +25023,7 @@
             }
             switch (alt78) {
                 case 1 :
-                    // InternalCompleteOCL.g:8017:2: rule__CollectionTypeCS__Group_1__0
+                    // InternalCompleteOCL.g:8045:2: rule__CollectionTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__Group_1__0();
@@ -24976,16 +25061,16 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0"
-    // InternalCompleteOCL.g:8031:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
+    // InternalCompleteOCL.g:8059:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
     public final void rule__CollectionTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8035:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
-            // InternalCompleteOCL.g:8036:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
+            // InternalCompleteOCL.g:8063:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
+            // InternalCompleteOCL.g:8064:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__CollectionTypeCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -25014,17 +25099,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:8043:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:8071:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__CollectionTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8047:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:8048:1: ( '(' )
+            // InternalCompleteOCL.g:8075:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:8076:1: ( '(' )
             {
-            // InternalCompleteOCL.g:8048:1: ( '(' )
-            // InternalCompleteOCL.g:8049:1: '('
+            // InternalCompleteOCL.g:8076:1: ( '(' )
+            // InternalCompleteOCL.g:8077:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -25055,14 +25140,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1"
-    // InternalCompleteOCL.g:8062:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
+    // InternalCompleteOCL.g:8090:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
     public final void rule__CollectionTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8066:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
-            // InternalCompleteOCL.g:8067:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
+            // InternalCompleteOCL.g:8094:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
+            // InternalCompleteOCL.g:8095:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_38);
             rule__CollectionTypeCS__Group_1__1__Impl();
@@ -25093,23 +25178,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:8074:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:8102:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CollectionTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8078:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:8079:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:8106:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:8107:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:8079:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
-            // InternalCompleteOCL.g:8080:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:8107:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:8108:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalCompleteOCL.g:8081:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
-            // InternalCompleteOCL.g:8081:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
+            // InternalCompleteOCL.g:8109:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:8109:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__OwnedTypeAssignment_1_1();
@@ -25144,14 +25229,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2"
-    // InternalCompleteOCL.g:8091:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
+    // InternalCompleteOCL.g:8119:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
     public final void rule__CollectionTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8095:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
-            // InternalCompleteOCL.g:8096:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
+            // InternalCompleteOCL.g:8123:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
+            // InternalCompleteOCL.g:8124:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_38);
             rule__CollectionTypeCS__Group_1__2__Impl();
@@ -25182,22 +25267,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2__Impl"
-    // InternalCompleteOCL.g:8103:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
+    // InternalCompleteOCL.g:8131:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
     public final void rule__CollectionTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8107:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
-            // InternalCompleteOCL.g:8108:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalCompleteOCL.g:8135:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
+            // InternalCompleteOCL.g:8136:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
             {
-            // InternalCompleteOCL.g:8108:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
-            // InternalCompleteOCL.g:8109:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalCompleteOCL.g:8136:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalCompleteOCL.g:8137:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityAssignment_1_2());
             }
-            // InternalCompleteOCL.g:8110:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalCompleteOCL.g:8138:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             int alt79=2;
             int LA79_0 = input.LA(1);
 
@@ -25206,7 +25291,7 @@
             }
             switch (alt79) {
                 case 1 :
-                    // InternalCompleteOCL.g:8110:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
+                    // InternalCompleteOCL.g:8138:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2();
@@ -25244,14 +25329,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3"
-    // InternalCompleteOCL.g:8120:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
+    // InternalCompleteOCL.g:8148:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
     public final void rule__CollectionTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8124:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
-            // InternalCompleteOCL.g:8125:2: rule__CollectionTypeCS__Group_1__3__Impl
+            // InternalCompleteOCL.g:8152:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
+            // InternalCompleteOCL.g:8153:2: rule__CollectionTypeCS__Group_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group_1__3__Impl();
@@ -25277,17 +25362,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3__Impl"
-    // InternalCompleteOCL.g:8131:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:8159:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
     public final void rule__CollectionTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8135:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:8136:1: ( ')' )
+            // InternalCompleteOCL.g:8163:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:8164:1: ( ')' )
             {
-            // InternalCompleteOCL.g:8136:1: ( ')' )
-            // InternalCompleteOCL.g:8137:1: ')'
+            // InternalCompleteOCL.g:8164:1: ( ')' )
+            // InternalCompleteOCL.g:8165:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());
@@ -25318,14 +25403,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0"
-    // InternalCompleteOCL.g:8158:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
+    // InternalCompleteOCL.g:8186:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
     public final void rule__MapTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8162:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
-            // InternalCompleteOCL.g:8163:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
+            // InternalCompleteOCL.g:8190:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
+            // InternalCompleteOCL.g:8191:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__MapTypeCS__Group__0__Impl();
@@ -25356,23 +25441,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0__Impl"
-    // InternalCompleteOCL.g:8170:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:8198:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
     public final void rule__MapTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8174:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:8175:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8202:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:8203:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:8175:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:8176:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8203:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8204:1: ( rule__MapTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:8177:1: ( rule__MapTypeCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:8177:2: rule__MapTypeCS__NameAssignment_0
+            // InternalCompleteOCL.g:8205:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8205:2: rule__MapTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__NameAssignment_0();
@@ -25407,14 +25492,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1"
-    // InternalCompleteOCL.g:8187:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:8215:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
     public final void rule__MapTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8191:1: ( rule__MapTypeCS__Group__1__Impl )
-            // InternalCompleteOCL.g:8192:2: rule__MapTypeCS__Group__1__Impl
+            // InternalCompleteOCL.g:8219:1: ( rule__MapTypeCS__Group__1__Impl )
+            // InternalCompleteOCL.g:8220:2: rule__MapTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group__1__Impl();
@@ -25440,22 +25525,22 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1__Impl"
-    // InternalCompleteOCL.g:8198:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:8226:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
     public final void rule__MapTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8202:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:8203:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:8230:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:8231:1: ( ( rule__MapTypeCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:8203:1: ( ( rule__MapTypeCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:8204:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalCompleteOCL.g:8231:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:8232:1: ( rule__MapTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:8205:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalCompleteOCL.g:8233:1: ( rule__MapTypeCS__Group_1__0 )?
             int alt80=2;
             int LA80_0 = input.LA(1);
 
@@ -25464,7 +25549,7 @@
             }
             switch (alt80) {
                 case 1 :
-                    // InternalCompleteOCL.g:8205:2: rule__MapTypeCS__Group_1__0
+                    // InternalCompleteOCL.g:8233:2: rule__MapTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapTypeCS__Group_1__0();
@@ -25502,16 +25587,16 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0"
-    // InternalCompleteOCL.g:8219:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
+    // InternalCompleteOCL.g:8247:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
     public final void rule__MapTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8223:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
-            // InternalCompleteOCL.g:8224:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
+            // InternalCompleteOCL.g:8251:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
+            // InternalCompleteOCL.g:8252:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__MapTypeCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -25540,17 +25625,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:8231:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:8259:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__MapTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8235:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:8236:1: ( '(' )
+            // InternalCompleteOCL.g:8263:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:8264:1: ( '(' )
             {
-            // InternalCompleteOCL.g:8236:1: ( '(' )
-            // InternalCompleteOCL.g:8237:1: '('
+            // InternalCompleteOCL.g:8264:1: ( '(' )
+            // InternalCompleteOCL.g:8265:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -25581,16 +25666,16 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1"
-    // InternalCompleteOCL.g:8250:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
+    // InternalCompleteOCL.g:8278:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
     public final void rule__MapTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8254:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
-            // InternalCompleteOCL.g:8255:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
+            // InternalCompleteOCL.g:8282:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
+            // InternalCompleteOCL.g:8283:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__MapTypeCS__Group_1__1__Impl();
 
             state._fsp--;
@@ -25619,23 +25704,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:8262:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:8290:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
     public final void rule__MapTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8266:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:8267:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:8294:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:8295:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:8267:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
-            // InternalCompleteOCL.g:8268:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:8295:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:8296:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
             }
-            // InternalCompleteOCL.g:8269:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
-            // InternalCompleteOCL.g:8269:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
+            // InternalCompleteOCL.g:8297:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:8297:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedKeyTypeAssignment_1_1();
@@ -25670,16 +25755,16 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2"
-    // InternalCompleteOCL.g:8279:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
+    // InternalCompleteOCL.g:8307:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
     public final void rule__MapTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8283:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
-            // InternalCompleteOCL.g:8284:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
+            // InternalCompleteOCL.g:8311:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
+            // InternalCompleteOCL.g:8312:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__MapTypeCS__Group_1__2__Impl();
 
             state._fsp--;
@@ -25708,17 +25793,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2__Impl"
-    // InternalCompleteOCL.g:8291:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:8319:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
     public final void rule__MapTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8295:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:8296:1: ( ',' )
+            // InternalCompleteOCL.g:8323:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:8324:1: ( ',' )
             {
-            // InternalCompleteOCL.g:8296:1: ( ',' )
-            // InternalCompleteOCL.g:8297:1: ','
+            // InternalCompleteOCL.g:8324:1: ( ',' )
+            // InternalCompleteOCL.g:8325:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
@@ -25749,14 +25834,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3"
-    // InternalCompleteOCL.g:8310:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
+    // InternalCompleteOCL.g:8338:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
     public final void rule__MapTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8314:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
-            // InternalCompleteOCL.g:8315:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
+            // InternalCompleteOCL.g:8342:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
+            // InternalCompleteOCL.g:8343:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__MapTypeCS__Group_1__3__Impl();
@@ -25787,23 +25872,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3__Impl"
-    // InternalCompleteOCL.g:8322:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
+    // InternalCompleteOCL.g:8350:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
     public final void rule__MapTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8326:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
-            // InternalCompleteOCL.g:8327:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalCompleteOCL.g:8354:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
+            // InternalCompleteOCL.g:8355:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
             {
-            // InternalCompleteOCL.g:8327:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
-            // InternalCompleteOCL.g:8328:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalCompleteOCL.g:8355:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalCompleteOCL.g:8356:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
             }
-            // InternalCompleteOCL.g:8329:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
-            // InternalCompleteOCL.g:8329:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
+            // InternalCompleteOCL.g:8357:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalCompleteOCL.g:8357:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedValueTypeAssignment_1_3();
@@ -25838,14 +25923,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4"
-    // InternalCompleteOCL.g:8339:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
+    // InternalCompleteOCL.g:8367:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
     public final void rule__MapTypeCS__Group_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8343:1: ( rule__MapTypeCS__Group_1__4__Impl )
-            // InternalCompleteOCL.g:8344:2: rule__MapTypeCS__Group_1__4__Impl
+            // InternalCompleteOCL.g:8371:1: ( rule__MapTypeCS__Group_1__4__Impl )
+            // InternalCompleteOCL.g:8372:2: rule__MapTypeCS__Group_1__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group_1__4__Impl();
@@ -25871,17 +25956,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4__Impl"
-    // InternalCompleteOCL.g:8350:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:8378:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
     public final void rule__MapTypeCS__Group_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8354:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:8355:1: ( ')' )
+            // InternalCompleteOCL.g:8382:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:8383:1: ( ')' )
             {
-            // InternalCompleteOCL.g:8355:1: ( ')' )
-            // InternalCompleteOCL.g:8356:1: ')'
+            // InternalCompleteOCL.g:8383:1: ( ')' )
+            // InternalCompleteOCL.g:8384:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
@@ -25912,14 +25997,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0"
-    // InternalCompleteOCL.g:8379:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
+    // InternalCompleteOCL.g:8407:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
     public final void rule__TupleTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8383:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
-            // InternalCompleteOCL.g:8384:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
+            // InternalCompleteOCL.g:8411:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
+            // InternalCompleteOCL.g:8412:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TupleTypeCS__Group__0__Impl();
@@ -25950,23 +26035,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0__Impl"
-    // InternalCompleteOCL.g:8391:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:8419:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
     public final void rule__TupleTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8395:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:8396:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8423:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:8424:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:8396:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:8397:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8424:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8425:1: ( rule__TupleTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:8398:1: ( rule__TupleTypeCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:8398:2: rule__TupleTypeCS__NameAssignment_0
+            // InternalCompleteOCL.g:8426:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8426:2: rule__TupleTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__NameAssignment_0();
@@ -26001,14 +26086,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1"
-    // InternalCompleteOCL.g:8408:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:8436:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
     public final void rule__TupleTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8412:1: ( rule__TupleTypeCS__Group__1__Impl )
-            // InternalCompleteOCL.g:8413:2: rule__TupleTypeCS__Group__1__Impl
+            // InternalCompleteOCL.g:8440:1: ( rule__TupleTypeCS__Group__1__Impl )
+            // InternalCompleteOCL.g:8441:2: rule__TupleTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group__1__Impl();
@@ -26034,22 +26119,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1__Impl"
-    // InternalCompleteOCL.g:8419:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:8447:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8423:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:8424:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:8451:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:8452:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:8424:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:8425:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalCompleteOCL.g:8452:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:8453:1: ( rule__TupleTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:8426:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalCompleteOCL.g:8454:1: ( rule__TupleTypeCS__Group_1__0 )?
             int alt81=2;
             int LA81_0 = input.LA(1);
 
@@ -26058,7 +26143,7 @@
             }
             switch (alt81) {
                 case 1 :
-                    // InternalCompleteOCL.g:8426:2: rule__TupleTypeCS__Group_1__0
+                    // InternalCompleteOCL.g:8454:2: rule__TupleTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1__0();
@@ -26096,16 +26181,16 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0"
-    // InternalCompleteOCL.g:8440:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
+    // InternalCompleteOCL.g:8468:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
     public final void rule__TupleTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8444:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
-            // InternalCompleteOCL.g:8445:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
+            // InternalCompleteOCL.g:8472:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
+            // InternalCompleteOCL.g:8473:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_15);
+            pushFollow(FollowSets000.FOLLOW_16);
             rule__TupleTypeCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -26134,17 +26219,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:8452:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:8480:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TupleTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8456:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:8457:1: ( '(' )
+            // InternalCompleteOCL.g:8484:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:8485:1: ( '(' )
             {
-            // InternalCompleteOCL.g:8457:1: ( '(' )
-            // InternalCompleteOCL.g:8458:1: '('
+            // InternalCompleteOCL.g:8485:1: ( '(' )
+            // InternalCompleteOCL.g:8486:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -26175,16 +26260,16 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1"
-    // InternalCompleteOCL.g:8471:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
+    // InternalCompleteOCL.g:8499:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
     public final void rule__TupleTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8475:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
-            // InternalCompleteOCL.g:8476:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
+            // InternalCompleteOCL.g:8503:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
+            // InternalCompleteOCL.g:8504:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
             {
-            pushFollow(FollowSets000.FOLLOW_15);
+            pushFollow(FollowSets000.FOLLOW_16);
             rule__TupleTypeCS__Group_1__1__Impl();
 
             state._fsp--;
@@ -26213,22 +26298,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:8483:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
+    // InternalCompleteOCL.g:8511:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8487:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
-            // InternalCompleteOCL.g:8488:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalCompleteOCL.g:8515:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
+            // InternalCompleteOCL.g:8516:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
             {
-            // InternalCompleteOCL.g:8488:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
-            // InternalCompleteOCL.g:8489:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalCompleteOCL.g:8516:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalCompleteOCL.g:8517:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
             }
-            // InternalCompleteOCL.g:8490:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalCompleteOCL.g:8518:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             int alt82=2;
             int LA82_0 = input.LA(1);
 
@@ -26237,7 +26322,7 @@
             }
             switch (alt82) {
                 case 1 :
-                    // InternalCompleteOCL.g:8490:2: rule__TupleTypeCS__Group_1_1__0
+                    // InternalCompleteOCL.g:8518:2: rule__TupleTypeCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1_1__0();
@@ -26275,14 +26360,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2"
-    // InternalCompleteOCL.g:8500:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
+    // InternalCompleteOCL.g:8528:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
     public final void rule__TupleTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8504:1: ( rule__TupleTypeCS__Group_1__2__Impl )
-            // InternalCompleteOCL.g:8505:2: rule__TupleTypeCS__Group_1__2__Impl
+            // InternalCompleteOCL.g:8532:1: ( rule__TupleTypeCS__Group_1__2__Impl )
+            // InternalCompleteOCL.g:8533:2: rule__TupleTypeCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1__2__Impl();
@@ -26308,17 +26393,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2__Impl"
-    // InternalCompleteOCL.g:8511:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:8539:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TupleTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8515:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:8516:1: ( ')' )
+            // InternalCompleteOCL.g:8543:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:8544:1: ( ')' )
             {
-            // InternalCompleteOCL.g:8516:1: ( ')' )
-            // InternalCompleteOCL.g:8517:1: ')'
+            // InternalCompleteOCL.g:8544:1: ( ')' )
+            // InternalCompleteOCL.g:8545:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
@@ -26349,16 +26434,16 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0"
-    // InternalCompleteOCL.g:8536:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
+    // InternalCompleteOCL.g:8564:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8540:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
-            // InternalCompleteOCL.g:8541:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
+            // InternalCompleteOCL.g:8568:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
+            // InternalCompleteOCL.g:8569:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__TupleTypeCS__Group_1_1__0__Impl();
 
             state._fsp--;
@@ -26387,23 +26472,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0__Impl"
-    // InternalCompleteOCL.g:8548:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
+    // InternalCompleteOCL.g:8576:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8552:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
-            // InternalCompleteOCL.g:8553:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalCompleteOCL.g:8580:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
+            // InternalCompleteOCL.g:8581:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
             {
-            // InternalCompleteOCL.g:8553:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
-            // InternalCompleteOCL.g:8554:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalCompleteOCL.g:8581:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalCompleteOCL.g:8582:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
             }
-            // InternalCompleteOCL.g:8555:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
-            // InternalCompleteOCL.g:8555:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
+            // InternalCompleteOCL.g:8583:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalCompleteOCL.g:8583:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_0();
@@ -26438,14 +26523,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1"
-    // InternalCompleteOCL.g:8565:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
+    // InternalCompleteOCL.g:8593:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8569:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
-            // InternalCompleteOCL.g:8570:2: rule__TupleTypeCS__Group_1_1__1__Impl
+            // InternalCompleteOCL.g:8597:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
+            // InternalCompleteOCL.g:8598:2: rule__TupleTypeCS__Group_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1__1__Impl();
@@ -26471,22 +26556,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1__Impl"
-    // InternalCompleteOCL.g:8576:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
+    // InternalCompleteOCL.g:8604:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
     public final void rule__TupleTypeCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8580:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
-            // InternalCompleteOCL.g:8581:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalCompleteOCL.g:8608:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
+            // InternalCompleteOCL.g:8609:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
             {
-            // InternalCompleteOCL.g:8581:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
-            // InternalCompleteOCL.g:8582:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalCompleteOCL.g:8609:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalCompleteOCL.g:8610:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
             }
-            // InternalCompleteOCL.g:8583:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalCompleteOCL.g:8611:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             loop83:
             do {
                 int alt83=2;
@@ -26499,9 +26584,9 @@
 
                 switch (alt83) {
             	case 1 :
-            	    // InternalCompleteOCL.g:8583:2: rule__TupleTypeCS__Group_1_1_1__0
+            	    // InternalCompleteOCL.g:8611:2: rule__TupleTypeCS__Group_1_1_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TupleTypeCS__Group_1_1_1__0();
 
             	    state._fsp--;
@@ -26540,16 +26625,16 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0"
-    // InternalCompleteOCL.g:8597:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
+    // InternalCompleteOCL.g:8625:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8601:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
-            // InternalCompleteOCL.g:8602:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
+            // InternalCompleteOCL.g:8629:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
+            // InternalCompleteOCL.g:8630:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TupleTypeCS__Group_1_1_1__0__Impl();
 
             state._fsp--;
@@ -26578,17 +26663,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0__Impl"
-    // InternalCompleteOCL.g:8609:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:8637:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8613:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:8614:1: ( ',' )
+            // InternalCompleteOCL.g:8641:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:8642:1: ( ',' )
             {
-            // InternalCompleteOCL.g:8614:1: ( ',' )
-            // InternalCompleteOCL.g:8615:1: ','
+            // InternalCompleteOCL.g:8642:1: ( ',' )
+            // InternalCompleteOCL.g:8643:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
@@ -26619,14 +26704,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1"
-    // InternalCompleteOCL.g:8628:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
+    // InternalCompleteOCL.g:8656:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8632:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
-            // InternalCompleteOCL.g:8633:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
+            // InternalCompleteOCL.g:8660:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
+            // InternalCompleteOCL.g:8661:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1_1__1__Impl();
@@ -26652,23 +26737,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1__Impl"
-    // InternalCompleteOCL.g:8639:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
+    // InternalCompleteOCL.g:8667:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8643:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
-            // InternalCompleteOCL.g:8644:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalCompleteOCL.g:8671:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
+            // InternalCompleteOCL.g:8672:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
             {
-            // InternalCompleteOCL.g:8644:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
-            // InternalCompleteOCL.g:8645:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalCompleteOCL.g:8672:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalCompleteOCL.g:8673:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
             }
-            // InternalCompleteOCL.g:8646:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
-            // InternalCompleteOCL.g:8646:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
+            // InternalCompleteOCL.g:8674:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalCompleteOCL.g:8674:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1();
@@ -26703,16 +26788,16 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0"
-    // InternalCompleteOCL.g:8660:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
+    // InternalCompleteOCL.g:8688:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
     public final void rule__TuplePartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8664:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
-            // InternalCompleteOCL.g:8665:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
+            // InternalCompleteOCL.g:8692:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
+            // InternalCompleteOCL.g:8693:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__TuplePartCS__Group__0__Impl();
 
             state._fsp--;
@@ -26741,23 +26826,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0__Impl"
-    // InternalCompleteOCL.g:8672:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:8700:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
     public final void rule__TuplePartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8676:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:8677:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8704:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:8705:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:8677:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:8678:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8705:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:8706:1: ( rule__TuplePartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:8679:1: ( rule__TuplePartCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:8679:2: rule__TuplePartCS__NameAssignment_0
+            // InternalCompleteOCL.g:8707:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:8707:2: rule__TuplePartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__NameAssignment_0();
@@ -26792,16 +26877,16 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1"
-    // InternalCompleteOCL.g:8689:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
+    // InternalCompleteOCL.g:8717:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
     public final void rule__TuplePartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8693:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
-            // InternalCompleteOCL.g:8694:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
+            // InternalCompleteOCL.g:8721:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
+            // InternalCompleteOCL.g:8722:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__TuplePartCS__Group__1__Impl();
 
             state._fsp--;
@@ -26830,17 +26915,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1__Impl"
-    // InternalCompleteOCL.g:8701:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:8729:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
     public final void rule__TuplePartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8705:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:8706:1: ( ':' )
+            // InternalCompleteOCL.g:8733:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:8734:1: ( ':' )
             {
-            // InternalCompleteOCL.g:8706:1: ( ':' )
-            // InternalCompleteOCL.g:8707:1: ':'
+            // InternalCompleteOCL.g:8734:1: ( ':' )
+            // InternalCompleteOCL.g:8735:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
@@ -26871,14 +26956,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2"
-    // InternalCompleteOCL.g:8720:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:8748:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
     public final void rule__TuplePartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8724:1: ( rule__TuplePartCS__Group__2__Impl )
-            // InternalCompleteOCL.g:8725:2: rule__TuplePartCS__Group__2__Impl
+            // InternalCompleteOCL.g:8752:1: ( rule__TuplePartCS__Group__2__Impl )
+            // InternalCompleteOCL.g:8753:2: rule__TuplePartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__Group__2__Impl();
@@ -26904,23 +26989,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2__Impl"
-    // InternalCompleteOCL.g:8731:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:8759:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__TuplePartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8735:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
-            // InternalCompleteOCL.g:8736:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalCompleteOCL.g:8763:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
+            // InternalCompleteOCL.g:8764:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:8736:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
-            // InternalCompleteOCL.g:8737:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalCompleteOCL.g:8764:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalCompleteOCL.g:8765:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalCompleteOCL.g:8738:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
-            // InternalCompleteOCL.g:8738:2: rule__TuplePartCS__OwnedTypeAssignment_2
+            // InternalCompleteOCL.g:8766:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalCompleteOCL.g:8766:2: rule__TuplePartCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__OwnedTypeAssignment_2();
@@ -26955,14 +27040,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:8754:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:8782:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
     public final void rule__CollectionLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8758:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:8759:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:8786:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:8787:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__CollectionLiteralExpCS__Group__0__Impl();
@@ -26993,23 +27078,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:8766:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:8794:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8770:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalCompleteOCL.g:8771:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalCompleteOCL.g:8798:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalCompleteOCL.g:8799:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:8771:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalCompleteOCL.g:8772:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalCompleteOCL.g:8799:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalCompleteOCL.g:8800:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalCompleteOCL.g:8773:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalCompleteOCL.g:8773:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
+            // InternalCompleteOCL.g:8801:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalCompleteOCL.g:8801:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedTypeAssignment_0();
@@ -27044,14 +27129,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:8783:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
+    // InternalCompleteOCL.g:8811:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
     public final void rule__CollectionLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8787:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
-            // InternalCompleteOCL.g:8788:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
+            // InternalCompleteOCL.g:8815:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
+            // InternalCompleteOCL.g:8816:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__CollectionLiteralExpCS__Group__1__Impl();
@@ -27082,17 +27167,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:8795:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:8823:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8799:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:8800:1: ( '{' )
+            // InternalCompleteOCL.g:8827:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:8828:1: ( '{' )
             {
-            // InternalCompleteOCL.g:8800:1: ( '{' )
-            // InternalCompleteOCL.g:8801:1: '{'
+            // InternalCompleteOCL.g:8828:1: ( '{' )
+            // InternalCompleteOCL.g:8829:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -27123,14 +27208,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2"
-    // InternalCompleteOCL.g:8814:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
+    // InternalCompleteOCL.g:8842:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
     public final void rule__CollectionLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8818:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
-            // InternalCompleteOCL.g:8819:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
+            // InternalCompleteOCL.g:8846:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
+            // InternalCompleteOCL.g:8847:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__CollectionLiteralExpCS__Group__2__Impl();
@@ -27161,22 +27246,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:8826:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:8854:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__CollectionLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8830:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:8831:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:8858:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:8859:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:8831:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:8832:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalCompleteOCL.g:8859:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:8860:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:8833:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalCompleteOCL.g:8861:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             int alt84=2;
             int LA84_0 = input.LA(1);
 
@@ -27185,7 +27270,7 @@
             }
             switch (alt84) {
                 case 1 :
-                    // InternalCompleteOCL.g:8833:2: rule__CollectionLiteralExpCS__Group_2__0
+                    // InternalCompleteOCL.g:8861:2: rule__CollectionLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralExpCS__Group_2__0();
@@ -27223,14 +27308,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3"
-    // InternalCompleteOCL.g:8843:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:8871:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
     public final void rule__CollectionLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8847:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
-            // InternalCompleteOCL.g:8848:2: rule__CollectionLiteralExpCS__Group__3__Impl
+            // InternalCompleteOCL.g:8875:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
+            // InternalCompleteOCL.g:8876:2: rule__CollectionLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group__3__Impl();
@@ -27256,17 +27341,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:8854:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:8882:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8858:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:8859:1: ( '}' )
+            // InternalCompleteOCL.g:8886:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:8887:1: ( '}' )
             {
-            // InternalCompleteOCL.g:8859:1: ( '}' )
-            // InternalCompleteOCL.g:8860:1: '}'
+            // InternalCompleteOCL.g:8887:1: ( '}' )
+            // InternalCompleteOCL.g:8888:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -27297,16 +27382,16 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0"
-    // InternalCompleteOCL.g:8881:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
+    // InternalCompleteOCL.g:8909:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8885:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
-            // InternalCompleteOCL.g:8886:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
+            // InternalCompleteOCL.g:8913:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
+            // InternalCompleteOCL.g:8914:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__CollectionLiteralExpCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -27335,23 +27420,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:8893:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalCompleteOCL.g:8921:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8897:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalCompleteOCL.g:8898:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:8925:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalCompleteOCL.g:8926:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalCompleteOCL.g:8898:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalCompleteOCL.g:8899:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:8926:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:8927:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalCompleteOCL.g:8900:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalCompleteOCL.g:8900:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalCompleteOCL.g:8928:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:8928:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -27386,14 +27471,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1"
-    // InternalCompleteOCL.g:8910:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:8938:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8914:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:8915:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:8942:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:8943:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2__1__Impl();
@@ -27419,22 +27504,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:8921:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalCompleteOCL.g:8949:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8925:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalCompleteOCL.g:8926:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:8953:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalCompleteOCL.g:8954:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalCompleteOCL.g:8926:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
-            // InternalCompleteOCL.g:8927:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:8954:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:8955:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalCompleteOCL.g:8928:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:8956:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             loop85:
             do {
                 int alt85=2;
@@ -27447,9 +27532,9 @@
 
                 switch (alt85) {
             	case 1 :
-            	    // InternalCompleteOCL.g:8928:2: rule__CollectionLiteralExpCS__Group_2_1__0
+            	    // InternalCompleteOCL.g:8956:2: rule__CollectionLiteralExpCS__Group_2_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__CollectionLiteralExpCS__Group_2_1__0();
 
             	    state._fsp--;
@@ -27488,14 +27573,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0"
-    // InternalCompleteOCL.g:8942:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
+    // InternalCompleteOCL.g:8970:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8946:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
-            // InternalCompleteOCL.g:8947:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
+            // InternalCompleteOCL.g:8974:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
+            // InternalCompleteOCL.g:8975:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__CollectionLiteralExpCS__Group_2_1__0__Impl();
@@ -27526,17 +27611,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0__Impl"
-    // InternalCompleteOCL.g:8954:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:8982:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8958:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:8959:1: ( ',' )
+            // InternalCompleteOCL.g:8986:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:8987:1: ( ',' )
             {
-            // InternalCompleteOCL.g:8959:1: ( ',' )
-            // InternalCompleteOCL.g:8960:1: ','
+            // InternalCompleteOCL.g:8987:1: ( ',' )
+            // InternalCompleteOCL.g:8988:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -27567,14 +27652,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1"
-    // InternalCompleteOCL.g:8973:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalCompleteOCL.g:9001:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8977:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
-            // InternalCompleteOCL.g:8978:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
+            // InternalCompleteOCL.g:9005:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
+            // InternalCompleteOCL.g:9006:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2_1__1__Impl();
@@ -27600,23 +27685,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1__Impl"
-    // InternalCompleteOCL.g:8984:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:9012:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:8988:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalCompleteOCL.g:8989:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:9016:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalCompleteOCL.g:9017:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:8989:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalCompleteOCL.g:8990:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:9017:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:9018:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalCompleteOCL.g:8991:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalCompleteOCL.g:8991:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalCompleteOCL.g:9019:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:9019:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -27651,14 +27736,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0"
-    // InternalCompleteOCL.g:9005:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
+    // InternalCompleteOCL.g:9033:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9009:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
-            // InternalCompleteOCL.g:9010:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
+            // InternalCompleteOCL.g:9037:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
+            // InternalCompleteOCL.g:9038:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__CollectionLiteralPartCS__Group_0__0__Impl();
@@ -27689,23 +27774,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:9017:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
+    // InternalCompleteOCL.g:9045:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9021:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
-            // InternalCompleteOCL.g:9022:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalCompleteOCL.g:9049:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
+            // InternalCompleteOCL.g:9050:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
             {
-            // InternalCompleteOCL.g:9022:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
-            // InternalCompleteOCL.g:9023:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalCompleteOCL.g:9050:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalCompleteOCL.g:9051:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
             }
-            // InternalCompleteOCL.g:9024:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
-            // InternalCompleteOCL.g:9024:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
+            // InternalCompleteOCL.g:9052:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalCompleteOCL.g:9052:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0();
@@ -27740,14 +27825,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1"
-    // InternalCompleteOCL.g:9034:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
+    // InternalCompleteOCL.g:9062:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9038:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
-            // InternalCompleteOCL.g:9039:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
+            // InternalCompleteOCL.g:9066:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
+            // InternalCompleteOCL.g:9067:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0__1__Impl();
@@ -27773,22 +27858,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:9045:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
+    // InternalCompleteOCL.g:9073:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9049:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
-            // InternalCompleteOCL.g:9050:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalCompleteOCL.g:9077:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
+            // InternalCompleteOCL.g:9078:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
             {
-            // InternalCompleteOCL.g:9050:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
-            // InternalCompleteOCL.g:9051:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalCompleteOCL.g:9078:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalCompleteOCL.g:9079:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
             }
-            // InternalCompleteOCL.g:9052:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalCompleteOCL.g:9080:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             int alt86=2;
             int LA86_0 = input.LA(1);
 
@@ -27797,7 +27882,7 @@
             }
             switch (alt86) {
                 case 1 :
-                    // InternalCompleteOCL.g:9052:2: rule__CollectionLiteralPartCS__Group_0_1__0
+                    // InternalCompleteOCL.g:9080:2: rule__CollectionLiteralPartCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0_1__0();
@@ -27835,14 +27920,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0"
-    // InternalCompleteOCL.g:9066:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
+    // InternalCompleteOCL.g:9094:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9070:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
-            // InternalCompleteOCL.g:9071:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
+            // InternalCompleteOCL.g:9098:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
+            // InternalCompleteOCL.g:9099:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__CollectionLiteralPartCS__Group_0_1__0__Impl();
@@ -27873,17 +27958,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0__Impl"
-    // InternalCompleteOCL.g:9078:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
+    // InternalCompleteOCL.g:9106:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9082:1: ( ( '..' ) )
-            // InternalCompleteOCL.g:9083:1: ( '..' )
+            // InternalCompleteOCL.g:9110:1: ( ( '..' ) )
+            // InternalCompleteOCL.g:9111:1: ( '..' )
             {
-            // InternalCompleteOCL.g:9083:1: ( '..' )
-            // InternalCompleteOCL.g:9084:1: '..'
+            // InternalCompleteOCL.g:9111:1: ( '..' )
+            // InternalCompleteOCL.g:9112:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
@@ -27914,14 +27999,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1"
-    // InternalCompleteOCL.g:9097:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
+    // InternalCompleteOCL.g:9125:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9101:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
-            // InternalCompleteOCL.g:9102:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
+            // InternalCompleteOCL.g:9129:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
+            // InternalCompleteOCL.g:9130:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0_1__1__Impl();
@@ -27947,23 +28032,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1__Impl"
-    // InternalCompleteOCL.g:9108:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
+    // InternalCompleteOCL.g:9136:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9112:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
-            // InternalCompleteOCL.g:9113:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalCompleteOCL.g:9140:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
+            // InternalCompleteOCL.g:9141:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
             {
-            // InternalCompleteOCL.g:9113:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
-            // InternalCompleteOCL.g:9114:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalCompleteOCL.g:9141:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalCompleteOCL.g:9142:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
             }
-            // InternalCompleteOCL.g:9115:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
-            // InternalCompleteOCL.g:9115:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
+            // InternalCompleteOCL.g:9143:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalCompleteOCL.g:9143:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1();
@@ -27998,14 +28083,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0"
-    // InternalCompleteOCL.g:9129:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
+    // InternalCompleteOCL.g:9157:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
     public final void rule__CollectionPatternCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9133:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
-            // InternalCompleteOCL.g:9134:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
+            // InternalCompleteOCL.g:9161:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
+            // InternalCompleteOCL.g:9162:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__CollectionPatternCS__Group__0__Impl();
@@ -28036,23 +28121,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0__Impl"
-    // InternalCompleteOCL.g:9141:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:9169:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionPatternCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9145:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
-            // InternalCompleteOCL.g:9146:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalCompleteOCL.g:9173:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
+            // InternalCompleteOCL.g:9174:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:9146:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
-            // InternalCompleteOCL.g:9147:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalCompleteOCL.g:9174:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalCompleteOCL.g:9175:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalCompleteOCL.g:9148:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
-            // InternalCompleteOCL.g:9148:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
+            // InternalCompleteOCL.g:9176:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalCompleteOCL.g:9176:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedTypeAssignment_0();
@@ -28087,14 +28172,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1"
-    // InternalCompleteOCL.g:9158:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
+    // InternalCompleteOCL.g:9186:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
     public final void rule__CollectionPatternCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9162:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
-            // InternalCompleteOCL.g:9163:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
+            // InternalCompleteOCL.g:9190:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
+            // InternalCompleteOCL.g:9191:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__CollectionPatternCS__Group__1__Impl();
@@ -28125,17 +28210,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1__Impl"
-    // InternalCompleteOCL.g:9170:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:9198:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionPatternCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9174:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:9175:1: ( '{' )
+            // InternalCompleteOCL.g:9202:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:9203:1: ( '{' )
             {
-            // InternalCompleteOCL.g:9175:1: ( '{' )
-            // InternalCompleteOCL.g:9176:1: '{'
+            // InternalCompleteOCL.g:9203:1: ( '{' )
+            // InternalCompleteOCL.g:9204:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
@@ -28166,14 +28251,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2"
-    // InternalCompleteOCL.g:9189:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
+    // InternalCompleteOCL.g:9217:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
     public final void rule__CollectionPatternCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9193:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
-            // InternalCompleteOCL.g:9194:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
+            // InternalCompleteOCL.g:9221:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
+            // InternalCompleteOCL.g:9222:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__CollectionPatternCS__Group__2__Impl();
@@ -28204,22 +28289,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2__Impl"
-    // InternalCompleteOCL.g:9201:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:9229:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
     public final void rule__CollectionPatternCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9205:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:9206:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:9233:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:9234:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:9206:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:9207:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalCompleteOCL.g:9234:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:9235:1: ( rule__CollectionPatternCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:9208:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalCompleteOCL.g:9236:1: ( rule__CollectionPatternCS__Group_2__0 )?
             int alt87=2;
             int LA87_0 = input.LA(1);
 
@@ -28228,7 +28313,7 @@
             }
             switch (alt87) {
                 case 1 :
-                    // InternalCompleteOCL.g:9208:2: rule__CollectionPatternCS__Group_2__0
+                    // InternalCompleteOCL.g:9236:2: rule__CollectionPatternCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionPatternCS__Group_2__0();
@@ -28266,14 +28351,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3"
-    // InternalCompleteOCL.g:9218:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:9246:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
     public final void rule__CollectionPatternCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9222:1: ( rule__CollectionPatternCS__Group__3__Impl )
-            // InternalCompleteOCL.g:9223:2: rule__CollectionPatternCS__Group__3__Impl
+            // InternalCompleteOCL.g:9250:1: ( rule__CollectionPatternCS__Group__3__Impl )
+            // InternalCompleteOCL.g:9251:2: rule__CollectionPatternCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group__3__Impl();
@@ -28299,17 +28384,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3__Impl"
-    // InternalCompleteOCL.g:9229:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:9257:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionPatternCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9233:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:9234:1: ( '}' )
+            // InternalCompleteOCL.g:9261:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:9262:1: ( '}' )
             {
-            // InternalCompleteOCL.g:9234:1: ( '}' )
-            // InternalCompleteOCL.g:9235:1: '}'
+            // InternalCompleteOCL.g:9262:1: ( '}' )
+            // InternalCompleteOCL.g:9263:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
@@ -28340,14 +28425,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0"
-    // InternalCompleteOCL.g:9256:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
+    // InternalCompleteOCL.g:9284:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
     public final void rule__CollectionPatternCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9260:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
-            // InternalCompleteOCL.g:9261:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
+            // InternalCompleteOCL.g:9288:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
+            // InternalCompleteOCL.g:9289:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__CollectionPatternCS__Group_2__0__Impl();
@@ -28378,23 +28463,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:9268:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalCompleteOCL.g:9296:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9272:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalCompleteOCL.g:9273:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:9300:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalCompleteOCL.g:9301:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalCompleteOCL.g:9273:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
-            // InternalCompleteOCL.g:9274:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:9301:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:9302:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalCompleteOCL.g:9275:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
-            // InternalCompleteOCL.g:9275:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
+            // InternalCompleteOCL.g:9303:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:9303:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_0();
@@ -28429,14 +28514,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1"
-    // InternalCompleteOCL.g:9285:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
+    // InternalCompleteOCL.g:9313:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
     public final void rule__CollectionPatternCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9289:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
-            // InternalCompleteOCL.g:9290:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
+            // InternalCompleteOCL.g:9317:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
+            // InternalCompleteOCL.g:9318:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__CollectionPatternCS__Group_2__1__Impl();
@@ -28467,22 +28552,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:9297:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
+    // InternalCompleteOCL.g:9325:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionPatternCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9301:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
-            // InternalCompleteOCL.g:9302:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:9329:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
+            // InternalCompleteOCL.g:9330:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
             {
-            // InternalCompleteOCL.g:9302:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
-            // InternalCompleteOCL.g:9303:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:9330:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:9331:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
             }
-            // InternalCompleteOCL.g:9304:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:9332:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             loop88:
             do {
                 int alt88=2;
@@ -28495,9 +28580,9 @@
 
                 switch (alt88) {
             	case 1 :
-            	    // InternalCompleteOCL.g:9304:2: rule__CollectionPatternCS__Group_2_1__0
+            	    // InternalCompleteOCL.g:9332:2: rule__CollectionPatternCS__Group_2_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__CollectionPatternCS__Group_2_1__0();
 
             	    state._fsp--;
@@ -28536,14 +28621,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2"
-    // InternalCompleteOCL.g:9314:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
+    // InternalCompleteOCL.g:9342:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
     public final void rule__CollectionPatternCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9318:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
-            // InternalCompleteOCL.g:9319:2: rule__CollectionPatternCS__Group_2__2__Impl
+            // InternalCompleteOCL.g:9346:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
+            // InternalCompleteOCL.g:9347:2: rule__CollectionPatternCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2__2__Impl();
@@ -28569,23 +28654,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2__Impl"
-    // InternalCompleteOCL.g:9325:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
+    // InternalCompleteOCL.g:9353:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9329:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
-            // InternalCompleteOCL.g:9330:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalCompleteOCL.g:9357:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
+            // InternalCompleteOCL.g:9358:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
             {
-            // InternalCompleteOCL.g:9330:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
-            // InternalCompleteOCL.g:9331:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalCompleteOCL.g:9358:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalCompleteOCL.g:9359:1: ( rule__CollectionPatternCS__Group_2_2__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
             }
-            // InternalCompleteOCL.g:9332:1: ( rule__CollectionPatternCS__Group_2_2__0 )
-            // InternalCompleteOCL.g:9332:2: rule__CollectionPatternCS__Group_2_2__0
+            // InternalCompleteOCL.g:9360:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalCompleteOCL.g:9360:2: rule__CollectionPatternCS__Group_2_2__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__0();
@@ -28620,14 +28705,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0"
-    // InternalCompleteOCL.g:9348:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
+    // InternalCompleteOCL.g:9376:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
     public final void rule__CollectionPatternCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9352:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
-            // InternalCompleteOCL.g:9353:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
+            // InternalCompleteOCL.g:9380:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
+            // InternalCompleteOCL.g:9381:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__CollectionPatternCS__Group_2_1__0__Impl();
@@ -28658,17 +28743,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0__Impl"
-    // InternalCompleteOCL.g:9360:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:9388:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionPatternCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9364:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:9365:1: ( ',' )
+            // InternalCompleteOCL.g:9392:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:9393:1: ( ',' )
             {
-            // InternalCompleteOCL.g:9365:1: ( ',' )
-            // InternalCompleteOCL.g:9366:1: ','
+            // InternalCompleteOCL.g:9393:1: ( ',' )
+            // InternalCompleteOCL.g:9394:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
@@ -28699,14 +28784,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1"
-    // InternalCompleteOCL.g:9379:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
+    // InternalCompleteOCL.g:9407:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9383:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
-            // InternalCompleteOCL.g:9384:2: rule__CollectionPatternCS__Group_2_1__1__Impl
+            // InternalCompleteOCL.g:9411:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
+            // InternalCompleteOCL.g:9412:2: rule__CollectionPatternCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_1__1__Impl();
@@ -28732,23 +28817,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1__Impl"
-    // InternalCompleteOCL.g:9390:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:9418:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9394:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalCompleteOCL.g:9395:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:9422:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalCompleteOCL.g:9423:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:9395:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalCompleteOCL.g:9396:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:9423:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:9424:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalCompleteOCL.g:9397:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
-            // InternalCompleteOCL.g:9397:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
+            // InternalCompleteOCL.g:9425:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:9425:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1();
@@ -28783,14 +28868,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0"
-    // InternalCompleteOCL.g:9411:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
+    // InternalCompleteOCL.g:9439:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
     public final void rule__CollectionPatternCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9415:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
-            // InternalCompleteOCL.g:9416:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
+            // InternalCompleteOCL.g:9443:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
+            // InternalCompleteOCL.g:9444:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__CollectionPatternCS__Group_2_2__0__Impl();
@@ -28821,17 +28906,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0__Impl"
-    // InternalCompleteOCL.g:9423:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
+    // InternalCompleteOCL.g:9451:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
     public final void rule__CollectionPatternCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9427:1: ( ( '++' ) )
-            // InternalCompleteOCL.g:9428:1: ( '++' )
+            // InternalCompleteOCL.g:9455:1: ( ( '++' ) )
+            // InternalCompleteOCL.g:9456:1: ( '++' )
             {
-            // InternalCompleteOCL.g:9428:1: ( '++' )
-            // InternalCompleteOCL.g:9429:1: '++'
+            // InternalCompleteOCL.g:9456:1: ( '++' )
+            // InternalCompleteOCL.g:9457:1: '++'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
@@ -28862,14 +28947,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1"
-    // InternalCompleteOCL.g:9442:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
+    // InternalCompleteOCL.g:9470:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9446:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
-            // InternalCompleteOCL.g:9447:2: rule__CollectionPatternCS__Group_2_2__1__Impl
+            // InternalCompleteOCL.g:9474:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
+            // InternalCompleteOCL.g:9475:2: rule__CollectionPatternCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__1__Impl();
@@ -28895,23 +28980,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1__Impl"
-    // InternalCompleteOCL.g:9453:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
+    // InternalCompleteOCL.g:9481:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9457:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
-            // InternalCompleteOCL.g:9458:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalCompleteOCL.g:9485:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
+            // InternalCompleteOCL.g:9486:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
             {
-            // InternalCompleteOCL.g:9458:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
-            // InternalCompleteOCL.g:9459:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalCompleteOCL.g:9486:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalCompleteOCL.g:9487:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
             }
-            // InternalCompleteOCL.g:9460:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
-            // InternalCompleteOCL.g:9460:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
+            // InternalCompleteOCL.g:9488:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalCompleteOCL.g:9488:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1();
@@ -28946,16 +29031,16 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0"
-    // InternalCompleteOCL.g:9474:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
+    // InternalCompleteOCL.g:9502:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
     public final void rule__ShadowPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9478:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
-            // InternalCompleteOCL.g:9479:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
+            // InternalCompleteOCL.g:9506:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
+            // InternalCompleteOCL.g:9507:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             rule__ShadowPartCS__Group_0__0__Impl();
 
             state._fsp--;
@@ -28984,23 +29069,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:9486:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
+    // InternalCompleteOCL.g:9514:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
     public final void rule__ShadowPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9490:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
-            // InternalCompleteOCL.g:9491:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalCompleteOCL.g:9518:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
+            // InternalCompleteOCL.g:9519:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
             {
-            // InternalCompleteOCL.g:9491:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
-            // InternalCompleteOCL.g:9492:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalCompleteOCL.g:9519:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalCompleteOCL.g:9520:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0_0());
             }
-            // InternalCompleteOCL.g:9493:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
-            // InternalCompleteOCL.g:9493:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
+            // InternalCompleteOCL.g:9521:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalCompleteOCL.g:9521:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__ReferredPropertyAssignment_0_0();
@@ -29035,14 +29120,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1"
-    // InternalCompleteOCL.g:9503:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
+    // InternalCompleteOCL.g:9531:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
     public final void rule__ShadowPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9507:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
-            // InternalCompleteOCL.g:9508:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
+            // InternalCompleteOCL.g:9535:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
+            // InternalCompleteOCL.g:9536:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__ShadowPartCS__Group_0__1__Impl();
@@ -29073,17 +29158,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:9515:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:9543:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
     public final void rule__ShadowPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9519:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:9520:1: ( '=' )
+            // InternalCompleteOCL.g:9547:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:9548:1: ( '=' )
             {
-            // InternalCompleteOCL.g:9520:1: ( '=' )
-            // InternalCompleteOCL.g:9521:1: '='
+            // InternalCompleteOCL.g:9548:1: ( '=' )
+            // InternalCompleteOCL.g:9549:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());
@@ -29114,14 +29199,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2"
-    // InternalCompleteOCL.g:9534:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
+    // InternalCompleteOCL.g:9562:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
     public final void rule__ShadowPartCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9538:1: ( rule__ShadowPartCS__Group_0__2__Impl )
-            // InternalCompleteOCL.g:9539:2: rule__ShadowPartCS__Group_0__2__Impl
+            // InternalCompleteOCL.g:9566:1: ( rule__ShadowPartCS__Group_0__2__Impl )
+            // InternalCompleteOCL.g:9567:2: rule__ShadowPartCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__Group_0__2__Impl();
@@ -29147,23 +29232,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2__Impl"
-    // InternalCompleteOCL.g:9545:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
+    // InternalCompleteOCL.g:9573:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
     public final void rule__ShadowPartCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9549:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
-            // InternalCompleteOCL.g:9550:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalCompleteOCL.g:9577:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
+            // InternalCompleteOCL.g:9578:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
             {
-            // InternalCompleteOCL.g:9550:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
-            // InternalCompleteOCL.g:9551:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalCompleteOCL.g:9578:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalCompleteOCL.g:9579:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_0_2());
             }
-            // InternalCompleteOCL.g:9552:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
-            // InternalCompleteOCL.g:9552:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
+            // InternalCompleteOCL.g:9580:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalCompleteOCL.g:9580:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2();
@@ -29198,14 +29283,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0"
-    // InternalCompleteOCL.g:9568:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
+    // InternalCompleteOCL.g:9596:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
     public final void rule__PatternExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9572:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
-            // InternalCompleteOCL.g:9573:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
+            // InternalCompleteOCL.g:9600:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
+            // InternalCompleteOCL.g:9601:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__PatternExpCS__Group__0__Impl();
@@ -29236,22 +29321,22 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:9580:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
+    // InternalCompleteOCL.g:9608:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
     public final void rule__PatternExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9584:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
-            // InternalCompleteOCL.g:9585:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalCompleteOCL.g:9612:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
+            // InternalCompleteOCL.g:9613:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
             {
-            // InternalCompleteOCL.g:9585:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
-            // InternalCompleteOCL.g:9586:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalCompleteOCL.g:9613:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalCompleteOCL.g:9614:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
             }
-            // InternalCompleteOCL.g:9587:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalCompleteOCL.g:9615:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             int alt89=2;
             int LA89_0 = input.LA(1);
 
@@ -29260,7 +29345,7 @@
             }
             switch (alt89) {
                 case 1 :
-                    // InternalCompleteOCL.g:9587:2: rule__PatternExpCS__PatternVariableNameAssignment_0
+                    // InternalCompleteOCL.g:9615:2: rule__PatternExpCS__PatternVariableNameAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PatternExpCS__PatternVariableNameAssignment_0();
@@ -29298,16 +29383,16 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1"
-    // InternalCompleteOCL.g:9597:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
+    // InternalCompleteOCL.g:9625:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
     public final void rule__PatternExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9601:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
-            // InternalCompleteOCL.g:9602:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
+            // InternalCompleteOCL.g:9629:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
+            // InternalCompleteOCL.g:9630:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__PatternExpCS__Group__1__Impl();
 
             state._fsp--;
@@ -29336,17 +29421,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:9609:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:9637:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
     public final void rule__PatternExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9613:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:9614:1: ( ':' )
+            // InternalCompleteOCL.g:9641:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:9642:1: ( ':' )
             {
-            // InternalCompleteOCL.g:9614:1: ( ':' )
-            // InternalCompleteOCL.g:9615:1: ':'
+            // InternalCompleteOCL.g:9642:1: ( ':' )
+            // InternalCompleteOCL.g:9643:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
@@ -29377,14 +29462,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2"
-    // InternalCompleteOCL.g:9628:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:9656:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
     public final void rule__PatternExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9632:1: ( rule__PatternExpCS__Group__2__Impl )
-            // InternalCompleteOCL.g:9633:2: rule__PatternExpCS__Group__2__Impl
+            // InternalCompleteOCL.g:9660:1: ( rule__PatternExpCS__Group__2__Impl )
+            // InternalCompleteOCL.g:9661:2: rule__PatternExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__Group__2__Impl();
@@ -29410,23 +29495,23 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:9639:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:9667:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
     public final void rule__PatternExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9643:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
-            // InternalCompleteOCL.g:9644:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalCompleteOCL.g:9671:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
+            // InternalCompleteOCL.g:9672:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:9644:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
-            // InternalCompleteOCL.g:9645:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalCompleteOCL.g:9672:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalCompleteOCL.g:9673:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
             }
-            // InternalCompleteOCL.g:9646:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
-            // InternalCompleteOCL.g:9646:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
+            // InternalCompleteOCL.g:9674:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalCompleteOCL.g:9674:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__OwnedPatternTypeAssignment_2();
@@ -29461,14 +29546,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:9662:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:9690:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
     public final void rule__LambdaLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9666:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:9667:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:9694:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:9695:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LambdaLiteralExpCS__Group__0__Impl();
@@ -29499,17 +29584,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:9674:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
+    // InternalCompleteOCL.g:9702:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
     public final void rule__LambdaLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9678:1: ( ( 'Lambda' ) )
-            // InternalCompleteOCL.g:9679:1: ( 'Lambda' )
+            // InternalCompleteOCL.g:9706:1: ( ( 'Lambda' ) )
+            // InternalCompleteOCL.g:9707:1: ( 'Lambda' )
             {
-            // InternalCompleteOCL.g:9679:1: ( 'Lambda' )
-            // InternalCompleteOCL.g:9680:1: 'Lambda'
+            // InternalCompleteOCL.g:9707:1: ( 'Lambda' )
+            // InternalCompleteOCL.g:9708:1: 'Lambda'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
@@ -29540,14 +29625,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:9693:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
+    // InternalCompleteOCL.g:9721:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
     public final void rule__LambdaLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9697:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
-            // InternalCompleteOCL.g:9698:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
+            // InternalCompleteOCL.g:9725:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
+            // InternalCompleteOCL.g:9726:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__LambdaLiteralExpCS__Group__1__Impl();
@@ -29578,17 +29663,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:9705:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:9733:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__LambdaLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9709:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:9710:1: ( '{' )
+            // InternalCompleteOCL.g:9737:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:9738:1: ( '{' )
             {
-            // InternalCompleteOCL.g:9710:1: ( '{' )
-            // InternalCompleteOCL.g:9711:1: '{'
+            // InternalCompleteOCL.g:9738:1: ( '{' )
+            // InternalCompleteOCL.g:9739:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -29619,14 +29704,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2"
-    // InternalCompleteOCL.g:9724:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
+    // InternalCompleteOCL.g:9752:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
     public final void rule__LambdaLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9728:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
-            // InternalCompleteOCL.g:9729:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
+            // InternalCompleteOCL.g:9756:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
+            // InternalCompleteOCL.g:9757:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__LambdaLiteralExpCS__Group__2__Impl();
@@ -29657,23 +29742,23 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:9736:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:9764:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
     public final void rule__LambdaLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9740:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
-            // InternalCompleteOCL.g:9741:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalCompleteOCL.g:9768:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
+            // InternalCompleteOCL.g:9769:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:9741:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
-            // InternalCompleteOCL.g:9742:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalCompleteOCL.g:9769:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalCompleteOCL.g:9770:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
             }
-            // InternalCompleteOCL.g:9743:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
-            // InternalCompleteOCL.g:9743:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
+            // InternalCompleteOCL.g:9771:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalCompleteOCL.g:9771:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2();
@@ -29708,14 +29793,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3"
-    // InternalCompleteOCL.g:9753:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:9781:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
     public final void rule__LambdaLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9757:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
-            // InternalCompleteOCL.g:9758:2: rule__LambdaLiteralExpCS__Group__3__Impl
+            // InternalCompleteOCL.g:9785:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
+            // InternalCompleteOCL.g:9786:2: rule__LambdaLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__Group__3__Impl();
@@ -29741,17 +29826,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:9764:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:9792:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__LambdaLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9768:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:9769:1: ( '}' )
+            // InternalCompleteOCL.g:9796:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:9797:1: ( '}' )
             {
-            // InternalCompleteOCL.g:9769:1: ( '}' )
-            // InternalCompleteOCL.g:9770:1: '}'
+            // InternalCompleteOCL.g:9797:1: ( '}' )
+            // InternalCompleteOCL.g:9798:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -29782,14 +29867,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:9791:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:9819:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
     public final void rule__MapLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9795:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:9796:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:9823:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:9824:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__MapLiteralExpCS__Group__0__Impl();
@@ -29820,23 +29905,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:9803:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:9831:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9807:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalCompleteOCL.g:9808:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalCompleteOCL.g:9835:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalCompleteOCL.g:9836:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:9808:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalCompleteOCL.g:9809:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalCompleteOCL.g:9836:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalCompleteOCL.g:9837:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalCompleteOCL.g:9810:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalCompleteOCL.g:9810:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
+            // InternalCompleteOCL.g:9838:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalCompleteOCL.g:9838:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedTypeAssignment_0();
@@ -29871,14 +29956,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:9820:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
+    // InternalCompleteOCL.g:9848:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
     public final void rule__MapLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9824:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
-            // InternalCompleteOCL.g:9825:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
+            // InternalCompleteOCL.g:9852:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
+            // InternalCompleteOCL.g:9853:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_47);
             rule__MapLiteralExpCS__Group__1__Impl();
@@ -29909,17 +29994,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:9832:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:9860:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__MapLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9836:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:9837:1: ( '{' )
+            // InternalCompleteOCL.g:9864:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:9865:1: ( '{' )
             {
-            // InternalCompleteOCL.g:9837:1: ( '{' )
-            // InternalCompleteOCL.g:9838:1: '{'
+            // InternalCompleteOCL.g:9865:1: ( '{' )
+            // InternalCompleteOCL.g:9866:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -29950,14 +30035,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2"
-    // InternalCompleteOCL.g:9851:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
+    // InternalCompleteOCL.g:9879:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
     public final void rule__MapLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9855:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
-            // InternalCompleteOCL.g:9856:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
+            // InternalCompleteOCL.g:9883:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
+            // InternalCompleteOCL.g:9884:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_47);
             rule__MapLiteralExpCS__Group__2__Impl();
@@ -29988,22 +30073,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:9863:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:9891:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__MapLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9867:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:9868:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:9895:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:9896:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:9868:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:9869:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalCompleteOCL.g:9896:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:9897:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:9870:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalCompleteOCL.g:9898:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             int alt90=2;
             int LA90_0 = input.LA(1);
 
@@ -30012,7 +30097,7 @@
             }
             switch (alt90) {
                 case 1 :
-                    // InternalCompleteOCL.g:9870:2: rule__MapLiteralExpCS__Group_2__0
+                    // InternalCompleteOCL.g:9898:2: rule__MapLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapLiteralExpCS__Group_2__0();
@@ -30050,14 +30135,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3"
-    // InternalCompleteOCL.g:9880:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:9908:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
     public final void rule__MapLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9884:1: ( rule__MapLiteralExpCS__Group__3__Impl )
-            // InternalCompleteOCL.g:9885:2: rule__MapLiteralExpCS__Group__3__Impl
+            // InternalCompleteOCL.g:9912:1: ( rule__MapLiteralExpCS__Group__3__Impl )
+            // InternalCompleteOCL.g:9913:2: rule__MapLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group__3__Impl();
@@ -30083,17 +30168,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:9891:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:9919:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__MapLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9895:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:9896:1: ( '}' )
+            // InternalCompleteOCL.g:9923:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:9924:1: ( '}' )
             {
-            // InternalCompleteOCL.g:9896:1: ( '}' )
-            // InternalCompleteOCL.g:9897:1: '}'
+            // InternalCompleteOCL.g:9924:1: ( '}' )
+            // InternalCompleteOCL.g:9925:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -30124,16 +30209,16 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0"
-    // InternalCompleteOCL.g:9918:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
+    // InternalCompleteOCL.g:9946:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
     public final void rule__MapLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9922:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
-            // InternalCompleteOCL.g:9923:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
+            // InternalCompleteOCL.g:9950:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
+            // InternalCompleteOCL.g:9951:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__MapLiteralExpCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -30162,23 +30247,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:9930:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalCompleteOCL.g:9958:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9934:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalCompleteOCL.g:9935:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:9962:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalCompleteOCL.g:9963:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalCompleteOCL.g:9935:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalCompleteOCL.g:9936:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:9963:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:9964:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalCompleteOCL.g:9937:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalCompleteOCL.g:9937:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalCompleteOCL.g:9965:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:9965:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -30213,14 +30298,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1"
-    // InternalCompleteOCL.g:9947:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:9975:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9951:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:9952:2: rule__MapLiteralExpCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:9979:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:9980:2: rule__MapLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2__1__Impl();
@@ -30246,22 +30331,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:9958:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalCompleteOCL.g:9986:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__MapLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9962:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalCompleteOCL.g:9963:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:9990:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalCompleteOCL.g:9991:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalCompleteOCL.g:9963:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
-            // InternalCompleteOCL.g:9964:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:9991:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:9992:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalCompleteOCL.g:9965:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:9993:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             loop91:
             do {
                 int alt91=2;
@@ -30274,9 +30359,9 @@
 
                 switch (alt91) {
             	case 1 :
-            	    // InternalCompleteOCL.g:9965:2: rule__MapLiteralExpCS__Group_2_1__0
+            	    // InternalCompleteOCL.g:9993:2: rule__MapLiteralExpCS__Group_2_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__MapLiteralExpCS__Group_2_1__0();
 
             	    state._fsp--;
@@ -30315,14 +30400,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0"
-    // InternalCompleteOCL.g:9979:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
+    // InternalCompleteOCL.g:10007:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
     public final void rule__MapLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9983:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
-            // InternalCompleteOCL.g:9984:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
+            // InternalCompleteOCL.g:10011:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
+            // InternalCompleteOCL.g:10012:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__MapLiteralExpCS__Group_2_1__0__Impl();
@@ -30353,17 +30438,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0__Impl"
-    // InternalCompleteOCL.g:9991:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:10019:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:9995:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:9996:1: ( ',' )
+            // InternalCompleteOCL.g:10023:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:10024:1: ( ',' )
             {
-            // InternalCompleteOCL.g:9996:1: ( ',' )
-            // InternalCompleteOCL.g:9997:1: ','
+            // InternalCompleteOCL.g:10024:1: ( ',' )
+            // InternalCompleteOCL.g:10025:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -30394,14 +30479,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1"
-    // InternalCompleteOCL.g:10010:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalCompleteOCL.g:10038:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10014:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
-            // InternalCompleteOCL.g:10015:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
+            // InternalCompleteOCL.g:10042:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
+            // InternalCompleteOCL.g:10043:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2_1__1__Impl();
@@ -30427,23 +30512,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1__Impl"
-    // InternalCompleteOCL.g:10021:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:10049:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10025:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalCompleteOCL.g:10026:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:10053:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalCompleteOCL.g:10054:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:10026:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalCompleteOCL.g:10027:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:10054:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:10055:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalCompleteOCL.g:10028:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalCompleteOCL.g:10028:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalCompleteOCL.g:10056:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:10056:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -30478,14 +30563,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0"
-    // InternalCompleteOCL.g:10042:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
+    // InternalCompleteOCL.g:10070:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
     public final void rule__MapLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10046:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
-            // InternalCompleteOCL.g:10047:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
+            // InternalCompleteOCL.g:10074:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
+            // InternalCompleteOCL.g:10075:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__MapLiteralPartCS__Group__0__Impl();
@@ -30516,23 +30601,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10054:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:10082:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
     public final void rule__MapLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10058:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
-            // InternalCompleteOCL.g:10059:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalCompleteOCL.g:10086:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
+            // InternalCompleteOCL.g:10087:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:10059:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
-            // InternalCompleteOCL.g:10060:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalCompleteOCL.g:10087:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalCompleteOCL.g:10088:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
             }
-            // InternalCompleteOCL.g:10061:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
-            // InternalCompleteOCL.g:10061:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
+            // InternalCompleteOCL.g:10089:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalCompleteOCL.g:10089:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedKeyAssignment_0();
@@ -30567,14 +30652,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1"
-    // InternalCompleteOCL.g:10071:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
+    // InternalCompleteOCL.g:10099:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
     public final void rule__MapLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10075:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
-            // InternalCompleteOCL.g:10076:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
+            // InternalCompleteOCL.g:10103:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
+            // InternalCompleteOCL.g:10104:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__MapLiteralPartCS__Group__1__Impl();
@@ -30605,17 +30690,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10083:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:10111:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
     public final void rule__MapLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10087:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:10088:1: ( '<-' )
+            // InternalCompleteOCL.g:10115:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:10116:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:10088:1: ( '<-' )
-            // InternalCompleteOCL.g:10089:1: '<-'
+            // InternalCompleteOCL.g:10116:1: ( '<-' )
+            // InternalCompleteOCL.g:10117:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
@@ -30646,14 +30731,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2"
-    // InternalCompleteOCL.g:10102:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:10130:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
     public final void rule__MapLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10106:1: ( rule__MapLiteralPartCS__Group__2__Impl )
-            // InternalCompleteOCL.g:10107:2: rule__MapLiteralPartCS__Group__2__Impl
+            // InternalCompleteOCL.g:10134:1: ( rule__MapLiteralPartCS__Group__2__Impl )
+            // InternalCompleteOCL.g:10135:2: rule__MapLiteralPartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__Group__2__Impl();
@@ -30679,23 +30764,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2__Impl"
-    // InternalCompleteOCL.g:10113:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:10141:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
     public final void rule__MapLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10117:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
-            // InternalCompleteOCL.g:10118:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalCompleteOCL.g:10145:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
+            // InternalCompleteOCL.g:10146:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:10118:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
-            // InternalCompleteOCL.g:10119:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalCompleteOCL.g:10146:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalCompleteOCL.g:10147:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
             }
-            // InternalCompleteOCL.g:10120:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
-            // InternalCompleteOCL.g:10120:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
+            // InternalCompleteOCL.g:10148:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalCompleteOCL.g:10148:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedValueAssignment_2();
@@ -30730,14 +30815,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:10136:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:10164:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
     public final void rule__TupleLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10140:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:10141:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:10168:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:10169:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TupleLiteralExpCS__Group__0__Impl();
@@ -30768,17 +30853,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10148:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
+    // InternalCompleteOCL.g:10176:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
     public final void rule__TupleLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10152:1: ( ( 'Tuple' ) )
-            // InternalCompleteOCL.g:10153:1: ( 'Tuple' )
+            // InternalCompleteOCL.g:10180:1: ( ( 'Tuple' ) )
+            // InternalCompleteOCL.g:10181:1: ( 'Tuple' )
             {
-            // InternalCompleteOCL.g:10153:1: ( 'Tuple' )
-            // InternalCompleteOCL.g:10154:1: 'Tuple'
+            // InternalCompleteOCL.g:10181:1: ( 'Tuple' )
+            // InternalCompleteOCL.g:10182:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
@@ -30809,16 +30894,16 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:10167:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
+    // InternalCompleteOCL.g:10195:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
     public final void rule__TupleLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10171:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
-            // InternalCompleteOCL.g:10172:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
+            // InternalCompleteOCL.g:10199:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
+            // InternalCompleteOCL.g:10200:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TupleLiteralExpCS__Group__1__Impl();
 
             state._fsp--;
@@ -30847,17 +30932,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10179:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:10207:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__TupleLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10183:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:10184:1: ( '{' )
+            // InternalCompleteOCL.g:10211:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:10212:1: ( '{' )
             {
-            // InternalCompleteOCL.g:10184:1: ( '{' )
-            // InternalCompleteOCL.g:10185:1: '{'
+            // InternalCompleteOCL.g:10212:1: ( '{' )
+            // InternalCompleteOCL.g:10213:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -30888,14 +30973,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2"
-    // InternalCompleteOCL.g:10198:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
+    // InternalCompleteOCL.g:10226:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
     public final void rule__TupleLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10202:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
-            // InternalCompleteOCL.g:10203:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
+            // InternalCompleteOCL.g:10230:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
+            // InternalCompleteOCL.g:10231:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__TupleLiteralExpCS__Group__2__Impl();
@@ -30926,23 +31011,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:10210:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
+    // InternalCompleteOCL.g:10238:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
     public final void rule__TupleLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10214:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
-            // InternalCompleteOCL.g:10215:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalCompleteOCL.g:10242:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
+            // InternalCompleteOCL.g:10243:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
             {
-            // InternalCompleteOCL.g:10215:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
-            // InternalCompleteOCL.g:10216:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalCompleteOCL.g:10243:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalCompleteOCL.g:10244:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
             }
-            // InternalCompleteOCL.g:10217:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
-            // InternalCompleteOCL.g:10217:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
+            // InternalCompleteOCL.g:10245:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalCompleteOCL.g:10245:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_2();
@@ -30977,14 +31062,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3"
-    // InternalCompleteOCL.g:10227:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
+    // InternalCompleteOCL.g:10255:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
     public final void rule__TupleLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10231:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
-            // InternalCompleteOCL.g:10232:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
+            // InternalCompleteOCL.g:10259:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
+            // InternalCompleteOCL.g:10260:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__TupleLiteralExpCS__Group__3__Impl();
@@ -31015,22 +31100,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:10239:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
+    // InternalCompleteOCL.g:10267:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
     public final void rule__TupleLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10243:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
-            // InternalCompleteOCL.g:10244:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalCompleteOCL.g:10271:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
+            // InternalCompleteOCL.g:10272:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
             {
-            // InternalCompleteOCL.g:10244:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
-            // InternalCompleteOCL.g:10245:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalCompleteOCL.g:10272:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalCompleteOCL.g:10273:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
             }
-            // InternalCompleteOCL.g:10246:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalCompleteOCL.g:10274:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             loop92:
             do {
                 int alt92=2;
@@ -31043,9 +31128,9 @@
 
                 switch (alt92) {
             	case 1 :
-            	    // InternalCompleteOCL.g:10246:2: rule__TupleLiteralExpCS__Group_3__0
+            	    // InternalCompleteOCL.g:10274:2: rule__TupleLiteralExpCS__Group_3__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TupleLiteralExpCS__Group_3__0();
 
             	    state._fsp--;
@@ -31084,14 +31169,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4"
-    // InternalCompleteOCL.g:10256:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:10284:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
     public final void rule__TupleLiteralExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10260:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
-            // InternalCompleteOCL.g:10261:2: rule__TupleLiteralExpCS__Group__4__Impl
+            // InternalCompleteOCL.g:10288:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
+            // InternalCompleteOCL.g:10289:2: rule__TupleLiteralExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group__4__Impl();
@@ -31117,17 +31202,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4__Impl"
-    // InternalCompleteOCL.g:10267:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:10295:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
     public final void rule__TupleLiteralExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10271:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:10272:1: ( '}' )
+            // InternalCompleteOCL.g:10299:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:10300:1: ( '}' )
             {
-            // InternalCompleteOCL.g:10272:1: ( '}' )
-            // InternalCompleteOCL.g:10273:1: '}'
+            // InternalCompleteOCL.g:10300:1: ( '}' )
+            // InternalCompleteOCL.g:10301:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
@@ -31158,16 +31243,16 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0"
-    // InternalCompleteOCL.g:10296:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
+    // InternalCompleteOCL.g:10324:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
     public final void rule__TupleLiteralExpCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10300:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
-            // InternalCompleteOCL.g:10301:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
+            // InternalCompleteOCL.g:10328:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
+            // InternalCompleteOCL.g:10329:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__TupleLiteralExpCS__Group_3__0__Impl();
 
             state._fsp--;
@@ -31196,17 +31281,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0__Impl"
-    // InternalCompleteOCL.g:10308:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:10336:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
     public final void rule__TupleLiteralExpCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10312:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:10313:1: ( ',' )
+            // InternalCompleteOCL.g:10340:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:10341:1: ( ',' )
             {
-            // InternalCompleteOCL.g:10313:1: ( ',' )
-            // InternalCompleteOCL.g:10314:1: ','
+            // InternalCompleteOCL.g:10341:1: ( ',' )
+            // InternalCompleteOCL.g:10342:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
@@ -31237,14 +31322,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1"
-    // InternalCompleteOCL.g:10327:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
+    // InternalCompleteOCL.g:10355:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
     public final void rule__TupleLiteralExpCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10331:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
-            // InternalCompleteOCL.g:10332:2: rule__TupleLiteralExpCS__Group_3__1__Impl
+            // InternalCompleteOCL.g:10359:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
+            // InternalCompleteOCL.g:10360:2: rule__TupleLiteralExpCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group_3__1__Impl();
@@ -31270,23 +31355,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1__Impl"
-    // InternalCompleteOCL.g:10338:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
+    // InternalCompleteOCL.g:10366:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
     public final void rule__TupleLiteralExpCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10342:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
-            // InternalCompleteOCL.g:10343:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalCompleteOCL.g:10370:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
+            // InternalCompleteOCL.g:10371:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
             {
-            // InternalCompleteOCL.g:10343:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
-            // InternalCompleteOCL.g:10344:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalCompleteOCL.g:10371:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalCompleteOCL.g:10372:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
             }
-            // InternalCompleteOCL.g:10345:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
-            // InternalCompleteOCL.g:10345:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
+            // InternalCompleteOCL.g:10373:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalCompleteOCL.g:10373:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1();
@@ -31321,14 +31406,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0"
-    // InternalCompleteOCL.g:10359:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
+    // InternalCompleteOCL.g:10387:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
     public final void rule__TupleLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10363:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
-            // InternalCompleteOCL.g:10364:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
+            // InternalCompleteOCL.g:10391:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
+            // InternalCompleteOCL.g:10392:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__TupleLiteralPartCS__Group__0__Impl();
@@ -31359,23 +31444,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10371:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:10399:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10375:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:10376:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:10403:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:10404:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:10376:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:10377:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:10404:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:10405:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:10378:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:10378:2: rule__TupleLiteralPartCS__NameAssignment_0
+            // InternalCompleteOCL.g:10406:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:10406:2: rule__TupleLiteralPartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__NameAssignment_0();
@@ -31410,14 +31495,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1"
-    // InternalCompleteOCL.g:10388:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
+    // InternalCompleteOCL.g:10416:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
     public final void rule__TupleLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10392:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
-            // InternalCompleteOCL.g:10393:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
+            // InternalCompleteOCL.g:10420:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
+            // InternalCompleteOCL.g:10421:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__TupleLiteralPartCS__Group__1__Impl();
@@ -31448,22 +31533,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10400:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:10428:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
     public final void rule__TupleLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10404:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:10405:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:10432:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:10433:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:10405:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:10406:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalCompleteOCL.g:10433:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:10434:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:10407:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalCompleteOCL.g:10435:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             int alt93=2;
             int LA93_0 = input.LA(1);
 
@@ -31472,7 +31557,7 @@
             }
             switch (alt93) {
                 case 1 :
-                    // InternalCompleteOCL.g:10407:2: rule__TupleLiteralPartCS__Group_1__0
+                    // InternalCompleteOCL.g:10435:2: rule__TupleLiteralPartCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleLiteralPartCS__Group_1__0();
@@ -31510,14 +31595,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2"
-    // InternalCompleteOCL.g:10417:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
+    // InternalCompleteOCL.g:10445:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
     public final void rule__TupleLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10421:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
-            // InternalCompleteOCL.g:10422:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
+            // InternalCompleteOCL.g:10449:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
+            // InternalCompleteOCL.g:10450:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__TupleLiteralPartCS__Group__2__Impl();
@@ -31548,17 +31633,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2__Impl"
-    // InternalCompleteOCL.g:10429:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:10457:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
     public final void rule__TupleLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10433:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:10434:1: ( '=' )
+            // InternalCompleteOCL.g:10461:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:10462:1: ( '=' )
             {
-            // InternalCompleteOCL.g:10434:1: ( '=' )
-            // InternalCompleteOCL.g:10435:1: '='
+            // InternalCompleteOCL.g:10462:1: ( '=' )
+            // InternalCompleteOCL.g:10463:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
@@ -31589,14 +31674,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3"
-    // InternalCompleteOCL.g:10448:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:10476:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
     public final void rule__TupleLiteralPartCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10452:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
-            // InternalCompleteOCL.g:10453:2: rule__TupleLiteralPartCS__Group__3__Impl
+            // InternalCompleteOCL.g:10480:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
+            // InternalCompleteOCL.g:10481:2: rule__TupleLiteralPartCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group__3__Impl();
@@ -31622,23 +31707,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3__Impl"
-    // InternalCompleteOCL.g:10459:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
+    // InternalCompleteOCL.g:10487:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10463:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
-            // InternalCompleteOCL.g:10464:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalCompleteOCL.g:10491:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
+            // InternalCompleteOCL.g:10492:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
             {
-            // InternalCompleteOCL.g:10464:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
-            // InternalCompleteOCL.g:10465:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalCompleteOCL.g:10492:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalCompleteOCL.g:10493:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
             }
-            // InternalCompleteOCL.g:10466:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
-            // InternalCompleteOCL.g:10466:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
+            // InternalCompleteOCL.g:10494:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalCompleteOCL.g:10494:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3();
@@ -31673,16 +31758,16 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0"
-    // InternalCompleteOCL.g:10484:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
+    // InternalCompleteOCL.g:10512:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
     public final void rule__TupleLiteralPartCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10488:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
-            // InternalCompleteOCL.g:10489:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
+            // InternalCompleteOCL.g:10516:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
+            // InternalCompleteOCL.g:10517:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__TupleLiteralPartCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -31711,17 +31796,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:10496:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:10524:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__TupleLiteralPartCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10500:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:10501:1: ( ':' )
+            // InternalCompleteOCL.g:10528:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:10529:1: ( ':' )
             {
-            // InternalCompleteOCL.g:10501:1: ( ':' )
-            // InternalCompleteOCL.g:10502:1: ':'
+            // InternalCompleteOCL.g:10529:1: ( ':' )
+            // InternalCompleteOCL.g:10530:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
@@ -31752,14 +31837,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1"
-    // InternalCompleteOCL.g:10515:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:10543:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
     public final void rule__TupleLiteralPartCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10519:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:10520:2: rule__TupleLiteralPartCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:10547:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:10548:2: rule__TupleLiteralPartCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group_1__1__Impl();
@@ -31785,23 +31870,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:10526:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:10554:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__TupleLiteralPartCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10530:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:10531:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:10558:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:10559:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:10531:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
-            // InternalCompleteOCL.g:10532:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:10559:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:10560:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalCompleteOCL.g:10533:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
-            // InternalCompleteOCL.g:10533:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
+            // InternalCompleteOCL.g:10561:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:10561:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1();
@@ -31836,14 +31921,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:10547:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:10575:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10551:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:10552:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:10579:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:10580:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl();
@@ -31874,23 +31959,23 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10559:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:10587:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10563:1: ( ( () ) )
-            // InternalCompleteOCL.g:10564:1: ( () )
+            // InternalCompleteOCL.g:10591:1: ( ( () ) )
+            // InternalCompleteOCL.g:10592:1: ( () )
             {
-            // InternalCompleteOCL.g:10564:1: ( () )
-            // InternalCompleteOCL.g:10565:1: ()
+            // InternalCompleteOCL.g:10592:1: ( () )
+            // InternalCompleteOCL.g:10593:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
             }
-            // InternalCompleteOCL.g:10566:1: ()
-            // InternalCompleteOCL.g:10568:1:
+            // InternalCompleteOCL.g:10594:1: ()
+            // InternalCompleteOCL.g:10596:1:
             {
             }
 
@@ -31915,14 +32000,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:10578:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:10606:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10582:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
-            // InternalCompleteOCL.g:10583:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
+            // InternalCompleteOCL.g:10610:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
+            // InternalCompleteOCL.g:10611:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl();
@@ -31948,17 +32033,17 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10589:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
+    // InternalCompleteOCL.g:10617:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10593:1: ( ( '*' ) )
-            // InternalCompleteOCL.g:10594:1: ( '*' )
+            // InternalCompleteOCL.g:10621:1: ( ( '*' ) )
+            // InternalCompleteOCL.g:10622:1: ( '*' )
             {
-            // InternalCompleteOCL.g:10594:1: ( '*' )
-            // InternalCompleteOCL.g:10595:1: '*'
+            // InternalCompleteOCL.g:10622:1: ( '*' )
+            // InternalCompleteOCL.g:10623:1: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
@@ -31989,14 +32074,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:10612:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:10640:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
     public final void rule__InvalidLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10616:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:10617:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:10644:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:10645:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__InvalidLiteralExpCS__Group__0__Impl();
@@ -32027,23 +32112,23 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10624:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:10652:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__InvalidLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10628:1: ( ( () ) )
-            // InternalCompleteOCL.g:10629:1: ( () )
+            // InternalCompleteOCL.g:10656:1: ( ( () ) )
+            // InternalCompleteOCL.g:10657:1: ( () )
             {
-            // InternalCompleteOCL.g:10629:1: ( () )
-            // InternalCompleteOCL.g:10630:1: ()
+            // InternalCompleteOCL.g:10657:1: ( () )
+            // InternalCompleteOCL.g:10658:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
             }
-            // InternalCompleteOCL.g:10631:1: ()
-            // InternalCompleteOCL.g:10633:1:
+            // InternalCompleteOCL.g:10659:1: ()
+            // InternalCompleteOCL.g:10661:1:
             {
             }
 
@@ -32068,14 +32153,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:10643:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:10671:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
     public final void rule__InvalidLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10647:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
-            // InternalCompleteOCL.g:10648:2: rule__InvalidLiteralExpCS__Group__1__Impl
+            // InternalCompleteOCL.g:10675:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
+            // InternalCompleteOCL.g:10676:2: rule__InvalidLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvalidLiteralExpCS__Group__1__Impl();
@@ -32101,17 +32186,17 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10654:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
+    // InternalCompleteOCL.g:10682:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
     public final void rule__InvalidLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10658:1: ( ( 'invalid' ) )
-            // InternalCompleteOCL.g:10659:1: ( 'invalid' )
+            // InternalCompleteOCL.g:10686:1: ( ( 'invalid' ) )
+            // InternalCompleteOCL.g:10687:1: ( 'invalid' )
             {
-            // InternalCompleteOCL.g:10659:1: ( 'invalid' )
-            // InternalCompleteOCL.g:10660:1: 'invalid'
+            // InternalCompleteOCL.g:10687:1: ( 'invalid' )
+            // InternalCompleteOCL.g:10688:1: 'invalid'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
@@ -32142,14 +32227,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0"
-    // InternalCompleteOCL.g:10677:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
+    // InternalCompleteOCL.g:10705:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
     public final void rule__NullLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10681:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
-            // InternalCompleteOCL.g:10682:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
+            // InternalCompleteOCL.g:10709:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
+            // InternalCompleteOCL.g:10710:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_53);
             rule__NullLiteralExpCS__Group__0__Impl();
@@ -32180,23 +32265,23 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10689:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:10717:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__NullLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10693:1: ( ( () ) )
-            // InternalCompleteOCL.g:10694:1: ( () )
+            // InternalCompleteOCL.g:10721:1: ( ( () ) )
+            // InternalCompleteOCL.g:10722:1: ( () )
             {
-            // InternalCompleteOCL.g:10694:1: ( () )
-            // InternalCompleteOCL.g:10695:1: ()
+            // InternalCompleteOCL.g:10722:1: ( () )
+            // InternalCompleteOCL.g:10723:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
             }
-            // InternalCompleteOCL.g:10696:1: ()
-            // InternalCompleteOCL.g:10698:1:
+            // InternalCompleteOCL.g:10724:1: ()
+            // InternalCompleteOCL.g:10726:1:
             {
             }
 
@@ -32221,14 +32306,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1"
-    // InternalCompleteOCL.g:10708:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:10736:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
     public final void rule__NullLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10712:1: ( rule__NullLiteralExpCS__Group__1__Impl )
-            // InternalCompleteOCL.g:10713:2: rule__NullLiteralExpCS__Group__1__Impl
+            // InternalCompleteOCL.g:10740:1: ( rule__NullLiteralExpCS__Group__1__Impl )
+            // InternalCompleteOCL.g:10741:2: rule__NullLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NullLiteralExpCS__Group__1__Impl();
@@ -32254,17 +32339,17 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10719:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
+    // InternalCompleteOCL.g:10747:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
     public final void rule__NullLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10723:1: ( ( 'null' ) )
-            // InternalCompleteOCL.g:10724:1: ( 'null' )
+            // InternalCompleteOCL.g:10751:1: ( ( 'null' ) )
+            // InternalCompleteOCL.g:10752:1: ( 'null' )
             {
-            // InternalCompleteOCL.g:10724:1: ( 'null' )
-            // InternalCompleteOCL.g:10725:1: 'null'
+            // InternalCompleteOCL.g:10752:1: ( 'null' )
+            // InternalCompleteOCL.g:10753:1: 'null'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
@@ -32295,14 +32380,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0"
-    // InternalCompleteOCL.g:10742:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
+    // InternalCompleteOCL.g:10770:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10746:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
-            // InternalCompleteOCL.g:10747:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
+            // InternalCompleteOCL.g:10774:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
+            // InternalCompleteOCL.g:10775:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__TypeLiteralWithMultiplicityCS__Group__0__Impl();
@@ -32333,17 +32418,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10754:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
+    // InternalCompleteOCL.g:10782:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10758:1: ( ( ruleTypeLiteralCS ) )
-            // InternalCompleteOCL.g:10759:1: ( ruleTypeLiteralCS )
+            // InternalCompleteOCL.g:10786:1: ( ( ruleTypeLiteralCS ) )
+            // InternalCompleteOCL.g:10787:1: ( ruleTypeLiteralCS )
             {
-            // InternalCompleteOCL.g:10759:1: ( ruleTypeLiteralCS )
-            // InternalCompleteOCL.g:10760:1: ruleTypeLiteralCS
+            // InternalCompleteOCL.g:10787:1: ( ruleTypeLiteralCS )
+            // InternalCompleteOCL.g:10788:1: ruleTypeLiteralCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());
@@ -32378,14 +32463,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1"
-    // InternalCompleteOCL.g:10771:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:10799:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10775:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
-            // InternalCompleteOCL.g:10776:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
+            // InternalCompleteOCL.g:10803:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
+            // InternalCompleteOCL.g:10804:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeLiteralWithMultiplicityCS__Group__1__Impl();
@@ -32411,22 +32496,22 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10782:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalCompleteOCL.g:10810:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10786:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalCompleteOCL.g:10787:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalCompleteOCL.g:10814:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalCompleteOCL.g:10815:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalCompleteOCL.g:10787:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalCompleteOCL.g:10788:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalCompleteOCL.g:10815:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalCompleteOCL.g:10816:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalCompleteOCL.g:10789:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalCompleteOCL.g:10817:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             int alt94=2;
             int LA94_0 = input.LA(1);
 
@@ -32435,7 +32520,7 @@
             }
             switch (alt94) {
                 case 1 :
-                    // InternalCompleteOCL.g:10789:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
+                    // InternalCompleteOCL.g:10817:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1();
@@ -32473,14 +32558,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0"
-    // InternalCompleteOCL.g:10803:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
+    // InternalCompleteOCL.g:10831:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
     public final void rule__TypeNameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10807:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
-            // InternalCompleteOCL.g:10808:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
+            // InternalCompleteOCL.g:10835:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
+            // InternalCompleteOCL.g:10836:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TypeNameExpCS__Group__0__Impl();
@@ -32511,23 +32596,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:10815:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:10843:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypeNameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10819:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:10820:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalCompleteOCL.g:10847:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:10848:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:10820:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalCompleteOCL.g:10821:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalCompleteOCL.g:10848:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalCompleteOCL.g:10849:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalCompleteOCL.g:10822:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
-            // InternalCompleteOCL.g:10822:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
+            // InternalCompleteOCL.g:10850:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalCompleteOCL.g:10850:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPathNameAssignment_0();
@@ -32562,14 +32647,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1"
-    // InternalCompleteOCL.g:10832:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:10860:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
     public final void rule__TypeNameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10836:1: ( rule__TypeNameExpCS__Group__1__Impl )
-            // InternalCompleteOCL.g:10837:2: rule__TypeNameExpCS__Group__1__Impl
+            // InternalCompleteOCL.g:10864:1: ( rule__TypeNameExpCS__Group__1__Impl )
+            // InternalCompleteOCL.g:10865:2: rule__TypeNameExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group__1__Impl();
@@ -32595,22 +32680,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:10843:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:10871:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10847:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:10848:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:10875:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:10876:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:10848:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:10849:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalCompleteOCL.g:10876:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:10877:1: ( rule__TypeNameExpCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:10850:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalCompleteOCL.g:10878:1: ( rule__TypeNameExpCS__Group_1__0 )?
             int alt95=2;
             int LA95_0 = input.LA(1);
 
@@ -32619,7 +32704,7 @@
             }
             switch (alt95) {
                 case 1 :
-                    // InternalCompleteOCL.g:10850:2: rule__TypeNameExpCS__Group_1__0
+                    // InternalCompleteOCL.g:10878:2: rule__TypeNameExpCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1__0();
@@ -32657,14 +32742,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0"
-    // InternalCompleteOCL.g:10864:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
+    // InternalCompleteOCL.g:10892:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
     public final void rule__TypeNameExpCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10868:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
-            // InternalCompleteOCL.g:10869:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
+            // InternalCompleteOCL.g:10896:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
+            // InternalCompleteOCL.g:10897:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TypeNameExpCS__Group_1__0__Impl();
@@ -32695,23 +32780,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:10876:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
+    // InternalCompleteOCL.g:10904:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
     public final void rule__TypeNameExpCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10880:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
-            // InternalCompleteOCL.g:10881:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalCompleteOCL.g:10908:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
+            // InternalCompleteOCL.g:10909:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
             {
-            // InternalCompleteOCL.g:10881:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
-            // InternalCompleteOCL.g:10882:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalCompleteOCL.g:10909:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalCompleteOCL.g:10910:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
             }
-            // InternalCompleteOCL.g:10883:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
-            // InternalCompleteOCL.g:10883:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
+            // InternalCompleteOCL.g:10911:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalCompleteOCL.g:10911:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0();
@@ -32746,14 +32831,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1"
-    // InternalCompleteOCL.g:10893:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:10921:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
     public final void rule__TypeNameExpCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10897:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:10898:2: rule__TypeNameExpCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:10925:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:10926:2: rule__TypeNameExpCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1__1__Impl();
@@ -32779,22 +32864,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:10904:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
+    // InternalCompleteOCL.g:10932:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10908:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
-            // InternalCompleteOCL.g:10909:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalCompleteOCL.g:10936:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
+            // InternalCompleteOCL.g:10937:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
             {
-            // InternalCompleteOCL.g:10909:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
-            // InternalCompleteOCL.g:10910:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalCompleteOCL.g:10937:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalCompleteOCL.g:10938:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
             }
-            // InternalCompleteOCL.g:10911:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalCompleteOCL.g:10939:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             int alt96=2;
             int LA96_0 = input.LA(1);
 
@@ -32803,7 +32888,7 @@
             }
             switch (alt96) {
                 case 1 :
-                    // InternalCompleteOCL.g:10911:2: rule__TypeNameExpCS__Group_1_1__0
+                    // InternalCompleteOCL.g:10939:2: rule__TypeNameExpCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1_1__0();
@@ -32841,14 +32926,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0"
-    // InternalCompleteOCL.g:10925:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
+    // InternalCompleteOCL.g:10953:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
     public final void rule__TypeNameExpCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10929:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
-            // InternalCompleteOCL.g:10930:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
+            // InternalCompleteOCL.g:10957:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
+            // InternalCompleteOCL.g:10958:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__TypeNameExpCS__Group_1_1__0__Impl();
@@ -32879,17 +32964,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0__Impl"
-    // InternalCompleteOCL.g:10937:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:10965:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10941:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:10942:1: ( '{' )
+            // InternalCompleteOCL.g:10969:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:10970:1: ( '{' )
             {
-            // InternalCompleteOCL.g:10942:1: ( '{' )
-            // InternalCompleteOCL.g:10943:1: '{'
+            // InternalCompleteOCL.g:10970:1: ( '{' )
+            // InternalCompleteOCL.g:10971:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
@@ -32920,14 +33005,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1"
-    // InternalCompleteOCL.g:10956:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
+    // InternalCompleteOCL.g:10984:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
     public final void rule__TypeNameExpCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10960:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
-            // InternalCompleteOCL.g:10961:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
+            // InternalCompleteOCL.g:10988:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
+            // InternalCompleteOCL.g:10989:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__TypeNameExpCS__Group_1_1__1__Impl();
@@ -32958,23 +33043,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1__Impl"
-    // InternalCompleteOCL.g:10968:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
+    // InternalCompleteOCL.g:10996:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
     public final void rule__TypeNameExpCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10972:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
-            // InternalCompleteOCL.g:10973:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalCompleteOCL.g:11000:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
+            // InternalCompleteOCL.g:11001:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
             {
-            // InternalCompleteOCL.g:10973:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
-            // InternalCompleteOCL.g:10974:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalCompleteOCL.g:11001:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalCompleteOCL.g:11002:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
             }
-            // InternalCompleteOCL.g:10975:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
-            // InternalCompleteOCL.g:10975:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
+            // InternalCompleteOCL.g:11003:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalCompleteOCL.g:11003:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1();
@@ -33009,14 +33094,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2"
-    // InternalCompleteOCL.g:10985:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
+    // InternalCompleteOCL.g:11013:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
     public final void rule__TypeNameExpCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:10989:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
-            // InternalCompleteOCL.g:10990:2: rule__TypeNameExpCS__Group_1_1__2__Impl
+            // InternalCompleteOCL.g:11017:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
+            // InternalCompleteOCL.g:11018:2: rule__TypeNameExpCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1_1__2__Impl();
@@ -33042,17 +33127,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2__Impl"
-    // InternalCompleteOCL.g:10996:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:11024:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11000:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:11001:1: ( '}' )
+            // InternalCompleteOCL.g:11028:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:11029:1: ( '}' )
             {
-            // InternalCompleteOCL.g:11001:1: ( '}' )
-            // InternalCompleteOCL.g:11002:1: '}'
+            // InternalCompleteOCL.g:11029:1: ( '}' )
+            // InternalCompleteOCL.g:11030:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
@@ -33083,14 +33168,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0"
-    // InternalCompleteOCL.g:11021:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
+    // InternalCompleteOCL.g:11049:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
     public final void rule__TypeExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11025:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
-            // InternalCompleteOCL.g:11026:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
+            // InternalCompleteOCL.g:11053:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
+            // InternalCompleteOCL.g:11054:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__TypeExpCS__Group__0__Impl();
@@ -33121,17 +33206,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:11033:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalCompleteOCL.g:11061:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__TypeExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11037:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalCompleteOCL.g:11038:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalCompleteOCL.g:11065:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalCompleteOCL.g:11066:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalCompleteOCL.g:11038:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalCompleteOCL.g:11039:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalCompleteOCL.g:11066:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalCompleteOCL.g:11067:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());
@@ -33166,14 +33251,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1"
-    // InternalCompleteOCL.g:11050:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:11078:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
     public final void rule__TypeExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11054:1: ( rule__TypeExpCS__Group__1__Impl )
-            // InternalCompleteOCL.g:11055:2: rule__TypeExpCS__Group__1__Impl
+            // InternalCompleteOCL.g:11082:1: ( rule__TypeExpCS__Group__1__Impl )
+            // InternalCompleteOCL.g:11083:2: rule__TypeExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeExpCS__Group__1__Impl();
@@ -33199,22 +33284,22 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:11061:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalCompleteOCL.g:11089:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11065:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalCompleteOCL.g:11066:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalCompleteOCL.g:11093:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalCompleteOCL.g:11094:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalCompleteOCL.g:11066:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalCompleteOCL.g:11067:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalCompleteOCL.g:11094:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalCompleteOCL.g:11095:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalCompleteOCL.g:11068:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalCompleteOCL.g:11096:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             int alt97=2;
             int LA97_0 = input.LA(1);
 
@@ -33223,7 +33308,7 @@
             }
             switch (alt97) {
                 case 1 :
-                    // InternalCompleteOCL.g:11068:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
+                    // InternalCompleteOCL.g:11096:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeExpCS__OwnedMultiplicityAssignment_1();
@@ -33261,14 +33346,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0"
-    // InternalCompleteOCL.g:11082:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
+    // InternalCompleteOCL.g:11110:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
     public final void rule__ExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11086:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
-            // InternalCompleteOCL.g:11087:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
+            // InternalCompleteOCL.g:11114:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
+            // InternalCompleteOCL.g:11115:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_55);
             rule__ExpCS__Group_0__0__Impl();
@@ -33299,17 +33384,17 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:11094:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalCompleteOCL.g:11122:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__ExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11098:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalCompleteOCL.g:11099:1: ( rulePrefixedPrimaryExpCS )
+            // InternalCompleteOCL.g:11126:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalCompleteOCL.g:11127:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalCompleteOCL.g:11099:1: ( rulePrefixedPrimaryExpCS )
-            // InternalCompleteOCL.g:11100:1: rulePrefixedPrimaryExpCS
+            // InternalCompleteOCL.g:11127:1: ( rulePrefixedPrimaryExpCS )
+            // InternalCompleteOCL.g:11128:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());
@@ -33344,14 +33429,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1"
-    // InternalCompleteOCL.g:11111:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
+    // InternalCompleteOCL.g:11139:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
     public final void rule__ExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11115:1: ( rule__ExpCS__Group_0__1__Impl )
-            // InternalCompleteOCL.g:11116:2: rule__ExpCS__Group_0__1__Impl
+            // InternalCompleteOCL.g:11143:1: ( rule__ExpCS__Group_0__1__Impl )
+            // InternalCompleteOCL.g:11144:2: rule__ExpCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0__1__Impl();
@@ -33377,22 +33462,22 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:11122:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
+    // InternalCompleteOCL.g:11150:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
     public final void rule__ExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11126:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
-            // InternalCompleteOCL.g:11127:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalCompleteOCL.g:11154:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
+            // InternalCompleteOCL.g:11155:1: ( ( rule__ExpCS__Group_0_1__0 )? )
             {
-            // InternalCompleteOCL.g:11127:1: ( ( rule__ExpCS__Group_0_1__0 )? )
-            // InternalCompleteOCL.g:11128:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalCompleteOCL.g:11155:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalCompleteOCL.g:11156:1: ( rule__ExpCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getGroup_0_1());
             }
-            // InternalCompleteOCL.g:11129:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalCompleteOCL.g:11157:1: ( rule__ExpCS__Group_0_1__0 )?
             int alt98=2;
             int LA98_0 = input.LA(1);
 
@@ -33401,7 +33486,7 @@
             }
             switch (alt98) {
                 case 1 :
-                    // InternalCompleteOCL.g:11129:2: rule__ExpCS__Group_0_1__0
+                    // InternalCompleteOCL.g:11157:2: rule__ExpCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0_1__0();
@@ -33439,14 +33524,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0"
-    // InternalCompleteOCL.g:11143:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
+    // InternalCompleteOCL.g:11171:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
     public final void rule__ExpCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11147:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
-            // InternalCompleteOCL.g:11148:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
+            // InternalCompleteOCL.g:11175:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
+            // InternalCompleteOCL.g:11176:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_55);
             rule__ExpCS__Group_0_1__0__Impl();
@@ -33477,23 +33562,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0__Impl"
-    // InternalCompleteOCL.g:11155:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:11183:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
     public final void rule__ExpCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11159:1: ( ( () ) )
-            // InternalCompleteOCL.g:11160:1: ( () )
+            // InternalCompleteOCL.g:11187:1: ( ( () ) )
+            // InternalCompleteOCL.g:11188:1: ( () )
             {
-            // InternalCompleteOCL.g:11160:1: ( () )
-            // InternalCompleteOCL.g:11161:1: ()
+            // InternalCompleteOCL.g:11188:1: ( () )
+            // InternalCompleteOCL.g:11189:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
             }
-            // InternalCompleteOCL.g:11162:1: ()
-            // InternalCompleteOCL.g:11164:1:
+            // InternalCompleteOCL.g:11190:1: ()
+            // InternalCompleteOCL.g:11192:1:
             {
             }
 
@@ -33518,14 +33603,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1"
-    // InternalCompleteOCL.g:11174:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
+    // InternalCompleteOCL.g:11202:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
     public final void rule__ExpCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11178:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
-            // InternalCompleteOCL.g:11179:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
+            // InternalCompleteOCL.g:11206:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
+            // InternalCompleteOCL.g:11207:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__ExpCS__Group_0_1__1__Impl();
@@ -33556,23 +33641,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1__Impl"
-    // InternalCompleteOCL.g:11186:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
+    // InternalCompleteOCL.g:11214:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
     public final void rule__ExpCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11190:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
-            // InternalCompleteOCL.g:11191:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalCompleteOCL.g:11218:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
+            // InternalCompleteOCL.g:11219:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
             {
-            // InternalCompleteOCL.g:11191:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
-            // InternalCompleteOCL.g:11192:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalCompleteOCL.g:11219:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalCompleteOCL.g:11220:1: ( rule__ExpCS__NameAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
             }
-            // InternalCompleteOCL.g:11193:1: ( rule__ExpCS__NameAssignment_0_1_1 )
-            // InternalCompleteOCL.g:11193:2: rule__ExpCS__NameAssignment_0_1_1
+            // InternalCompleteOCL.g:11221:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalCompleteOCL.g:11221:2: rule__ExpCS__NameAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__NameAssignment_0_1_1();
@@ -33607,14 +33692,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2"
-    // InternalCompleteOCL.g:11203:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
+    // InternalCompleteOCL.g:11231:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
     public final void rule__ExpCS__Group_0_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11207:1: ( rule__ExpCS__Group_0_1__2__Impl )
-            // InternalCompleteOCL.g:11208:2: rule__ExpCS__Group_0_1__2__Impl
+            // InternalCompleteOCL.g:11235:1: ( rule__ExpCS__Group_0_1__2__Impl )
+            // InternalCompleteOCL.g:11236:2: rule__ExpCS__Group_0_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0_1__2__Impl();
@@ -33640,23 +33725,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2__Impl"
-    // InternalCompleteOCL.g:11214:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
+    // InternalCompleteOCL.g:11242:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
     public final void rule__ExpCS__Group_0_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11218:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
-            // InternalCompleteOCL.g:11219:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalCompleteOCL.g:11246:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
+            // InternalCompleteOCL.g:11247:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
             {
-            // InternalCompleteOCL.g:11219:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
-            // InternalCompleteOCL.g:11220:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalCompleteOCL.g:11247:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalCompleteOCL.g:11248:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
             }
-            // InternalCompleteOCL.g:11221:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
-            // InternalCompleteOCL.g:11221:2: rule__ExpCS__OwnedRightAssignment_0_1_2
+            // InternalCompleteOCL.g:11249:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalCompleteOCL.g:11249:2: rule__ExpCS__OwnedRightAssignment_0_1_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__OwnedRightAssignment_0_1_2();
@@ -33691,14 +33776,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0"
-    // InternalCompleteOCL.g:11237:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
+    // InternalCompleteOCL.g:11265:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
     public final void rule__PrefixedLetExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11241:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
-            // InternalCompleteOCL.g:11242:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
+            // InternalCompleteOCL.g:11269:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
+            // InternalCompleteOCL.g:11270:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__PrefixedLetExpCS__Group_0__0__Impl();
@@ -33729,23 +33814,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:11249:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:11277:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedLetExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11253:1: ( ( () ) )
-            // InternalCompleteOCL.g:11254:1: ( () )
+            // InternalCompleteOCL.g:11281:1: ( ( () ) )
+            // InternalCompleteOCL.g:11282:1: ( () )
             {
-            // InternalCompleteOCL.g:11254:1: ( () )
-            // InternalCompleteOCL.g:11255:1: ()
+            // InternalCompleteOCL.g:11282:1: ( () )
+            // InternalCompleteOCL.g:11283:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalCompleteOCL.g:11256:1: ()
-            // InternalCompleteOCL.g:11258:1:
+            // InternalCompleteOCL.g:11284:1: ()
+            // InternalCompleteOCL.g:11286:1:
             {
             }
 
@@ -33770,14 +33855,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1"
-    // InternalCompleteOCL.g:11268:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
+    // InternalCompleteOCL.g:11296:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
     public final void rule__PrefixedLetExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11272:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
-            // InternalCompleteOCL.g:11273:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
+            // InternalCompleteOCL.g:11300:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
+            // InternalCompleteOCL.g:11301:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__PrefixedLetExpCS__Group_0__1__Impl();
@@ -33808,23 +33893,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:11280:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
+    // InternalCompleteOCL.g:11308:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11284:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
-            // InternalCompleteOCL.g:11285:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalCompleteOCL.g:11312:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
+            // InternalCompleteOCL.g:11313:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
             {
-            // InternalCompleteOCL.g:11285:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
-            // InternalCompleteOCL.g:11286:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalCompleteOCL.g:11313:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalCompleteOCL.g:11314:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalCompleteOCL.g:11287:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
-            // InternalCompleteOCL.g:11287:2: rule__PrefixedLetExpCS__NameAssignment_0_1
+            // InternalCompleteOCL.g:11315:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalCompleteOCL.g:11315:2: rule__PrefixedLetExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__NameAssignment_0_1();
@@ -33859,14 +33944,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2"
-    // InternalCompleteOCL.g:11297:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
+    // InternalCompleteOCL.g:11325:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedLetExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11301:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
-            // InternalCompleteOCL.g:11302:2: rule__PrefixedLetExpCS__Group_0__2__Impl
+            // InternalCompleteOCL.g:11329:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
+            // InternalCompleteOCL.g:11330:2: rule__PrefixedLetExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__Group_0__2__Impl();
@@ -33892,23 +33977,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2__Impl"
-    // InternalCompleteOCL.g:11308:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalCompleteOCL.g:11336:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11312:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalCompleteOCL.g:11313:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalCompleteOCL.g:11340:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalCompleteOCL.g:11341:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalCompleteOCL.g:11313:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalCompleteOCL.g:11314:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalCompleteOCL.g:11341:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalCompleteOCL.g:11342:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalCompleteOCL.g:11315:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
-            // InternalCompleteOCL.g:11315:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
+            // InternalCompleteOCL.g:11343:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalCompleteOCL.g:11343:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__OwnedRightAssignment_0_2();
@@ -33943,14 +34028,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0"
-    // InternalCompleteOCL.g:11331:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
+    // InternalCompleteOCL.g:11359:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11335:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
-            // InternalCompleteOCL.g:11336:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
+            // InternalCompleteOCL.g:11363:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
+            // InternalCompleteOCL.g:11364:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__PrefixedPrimaryExpCS__Group_0__0__Impl();
@@ -33981,23 +34066,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:11343:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:11371:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11347:1: ( ( () ) )
-            // InternalCompleteOCL.g:11348:1: ( () )
+            // InternalCompleteOCL.g:11375:1: ( ( () ) )
+            // InternalCompleteOCL.g:11376:1: ( () )
             {
-            // InternalCompleteOCL.g:11348:1: ( () )
-            // InternalCompleteOCL.g:11349:1: ()
+            // InternalCompleteOCL.g:11376:1: ( () )
+            // InternalCompleteOCL.g:11377:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalCompleteOCL.g:11350:1: ()
-            // InternalCompleteOCL.g:11352:1:
+            // InternalCompleteOCL.g:11378:1: ()
+            // InternalCompleteOCL.g:11380:1:
             {
             }
 
@@ -34022,16 +34107,16 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1"
-    // InternalCompleteOCL.g:11362:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
+    // InternalCompleteOCL.g:11390:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11366:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
-            // InternalCompleteOCL.g:11367:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
+            // InternalCompleteOCL.g:11394:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
+            // InternalCompleteOCL.g:11395:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
             {
-            pushFollow(FollowSets000.FOLLOW_57);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__PrefixedPrimaryExpCS__Group_0__1__Impl();
 
             state._fsp--;
@@ -34060,23 +34145,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:11374:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
+    // InternalCompleteOCL.g:11402:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11378:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
-            // InternalCompleteOCL.g:11379:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalCompleteOCL.g:11406:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
+            // InternalCompleteOCL.g:11407:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
             {
-            // InternalCompleteOCL.g:11379:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
-            // InternalCompleteOCL.g:11380:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalCompleteOCL.g:11407:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalCompleteOCL.g:11408:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalCompleteOCL.g:11381:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
-            // InternalCompleteOCL.g:11381:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
+            // InternalCompleteOCL.g:11409:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalCompleteOCL.g:11409:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__NameAssignment_0_1();
@@ -34111,14 +34196,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2"
-    // InternalCompleteOCL.g:11391:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
+    // InternalCompleteOCL.g:11419:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11395:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
-            // InternalCompleteOCL.g:11396:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
+            // InternalCompleteOCL.g:11423:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
+            // InternalCompleteOCL.g:11424:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__Group_0__2__Impl();
@@ -34144,23 +34229,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2__Impl"
-    // InternalCompleteOCL.g:11402:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalCompleteOCL.g:11430:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11406:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalCompleteOCL.g:11407:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalCompleteOCL.g:11434:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalCompleteOCL.g:11435:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalCompleteOCL.g:11407:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalCompleteOCL.g:11408:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalCompleteOCL.g:11435:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalCompleteOCL.g:11436:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalCompleteOCL.g:11409:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
-            // InternalCompleteOCL.g:11409:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
+            // InternalCompleteOCL.g:11437:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalCompleteOCL.g:11437:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2();
@@ -34195,16 +34280,16 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0"
-    // InternalCompleteOCL.g:11425:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
+    // InternalCompleteOCL.g:11453:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
     public final void rule__NameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11429:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
-            // InternalCompleteOCL.g:11430:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
+            // InternalCompleteOCL.g:11457:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
+            // InternalCompleteOCL.g:11458:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_58);
+            pushFollow(FollowSets000.FOLLOW_57);
             rule__NameExpCS__Group__0__Impl();
 
             state._fsp--;
@@ -34233,23 +34318,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:11437:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:11465:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__NameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11441:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:11442:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalCompleteOCL.g:11469:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:11470:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:11442:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalCompleteOCL.g:11443:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalCompleteOCL.g:11470:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalCompleteOCL.g:11471:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalCompleteOCL.g:11444:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
-            // InternalCompleteOCL.g:11444:2: rule__NameExpCS__OwnedPathNameAssignment_0
+            // InternalCompleteOCL.g:11472:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalCompleteOCL.g:11472:2: rule__NameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__OwnedPathNameAssignment_0();
@@ -34284,16 +34369,16 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1"
-    // InternalCompleteOCL.g:11454:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
+    // InternalCompleteOCL.g:11482:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
     public final void rule__NameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11458:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
-            // InternalCompleteOCL.g:11459:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
+            // InternalCompleteOCL.g:11486:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
+            // InternalCompleteOCL.g:11487:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_58);
+            pushFollow(FollowSets000.FOLLOW_57);
             rule__NameExpCS__Group__1__Impl();
 
             state._fsp--;
@@ -34322,22 +34407,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:11466:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
+    // InternalCompleteOCL.g:11494:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
     public final void rule__NameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11470:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
-            // InternalCompleteOCL.g:11471:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalCompleteOCL.g:11498:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
+            // InternalCompleteOCL.g:11499:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
             {
-            // InternalCompleteOCL.g:11471:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
-            // InternalCompleteOCL.g:11472:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalCompleteOCL.g:11499:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalCompleteOCL.g:11500:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
             }
-            // InternalCompleteOCL.g:11473:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalCompleteOCL.g:11501:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             loop99:
             do {
                 int alt99=2;
@@ -34350,9 +34435,9 @@
 
                 switch (alt99) {
             	case 1 :
-            	    // InternalCompleteOCL.g:11473:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
+            	    // InternalCompleteOCL.g:11501:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_59);
+            	    pushFollow(FollowSets000.FOLLOW_58);
             	    rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1();
 
             	    state._fsp--;
@@ -34391,16 +34476,16 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2"
-    // InternalCompleteOCL.g:11483:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
+    // InternalCompleteOCL.g:11511:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
     public final void rule__NameExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11487:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
-            // InternalCompleteOCL.g:11488:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
+            // InternalCompleteOCL.g:11515:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
+            // InternalCompleteOCL.g:11516:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_58);
+            pushFollow(FollowSets000.FOLLOW_57);
             rule__NameExpCS__Group__2__Impl();
 
             state._fsp--;
@@ -34429,22 +34514,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:11495:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
+    // InternalCompleteOCL.g:11523:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
     public final void rule__NameExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11499:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
-            // InternalCompleteOCL.g:11500:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalCompleteOCL.g:11527:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
+            // InternalCompleteOCL.g:11528:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
             {
-            // InternalCompleteOCL.g:11500:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
-            // InternalCompleteOCL.g:11501:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalCompleteOCL.g:11528:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalCompleteOCL.g:11529:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
             }
-            // InternalCompleteOCL.g:11502:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalCompleteOCL.g:11530:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             int alt100=2;
             int LA100_0 = input.LA(1);
 
@@ -34453,7 +34538,7 @@
             }
             switch (alt100) {
                 case 1 :
-                    // InternalCompleteOCL.g:11502:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
+                    // InternalCompleteOCL.g:11530:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2();
@@ -34491,16 +34576,16 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3"
-    // InternalCompleteOCL.g:11512:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
+    // InternalCompleteOCL.g:11540:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
     public final void rule__NameExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11516:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
-            // InternalCompleteOCL.g:11517:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
+            // InternalCompleteOCL.g:11544:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
+            // InternalCompleteOCL.g:11545:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_58);
+            pushFollow(FollowSets000.FOLLOW_57);
             rule__NameExpCS__Group__3__Impl();
 
             state._fsp--;
@@ -34529,22 +34614,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:11524:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
+    // InternalCompleteOCL.g:11552:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
     public final void rule__NameExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11528:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
-            // InternalCompleteOCL.g:11529:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalCompleteOCL.g:11556:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
+            // InternalCompleteOCL.g:11557:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
             {
-            // InternalCompleteOCL.g:11529:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
-            // InternalCompleteOCL.g:11530:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalCompleteOCL.g:11557:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalCompleteOCL.g:11558:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
             }
-            // InternalCompleteOCL.g:11531:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalCompleteOCL.g:11559:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             int alt101=2;
             int LA101_0 = input.LA(1);
 
@@ -34553,7 +34638,7 @@
             }
             switch (alt101) {
                 case 1 :
-                    // InternalCompleteOCL.g:11531:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
+                    // InternalCompleteOCL.g:11559:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3();
@@ -34591,14 +34676,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4"
-    // InternalCompleteOCL.g:11541:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:11569:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
     public final void rule__NameExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11545:1: ( rule__NameExpCS__Group__4__Impl )
-            // InternalCompleteOCL.g:11546:2: rule__NameExpCS__Group__4__Impl
+            // InternalCompleteOCL.g:11573:1: ( rule__NameExpCS__Group__4__Impl )
+            // InternalCompleteOCL.g:11574:2: rule__NameExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group__4__Impl();
@@ -34624,22 +34709,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4__Impl"
-    // InternalCompleteOCL.g:11552:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
+    // InternalCompleteOCL.g:11580:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
     public final void rule__NameExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11556:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
-            // InternalCompleteOCL.g:11557:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalCompleteOCL.g:11584:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
+            // InternalCompleteOCL.g:11585:1: ( ( rule__NameExpCS__Group_4__0 )? )
             {
-            // InternalCompleteOCL.g:11557:1: ( ( rule__NameExpCS__Group_4__0 )? )
-            // InternalCompleteOCL.g:11558:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalCompleteOCL.g:11585:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalCompleteOCL.g:11586:1: ( rule__NameExpCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getGroup_4());
             }
-            // InternalCompleteOCL.g:11559:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalCompleteOCL.g:11587:1: ( rule__NameExpCS__Group_4__0 )?
             int alt102=2;
             int LA102_0 = input.LA(1);
 
@@ -34648,7 +34733,7 @@
             }
             switch (alt102) {
                 case 1 :
-                    // InternalCompleteOCL.g:11559:2: rule__NameExpCS__Group_4__0
+                    // InternalCompleteOCL.g:11587:2: rule__NameExpCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__Group_4__0();
@@ -34686,16 +34771,16 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0"
-    // InternalCompleteOCL.g:11579:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
+    // InternalCompleteOCL.g:11607:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
     public final void rule__NameExpCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11583:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
-            // InternalCompleteOCL.g:11584:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
+            // InternalCompleteOCL.g:11611:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
+            // InternalCompleteOCL.g:11612:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
             {
-            pushFollow(FollowSets000.FOLLOW_60);
+            pushFollow(FollowSets000.FOLLOW_59);
             rule__NameExpCS__Group_4__0__Impl();
 
             state._fsp--;
@@ -34724,23 +34809,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0__Impl"
-    // InternalCompleteOCL.g:11591:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
+    // InternalCompleteOCL.g:11619:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
     public final void rule__NameExpCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11595:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
-            // InternalCompleteOCL.g:11596:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalCompleteOCL.g:11623:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
+            // InternalCompleteOCL.g:11624:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
             {
-            // InternalCompleteOCL.g:11596:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
-            // InternalCompleteOCL.g:11597:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalCompleteOCL.g:11624:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalCompleteOCL.g:11625:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
             }
-            // InternalCompleteOCL.g:11598:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
-            // InternalCompleteOCL.g:11598:2: rule__NameExpCS__IsPreAssignment_4_0
+            // InternalCompleteOCL.g:11626:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalCompleteOCL.g:11626:2: rule__NameExpCS__IsPreAssignment_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__IsPreAssignment_4_0();
@@ -34775,14 +34860,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1"
-    // InternalCompleteOCL.g:11608:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
+    // InternalCompleteOCL.g:11636:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
     public final void rule__NameExpCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11612:1: ( rule__NameExpCS__Group_4__1__Impl )
-            // InternalCompleteOCL.g:11613:2: rule__NameExpCS__Group_4__1__Impl
+            // InternalCompleteOCL.g:11640:1: ( rule__NameExpCS__Group_4__1__Impl )
+            // InternalCompleteOCL.g:11641:2: rule__NameExpCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group_4__1__Impl();
@@ -34808,17 +34893,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1__Impl"
-    // InternalCompleteOCL.g:11619:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
+    // InternalCompleteOCL.g:11647:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
     public final void rule__NameExpCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11623:1: ( ( 'pre' ) )
-            // InternalCompleteOCL.g:11624:1: ( 'pre' )
+            // InternalCompleteOCL.g:11651:1: ( ( 'pre' ) )
+            // InternalCompleteOCL.g:11652:1: ( 'pre' )
             {
-            // InternalCompleteOCL.g:11624:1: ( 'pre' )
-            // InternalCompleteOCL.g:11625:1: 'pre'
+            // InternalCompleteOCL.g:11652:1: ( 'pre' )
+            // InternalCompleteOCL.g:11653:1: 'pre'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
@@ -34849,14 +34934,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0"
-    // InternalCompleteOCL.g:11642:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
+    // InternalCompleteOCL.g:11670:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
     public final void rule__CurlyBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11646:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
-            // InternalCompleteOCL.g:11647:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
+            // InternalCompleteOCL.g:11674:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
+            // InternalCompleteOCL.g:11675:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__CurlyBracketedClauseCS__Group__0__Impl();
@@ -34887,23 +34972,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0__Impl"
-    // InternalCompleteOCL.g:11654:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:11682:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__CurlyBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11658:1: ( ( () ) )
-            // InternalCompleteOCL.g:11659:1: ( () )
+            // InternalCompleteOCL.g:11686:1: ( ( () ) )
+            // InternalCompleteOCL.g:11687:1: ( () )
             {
-            // InternalCompleteOCL.g:11659:1: ( () )
-            // InternalCompleteOCL.g:11660:1: ()
+            // InternalCompleteOCL.g:11687:1: ( () )
+            // InternalCompleteOCL.g:11688:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
             }
-            // InternalCompleteOCL.g:11661:1: ()
-            // InternalCompleteOCL.g:11663:1:
+            // InternalCompleteOCL.g:11689:1: ()
+            // InternalCompleteOCL.g:11691:1:
             {
             }
 
@@ -34928,16 +35013,16 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1"
-    // InternalCompleteOCL.g:11673:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
+    // InternalCompleteOCL.g:11701:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
     public final void rule__CurlyBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11677:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
-            // InternalCompleteOCL.g:11678:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
+            // InternalCompleteOCL.g:11705:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
+            // InternalCompleteOCL.g:11706:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_61);
+            pushFollow(FollowSets000.FOLLOW_60);
             rule__CurlyBracketedClauseCS__Group__1__Impl();
 
             state._fsp--;
@@ -34966,17 +35051,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1__Impl"
-    // InternalCompleteOCL.g:11685:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
+    // InternalCompleteOCL.g:11713:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11689:1: ( ( '{' ) )
-            // InternalCompleteOCL.g:11690:1: ( '{' )
+            // InternalCompleteOCL.g:11717:1: ( ( '{' ) )
+            // InternalCompleteOCL.g:11718:1: ( '{' )
             {
-            // InternalCompleteOCL.g:11690:1: ( '{' )
-            // InternalCompleteOCL.g:11691:1: '{'
+            // InternalCompleteOCL.g:11718:1: ( '{' )
+            // InternalCompleteOCL.g:11719:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
@@ -35007,16 +35092,16 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2"
-    // InternalCompleteOCL.g:11704:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
+    // InternalCompleteOCL.g:11732:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
     public final void rule__CurlyBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11708:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
-            // InternalCompleteOCL.g:11709:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
+            // InternalCompleteOCL.g:11736:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
+            // InternalCompleteOCL.g:11737:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_61);
+            pushFollow(FollowSets000.FOLLOW_60);
             rule__CurlyBracketedClauseCS__Group__2__Impl();
 
             state._fsp--;
@@ -35045,22 +35130,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2__Impl"
-    // InternalCompleteOCL.g:11716:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:11744:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__CurlyBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11720:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:11721:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:11748:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:11749:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:11721:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:11722:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalCompleteOCL.g:11749:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:11750:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:11723:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalCompleteOCL.g:11751:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             int alt103=2;
             int LA103_0 = input.LA(1);
 
@@ -35069,7 +35154,7 @@
             }
             switch (alt103) {
                 case 1 :
-                    // InternalCompleteOCL.g:11723:2: rule__CurlyBracketedClauseCS__Group_2__0
+                    // InternalCompleteOCL.g:11751:2: rule__CurlyBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CurlyBracketedClauseCS__Group_2__0();
@@ -35107,14 +35192,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3"
-    // InternalCompleteOCL.g:11733:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:11761:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11737:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
-            // InternalCompleteOCL.g:11738:2: rule__CurlyBracketedClauseCS__Group__3__Impl
+            // InternalCompleteOCL.g:11765:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
+            // InternalCompleteOCL.g:11766:2: rule__CurlyBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group__3__Impl();
@@ -35140,17 +35225,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3__Impl"
-    // InternalCompleteOCL.g:11744:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
+    // InternalCompleteOCL.g:11772:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11748:1: ( ( '}' ) )
-            // InternalCompleteOCL.g:11749:1: ( '}' )
+            // InternalCompleteOCL.g:11776:1: ( ( '}' ) )
+            // InternalCompleteOCL.g:11777:1: ( '}' )
             {
-            // InternalCompleteOCL.g:11749:1: ( '}' )
-            // InternalCompleteOCL.g:11750:1: '}'
+            // InternalCompleteOCL.g:11777:1: ( '}' )
+            // InternalCompleteOCL.g:11778:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
@@ -35181,16 +35266,16 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0"
-    // InternalCompleteOCL.g:11771:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
+    // InternalCompleteOCL.g:11799:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11775:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
-            // InternalCompleteOCL.g:11776:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
+            // InternalCompleteOCL.g:11803:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
+            // InternalCompleteOCL.g:11804:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_18);
+            pushFollow(FollowSets000.FOLLOW_19);
             rule__CurlyBracketedClauseCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -35219,23 +35304,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:11783:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalCompleteOCL.g:11811:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11787:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalCompleteOCL.g:11788:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:11815:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalCompleteOCL.g:11816:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalCompleteOCL.g:11788:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
-            // InternalCompleteOCL.g:11789:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:11816:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:11817:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalCompleteOCL.g:11790:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
-            // InternalCompleteOCL.g:11790:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
+            // InternalCompleteOCL.g:11818:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalCompleteOCL.g:11818:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0();
@@ -35270,14 +35355,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1"
-    // InternalCompleteOCL.g:11800:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:11828:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11804:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:11805:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:11832:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:11833:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2__1__Impl();
@@ -35303,22 +35388,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:11811:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
+    // InternalCompleteOCL.g:11839:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11815:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
-            // InternalCompleteOCL.g:11816:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:11843:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
+            // InternalCompleteOCL.g:11844:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
             {
-            // InternalCompleteOCL.g:11816:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
-            // InternalCompleteOCL.g:11817:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:11844:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalCompleteOCL.g:11845:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_1());
             }
-            // InternalCompleteOCL.g:11818:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalCompleteOCL.g:11846:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             loop104:
             do {
                 int alt104=2;
@@ -35331,9 +35416,9 @@
 
                 switch (alt104) {
             	case 1 :
-            	    // InternalCompleteOCL.g:11818:2: rule__CurlyBracketedClauseCS__Group_2_1__0
+            	    // InternalCompleteOCL.g:11846:2: rule__CurlyBracketedClauseCS__Group_2_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__CurlyBracketedClauseCS__Group_2_1__0();
 
             	    state._fsp--;
@@ -35372,16 +35457,16 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0"
-    // InternalCompleteOCL.g:11832:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
+    // InternalCompleteOCL.g:11860:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11836:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
-            // InternalCompleteOCL.g:11837:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
+            // InternalCompleteOCL.g:11864:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
+            // InternalCompleteOCL.g:11865:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_23);
+            pushFollow(FollowSets000.FOLLOW_24);
             rule__CurlyBracketedClauseCS__Group_2_1__0__Impl();
 
             state._fsp--;
@@ -35410,17 +35495,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0__Impl"
-    // InternalCompleteOCL.g:11844:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:11872:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11848:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:11849:1: ( ',' )
+            // InternalCompleteOCL.g:11876:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:11877:1: ( ',' )
             {
-            // InternalCompleteOCL.g:11849:1: ( ',' )
-            // InternalCompleteOCL.g:11850:1: ','
+            // InternalCompleteOCL.g:11877:1: ( ',' )
+            // InternalCompleteOCL.g:11878:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
@@ -35451,14 +35536,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1"
-    // InternalCompleteOCL.g:11863:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
+    // InternalCompleteOCL.g:11891:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11867:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
-            // InternalCompleteOCL.g:11868:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
+            // InternalCompleteOCL.g:11895:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
+            // InternalCompleteOCL.g:11896:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2_1__1__Impl();
@@ -35484,23 +35569,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1__Impl"
-    // InternalCompleteOCL.g:11874:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:11902:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11878:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalCompleteOCL.g:11879:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:11906:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalCompleteOCL.g:11907:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:11879:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalCompleteOCL.g:11880:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:11907:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:11908:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalCompleteOCL.g:11881:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
-            // InternalCompleteOCL.g:11881:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
+            // InternalCompleteOCL.g:11909:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalCompleteOCL.g:11909:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1();
@@ -35535,14 +35620,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0"
-    // InternalCompleteOCL.g:11895:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
+    // InternalCompleteOCL.g:11923:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
     public final void rule__RoundBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11899:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
-            // InternalCompleteOCL.g:11900:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
+            // InternalCompleteOCL.g:11927:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
+            // InternalCompleteOCL.g:11928:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__RoundBracketedClauseCS__Group__0__Impl();
@@ -35573,23 +35658,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0__Impl"
-    // InternalCompleteOCL.g:11907:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:11935:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__RoundBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11911:1: ( ( () ) )
-            // InternalCompleteOCL.g:11912:1: ( () )
+            // InternalCompleteOCL.g:11939:1: ( ( () ) )
+            // InternalCompleteOCL.g:11940:1: ( () )
             {
-            // InternalCompleteOCL.g:11912:1: ( () )
-            // InternalCompleteOCL.g:11913:1: ()
+            // InternalCompleteOCL.g:11940:1: ( () )
+            // InternalCompleteOCL.g:11941:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
             }
-            // InternalCompleteOCL.g:11914:1: ()
-            // InternalCompleteOCL.g:11916:1:
+            // InternalCompleteOCL.g:11942:1: ()
+            // InternalCompleteOCL.g:11944:1:
             {
             }
 
@@ -35614,16 +35699,16 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1"
-    // InternalCompleteOCL.g:11926:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
+    // InternalCompleteOCL.g:11954:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
     public final void rule__RoundBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11930:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
-            // InternalCompleteOCL.g:11931:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
+            // InternalCompleteOCL.g:11958:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
+            // InternalCompleteOCL.g:11959:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_62);
+            pushFollow(FollowSets000.FOLLOW_61);
             rule__RoundBracketedClauseCS__Group__1__Impl();
 
             state._fsp--;
@@ -35652,17 +35737,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1__Impl"
-    // InternalCompleteOCL.g:11938:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:11966:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
     public final void rule__RoundBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11942:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:11943:1: ( '(' )
+            // InternalCompleteOCL.g:11970:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:11971:1: ( '(' )
             {
-            // InternalCompleteOCL.g:11943:1: ( '(' )
-            // InternalCompleteOCL.g:11944:1: '('
+            // InternalCompleteOCL.g:11971:1: ( '(' )
+            // InternalCompleteOCL.g:11972:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
@@ -35693,16 +35778,16 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2"
-    // InternalCompleteOCL.g:11957:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
+    // InternalCompleteOCL.g:11985:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
     public final void rule__RoundBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11961:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
-            // InternalCompleteOCL.g:11962:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
+            // InternalCompleteOCL.g:11989:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
+            // InternalCompleteOCL.g:11990:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_62);
+            pushFollow(FollowSets000.FOLLOW_61);
             rule__RoundBracketedClauseCS__Group__2__Impl();
 
             state._fsp--;
@@ -35731,22 +35816,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2__Impl"
-    // InternalCompleteOCL.g:11969:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:11997:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__RoundBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11973:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:11974:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:12001:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:12002:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:11974:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:11975:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalCompleteOCL.g:12002:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:12003:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:11976:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalCompleteOCL.g:12004:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             int alt105=2;
             int LA105_0 = input.LA(1);
 
@@ -35755,7 +35840,7 @@
             }
             switch (alt105) {
                 case 1 :
-                    // InternalCompleteOCL.g:11976:2: rule__RoundBracketedClauseCS__Group_2__0
+                    // InternalCompleteOCL.g:12004:2: rule__RoundBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__RoundBracketedClauseCS__Group_2__0();
@@ -35793,14 +35878,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3"
-    // InternalCompleteOCL.g:11986:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:12014:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
     public final void rule__RoundBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:11990:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
-            // InternalCompleteOCL.g:11991:2: rule__RoundBracketedClauseCS__Group__3__Impl
+            // InternalCompleteOCL.g:12018:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
+            // InternalCompleteOCL.g:12019:2: rule__RoundBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group__3__Impl();
@@ -35826,17 +35911,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3__Impl"
-    // InternalCompleteOCL.g:11997:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:12025:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
     public final void rule__RoundBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12001:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:12002:1: ( ')' )
+            // InternalCompleteOCL.g:12029:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:12030:1: ( ')' )
             {
-            // InternalCompleteOCL.g:12002:1: ( ')' )
-            // InternalCompleteOCL.g:12003:1: ')'
+            // InternalCompleteOCL.g:12030:1: ( ')' )
+            // InternalCompleteOCL.g:12031:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
@@ -35867,16 +35952,16 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0"
-    // InternalCompleteOCL.g:12024:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
+    // InternalCompleteOCL.g:12052:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
     public final void rule__RoundBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12028:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
-            // InternalCompleteOCL.g:12029:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
+            // InternalCompleteOCL.g:12056:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
+            // InternalCompleteOCL.g:12057:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_63);
+            pushFollow(FollowSets000.FOLLOW_62);
             rule__RoundBracketedClauseCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -35905,23 +35990,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:12036:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
+    // InternalCompleteOCL.g:12064:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12040:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
-            // InternalCompleteOCL.g:12041:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:12068:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
+            // InternalCompleteOCL.g:12069:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
             {
-            // InternalCompleteOCL.g:12041:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
-            // InternalCompleteOCL.g:12042:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalCompleteOCL.g:12069:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalCompleteOCL.g:12070:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
             }
-            // InternalCompleteOCL.g:12043:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
-            // InternalCompleteOCL.g:12043:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
+            // InternalCompleteOCL.g:12071:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalCompleteOCL.g:12071:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0();
@@ -35956,14 +36041,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1"
-    // InternalCompleteOCL.g:12053:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:12081:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__RoundBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12057:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:12058:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:12085:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:12086:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group_2__1__Impl();
@@ -35989,22 +36074,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:12064:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
+    // InternalCompleteOCL.g:12092:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12068:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
-            // InternalCompleteOCL.g:12069:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalCompleteOCL.g:12096:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
+            // InternalCompleteOCL.g:12097:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
             {
-            // InternalCompleteOCL.g:12069:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
-            // InternalCompleteOCL.g:12070:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalCompleteOCL.g:12097:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalCompleteOCL.g:12098:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
             }
-            // InternalCompleteOCL.g:12071:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalCompleteOCL.g:12099:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             loop106:
             do {
                 int alt106=2;
@@ -36017,9 +36102,9 @@
 
                 switch (alt106) {
             	case 1 :
-            	    // InternalCompleteOCL.g:12071:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
+            	    // InternalCompleteOCL.g:12099:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_64);
+            	    pushFollow(FollowSets000.FOLLOW_63);
             	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1();
 
             	    state._fsp--;
@@ -36058,14 +36143,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0"
-    // InternalCompleteOCL.g:12085:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
+    // InternalCompleteOCL.g:12113:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
     public final void rule__SquareBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12089:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
-            // InternalCompleteOCL.g:12090:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
+            // InternalCompleteOCL.g:12117:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
+            // InternalCompleteOCL.g:12118:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__SquareBracketedClauseCS__Group__0__Impl();
@@ -36096,17 +36181,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0__Impl"
-    // InternalCompleteOCL.g:12097:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
+    // InternalCompleteOCL.g:12125:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
     public final void rule__SquareBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12101:1: ( ( '[' ) )
-            // InternalCompleteOCL.g:12102:1: ( '[' )
+            // InternalCompleteOCL.g:12129:1: ( ( '[' ) )
+            // InternalCompleteOCL.g:12130:1: ( '[' )
             {
-            // InternalCompleteOCL.g:12102:1: ( '[' )
-            // InternalCompleteOCL.g:12103:1: '['
+            // InternalCompleteOCL.g:12130:1: ( '[' )
+            // InternalCompleteOCL.g:12131:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
@@ -36137,16 +36222,16 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1"
-    // InternalCompleteOCL.g:12116:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
+    // InternalCompleteOCL.g:12144:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
     public final void rule__SquareBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12120:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
-            // InternalCompleteOCL.g:12121:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
+            // InternalCompleteOCL.g:12148:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
+            // InternalCompleteOCL.g:12149:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_65);
+            pushFollow(FollowSets000.FOLLOW_64);
             rule__SquareBracketedClauseCS__Group__1__Impl();
 
             state._fsp--;
@@ -36175,23 +36260,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1__Impl"
-    // InternalCompleteOCL.g:12128:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:12156:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12132:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
-            // InternalCompleteOCL.g:12133:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalCompleteOCL.g:12160:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
+            // InternalCompleteOCL.g:12161:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:12133:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
-            // InternalCompleteOCL.g:12134:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalCompleteOCL.g:12161:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalCompleteOCL.g:12162:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
             }
-            // InternalCompleteOCL.g:12135:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
-            // InternalCompleteOCL.g:12135:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
+            // InternalCompleteOCL.g:12163:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalCompleteOCL.g:12163:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_1();
@@ -36226,16 +36311,16 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2"
-    // InternalCompleteOCL.g:12145:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
+    // InternalCompleteOCL.g:12173:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
     public final void rule__SquareBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12149:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
-            // InternalCompleteOCL.g:12150:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
+            // InternalCompleteOCL.g:12177:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
+            // InternalCompleteOCL.g:12178:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_65);
+            pushFollow(FollowSets000.FOLLOW_64);
             rule__SquareBracketedClauseCS__Group__2__Impl();
 
             state._fsp--;
@@ -36264,22 +36349,22 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2__Impl"
-    // InternalCompleteOCL.g:12157:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
+    // InternalCompleteOCL.g:12185:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
     public final void rule__SquareBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12161:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
-            // InternalCompleteOCL.g:12162:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalCompleteOCL.g:12189:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
+            // InternalCompleteOCL.g:12190:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
             {
-            // InternalCompleteOCL.g:12162:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
-            // InternalCompleteOCL.g:12163:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalCompleteOCL.g:12190:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalCompleteOCL.g:12191:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:12164:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalCompleteOCL.g:12192:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             loop107:
             do {
                 int alt107=2;
@@ -36292,9 +36377,9 @@
 
                 switch (alt107) {
             	case 1 :
-            	    // InternalCompleteOCL.g:12164:2: rule__SquareBracketedClauseCS__Group_2__0
+            	    // InternalCompleteOCL.g:12192:2: rule__SquareBracketedClauseCS__Group_2__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__SquareBracketedClauseCS__Group_2__0();
 
             	    state._fsp--;
@@ -36333,14 +36418,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3"
-    // InternalCompleteOCL.g:12174:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:12202:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
     public final void rule__SquareBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12178:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
-            // InternalCompleteOCL.g:12179:2: rule__SquareBracketedClauseCS__Group__3__Impl
+            // InternalCompleteOCL.g:12206:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
+            // InternalCompleteOCL.g:12207:2: rule__SquareBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group__3__Impl();
@@ -36366,17 +36451,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3__Impl"
-    // InternalCompleteOCL.g:12185:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
+    // InternalCompleteOCL.g:12213:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
     public final void rule__SquareBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12189:1: ( ( ']' ) )
-            // InternalCompleteOCL.g:12190:1: ( ']' )
+            // InternalCompleteOCL.g:12217:1: ( ( ']' ) )
+            // InternalCompleteOCL.g:12218:1: ( ']' )
             {
-            // InternalCompleteOCL.g:12190:1: ( ']' )
-            // InternalCompleteOCL.g:12191:1: ']'
+            // InternalCompleteOCL.g:12218:1: ( ']' )
+            // InternalCompleteOCL.g:12219:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
@@ -36407,14 +36492,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0"
-    // InternalCompleteOCL.g:12212:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
+    // InternalCompleteOCL.g:12240:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
     public final void rule__SquareBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12216:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
-            // InternalCompleteOCL.g:12217:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
+            // InternalCompleteOCL.g:12244:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
+            // InternalCompleteOCL.g:12245:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__SquareBracketedClauseCS__Group_2__0__Impl();
@@ -36445,17 +36530,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:12224:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:12252:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12228:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:12229:1: ( ',' )
+            // InternalCompleteOCL.g:12256:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:12257:1: ( ',' )
             {
-            // InternalCompleteOCL.g:12229:1: ( ',' )
-            // InternalCompleteOCL.g:12230:1: ','
+            // InternalCompleteOCL.g:12257:1: ( ',' )
+            // InternalCompleteOCL.g:12258:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
@@ -36486,14 +36571,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1"
-    // InternalCompleteOCL.g:12243:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:12271:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__SquareBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12247:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:12248:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:12275:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:12276:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group_2__1__Impl();
@@ -36519,23 +36604,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:12254:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:12282:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12258:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:12259:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalCompleteOCL.g:12286:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:12287:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:12259:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
-            // InternalCompleteOCL.g:12260:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalCompleteOCL.g:12287:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalCompleteOCL.g:12288:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
             }
-            // InternalCompleteOCL.g:12261:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
-            // InternalCompleteOCL.g:12261:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
+            // InternalCompleteOCL.g:12289:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalCompleteOCL.g:12289:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1();
@@ -36570,16 +36655,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0"
-    // InternalCompleteOCL.g:12275:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
+    // InternalCompleteOCL.g:12303:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
     public final void rule__NavigatingArgCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12279:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
-            // InternalCompleteOCL.g:12280:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
+            // InternalCompleteOCL.g:12307:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
+            // InternalCompleteOCL.g:12308:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             rule__NavigatingArgCS__Group_0__0__Impl();
 
             state._fsp--;
@@ -36608,23 +36693,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0__Impl"
-    // InternalCompleteOCL.g:12287:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
+    // InternalCompleteOCL.g:12315:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
     public final void rule__NavigatingArgCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12291:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
-            // InternalCompleteOCL.g:12292:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalCompleteOCL.g:12319:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
+            // InternalCompleteOCL.g:12320:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
             {
-            // InternalCompleteOCL.g:12292:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
-            // InternalCompleteOCL.g:12293:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalCompleteOCL.g:12320:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalCompleteOCL.g:12321:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
             }
-            // InternalCompleteOCL.g:12294:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
-            // InternalCompleteOCL.g:12294:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
+            // InternalCompleteOCL.g:12322:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalCompleteOCL.g:12322:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0();
@@ -36659,14 +36744,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1"
-    // InternalCompleteOCL.g:12304:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
+    // InternalCompleteOCL.g:12332:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12308:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
-            // InternalCompleteOCL.g:12309:2: rule__NavigatingArgCS__Group_0__1__Impl
+            // InternalCompleteOCL.g:12336:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
+            // InternalCompleteOCL.g:12337:2: rule__NavigatingArgCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0__1__Impl();
@@ -36692,22 +36777,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1__Impl"
-    // InternalCompleteOCL.g:12315:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
+    // InternalCompleteOCL.g:12343:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
     public final void rule__NavigatingArgCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12319:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
-            // InternalCompleteOCL.g:12320:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalCompleteOCL.g:12347:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
+            // InternalCompleteOCL.g:12348:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
             {
-            // InternalCompleteOCL.g:12320:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
-            // InternalCompleteOCL.g:12321:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalCompleteOCL.g:12348:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalCompleteOCL.g:12349:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
             }
-            // InternalCompleteOCL.g:12322:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalCompleteOCL.g:12350:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             int alt108=2;
             int LA108_0 = input.LA(1);
 
@@ -36716,7 +36801,7 @@
             }
             switch (alt108) {
                 case 1 :
-                    // InternalCompleteOCL.g:12322:2: rule__NavigatingArgCS__Alternatives_0_1
+                    // InternalCompleteOCL.g:12350:2: rule__NavigatingArgCS__Alternatives_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Alternatives_0_1();
@@ -36754,16 +36839,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0"
-    // InternalCompleteOCL.g:12336:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
+    // InternalCompleteOCL.g:12364:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12340:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
-            // InternalCompleteOCL.g:12341:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
+            // InternalCompleteOCL.g:12368:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
+            // InternalCompleteOCL.g:12369:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__NavigatingArgCS__Group_0_1_0__0__Impl();
 
             state._fsp--;
@@ -36792,17 +36877,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0__Impl"
-    // InternalCompleteOCL.g:12348:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:12376:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12352:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:12353:1: ( '<-' )
+            // InternalCompleteOCL.g:12380:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:12381:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:12353:1: ( '<-' )
-            // InternalCompleteOCL.g:12354:1: '<-'
+            // InternalCompleteOCL.g:12381:1: ( '<-' )
+            // InternalCompleteOCL.g:12382:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
@@ -36833,16 +36918,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1"
-    // InternalCompleteOCL.g:12367:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
+    // InternalCompleteOCL.g:12395:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12371:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
-            // InternalCompleteOCL.g:12372:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
+            // InternalCompleteOCL.g:12399:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
+            // InternalCompleteOCL.g:12400:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
             {
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             rule__NavigatingArgCS__Group_0_1_0__1__Impl();
 
             state._fsp--;
@@ -36871,23 +36956,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1__Impl"
-    // InternalCompleteOCL.g:12379:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
+    // InternalCompleteOCL.g:12407:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12383:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
-            // InternalCompleteOCL.g:12384:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalCompleteOCL.g:12411:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
+            // InternalCompleteOCL.g:12412:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
             {
-            // InternalCompleteOCL.g:12384:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
-            // InternalCompleteOCL.g:12385:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalCompleteOCL.g:12412:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalCompleteOCL.g:12413:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_0_1());
             }
-            // InternalCompleteOCL.g:12386:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
-            // InternalCompleteOCL.g:12386:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
+            // InternalCompleteOCL.g:12414:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalCompleteOCL.g:12414:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1();
@@ -36922,14 +37007,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2"
-    // InternalCompleteOCL.g:12396:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
+    // InternalCompleteOCL.g:12424:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12400:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
-            // InternalCompleteOCL.g:12401:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
+            // InternalCompleteOCL.g:12428:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
+            // InternalCompleteOCL.g:12429:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0__2__Impl();
@@ -36955,22 +37040,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2__Impl"
-    // InternalCompleteOCL.g:12407:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
+    // InternalCompleteOCL.g:12435:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12411:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
-            // InternalCompleteOCL.g:12412:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalCompleteOCL.g:12439:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
+            // InternalCompleteOCL.g:12440:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
             {
-            // InternalCompleteOCL.g:12412:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
-            // InternalCompleteOCL.g:12413:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalCompleteOCL.g:12440:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalCompleteOCL.g:12441:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
             }
-            // InternalCompleteOCL.g:12414:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalCompleteOCL.g:12442:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             int alt109=2;
             int LA109_0 = input.LA(1);
 
@@ -36979,7 +37064,7 @@
             }
             switch (alt109) {
                 case 1 :
-                    // InternalCompleteOCL.g:12414:2: rule__NavigatingArgCS__Group_0_1_0_2__0
+                    // InternalCompleteOCL.g:12442:2: rule__NavigatingArgCS__Group_0_1_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0_2__0();
@@ -37017,14 +37102,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0"
-    // InternalCompleteOCL.g:12430:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
+    // InternalCompleteOCL.g:12458:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12434:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
-            // InternalCompleteOCL.g:12435:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
+            // InternalCompleteOCL.g:12462:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
+            // InternalCompleteOCL.g:12463:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingArgCS__Group_0_1_0_2__0__Impl();
@@ -37055,17 +37140,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0__Impl"
-    // InternalCompleteOCL.g:12442:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:12470:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12446:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:12447:1: ( '=' )
+            // InternalCompleteOCL.g:12474:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:12475:1: ( '=' )
             {
-            // InternalCompleteOCL.g:12447:1: ( '=' )
-            // InternalCompleteOCL.g:12448:1: '='
+            // InternalCompleteOCL.g:12475:1: ( '=' )
+            // InternalCompleteOCL.g:12476:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
@@ -37096,14 +37181,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1"
-    // InternalCompleteOCL.g:12461:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
+    // InternalCompleteOCL.g:12489:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12465:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
-            // InternalCompleteOCL.g:12466:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
+            // InternalCompleteOCL.g:12493:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
+            // InternalCompleteOCL.g:12494:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0_2__1__Impl();
@@ -37129,23 +37214,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1__Impl"
-    // InternalCompleteOCL.g:12472:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
+    // InternalCompleteOCL.g:12500:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12476:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
-            // InternalCompleteOCL.g:12477:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalCompleteOCL.g:12504:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
+            // InternalCompleteOCL.g:12505:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
             {
-            // InternalCompleteOCL.g:12477:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
-            // InternalCompleteOCL.g:12478:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalCompleteOCL.g:12505:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalCompleteOCL.g:12506:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
             }
-            // InternalCompleteOCL.g:12479:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
-            // InternalCompleteOCL.g:12479:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
+            // InternalCompleteOCL.g:12507:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalCompleteOCL.g:12507:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1();
@@ -37180,16 +37265,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0"
-    // InternalCompleteOCL.g:12493:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
+    // InternalCompleteOCL.g:12521:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12497:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
-            // InternalCompleteOCL.g:12498:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
+            // InternalCompleteOCL.g:12525:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
+            // InternalCompleteOCL.g:12526:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingArgCS__Group_0_1_1__0__Impl();
 
             state._fsp--;
@@ -37218,17 +37303,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0__Impl"
-    // InternalCompleteOCL.g:12505:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:12533:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12509:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:12510:1: ( ':' )
+            // InternalCompleteOCL.g:12537:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:12538:1: ( ':' )
             {
-            // InternalCompleteOCL.g:12510:1: ( ':' )
-            // InternalCompleteOCL.g:12511:1: ':'
+            // InternalCompleteOCL.g:12538:1: ( ':' )
+            // InternalCompleteOCL.g:12539:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
@@ -37259,16 +37344,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1"
-    // InternalCompleteOCL.g:12524:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
+    // InternalCompleteOCL.g:12552:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12528:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
-            // InternalCompleteOCL.g:12529:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
+            // InternalCompleteOCL.g:12556:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
+            // InternalCompleteOCL.g:12557:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
             {
-            pushFollow(FollowSets000.FOLLOW_67);
+            pushFollow(FollowSets000.FOLLOW_66);
             rule__NavigatingArgCS__Group_0_1_1__1__Impl();
 
             state._fsp--;
@@ -37297,23 +37382,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1__Impl"
-    // InternalCompleteOCL.g:12536:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
+    // InternalCompleteOCL.g:12564:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12540:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
-            // InternalCompleteOCL.g:12541:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalCompleteOCL.g:12568:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
+            // InternalCompleteOCL.g:12569:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
             {
-            // InternalCompleteOCL.g:12541:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
-            // InternalCompleteOCL.g:12542:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalCompleteOCL.g:12569:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalCompleteOCL.g:12570:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_1_1());
             }
-            // InternalCompleteOCL.g:12543:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
-            // InternalCompleteOCL.g:12543:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
+            // InternalCompleteOCL.g:12571:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalCompleteOCL.g:12571:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1();
@@ -37348,16 +37433,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2"
-    // InternalCompleteOCL.g:12553:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
+    // InternalCompleteOCL.g:12581:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12557:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
-            // InternalCompleteOCL.g:12558:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
+            // InternalCompleteOCL.g:12585:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
+            // InternalCompleteOCL.g:12586:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
             {
-            pushFollow(FollowSets000.FOLLOW_67);
+            pushFollow(FollowSets000.FOLLOW_66);
             rule__NavigatingArgCS__Group_0_1_1__2__Impl();
 
             state._fsp--;
@@ -37386,22 +37471,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2__Impl"
-    // InternalCompleteOCL.g:12565:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
+    // InternalCompleteOCL.g:12593:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12569:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
-            // InternalCompleteOCL.g:12570:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalCompleteOCL.g:12597:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
+            // InternalCompleteOCL.g:12598:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
             {
-            // InternalCompleteOCL.g:12570:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
-            // InternalCompleteOCL.g:12571:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalCompleteOCL.g:12598:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalCompleteOCL.g:12599:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_2());
             }
-            // InternalCompleteOCL.g:12572:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalCompleteOCL.g:12600:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             int alt110=2;
             int LA110_0 = input.LA(1);
 
@@ -37410,7 +37495,7 @@
             }
             switch (alt110) {
                 case 1 :
-                    // InternalCompleteOCL.g:12572:2: rule__NavigatingArgCS__Group_0_1_1_2__0
+                    // InternalCompleteOCL.g:12600:2: rule__NavigatingArgCS__Group_0_1_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_2__0();
@@ -37448,14 +37533,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3"
-    // InternalCompleteOCL.g:12582:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
+    // InternalCompleteOCL.g:12610:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12586:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
-            // InternalCompleteOCL.g:12587:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
+            // InternalCompleteOCL.g:12614:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
+            // InternalCompleteOCL.g:12615:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1__3__Impl();
@@ -37481,22 +37566,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3__Impl"
-    // InternalCompleteOCL.g:12593:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
+    // InternalCompleteOCL.g:12621:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12597:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
-            // InternalCompleteOCL.g:12598:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalCompleteOCL.g:12625:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
+            // InternalCompleteOCL.g:12626:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
             {
-            // InternalCompleteOCL.g:12598:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
-            // InternalCompleteOCL.g:12599:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalCompleteOCL.g:12626:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalCompleteOCL.g:12627:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_3());
             }
-            // InternalCompleteOCL.g:12600:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalCompleteOCL.g:12628:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             int alt111=2;
             int LA111_0 = input.LA(1);
 
@@ -37505,7 +37590,7 @@
             }
             switch (alt111) {
                 case 1 :
-                    // InternalCompleteOCL.g:12600:2: rule__NavigatingArgCS__Group_0_1_1_3__0
+                    // InternalCompleteOCL.g:12628:2: rule__NavigatingArgCS__Group_0_1_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_3__0();
@@ -37543,16 +37628,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0"
-    // InternalCompleteOCL.g:12618:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
+    // InternalCompleteOCL.g:12646:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12622:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
-            // InternalCompleteOCL.g:12623:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
+            // InternalCompleteOCL.g:12650:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
+            // InternalCompleteOCL.g:12651:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__NavigatingArgCS__Group_0_1_1_2__0__Impl();
 
             state._fsp--;
@@ -37581,17 +37666,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0__Impl"
-    // InternalCompleteOCL.g:12630:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:12658:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12634:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:12635:1: ( '<-' )
+            // InternalCompleteOCL.g:12662:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:12663:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:12635:1: ( '<-' )
-            // InternalCompleteOCL.g:12636:1: '<-'
+            // InternalCompleteOCL.g:12663:1: ( '<-' )
+            // InternalCompleteOCL.g:12664:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
@@ -37622,14 +37707,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1"
-    // InternalCompleteOCL.g:12649:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
+    // InternalCompleteOCL.g:12677:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12653:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
-            // InternalCompleteOCL.g:12654:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
+            // InternalCompleteOCL.g:12681:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
+            // InternalCompleteOCL.g:12682:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_2__1__Impl();
@@ -37655,23 +37740,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1__Impl"
-    // InternalCompleteOCL.g:12660:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
+    // InternalCompleteOCL.g:12688:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12664:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
-            // InternalCompleteOCL.g:12665:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalCompleteOCL.g:12692:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
+            // InternalCompleteOCL.g:12693:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
             {
-            // InternalCompleteOCL.g:12665:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
-            // InternalCompleteOCL.g:12666:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalCompleteOCL.g:12693:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalCompleteOCL.g:12694:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_1_2_1());
             }
-            // InternalCompleteOCL.g:12667:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
-            // InternalCompleteOCL.g:12667:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
+            // InternalCompleteOCL.g:12695:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalCompleteOCL.g:12695:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1();
@@ -37706,14 +37791,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0"
-    // InternalCompleteOCL.g:12681:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
+    // InternalCompleteOCL.g:12709:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12685:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
-            // InternalCompleteOCL.g:12686:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
+            // InternalCompleteOCL.g:12713:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
+            // InternalCompleteOCL.g:12714:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingArgCS__Group_0_1_1_3__0__Impl();
@@ -37744,17 +37829,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0__Impl"
-    // InternalCompleteOCL.g:12693:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:12721:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12697:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:12698:1: ( '=' )
+            // InternalCompleteOCL.g:12725:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:12726:1: ( '=' )
             {
-            // InternalCompleteOCL.g:12698:1: ( '=' )
-            // InternalCompleteOCL.g:12699:1: '='
+            // InternalCompleteOCL.g:12726:1: ( '=' )
+            // InternalCompleteOCL.g:12727:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());
@@ -37785,14 +37870,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1"
-    // InternalCompleteOCL.g:12712:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
+    // InternalCompleteOCL.g:12740:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12716:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
-            // InternalCompleteOCL.g:12717:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
+            // InternalCompleteOCL.g:12744:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
+            // InternalCompleteOCL.g:12745:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_3__1__Impl();
@@ -37818,23 +37903,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1__Impl"
-    // InternalCompleteOCL.g:12723:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
+    // InternalCompleteOCL.g:12751:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12727:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
-            // InternalCompleteOCL.g:12728:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalCompleteOCL.g:12755:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
+            // InternalCompleteOCL.g:12756:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
             {
-            // InternalCompleteOCL.g:12728:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
-            // InternalCompleteOCL.g:12729:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalCompleteOCL.g:12756:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalCompleteOCL.g:12757:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_3_1());
             }
-            // InternalCompleteOCL.g:12730:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
-            // InternalCompleteOCL.g:12730:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
+            // InternalCompleteOCL.g:12758:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalCompleteOCL.g:12758:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1();
@@ -37869,16 +37954,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0"
-    // InternalCompleteOCL.g:12744:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
+    // InternalCompleteOCL.g:12772:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12748:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
-            // InternalCompleteOCL.g:12749:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
+            // InternalCompleteOCL.g:12776:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
+            // InternalCompleteOCL.g:12777:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             rule__NavigatingArgCS__Group_0_1_2__0__Impl();
 
             state._fsp--;
@@ -37907,22 +37992,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0__Impl"
-    // InternalCompleteOCL.g:12756:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
+    // InternalCompleteOCL.g:12784:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12760:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
-            // InternalCompleteOCL.g:12761:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalCompleteOCL.g:12788:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
+            // InternalCompleteOCL.g:12789:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
             {
-            // InternalCompleteOCL.g:12761:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
-            // InternalCompleteOCL.g:12762:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalCompleteOCL.g:12789:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalCompleteOCL.g:12790:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_0());
             }
-            // InternalCompleteOCL.g:12763:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalCompleteOCL.g:12791:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             int alt112=2;
             int LA112_0 = input.LA(1);
 
@@ -37931,7 +38016,7 @@
             }
             switch (alt112) {
                 case 1 :
-                    // InternalCompleteOCL.g:12763:2: rule__NavigatingArgCS__Group_0_1_2_0__0
+                    // InternalCompleteOCL.g:12791:2: rule__NavigatingArgCS__Group_0_1_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_0__0();
@@ -37969,16 +38054,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1"
-    // InternalCompleteOCL.g:12773:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
+    // InternalCompleteOCL.g:12801:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12777:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
-            // InternalCompleteOCL.g:12778:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
+            // InternalCompleteOCL.g:12805:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
+            // InternalCompleteOCL.g:12806:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
             {
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             rule__NavigatingArgCS__Group_0_1_2__1__Impl();
 
             state._fsp--;
@@ -38007,22 +38092,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1__Impl"
-    // InternalCompleteOCL.g:12785:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
+    // InternalCompleteOCL.g:12813:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12789:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
-            // InternalCompleteOCL.g:12790:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalCompleteOCL.g:12817:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
+            // InternalCompleteOCL.g:12818:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
             {
-            // InternalCompleteOCL.g:12790:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
-            // InternalCompleteOCL.g:12791:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalCompleteOCL.g:12818:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalCompleteOCL.g:12819:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_1());
             }
-            // InternalCompleteOCL.g:12792:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalCompleteOCL.g:12820:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             int alt113=2;
             int LA113_0 = input.LA(1);
 
@@ -38031,7 +38116,7 @@
             }
             switch (alt113) {
                 case 1 :
-                    // InternalCompleteOCL.g:12792:2: rule__NavigatingArgCS__Group_0_1_2_1__0
+                    // InternalCompleteOCL.g:12820:2: rule__NavigatingArgCS__Group_0_1_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_1__0();
@@ -38069,14 +38154,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2"
-    // InternalCompleteOCL.g:12802:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
+    // InternalCompleteOCL.g:12830:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12806:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
-            // InternalCompleteOCL.g:12807:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
+            // InternalCompleteOCL.g:12834:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
+            // InternalCompleteOCL.g:12835:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingArgCS__Group_0_1_2__2__Impl();
@@ -38107,17 +38192,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2__Impl"
-    // InternalCompleteOCL.g:12814:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
+    // InternalCompleteOCL.g:12842:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12818:1: ( ( 'in' ) )
-            // InternalCompleteOCL.g:12819:1: ( 'in' )
+            // InternalCompleteOCL.g:12846:1: ( ( 'in' ) )
+            // InternalCompleteOCL.g:12847:1: ( 'in' )
             {
-            // InternalCompleteOCL.g:12819:1: ( 'in' )
-            // InternalCompleteOCL.g:12820:1: 'in'
+            // InternalCompleteOCL.g:12847:1: ( 'in' )
+            // InternalCompleteOCL.g:12848:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());
@@ -38148,14 +38233,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3"
-    // InternalCompleteOCL.g:12833:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
+    // InternalCompleteOCL.g:12861:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12837:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
-            // InternalCompleteOCL.g:12838:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
+            // InternalCompleteOCL.g:12865:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
+            // InternalCompleteOCL.g:12866:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2__3__Impl();
@@ -38181,23 +38266,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3__Impl"
-    // InternalCompleteOCL.g:12844:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
+    // InternalCompleteOCL.g:12872:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12848:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
-            // InternalCompleteOCL.g:12849:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalCompleteOCL.g:12876:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
+            // InternalCompleteOCL.g:12877:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
             {
-            // InternalCompleteOCL.g:12849:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
-            // InternalCompleteOCL.g:12850:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalCompleteOCL.g:12877:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalCompleteOCL.g:12878:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_2_3());
             }
-            // InternalCompleteOCL.g:12851:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
-            // InternalCompleteOCL.g:12851:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
+            // InternalCompleteOCL.g:12879:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalCompleteOCL.g:12879:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3();
@@ -38232,16 +38317,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0"
-    // InternalCompleteOCL.g:12869:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
+    // InternalCompleteOCL.g:12897:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12873:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
-            // InternalCompleteOCL.g:12874:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
+            // InternalCompleteOCL.g:12901:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
+            // InternalCompleteOCL.g:12902:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingArgCS__Group_0_1_2_0__0__Impl();
 
             state._fsp--;
@@ -38270,17 +38355,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0__Impl"
-    // InternalCompleteOCL.g:12881:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:12909:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12885:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:12886:1: ( ':' )
+            // InternalCompleteOCL.g:12913:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:12914:1: ( ':' )
             {
-            // InternalCompleteOCL.g:12886:1: ( ':' )
-            // InternalCompleteOCL.g:12887:1: ':'
+            // InternalCompleteOCL.g:12914:1: ( ':' )
+            // InternalCompleteOCL.g:12915:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
@@ -38311,14 +38396,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1"
-    // InternalCompleteOCL.g:12900:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
+    // InternalCompleteOCL.g:12928:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12904:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
-            // InternalCompleteOCL.g:12905:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
+            // InternalCompleteOCL.g:12932:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
+            // InternalCompleteOCL.g:12933:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_0__1__Impl();
@@ -38344,23 +38429,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1__Impl"
-    // InternalCompleteOCL.g:12911:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
+    // InternalCompleteOCL.g:12939:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12915:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
-            // InternalCompleteOCL.g:12916:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalCompleteOCL.g:12943:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
+            // InternalCompleteOCL.g:12944:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
             {
-            // InternalCompleteOCL.g:12916:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
-            // InternalCompleteOCL.g:12917:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalCompleteOCL.g:12944:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalCompleteOCL.g:12945:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_2_0_1());
             }
-            // InternalCompleteOCL.g:12918:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
-            // InternalCompleteOCL.g:12918:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
+            // InternalCompleteOCL.g:12946:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalCompleteOCL.g:12946:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1();
@@ -38395,16 +38480,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0"
-    // InternalCompleteOCL.g:12932:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
+    // InternalCompleteOCL.g:12960:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12936:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
-            // InternalCompleteOCL.g:12937:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
+            // InternalCompleteOCL.g:12964:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
+            // InternalCompleteOCL.g:12965:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__NavigatingArgCS__Group_0_1_2_1__0__Impl();
 
             state._fsp--;
@@ -38433,17 +38518,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0__Impl"
-    // InternalCompleteOCL.g:12944:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:12972:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12948:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:12949:1: ( '<-' )
+            // InternalCompleteOCL.g:12976:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:12977:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:12949:1: ( '<-' )
-            // InternalCompleteOCL.g:12950:1: '<-'
+            // InternalCompleteOCL.g:12977:1: ( '<-' )
+            // InternalCompleteOCL.g:12978:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
@@ -38474,14 +38559,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1"
-    // InternalCompleteOCL.g:12963:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
+    // InternalCompleteOCL.g:12991:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12967:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
-            // InternalCompleteOCL.g:12968:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
+            // InternalCompleteOCL.g:12995:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
+            // InternalCompleteOCL.g:12996:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_1__1__Impl();
@@ -38507,23 +38592,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1__Impl"
-    // InternalCompleteOCL.g:12974:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:13002:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12978:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
-            // InternalCompleteOCL.g:12979:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalCompleteOCL.g:13006:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
+            // InternalCompleteOCL.g:13007:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:12979:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
-            // InternalCompleteOCL.g:12980:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalCompleteOCL.g:13007:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalCompleteOCL.g:13008:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_2_1_1());
             }
-            // InternalCompleteOCL.g:12981:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
-            // InternalCompleteOCL.g:12981:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
+            // InternalCompleteOCL.g:13009:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalCompleteOCL.g:13009:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1();
@@ -38558,16 +38643,16 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0"
-    // InternalCompleteOCL.g:12995:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
+    // InternalCompleteOCL.g:13023:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
     public final void rule__NavigatingArgCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:12999:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
-            // InternalCompleteOCL.g:13000:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
+            // InternalCompleteOCL.g:13027:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
+            // InternalCompleteOCL.g:13028:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingArgCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -38596,17 +38681,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:13007:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:13035:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13011:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:13012:1: ( ':' )
+            // InternalCompleteOCL.g:13039:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:13040:1: ( ':' )
             {
-            // InternalCompleteOCL.g:13012:1: ( ':' )
-            // InternalCompleteOCL.g:13013:1: ':'
+            // InternalCompleteOCL.g:13040:1: ( ':' )
+            // InternalCompleteOCL.g:13041:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
@@ -38637,14 +38722,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1"
-    // InternalCompleteOCL.g:13026:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:13054:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13030:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:13031:2: rule__NavigatingArgCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:13058:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:13059:2: rule__NavigatingArgCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_1__1__Impl();
@@ -38670,23 +38755,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:13037:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:13065:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13041:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:13042:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:13069:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:13070:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:13042:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
-            // InternalCompleteOCL.g:13043:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:13070:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:13071:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalCompleteOCL.g:13044:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
-            // InternalCompleteOCL.g:13044:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
+            // InternalCompleteOCL.g:13072:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:13072:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_1_1();
@@ -38721,16 +38806,16 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0"
-    // InternalCompleteOCL.g:13058:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
+    // InternalCompleteOCL.g:13086:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
     public final void rule__NavigatingBarArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13062:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
-            // InternalCompleteOCL.g:13063:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
+            // InternalCompleteOCL.g:13090:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
+            // InternalCompleteOCL.g:13091:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_68);
+            pushFollow(FollowSets000.FOLLOW_67);
             rule__NavigatingBarArgCS__Group__0__Impl();
 
             state._fsp--;
@@ -38759,23 +38844,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0__Impl"
-    // InternalCompleteOCL.g:13070:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:13098:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13074:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
-            // InternalCompleteOCL.g:13075:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalCompleteOCL.g:13102:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
+            // InternalCompleteOCL.g:13103:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:13075:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
-            // InternalCompleteOCL.g:13076:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalCompleteOCL.g:13103:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalCompleteOCL.g:13104:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalCompleteOCL.g:13077:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
-            // InternalCompleteOCL.g:13077:2: rule__NavigatingBarArgCS__PrefixAssignment_0
+            // InternalCompleteOCL.g:13105:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalCompleteOCL.g:13105:2: rule__NavigatingBarArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__PrefixAssignment_0();
@@ -38810,16 +38895,16 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1"
-    // InternalCompleteOCL.g:13087:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
+    // InternalCompleteOCL.g:13115:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
     public final void rule__NavigatingBarArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13091:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
-            // InternalCompleteOCL.g:13092:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
+            // InternalCompleteOCL.g:13119:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
+            // InternalCompleteOCL.g:13120:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__NavigatingBarArgCS__Group__1__Impl();
 
             state._fsp--;
@@ -38848,23 +38933,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1__Impl"
-    // InternalCompleteOCL.g:13099:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:13127:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13103:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalCompleteOCL.g:13104:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:13131:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:13132:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:13104:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalCompleteOCL.g:13105:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalCompleteOCL.g:13132:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:13133:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalCompleteOCL.g:13106:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalCompleteOCL.g:13106:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
+            // InternalCompleteOCL.g:13134:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalCompleteOCL.g:13134:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1();
@@ -38899,14 +38984,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2"
-    // InternalCompleteOCL.g:13116:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:13144:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13120:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
-            // InternalCompleteOCL.g:13121:2: rule__NavigatingBarArgCS__Group__2__Impl
+            // InternalCompleteOCL.g:13148:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
+            // InternalCompleteOCL.g:13149:2: rule__NavigatingBarArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group__2__Impl();
@@ -38932,22 +39017,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2__Impl"
-    // InternalCompleteOCL.g:13127:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:13155:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13131:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:13132:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:13159:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:13160:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:13132:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:13133:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalCompleteOCL.g:13160:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:13161:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:13134:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalCompleteOCL.g:13162:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             int alt114=2;
             int LA114_0 = input.LA(1);
 
@@ -38956,7 +39041,7 @@
             }
             switch (alt114) {
                 case 1 :
-                    // InternalCompleteOCL.g:13134:2: rule__NavigatingBarArgCS__Group_2__0
+                    // InternalCompleteOCL.g:13162:2: rule__NavigatingBarArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2__0();
@@ -38994,16 +39079,16 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0"
-    // InternalCompleteOCL.g:13150:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
+    // InternalCompleteOCL.g:13178:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13154:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
-            // InternalCompleteOCL.g:13155:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
+            // InternalCompleteOCL.g:13182:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
+            // InternalCompleteOCL.g:13183:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingBarArgCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -39032,17 +39117,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:13162:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:13190:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingBarArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13166:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:13167:1: ( ':' )
+            // InternalCompleteOCL.g:13194:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:13195:1: ( ':' )
             {
-            // InternalCompleteOCL.g:13167:1: ( ':' )
-            // InternalCompleteOCL.g:13168:1: ':'
+            // InternalCompleteOCL.g:13195:1: ( ':' )
+            // InternalCompleteOCL.g:13196:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
@@ -39073,16 +39158,16 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1"
-    // InternalCompleteOCL.g:13181:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
+    // InternalCompleteOCL.g:13209:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
     public final void rule__NavigatingBarArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13185:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
-            // InternalCompleteOCL.g:13186:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
+            // InternalCompleteOCL.g:13213:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
+            // InternalCompleteOCL.g:13214:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
             {
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             rule__NavigatingBarArgCS__Group_2__1__Impl();
 
             state._fsp--;
@@ -39111,23 +39196,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:13193:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:13221:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13197:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:13198:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalCompleteOCL.g:13225:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:13226:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:13198:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalCompleteOCL.g:13199:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalCompleteOCL.g:13226:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalCompleteOCL.g:13227:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalCompleteOCL.g:13200:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
-            // InternalCompleteOCL.g:13200:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
+            // InternalCompleteOCL.g:13228:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalCompleteOCL.g:13228:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1();
@@ -39162,14 +39247,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2"
-    // InternalCompleteOCL.g:13210:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
+    // InternalCompleteOCL.g:13238:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13214:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
-            // InternalCompleteOCL.g:13215:2: rule__NavigatingBarArgCS__Group_2__2__Impl
+            // InternalCompleteOCL.g:13242:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
+            // InternalCompleteOCL.g:13243:2: rule__NavigatingBarArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2__2__Impl();
@@ -39195,22 +39280,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2__Impl"
-    // InternalCompleteOCL.g:13221:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
+    // InternalCompleteOCL.g:13249:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13225:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
-            // InternalCompleteOCL.g:13226:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalCompleteOCL.g:13253:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
+            // InternalCompleteOCL.g:13254:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
             {
-            // InternalCompleteOCL.g:13226:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
-            // InternalCompleteOCL.g:13227:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalCompleteOCL.g:13254:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalCompleteOCL.g:13255:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
             }
-            // InternalCompleteOCL.g:13228:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalCompleteOCL.g:13256:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             int alt115=2;
             int LA115_0 = input.LA(1);
 
@@ -39219,7 +39304,7 @@
             }
             switch (alt115) {
                 case 1 :
-                    // InternalCompleteOCL.g:13228:2: rule__NavigatingBarArgCS__Group_2_2__0
+                    // InternalCompleteOCL.g:13256:2: rule__NavigatingBarArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2_2__0();
@@ -39257,14 +39342,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0"
-    // InternalCompleteOCL.g:13244:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
+    // InternalCompleteOCL.g:13272:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13248:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
-            // InternalCompleteOCL.g:13249:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
+            // InternalCompleteOCL.g:13276:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
+            // InternalCompleteOCL.g:13277:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingBarArgCS__Group_2_2__0__Impl();
@@ -39295,17 +39380,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0__Impl"
-    // InternalCompleteOCL.g:13256:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:13284:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13260:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:13261:1: ( '=' )
+            // InternalCompleteOCL.g:13288:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:13289:1: ( '=' )
             {
-            // InternalCompleteOCL.g:13261:1: ( '=' )
-            // InternalCompleteOCL.g:13262:1: '='
+            // InternalCompleteOCL.g:13289:1: ( '=' )
+            // InternalCompleteOCL.g:13290:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -39336,14 +39421,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1"
-    // InternalCompleteOCL.g:13275:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
+    // InternalCompleteOCL.g:13303:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13279:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
-            // InternalCompleteOCL.g:13280:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
+            // InternalCompleteOCL.g:13307:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
+            // InternalCompleteOCL.g:13308:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2_2__1__Impl();
@@ -39369,23 +39454,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1__Impl"
-    // InternalCompleteOCL.g:13286:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalCompleteOCL.g:13314:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13290:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalCompleteOCL.g:13291:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalCompleteOCL.g:13318:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalCompleteOCL.g:13319:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalCompleteOCL.g:13291:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalCompleteOCL.g:13292:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalCompleteOCL.g:13319:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalCompleteOCL.g:13320:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalCompleteOCL.g:13293:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalCompleteOCL.g:13293:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalCompleteOCL.g:13321:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalCompleteOCL.g:13321:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -39420,16 +39505,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0"
-    // InternalCompleteOCL.g:13307:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
+    // InternalCompleteOCL.g:13335:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
     public final void rule__NavigatingCommaArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13311:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
-            // InternalCompleteOCL.g:13312:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
+            // InternalCompleteOCL.g:13339:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
+            // InternalCompleteOCL.g:13340:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_68);
+            pushFollow(FollowSets000.FOLLOW_67);
             rule__NavigatingCommaArgCS__Group__0__Impl();
 
             state._fsp--;
@@ -39458,23 +39543,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0__Impl"
-    // InternalCompleteOCL.g:13319:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:13347:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13323:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
-            // InternalCompleteOCL.g:13324:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalCompleteOCL.g:13351:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
+            // InternalCompleteOCL.g:13352:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:13324:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
-            // InternalCompleteOCL.g:13325:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalCompleteOCL.g:13352:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalCompleteOCL.g:13353:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalCompleteOCL.g:13326:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
-            // InternalCompleteOCL.g:13326:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
+            // InternalCompleteOCL.g:13354:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalCompleteOCL.g:13354:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__PrefixAssignment_0();
@@ -39509,16 +39594,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1"
-    // InternalCompleteOCL.g:13336:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
+    // InternalCompleteOCL.g:13364:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
     public final void rule__NavigatingCommaArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13340:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
-            // InternalCompleteOCL.g:13341:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
+            // InternalCompleteOCL.g:13368:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
+            // InternalCompleteOCL.g:13369:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             rule__NavigatingCommaArgCS__Group__1__Impl();
 
             state._fsp--;
@@ -39547,23 +39632,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1__Impl"
-    // InternalCompleteOCL.g:13348:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:13376:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13352:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalCompleteOCL.g:13353:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:13380:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:13381:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:13353:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalCompleteOCL.g:13354:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalCompleteOCL.g:13381:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:13382:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalCompleteOCL.g:13355:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalCompleteOCL.g:13355:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
+            // InternalCompleteOCL.g:13383:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalCompleteOCL.g:13383:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1();
@@ -39598,14 +39683,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2"
-    // InternalCompleteOCL.g:13365:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:13393:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13369:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
-            // InternalCompleteOCL.g:13370:2: rule__NavigatingCommaArgCS__Group__2__Impl
+            // InternalCompleteOCL.g:13397:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
+            // InternalCompleteOCL.g:13398:2: rule__NavigatingCommaArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group__2__Impl();
@@ -39631,22 +39716,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2__Impl"
-    // InternalCompleteOCL.g:13376:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
+    // InternalCompleteOCL.g:13404:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13380:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
-            // InternalCompleteOCL.g:13381:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalCompleteOCL.g:13408:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
+            // InternalCompleteOCL.g:13409:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
             {
-            // InternalCompleteOCL.g:13381:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
-            // InternalCompleteOCL.g:13382:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalCompleteOCL.g:13409:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalCompleteOCL.g:13410:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
             }
-            // InternalCompleteOCL.g:13383:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalCompleteOCL.g:13411:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             int alt116=2;
             int LA116_0 = input.LA(1);
 
@@ -39655,7 +39740,7 @@
             }
             switch (alt116) {
                 case 1 :
-                    // InternalCompleteOCL.g:13383:2: rule__NavigatingCommaArgCS__Alternatives_2
+                    // InternalCompleteOCL.g:13411:2: rule__NavigatingCommaArgCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Alternatives_2();
@@ -39693,16 +39778,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0"
-    // InternalCompleteOCL.g:13399:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
+    // InternalCompleteOCL.g:13427:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13403:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
-            // InternalCompleteOCL.g:13404:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
+            // InternalCompleteOCL.g:13431:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
+            // InternalCompleteOCL.g:13432:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__NavigatingCommaArgCS__Group_2_0__0__Impl();
 
             state._fsp--;
@@ -39731,17 +39816,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0__Impl"
-    // InternalCompleteOCL.g:13411:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:13439:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13415:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:13416:1: ( '<-' )
+            // InternalCompleteOCL.g:13443:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:13444:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:13416:1: ( '<-' )
-            // InternalCompleteOCL.g:13417:1: '<-'
+            // InternalCompleteOCL.g:13444:1: ( '<-' )
+            // InternalCompleteOCL.g:13445:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
@@ -39772,16 +39857,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1"
-    // InternalCompleteOCL.g:13430:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
+    // InternalCompleteOCL.g:13458:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13434:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
-            // InternalCompleteOCL.g:13435:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
+            // InternalCompleteOCL.g:13462:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
+            // InternalCompleteOCL.g:13463:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
             {
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             rule__NavigatingCommaArgCS__Group_2_0__1__Impl();
 
             state._fsp--;
@@ -39810,23 +39895,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1__Impl"
-    // InternalCompleteOCL.g:13442:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
+    // InternalCompleteOCL.g:13470:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13446:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
-            // InternalCompleteOCL.g:13447:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalCompleteOCL.g:13474:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
+            // InternalCompleteOCL.g:13475:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
             {
-            // InternalCompleteOCL.g:13447:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
-            // InternalCompleteOCL.g:13448:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalCompleteOCL.g:13475:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalCompleteOCL.g:13476:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_0_1());
             }
-            // InternalCompleteOCL.g:13449:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
-            // InternalCompleteOCL.g:13449:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
+            // InternalCompleteOCL.g:13477:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalCompleteOCL.g:13477:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1();
@@ -39861,14 +39946,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2"
-    // InternalCompleteOCL.g:13459:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
+    // InternalCompleteOCL.g:13487:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13463:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
-            // InternalCompleteOCL.g:13464:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
+            // InternalCompleteOCL.g:13491:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
+            // InternalCompleteOCL.g:13492:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0__2__Impl();
@@ -39894,22 +39979,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2__Impl"
-    // InternalCompleteOCL.g:13470:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
+    // InternalCompleteOCL.g:13498:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13474:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
-            // InternalCompleteOCL.g:13475:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalCompleteOCL.g:13502:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
+            // InternalCompleteOCL.g:13503:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
             {
-            // InternalCompleteOCL.g:13475:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
-            // InternalCompleteOCL.g:13476:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalCompleteOCL.g:13503:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalCompleteOCL.g:13504:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
             }
-            // InternalCompleteOCL.g:13477:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalCompleteOCL.g:13505:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             int alt117=2;
             int LA117_0 = input.LA(1);
 
@@ -39918,7 +40003,7 @@
             }
             switch (alt117) {
                 case 1 :
-                    // InternalCompleteOCL.g:13477:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
+                    // InternalCompleteOCL.g:13505:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0_2__0();
@@ -39956,14 +40041,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0"
-    // InternalCompleteOCL.g:13493:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
+    // InternalCompleteOCL.g:13521:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13497:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
-            // InternalCompleteOCL.g:13498:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
+            // InternalCompleteOCL.g:13525:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
+            // InternalCompleteOCL.g:13526:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl();
@@ -39994,17 +40079,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl"
-    // InternalCompleteOCL.g:13505:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:13533:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13509:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:13510:1: ( '=' )
+            // InternalCompleteOCL.g:13537:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:13538:1: ( '=' )
             {
-            // InternalCompleteOCL.g:13510:1: ( '=' )
-            // InternalCompleteOCL.g:13511:1: '='
+            // InternalCompleteOCL.g:13538:1: ( '=' )
+            // InternalCompleteOCL.g:13539:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
@@ -40035,14 +40120,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1"
-    // InternalCompleteOCL.g:13524:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
+    // InternalCompleteOCL.g:13552:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13528:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
-            // InternalCompleteOCL.g:13529:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
+            // InternalCompleteOCL.g:13556:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
+            // InternalCompleteOCL.g:13557:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl();
@@ -40068,23 +40153,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl"
-    // InternalCompleteOCL.g:13535:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
+    // InternalCompleteOCL.g:13563:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13539:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
-            // InternalCompleteOCL.g:13540:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalCompleteOCL.g:13567:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
+            // InternalCompleteOCL.g:13568:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
             {
-            // InternalCompleteOCL.g:13540:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
-            // InternalCompleteOCL.g:13541:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalCompleteOCL.g:13568:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalCompleteOCL.g:13569:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
             }
-            // InternalCompleteOCL.g:13542:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
-            // InternalCompleteOCL.g:13542:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
+            // InternalCompleteOCL.g:13570:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalCompleteOCL.g:13570:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1();
@@ -40119,16 +40204,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0"
-    // InternalCompleteOCL.g:13556:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
+    // InternalCompleteOCL.g:13584:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13560:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
-            // InternalCompleteOCL.g:13561:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
+            // InternalCompleteOCL.g:13588:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
+            // InternalCompleteOCL.g:13589:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingCommaArgCS__Group_2_1__0__Impl();
 
             state._fsp--;
@@ -40157,17 +40242,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0__Impl"
-    // InternalCompleteOCL.g:13568:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:13596:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13572:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:13573:1: ( ':' )
+            // InternalCompleteOCL.g:13600:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:13601:1: ( ':' )
             {
-            // InternalCompleteOCL.g:13573:1: ( ':' )
-            // InternalCompleteOCL.g:13574:1: ':'
+            // InternalCompleteOCL.g:13601:1: ( ':' )
+            // InternalCompleteOCL.g:13602:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
@@ -40198,16 +40283,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1"
-    // InternalCompleteOCL.g:13587:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
+    // InternalCompleteOCL.g:13615:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13591:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
-            // InternalCompleteOCL.g:13592:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
+            // InternalCompleteOCL.g:13619:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
+            // InternalCompleteOCL.g:13620:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
             {
-            pushFollow(FollowSets000.FOLLOW_67);
+            pushFollow(FollowSets000.FOLLOW_66);
             rule__NavigatingCommaArgCS__Group_2_1__1__Impl();
 
             state._fsp--;
@@ -40236,23 +40321,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"
-    // InternalCompleteOCL.g:13599:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:13627:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13603:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
-            // InternalCompleteOCL.g:13604:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:13631:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
+            // InternalCompleteOCL.g:13632:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:13604:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
-            // InternalCompleteOCL.g:13605:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalCompleteOCL.g:13632:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalCompleteOCL.g:13633:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_1_1());
             }
-            // InternalCompleteOCL.g:13606:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
-            // InternalCompleteOCL.g:13606:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
+            // InternalCompleteOCL.g:13634:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalCompleteOCL.g:13634:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1();
@@ -40287,16 +40372,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2"
-    // InternalCompleteOCL.g:13616:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
+    // InternalCompleteOCL.g:13644:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13620:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
-            // InternalCompleteOCL.g:13621:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
+            // InternalCompleteOCL.g:13648:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
+            // InternalCompleteOCL.g:13649:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
             {
-            pushFollow(FollowSets000.FOLLOW_67);
+            pushFollow(FollowSets000.FOLLOW_66);
             rule__NavigatingCommaArgCS__Group_2_1__2__Impl();
 
             state._fsp--;
@@ -40325,22 +40410,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2__Impl"
-    // InternalCompleteOCL.g:13628:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
+    // InternalCompleteOCL.g:13656:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13632:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
-            // InternalCompleteOCL.g:13633:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalCompleteOCL.g:13660:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
+            // InternalCompleteOCL.g:13661:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
             {
-            // InternalCompleteOCL.g:13633:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
-            // InternalCompleteOCL.g:13634:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalCompleteOCL.g:13661:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalCompleteOCL.g:13662:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_2());
             }
-            // InternalCompleteOCL.g:13635:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalCompleteOCL.g:13663:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             int alt118=2;
             int LA118_0 = input.LA(1);
 
@@ -40349,7 +40434,7 @@
             }
             switch (alt118) {
                 case 1 :
-                    // InternalCompleteOCL.g:13635:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
+                    // InternalCompleteOCL.g:13663:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_2__0();
@@ -40387,14 +40472,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3"
-    // InternalCompleteOCL.g:13645:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
+    // InternalCompleteOCL.g:13673:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13649:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
-            // InternalCompleteOCL.g:13650:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
+            // InternalCompleteOCL.g:13677:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
+            // InternalCompleteOCL.g:13678:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1__3__Impl();
@@ -40420,22 +40505,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3__Impl"
-    // InternalCompleteOCL.g:13656:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
+    // InternalCompleteOCL.g:13684:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13660:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
-            // InternalCompleteOCL.g:13661:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalCompleteOCL.g:13688:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
+            // InternalCompleteOCL.g:13689:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
             {
-            // InternalCompleteOCL.g:13661:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
-            // InternalCompleteOCL.g:13662:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalCompleteOCL.g:13689:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalCompleteOCL.g:13690:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_3());
             }
-            // InternalCompleteOCL.g:13663:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalCompleteOCL.g:13691:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             int alt119=2;
             int LA119_0 = input.LA(1);
 
@@ -40444,7 +40529,7 @@
             }
             switch (alt119) {
                 case 1 :
-                    // InternalCompleteOCL.g:13663:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
+                    // InternalCompleteOCL.g:13691:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_3__0();
@@ -40482,16 +40567,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0"
-    // InternalCompleteOCL.g:13681:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
+    // InternalCompleteOCL.g:13709:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13685:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
-            // InternalCompleteOCL.g:13686:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
+            // InternalCompleteOCL.g:13713:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
+            // InternalCompleteOCL.g:13714:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl();
 
             state._fsp--;
@@ -40520,17 +40605,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl"
-    // InternalCompleteOCL.g:13693:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:13721:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13697:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:13698:1: ( '<-' )
+            // InternalCompleteOCL.g:13725:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:13726:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:13698:1: ( '<-' )
-            // InternalCompleteOCL.g:13699:1: '<-'
+            // InternalCompleteOCL.g:13726:1: ( '<-' )
+            // InternalCompleteOCL.g:13727:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
@@ -40561,14 +40646,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1"
-    // InternalCompleteOCL.g:13712:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
+    // InternalCompleteOCL.g:13740:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13716:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
-            // InternalCompleteOCL.g:13717:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
+            // InternalCompleteOCL.g:13744:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
+            // InternalCompleteOCL.g:13745:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl();
@@ -40594,23 +40679,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl"
-    // InternalCompleteOCL.g:13723:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
+    // InternalCompleteOCL.g:13751:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13727:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
-            // InternalCompleteOCL.g:13728:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalCompleteOCL.g:13755:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
+            // InternalCompleteOCL.g:13756:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
             {
-            // InternalCompleteOCL.g:13728:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
-            // InternalCompleteOCL.g:13729:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalCompleteOCL.g:13756:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalCompleteOCL.g:13757:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_1_2_1());
             }
-            // InternalCompleteOCL.g:13730:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
-            // InternalCompleteOCL.g:13730:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
+            // InternalCompleteOCL.g:13758:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalCompleteOCL.g:13758:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1();
@@ -40645,14 +40730,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0"
-    // InternalCompleteOCL.g:13744:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
+    // InternalCompleteOCL.g:13772:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13748:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
-            // InternalCompleteOCL.g:13749:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
+            // InternalCompleteOCL.g:13776:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
+            // InternalCompleteOCL.g:13777:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl();
@@ -40683,17 +40768,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl"
-    // InternalCompleteOCL.g:13756:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:13784:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13760:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:13761:1: ( '=' )
+            // InternalCompleteOCL.g:13788:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:13789:1: ( '=' )
             {
-            // InternalCompleteOCL.g:13761:1: ( '=' )
-            // InternalCompleteOCL.g:13762:1: '='
+            // InternalCompleteOCL.g:13789:1: ( '=' )
+            // InternalCompleteOCL.g:13790:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());
@@ -40724,14 +40809,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1"
-    // InternalCompleteOCL.g:13775:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
+    // InternalCompleteOCL.g:13803:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13779:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
-            // InternalCompleteOCL.g:13780:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
+            // InternalCompleteOCL.g:13807:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
+            // InternalCompleteOCL.g:13808:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl();
@@ -40757,23 +40842,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl"
-    // InternalCompleteOCL.g:13786:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
+    // InternalCompleteOCL.g:13814:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13790:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
-            // InternalCompleteOCL.g:13791:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalCompleteOCL.g:13818:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
+            // InternalCompleteOCL.g:13819:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
             {
-            // InternalCompleteOCL.g:13791:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
-            // InternalCompleteOCL.g:13792:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalCompleteOCL.g:13819:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalCompleteOCL.g:13820:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_3_1());
             }
-            // InternalCompleteOCL.g:13793:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
-            // InternalCompleteOCL.g:13793:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
+            // InternalCompleteOCL.g:13821:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalCompleteOCL.g:13821:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1();
@@ -40808,16 +40893,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0"
-    // InternalCompleteOCL.g:13807:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
+    // InternalCompleteOCL.g:13835:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13811:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
-            // InternalCompleteOCL.g:13812:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
+            // InternalCompleteOCL.g:13839:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
+            // InternalCompleteOCL.g:13840:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             rule__NavigatingCommaArgCS__Group_2_2__0__Impl();
 
             state._fsp--;
@@ -40846,22 +40931,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0__Impl"
-    // InternalCompleteOCL.g:13819:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
+    // InternalCompleteOCL.g:13847:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13823:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
-            // InternalCompleteOCL.g:13824:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalCompleteOCL.g:13851:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
+            // InternalCompleteOCL.g:13852:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
             {
-            // InternalCompleteOCL.g:13824:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
-            // InternalCompleteOCL.g:13825:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalCompleteOCL.g:13852:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalCompleteOCL.g:13853:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_0());
             }
-            // InternalCompleteOCL.g:13826:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalCompleteOCL.g:13854:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             int alt120=2;
             int LA120_0 = input.LA(1);
 
@@ -40870,7 +40955,7 @@
             }
             switch (alt120) {
                 case 1 :
-                    // InternalCompleteOCL.g:13826:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
+                    // InternalCompleteOCL.g:13854:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_0__0();
@@ -40908,16 +40993,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1"
-    // InternalCompleteOCL.g:13836:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
+    // InternalCompleteOCL.g:13864:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13840:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
-            // InternalCompleteOCL.g:13841:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
+            // InternalCompleteOCL.g:13868:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
+            // InternalCompleteOCL.g:13869:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
             {
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             rule__NavigatingCommaArgCS__Group_2_2__1__Impl();
 
             state._fsp--;
@@ -40946,22 +41031,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1__Impl"
-    // InternalCompleteOCL.g:13848:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
+    // InternalCompleteOCL.g:13876:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13852:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
-            // InternalCompleteOCL.g:13853:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalCompleteOCL.g:13880:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
+            // InternalCompleteOCL.g:13881:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
             {
-            // InternalCompleteOCL.g:13853:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
-            // InternalCompleteOCL.g:13854:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalCompleteOCL.g:13881:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalCompleteOCL.g:13882:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_1());
             }
-            // InternalCompleteOCL.g:13855:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalCompleteOCL.g:13883:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             int alt121=2;
             int LA121_0 = input.LA(1);
 
@@ -40970,7 +41055,7 @@
             }
             switch (alt121) {
                 case 1 :
-                    // InternalCompleteOCL.g:13855:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
+                    // InternalCompleteOCL.g:13883:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_1__0();
@@ -41008,14 +41093,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2"
-    // InternalCompleteOCL.g:13865:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
+    // InternalCompleteOCL.g:13893:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13869:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
-            // InternalCompleteOCL.g:13870:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
+            // InternalCompleteOCL.g:13897:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
+            // InternalCompleteOCL.g:13898:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingCommaArgCS__Group_2_2__2__Impl();
@@ -41046,17 +41131,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2__Impl"
-    // InternalCompleteOCL.g:13877:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
+    // InternalCompleteOCL.g:13905:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13881:1: ( ( 'in' ) )
-            // InternalCompleteOCL.g:13882:1: ( 'in' )
+            // InternalCompleteOCL.g:13909:1: ( ( 'in' ) )
+            // InternalCompleteOCL.g:13910:1: ( 'in' )
             {
-            // InternalCompleteOCL.g:13882:1: ( 'in' )
-            // InternalCompleteOCL.g:13883:1: 'in'
+            // InternalCompleteOCL.g:13910:1: ( 'in' )
+            // InternalCompleteOCL.g:13911:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());
@@ -41087,14 +41172,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3"
-    // InternalCompleteOCL.g:13896:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
+    // InternalCompleteOCL.g:13924:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13900:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
-            // InternalCompleteOCL.g:13901:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
+            // InternalCompleteOCL.g:13928:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
+            // InternalCompleteOCL.g:13929:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2__3__Impl();
@@ -41120,23 +41205,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3__Impl"
-    // InternalCompleteOCL.g:13907:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
+    // InternalCompleteOCL.g:13935:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13911:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
-            // InternalCompleteOCL.g:13912:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalCompleteOCL.g:13939:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
+            // InternalCompleteOCL.g:13940:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
             {
-            // InternalCompleteOCL.g:13912:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
-            // InternalCompleteOCL.g:13913:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalCompleteOCL.g:13940:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalCompleteOCL.g:13941:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_2_3());
             }
-            // InternalCompleteOCL.g:13914:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
-            // InternalCompleteOCL.g:13914:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
+            // InternalCompleteOCL.g:13942:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalCompleteOCL.g:13942:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3();
@@ -41171,16 +41256,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0"
-    // InternalCompleteOCL.g:13932:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
+    // InternalCompleteOCL.g:13960:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13936:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
-            // InternalCompleteOCL.g:13937:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
+            // InternalCompleteOCL.g:13964:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
+            // InternalCompleteOCL.g:13965:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl();
 
             state._fsp--;
@@ -41209,17 +41294,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl"
-    // InternalCompleteOCL.g:13944:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:13972:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13948:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:13949:1: ( ':' )
+            // InternalCompleteOCL.g:13976:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:13977:1: ( ':' )
             {
-            // InternalCompleteOCL.g:13949:1: ( ':' )
-            // InternalCompleteOCL.g:13950:1: ':'
+            // InternalCompleteOCL.g:13977:1: ( ':' )
+            // InternalCompleteOCL.g:13978:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
@@ -41250,14 +41335,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1"
-    // InternalCompleteOCL.g:13963:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
+    // InternalCompleteOCL.g:13991:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13967:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
-            // InternalCompleteOCL.g:13968:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
+            // InternalCompleteOCL.g:13995:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
+            // InternalCompleteOCL.g:13996:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl();
@@ -41283,23 +41368,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl"
-    // InternalCompleteOCL.g:13974:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
+    // InternalCompleteOCL.g:14002:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13978:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
-            // InternalCompleteOCL.g:13979:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalCompleteOCL.g:14006:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
+            // InternalCompleteOCL.g:14007:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
             {
-            // InternalCompleteOCL.g:13979:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
-            // InternalCompleteOCL.g:13980:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalCompleteOCL.g:14007:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalCompleteOCL.g:14008:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_2_0_1());
             }
-            // InternalCompleteOCL.g:13981:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
-            // InternalCompleteOCL.g:13981:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
+            // InternalCompleteOCL.g:14009:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalCompleteOCL.g:14009:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1();
@@ -41334,16 +41419,16 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0"
-    // InternalCompleteOCL.g:13995:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
+    // InternalCompleteOCL.g:14023:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:13999:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
-            // InternalCompleteOCL.g:14000:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
+            // InternalCompleteOCL.g:14027:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
+            // InternalCompleteOCL.g:14028:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl();
 
             state._fsp--;
@@ -41372,17 +41457,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl"
-    // InternalCompleteOCL.g:14007:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
+    // InternalCompleteOCL.g:14035:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14011:1: ( ( '<-' ) )
-            // InternalCompleteOCL.g:14012:1: ( '<-' )
+            // InternalCompleteOCL.g:14039:1: ( ( '<-' ) )
+            // InternalCompleteOCL.g:14040:1: ( '<-' )
             {
-            // InternalCompleteOCL.g:14012:1: ( '<-' )
-            // InternalCompleteOCL.g:14013:1: '<-'
+            // InternalCompleteOCL.g:14040:1: ( '<-' )
+            // InternalCompleteOCL.g:14041:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
@@ -41413,14 +41498,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1"
-    // InternalCompleteOCL.g:14026:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
+    // InternalCompleteOCL.g:14054:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14030:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
-            // InternalCompleteOCL.g:14031:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
+            // InternalCompleteOCL.g:14058:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
+            // InternalCompleteOCL.g:14059:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl();
@@ -41446,23 +41531,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl"
-    // InternalCompleteOCL.g:14037:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
+    // InternalCompleteOCL.g:14065:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14041:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
-            // InternalCompleteOCL.g:14042:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalCompleteOCL.g:14069:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
+            // InternalCompleteOCL.g:14070:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
             {
-            // InternalCompleteOCL.g:14042:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
-            // InternalCompleteOCL.g:14043:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalCompleteOCL.g:14070:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalCompleteOCL.g:14071:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_2_1_1());
             }
-            // InternalCompleteOCL.g:14044:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
-            // InternalCompleteOCL.g:14044:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
+            // InternalCompleteOCL.g:14072:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalCompleteOCL.g:14072:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1();
@@ -41497,16 +41582,16 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0"
-    // InternalCompleteOCL.g:14058:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
+    // InternalCompleteOCL.g:14086:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
     public final void rule__NavigatingSemiArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14062:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
-            // InternalCompleteOCL.g:14063:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
+            // InternalCompleteOCL.g:14090:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
+            // InternalCompleteOCL.g:14091:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_68);
+            pushFollow(FollowSets000.FOLLOW_67);
             rule__NavigatingSemiArgCS__Group__0__Impl();
 
             state._fsp--;
@@ -41535,23 +41620,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0__Impl"
-    // InternalCompleteOCL.g:14070:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:14098:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14074:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
-            // InternalCompleteOCL.g:14075:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalCompleteOCL.g:14102:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
+            // InternalCompleteOCL.g:14103:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:14075:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
-            // InternalCompleteOCL.g:14076:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalCompleteOCL.g:14103:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalCompleteOCL.g:14104:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalCompleteOCL.g:14077:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
-            // InternalCompleteOCL.g:14077:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
+            // InternalCompleteOCL.g:14105:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalCompleteOCL.g:14105:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__PrefixAssignment_0();
@@ -41586,16 +41671,16 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1"
-    // InternalCompleteOCL.g:14087:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
+    // InternalCompleteOCL.g:14115:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
     public final void rule__NavigatingSemiArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14091:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
-            // InternalCompleteOCL.g:14092:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
+            // InternalCompleteOCL.g:14119:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
+            // InternalCompleteOCL.g:14120:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__NavigatingSemiArgCS__Group__1__Impl();
 
             state._fsp--;
@@ -41624,23 +41709,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1__Impl"
-    // InternalCompleteOCL.g:14099:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:14127:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14103:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalCompleteOCL.g:14104:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:14131:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:14132:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:14104:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalCompleteOCL.g:14105:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalCompleteOCL.g:14132:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:14133:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalCompleteOCL.g:14106:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalCompleteOCL.g:14106:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
+            // InternalCompleteOCL.g:14134:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalCompleteOCL.g:14134:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1();
@@ -41675,14 +41760,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2"
-    // InternalCompleteOCL.g:14116:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:14144:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14120:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
-            // InternalCompleteOCL.g:14121:2: rule__NavigatingSemiArgCS__Group__2__Impl
+            // InternalCompleteOCL.g:14148:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
+            // InternalCompleteOCL.g:14149:2: rule__NavigatingSemiArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group__2__Impl();
@@ -41708,22 +41793,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2__Impl"
-    // InternalCompleteOCL.g:14127:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:14155:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14131:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:14132:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:14159:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:14160:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:14132:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:14133:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalCompleteOCL.g:14160:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:14161:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:14134:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalCompleteOCL.g:14162:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             int alt122=2;
             int LA122_0 = input.LA(1);
 
@@ -41732,7 +41817,7 @@
             }
             switch (alt122) {
                 case 1 :
-                    // InternalCompleteOCL.g:14134:2: rule__NavigatingSemiArgCS__Group_2__0
+                    // InternalCompleteOCL.g:14162:2: rule__NavigatingSemiArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2__0();
@@ -41770,16 +41855,16 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0"
-    // InternalCompleteOCL.g:14150:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
+    // InternalCompleteOCL.g:14178:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14154:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
-            // InternalCompleteOCL.g:14155:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
+            // InternalCompleteOCL.g:14182:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
+            // InternalCompleteOCL.g:14183:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__NavigatingSemiArgCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -41808,17 +41893,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:14162:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:14190:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14166:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:14167:1: ( ':' )
+            // InternalCompleteOCL.g:14194:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:14195:1: ( ':' )
             {
-            // InternalCompleteOCL.g:14167:1: ( ':' )
-            // InternalCompleteOCL.g:14168:1: ':'
+            // InternalCompleteOCL.g:14195:1: ( ':' )
+            // InternalCompleteOCL.g:14196:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
@@ -41849,16 +41934,16 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1"
-    // InternalCompleteOCL.g:14181:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
+    // InternalCompleteOCL.g:14209:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
     public final void rule__NavigatingSemiArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14185:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
-            // InternalCompleteOCL.g:14186:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
+            // InternalCompleteOCL.g:14213:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
+            // InternalCompleteOCL.g:14214:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
             {
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             rule__NavigatingSemiArgCS__Group_2__1__Impl();
 
             state._fsp--;
@@ -41887,23 +41972,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:14193:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:14221:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14197:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:14198:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalCompleteOCL.g:14225:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:14226:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:14198:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalCompleteOCL.g:14199:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalCompleteOCL.g:14226:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalCompleteOCL.g:14227:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalCompleteOCL.g:14200:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
-            // InternalCompleteOCL.g:14200:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
+            // InternalCompleteOCL.g:14228:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalCompleteOCL.g:14228:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1();
@@ -41938,14 +42023,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2"
-    // InternalCompleteOCL.g:14210:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
+    // InternalCompleteOCL.g:14238:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14214:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
-            // InternalCompleteOCL.g:14215:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
+            // InternalCompleteOCL.g:14242:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
+            // InternalCompleteOCL.g:14243:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2__2__Impl();
@@ -41971,22 +42056,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2__Impl"
-    // InternalCompleteOCL.g:14221:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
+    // InternalCompleteOCL.g:14249:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14225:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
-            // InternalCompleteOCL.g:14226:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalCompleteOCL.g:14253:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
+            // InternalCompleteOCL.g:14254:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
             {
-            // InternalCompleteOCL.g:14226:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
-            // InternalCompleteOCL.g:14227:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalCompleteOCL.g:14254:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalCompleteOCL.g:14255:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
             }
-            // InternalCompleteOCL.g:14228:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalCompleteOCL.g:14256:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             int alt123=2;
             int LA123_0 = input.LA(1);
 
@@ -41995,7 +42080,7 @@
             }
             switch (alt123) {
                 case 1 :
-                    // InternalCompleteOCL.g:14228:2: rule__NavigatingSemiArgCS__Group_2_2__0
+                    // InternalCompleteOCL.g:14256:2: rule__NavigatingSemiArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2_2__0();
@@ -42033,14 +42118,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0"
-    // InternalCompleteOCL.g:14244:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
+    // InternalCompleteOCL.g:14272:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14248:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
-            // InternalCompleteOCL.g:14249:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
+            // InternalCompleteOCL.g:14276:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
+            // InternalCompleteOCL.g:14277:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingSemiArgCS__Group_2_2__0__Impl();
@@ -42071,17 +42156,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0__Impl"
-    // InternalCompleteOCL.g:14256:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:14284:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14260:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:14261:1: ( '=' )
+            // InternalCompleteOCL.g:14288:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:14289:1: ( '=' )
             {
-            // InternalCompleteOCL.g:14261:1: ( '=' )
-            // InternalCompleteOCL.g:14262:1: '='
+            // InternalCompleteOCL.g:14289:1: ( '=' )
+            // InternalCompleteOCL.g:14290:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -42112,14 +42197,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1"
-    // InternalCompleteOCL.g:14275:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
+    // InternalCompleteOCL.g:14303:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14279:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
-            // InternalCompleteOCL.g:14280:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
+            // InternalCompleteOCL.g:14307:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
+            // InternalCompleteOCL.g:14308:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2_2__1__Impl();
@@ -42145,23 +42230,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1__Impl"
-    // InternalCompleteOCL.g:14286:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalCompleteOCL.g:14314:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14290:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalCompleteOCL.g:14291:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalCompleteOCL.g:14318:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalCompleteOCL.g:14319:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalCompleteOCL.g:14291:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalCompleteOCL.g:14292:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalCompleteOCL.g:14319:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalCompleteOCL.g:14320:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalCompleteOCL.g:14293:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalCompleteOCL.g:14293:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalCompleteOCL.g:14321:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalCompleteOCL.g:14321:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -42196,16 +42281,16 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0"
-    // InternalCompleteOCL.g:14307:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
+    // InternalCompleteOCL.g:14335:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
     public final void rule__CoIteratorVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14311:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
-            // InternalCompleteOCL.g:14312:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
+            // InternalCompleteOCL.g:14339:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
+            // InternalCompleteOCL.g:14340:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_16);
+            pushFollow(FollowSets000.FOLLOW_17);
             rule__CoIteratorVariableCS__Group__0__Impl();
 
             state._fsp--;
@@ -42234,23 +42319,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0__Impl"
-    // InternalCompleteOCL.g:14319:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:14347:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
     public final void rule__CoIteratorVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14323:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:14324:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:14351:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:14352:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:14324:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:14325:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:14352:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:14353:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:14326:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:14326:2: rule__CoIteratorVariableCS__NameAssignment_0
+            // InternalCompleteOCL.g:14354:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:14354:2: rule__CoIteratorVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__NameAssignment_0();
@@ -42285,14 +42370,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1"
-    // InternalCompleteOCL.g:14336:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:14364:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14340:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
-            // InternalCompleteOCL.g:14341:2: rule__CoIteratorVariableCS__Group__1__Impl
+            // InternalCompleteOCL.g:14368:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
+            // InternalCompleteOCL.g:14369:2: rule__CoIteratorVariableCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group__1__Impl();
@@ -42318,22 +42403,22 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1__Impl"
-    // InternalCompleteOCL.g:14347:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:14375:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
     public final void rule__CoIteratorVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14351:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:14352:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:14379:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:14380:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:14352:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:14353:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalCompleteOCL.g:14380:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:14381:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:14354:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalCompleteOCL.g:14382:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             int alt124=2;
             int LA124_0 = input.LA(1);
 
@@ -42342,7 +42427,7 @@
             }
             switch (alt124) {
                 case 1 :
-                    // InternalCompleteOCL.g:14354:2: rule__CoIteratorVariableCS__Group_1__0
+                    // InternalCompleteOCL.g:14382:2: rule__CoIteratorVariableCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CoIteratorVariableCS__Group_1__0();
@@ -42380,16 +42465,16 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0"
-    // InternalCompleteOCL.g:14368:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
+    // InternalCompleteOCL.g:14396:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
     public final void rule__CoIteratorVariableCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14372:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
-            // InternalCompleteOCL.g:14373:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
+            // InternalCompleteOCL.g:14400:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
+            // InternalCompleteOCL.g:14401:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__CoIteratorVariableCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -42418,17 +42503,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:14380:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:14408:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__CoIteratorVariableCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14384:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:14385:1: ( ':' )
+            // InternalCompleteOCL.g:14412:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:14413:1: ( ':' )
             {
-            // InternalCompleteOCL.g:14385:1: ( ':' )
-            // InternalCompleteOCL.g:14386:1: ':'
+            // InternalCompleteOCL.g:14413:1: ( ':' )
+            // InternalCompleteOCL.g:14414:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
@@ -42459,14 +42544,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1"
-    // InternalCompleteOCL.g:14399:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:14427:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14403:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:14404:2: rule__CoIteratorVariableCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:14431:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:14432:2: rule__CoIteratorVariableCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group_1__1__Impl();
@@ -42492,23 +42577,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:14410:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:14438:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CoIteratorVariableCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14414:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:14415:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:14442:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:14443:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:14415:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
-            // InternalCompleteOCL.g:14416:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:14443:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalCompleteOCL.g:14444:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalCompleteOCL.g:14417:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
-            // InternalCompleteOCL.g:14417:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
+            // InternalCompleteOCL.g:14445:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalCompleteOCL.g:14445:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1();
@@ -42543,14 +42628,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0"
-    // InternalCompleteOCL.g:14431:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
+    // InternalCompleteOCL.g:14459:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
     public final void rule__IfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14435:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
-            // InternalCompleteOCL.g:14436:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
+            // InternalCompleteOCL.g:14463:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
+            // InternalCompleteOCL.g:14464:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__IfExpCS__Group__0__Impl();
@@ -42581,17 +42666,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:14443:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
+    // InternalCompleteOCL.g:14471:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
     public final void rule__IfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14447:1: ( ( 'if' ) )
-            // InternalCompleteOCL.g:14448:1: ( 'if' )
+            // InternalCompleteOCL.g:14475:1: ( ( 'if' ) )
+            // InternalCompleteOCL.g:14476:1: ( 'if' )
             {
-            // InternalCompleteOCL.g:14448:1: ( 'if' )
-            // InternalCompleteOCL.g:14449:1: 'if'
+            // InternalCompleteOCL.g:14476:1: ( 'if' )
+            // InternalCompleteOCL.g:14477:1: 'if'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
@@ -42622,16 +42707,16 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1"
-    // InternalCompleteOCL.g:14462:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
+    // InternalCompleteOCL.g:14490:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
     public final void rule__IfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14466:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
-            // InternalCompleteOCL.g:14467:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
+            // InternalCompleteOCL.g:14494:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
+            // InternalCompleteOCL.g:14495:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_69);
+            pushFollow(FollowSets000.FOLLOW_68);
             rule__IfExpCS__Group__1__Impl();
 
             state._fsp--;
@@ -42660,23 +42745,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:14474:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:14502:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__IfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14478:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalCompleteOCL.g:14479:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalCompleteOCL.g:14506:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:14507:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:14479:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
-            // InternalCompleteOCL.g:14480:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalCompleteOCL.g:14507:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalCompleteOCL.g:14508:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalCompleteOCL.g:14481:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
-            // InternalCompleteOCL.g:14481:2: rule__IfExpCS__OwnedConditionAssignment_1
+            // InternalCompleteOCL.g:14509:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalCompleteOCL.g:14509:2: rule__IfExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAssignment_1();
@@ -42711,14 +42796,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2"
-    // InternalCompleteOCL.g:14491:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
+    // InternalCompleteOCL.g:14519:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
     public final void rule__IfExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14495:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
-            // InternalCompleteOCL.g:14496:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
+            // InternalCompleteOCL.g:14523:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
+            // InternalCompleteOCL.g:14524:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__IfExpCS__Group__2__Impl();
@@ -42749,17 +42834,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:14503:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalCompleteOCL.g:14531:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__IfExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14507:1: ( ( 'then' ) )
-            // InternalCompleteOCL.g:14508:1: ( 'then' )
+            // InternalCompleteOCL.g:14535:1: ( ( 'then' ) )
+            // InternalCompleteOCL.g:14536:1: ( 'then' )
             {
-            // InternalCompleteOCL.g:14508:1: ( 'then' )
-            // InternalCompleteOCL.g:14509:1: 'then'
+            // InternalCompleteOCL.g:14536:1: ( 'then' )
+            // InternalCompleteOCL.g:14537:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
@@ -42790,16 +42875,16 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3"
-    // InternalCompleteOCL.g:14522:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
+    // InternalCompleteOCL.g:14550:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
     public final void rule__IfExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14526:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
-            // InternalCompleteOCL.g:14527:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
+            // InternalCompleteOCL.g:14554:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
+            // InternalCompleteOCL.g:14555:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
             {
-            pushFollow(FollowSets000.FOLLOW_70);
+            pushFollow(FollowSets000.FOLLOW_69);
             rule__IfExpCS__Group__3__Impl();
 
             state._fsp--;
@@ -42828,23 +42913,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:14534:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalCompleteOCL.g:14562:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__IfExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14538:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalCompleteOCL.g:14539:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalCompleteOCL.g:14566:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalCompleteOCL.g:14567:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalCompleteOCL.g:14539:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalCompleteOCL.g:14540:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalCompleteOCL.g:14567:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalCompleteOCL.g:14568:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalCompleteOCL.g:14541:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalCompleteOCL.g:14541:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
+            // InternalCompleteOCL.g:14569:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalCompleteOCL.g:14569:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedThenExpressionAssignment_3();
@@ -42879,16 +42964,16 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4"
-    // InternalCompleteOCL.g:14551:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
+    // InternalCompleteOCL.g:14579:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
     public final void rule__IfExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14555:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
-            // InternalCompleteOCL.g:14556:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
+            // InternalCompleteOCL.g:14583:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
+            // InternalCompleteOCL.g:14584:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
             {
-            pushFollow(FollowSets000.FOLLOW_70);
+            pushFollow(FollowSets000.FOLLOW_69);
             rule__IfExpCS__Group__4__Impl();
 
             state._fsp--;
@@ -42917,22 +43002,22 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4__Impl"
-    // InternalCompleteOCL.g:14563:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
+    // InternalCompleteOCL.g:14591:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
     public final void rule__IfExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14567:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
-            // InternalCompleteOCL.g:14568:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalCompleteOCL.g:14595:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
+            // InternalCompleteOCL.g:14596:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
             {
-            // InternalCompleteOCL.g:14568:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
-            // InternalCompleteOCL.g:14569:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalCompleteOCL.g:14596:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalCompleteOCL.g:14597:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
             }
-            // InternalCompleteOCL.g:14570:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalCompleteOCL.g:14598:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             loop125:
             do {
                 int alt125=2;
@@ -42945,9 +43030,9 @@
 
                 switch (alt125) {
             	case 1 :
-            	    // InternalCompleteOCL.g:14570:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
+            	    // InternalCompleteOCL.g:14598:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    pushFollow(FollowSets000.FOLLOW_70);
             	    rule__IfExpCS__OwnedIfThenExpressionsAssignment_4();
 
             	    state._fsp--;
@@ -42986,14 +43071,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5"
-    // InternalCompleteOCL.g:14580:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
+    // InternalCompleteOCL.g:14608:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
     public final void rule__IfExpCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14584:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
-            // InternalCompleteOCL.g:14585:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
+            // InternalCompleteOCL.g:14612:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
+            // InternalCompleteOCL.g:14613:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__IfExpCS__Group__5__Impl();
@@ -43024,17 +43109,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5__Impl"
-    // InternalCompleteOCL.g:14592:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
+    // InternalCompleteOCL.g:14620:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
     public final void rule__IfExpCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14596:1: ( ( 'else' ) )
-            // InternalCompleteOCL.g:14597:1: ( 'else' )
+            // InternalCompleteOCL.g:14624:1: ( ( 'else' ) )
+            // InternalCompleteOCL.g:14625:1: ( 'else' )
             {
-            // InternalCompleteOCL.g:14597:1: ( 'else' )
-            // InternalCompleteOCL.g:14598:1: 'else'
+            // InternalCompleteOCL.g:14625:1: ( 'else' )
+            // InternalCompleteOCL.g:14626:1: 'else'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
@@ -43065,16 +43150,16 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6"
-    // InternalCompleteOCL.g:14611:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
+    // InternalCompleteOCL.g:14639:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
     public final void rule__IfExpCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14615:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
-            // InternalCompleteOCL.g:14616:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
+            // InternalCompleteOCL.g:14643:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
+            // InternalCompleteOCL.g:14644:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
             {
-            pushFollow(FollowSets000.FOLLOW_72);
+            pushFollow(FollowSets000.FOLLOW_71);
             rule__IfExpCS__Group__6__Impl();
 
             state._fsp--;
@@ -43103,23 +43188,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6__Impl"
-    // InternalCompleteOCL.g:14623:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
+    // InternalCompleteOCL.g:14651:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
     public final void rule__IfExpCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14627:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
-            // InternalCompleteOCL.g:14628:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalCompleteOCL.g:14655:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
+            // InternalCompleteOCL.g:14656:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
             {
-            // InternalCompleteOCL.g:14628:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
-            // InternalCompleteOCL.g:14629:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalCompleteOCL.g:14656:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalCompleteOCL.g:14657:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
             }
-            // InternalCompleteOCL.g:14630:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
-            // InternalCompleteOCL.g:14630:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
+            // InternalCompleteOCL.g:14658:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalCompleteOCL.g:14658:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedElseExpressionAssignment_6();
@@ -43154,14 +43239,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7"
-    // InternalCompleteOCL.g:14640:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
+    // InternalCompleteOCL.g:14668:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
     public final void rule__IfExpCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14644:1: ( rule__IfExpCS__Group__7__Impl )
-            // InternalCompleteOCL.g:14645:2: rule__IfExpCS__Group__7__Impl
+            // InternalCompleteOCL.g:14672:1: ( rule__IfExpCS__Group__7__Impl )
+            // InternalCompleteOCL.g:14673:2: rule__IfExpCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__Group__7__Impl();
@@ -43187,17 +43272,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7__Impl"
-    // InternalCompleteOCL.g:14651:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
+    // InternalCompleteOCL.g:14679:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
     public final void rule__IfExpCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14655:1: ( ( 'endif' ) )
-            // InternalCompleteOCL.g:14656:1: ( 'endif' )
+            // InternalCompleteOCL.g:14683:1: ( ( 'endif' ) )
+            // InternalCompleteOCL.g:14684:1: ( 'endif' )
             {
-            // InternalCompleteOCL.g:14656:1: ( 'endif' )
-            // InternalCompleteOCL.g:14657:1: 'endif'
+            // InternalCompleteOCL.g:14684:1: ( 'endif' )
+            // InternalCompleteOCL.g:14685:1: 'endif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
@@ -43228,14 +43313,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0"
-    // InternalCompleteOCL.g:14686:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
+    // InternalCompleteOCL.g:14714:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
     public final void rule__ElseIfThenExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14690:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
-            // InternalCompleteOCL.g:14691:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
+            // InternalCompleteOCL.g:14718:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
+            // InternalCompleteOCL.g:14719:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__ElseIfThenExpCS__Group__0__Impl();
@@ -43266,17 +43351,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:14698:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
+    // InternalCompleteOCL.g:14726:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
     public final void rule__ElseIfThenExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14702:1: ( ( 'elseif' ) )
-            // InternalCompleteOCL.g:14703:1: ( 'elseif' )
+            // InternalCompleteOCL.g:14730:1: ( ( 'elseif' ) )
+            // InternalCompleteOCL.g:14731:1: ( 'elseif' )
             {
-            // InternalCompleteOCL.g:14703:1: ( 'elseif' )
-            // InternalCompleteOCL.g:14704:1: 'elseif'
+            // InternalCompleteOCL.g:14731:1: ( 'elseif' )
+            // InternalCompleteOCL.g:14732:1: 'elseif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
@@ -43307,16 +43392,16 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1"
-    // InternalCompleteOCL.g:14717:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
+    // InternalCompleteOCL.g:14745:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
     public final void rule__ElseIfThenExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14721:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
-            // InternalCompleteOCL.g:14722:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
+            // InternalCompleteOCL.g:14749:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
+            // InternalCompleteOCL.g:14750:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_69);
+            pushFollow(FollowSets000.FOLLOW_68);
             rule__ElseIfThenExpCS__Group__1__Impl();
 
             state._fsp--;
@@ -43345,23 +43430,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:14729:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:14757:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14733:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalCompleteOCL.g:14734:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalCompleteOCL.g:14761:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:14762:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:14734:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
-            // InternalCompleteOCL.g:14735:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalCompleteOCL.g:14762:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalCompleteOCL.g:14763:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalCompleteOCL.g:14736:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
-            // InternalCompleteOCL.g:14736:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
+            // InternalCompleteOCL.g:14764:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalCompleteOCL.g:14764:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedConditionAssignment_1();
@@ -43396,14 +43481,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2"
-    // InternalCompleteOCL.g:14746:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
+    // InternalCompleteOCL.g:14774:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
     public final void rule__ElseIfThenExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14750:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
-            // InternalCompleteOCL.g:14751:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
+            // InternalCompleteOCL.g:14778:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
+            // InternalCompleteOCL.g:14779:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__ElseIfThenExpCS__Group__2__Impl();
@@ -43434,17 +43519,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:14758:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalCompleteOCL.g:14786:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__ElseIfThenExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14762:1: ( ( 'then' ) )
-            // InternalCompleteOCL.g:14763:1: ( 'then' )
+            // InternalCompleteOCL.g:14790:1: ( ( 'then' ) )
+            // InternalCompleteOCL.g:14791:1: ( 'then' )
             {
-            // InternalCompleteOCL.g:14763:1: ( 'then' )
-            // InternalCompleteOCL.g:14764:1: 'then'
+            // InternalCompleteOCL.g:14791:1: ( 'then' )
+            // InternalCompleteOCL.g:14792:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
@@ -43475,14 +43560,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3"
-    // InternalCompleteOCL.g:14777:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:14805:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
     public final void rule__ElseIfThenExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14781:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
-            // InternalCompleteOCL.g:14782:2: rule__ElseIfThenExpCS__Group__3__Impl
+            // InternalCompleteOCL.g:14809:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
+            // InternalCompleteOCL.g:14810:2: rule__ElseIfThenExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__Group__3__Impl();
@@ -43508,23 +43593,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:14788:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalCompleteOCL.g:14816:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14792:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalCompleteOCL.g:14793:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalCompleteOCL.g:14820:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalCompleteOCL.g:14821:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalCompleteOCL.g:14793:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalCompleteOCL.g:14794:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalCompleteOCL.g:14821:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalCompleteOCL.g:14822:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalCompleteOCL.g:14795:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalCompleteOCL.g:14795:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
+            // InternalCompleteOCL.g:14823:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalCompleteOCL.g:14823:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3();
@@ -43559,16 +43644,16 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0"
-    // InternalCompleteOCL.g:14813:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
+    // InternalCompleteOCL.g:14841:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
     public final void rule__LetExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14817:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
-            // InternalCompleteOCL.g:14818:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
+            // InternalCompleteOCL.g:14845:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
+            // InternalCompleteOCL.g:14846:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__LetExpCS__Group__0__Impl();
 
             state._fsp--;
@@ -43597,17 +43682,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:14825:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
+    // InternalCompleteOCL.g:14853:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
     public final void rule__LetExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14829:1: ( ( 'let' ) )
-            // InternalCompleteOCL.g:14830:1: ( 'let' )
+            // InternalCompleteOCL.g:14857:1: ( ( 'let' ) )
+            // InternalCompleteOCL.g:14858:1: ( 'let' )
             {
-            // InternalCompleteOCL.g:14830:1: ( 'let' )
-            // InternalCompleteOCL.g:14831:1: 'let'
+            // InternalCompleteOCL.g:14858:1: ( 'let' )
+            // InternalCompleteOCL.g:14859:1: 'let'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
@@ -43638,16 +43723,16 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1"
-    // InternalCompleteOCL.g:14844:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
+    // InternalCompleteOCL.g:14872:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
     public final void rule__LetExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14848:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
-            // InternalCompleteOCL.g:14849:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
+            // InternalCompleteOCL.g:14876:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
+            // InternalCompleteOCL.g:14877:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_73);
+            pushFollow(FollowSets000.FOLLOW_72);
             rule__LetExpCS__Group__1__Impl();
 
             state._fsp--;
@@ -43676,23 +43761,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:14856:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:14884:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
     public final void rule__LetExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14860:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
-            // InternalCompleteOCL.g:14861:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalCompleteOCL.g:14888:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
+            // InternalCompleteOCL.g:14889:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:14861:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
-            // InternalCompleteOCL.g:14862:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalCompleteOCL.g:14889:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalCompleteOCL.g:14890:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
             }
-            // InternalCompleteOCL.g:14863:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
-            // InternalCompleteOCL.g:14863:2: rule__LetExpCS__OwnedVariablesAssignment_1
+            // InternalCompleteOCL.g:14891:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalCompleteOCL.g:14891:2: rule__LetExpCS__OwnedVariablesAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_1();
@@ -43727,16 +43812,16 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2"
-    // InternalCompleteOCL.g:14873:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
+    // InternalCompleteOCL.g:14901:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
     public final void rule__LetExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14877:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
-            // InternalCompleteOCL.g:14878:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
+            // InternalCompleteOCL.g:14905:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
+            // InternalCompleteOCL.g:14906:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_73);
+            pushFollow(FollowSets000.FOLLOW_72);
             rule__LetExpCS__Group__2__Impl();
 
             state._fsp--;
@@ -43765,22 +43850,22 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:14885:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
+    // InternalCompleteOCL.g:14913:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
     public final void rule__LetExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14889:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
-            // InternalCompleteOCL.g:14890:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalCompleteOCL.g:14917:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
+            // InternalCompleteOCL.g:14918:1: ( ( rule__LetExpCS__Group_2__0 )* )
             {
-            // InternalCompleteOCL.g:14890:1: ( ( rule__LetExpCS__Group_2__0 )* )
-            // InternalCompleteOCL.g:14891:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalCompleteOCL.g:14918:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalCompleteOCL.g:14919:1: ( rule__LetExpCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:14892:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalCompleteOCL.g:14920:1: ( rule__LetExpCS__Group_2__0 )*
             loop126:
             do {
                 int alt126=2;
@@ -43793,9 +43878,9 @@
 
                 switch (alt126) {
             	case 1 :
-            	    // InternalCompleteOCL.g:14892:2: rule__LetExpCS__Group_2__0
+            	    // InternalCompleteOCL.g:14920:2: rule__LetExpCS__Group_2__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__LetExpCS__Group_2__0();
 
             	    state._fsp--;
@@ -43834,14 +43919,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3"
-    // InternalCompleteOCL.g:14902:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
+    // InternalCompleteOCL.g:14930:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
     public final void rule__LetExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14906:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
-            // InternalCompleteOCL.g:14907:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
+            // InternalCompleteOCL.g:14934:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
+            // InternalCompleteOCL.g:14935:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__LetExpCS__Group__3__Impl();
@@ -43872,17 +43957,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3__Impl"
-    // InternalCompleteOCL.g:14914:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
+    // InternalCompleteOCL.g:14942:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
     public final void rule__LetExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14918:1: ( ( 'in' ) )
-            // InternalCompleteOCL.g:14919:1: ( 'in' )
+            // InternalCompleteOCL.g:14946:1: ( ( 'in' ) )
+            // InternalCompleteOCL.g:14947:1: ( 'in' )
             {
-            // InternalCompleteOCL.g:14919:1: ( 'in' )
-            // InternalCompleteOCL.g:14920:1: 'in'
+            // InternalCompleteOCL.g:14947:1: ( 'in' )
+            // InternalCompleteOCL.g:14948:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getInKeyword_3());
@@ -43913,14 +43998,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4"
-    // InternalCompleteOCL.g:14933:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:14961:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
     public final void rule__LetExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14937:1: ( rule__LetExpCS__Group__4__Impl )
-            // InternalCompleteOCL.g:14938:2: rule__LetExpCS__Group__4__Impl
+            // InternalCompleteOCL.g:14965:1: ( rule__LetExpCS__Group__4__Impl )
+            // InternalCompleteOCL.g:14966:2: rule__LetExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group__4__Impl();
@@ -43946,23 +44031,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4__Impl"
-    // InternalCompleteOCL.g:14944:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
+    // InternalCompleteOCL.g:14972:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
     public final void rule__LetExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14948:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
-            // InternalCompleteOCL.g:14949:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalCompleteOCL.g:14976:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
+            // InternalCompleteOCL.g:14977:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
             {
-            // InternalCompleteOCL.g:14949:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
-            // InternalCompleteOCL.g:14950:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalCompleteOCL.g:14977:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalCompleteOCL.g:14978:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
             }
-            // InternalCompleteOCL.g:14951:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
-            // InternalCompleteOCL.g:14951:2: rule__LetExpCS__OwnedInExpressionAssignment_4
+            // InternalCompleteOCL.g:14979:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalCompleteOCL.g:14979:2: rule__LetExpCS__OwnedInExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedInExpressionAssignment_4();
@@ -43997,16 +44082,16 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0"
-    // InternalCompleteOCL.g:14971:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
+    // InternalCompleteOCL.g:14999:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
     public final void rule__LetExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14975:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
-            // InternalCompleteOCL.g:14976:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
+            // InternalCompleteOCL.g:15003:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
+            // InternalCompleteOCL.g:15004:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_20);
+            pushFollow(FollowSets000.FOLLOW_21);
             rule__LetExpCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -44035,17 +44120,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:14983:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:15011:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__LetExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:14987:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:14988:1: ( ',' )
+            // InternalCompleteOCL.g:15015:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:15016:1: ( ',' )
             {
-            // InternalCompleteOCL.g:14988:1: ( ',' )
-            // InternalCompleteOCL.g:14989:1: ','
+            // InternalCompleteOCL.g:15016:1: ( ',' )
+            // InternalCompleteOCL.g:15017:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
@@ -44076,14 +44161,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1"
-    // InternalCompleteOCL.g:15002:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:15030:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
     public final void rule__LetExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15006:1: ( rule__LetExpCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:15007:2: rule__LetExpCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:15034:1: ( rule__LetExpCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:15035:2: rule__LetExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group_2__1__Impl();
@@ -44109,23 +44194,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:15013:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:15041:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
     public final void rule__LetExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15017:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:15018:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalCompleteOCL.g:15045:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:15046:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:15018:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
-            // InternalCompleteOCL.g:15019:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalCompleteOCL.g:15046:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalCompleteOCL.g:15047:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
             }
-            // InternalCompleteOCL.g:15020:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
-            // InternalCompleteOCL.g:15020:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
+            // InternalCompleteOCL.g:15048:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalCompleteOCL.g:15048:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_2_1();
@@ -44160,16 +44245,16 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0"
-    // InternalCompleteOCL.g:15034:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
+    // InternalCompleteOCL.g:15062:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
     public final void rule__LetVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15038:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
-            // InternalCompleteOCL.g:15039:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
+            // InternalCompleteOCL.g:15066:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
+            // InternalCompleteOCL.g:15067:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_74);
+            pushFollow(FollowSets000.FOLLOW_73);
             rule__LetVariableCS__Group__0__Impl();
 
             state._fsp--;
@@ -44198,23 +44283,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15046:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:15074:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
     public final void rule__LetVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15050:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:15051:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:15078:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:15079:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:15051:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:15052:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:15079:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:15080:1: ( rule__LetVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:15053:1: ( rule__LetVariableCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:15053:2: rule__LetVariableCS__NameAssignment_0
+            // InternalCompleteOCL.g:15081:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:15081:2: rule__LetVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__NameAssignment_0();
@@ -44249,16 +44334,16 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1"
-    // InternalCompleteOCL.g:15063:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
+    // InternalCompleteOCL.g:15091:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
     public final void rule__LetVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15067:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
-            // InternalCompleteOCL.g:15068:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
+            // InternalCompleteOCL.g:15095:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
+            // InternalCompleteOCL.g:15096:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_74);
+            pushFollow(FollowSets000.FOLLOW_73);
             rule__LetVariableCS__Group__1__Impl();
 
             state._fsp--;
@@ -44287,22 +44372,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15075:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
+    // InternalCompleteOCL.g:15103:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
     public final void rule__LetVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15079:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
-            // InternalCompleteOCL.g:15080:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalCompleteOCL.g:15107:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
+            // InternalCompleteOCL.g:15108:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
             {
-            // InternalCompleteOCL.g:15080:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
-            // InternalCompleteOCL.g:15081:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalCompleteOCL.g:15108:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalCompleteOCL.g:15109:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
             }
-            // InternalCompleteOCL.g:15082:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalCompleteOCL.g:15110:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             int alt127=2;
             int LA127_0 = input.LA(1);
 
@@ -44311,7 +44396,7 @@
             }
             switch (alt127) {
                 case 1 :
-                    // InternalCompleteOCL.g:15082:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
+                    // InternalCompleteOCL.g:15110:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1();
@@ -44349,16 +44434,16 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2"
-    // InternalCompleteOCL.g:15092:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
+    // InternalCompleteOCL.g:15120:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
     public final void rule__LetVariableCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15096:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
-            // InternalCompleteOCL.g:15097:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
+            // InternalCompleteOCL.g:15124:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
+            // InternalCompleteOCL.g:15125:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_74);
+            pushFollow(FollowSets000.FOLLOW_73);
             rule__LetVariableCS__Group__2__Impl();
 
             state._fsp--;
@@ -44387,22 +44472,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2__Impl"
-    // InternalCompleteOCL.g:15104:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:15132:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
     public final void rule__LetVariableCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15108:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:15109:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:15136:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:15137:1: ( ( rule__LetVariableCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:15109:1: ( ( rule__LetVariableCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:15110:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalCompleteOCL.g:15137:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:15138:1: ( rule__LetVariableCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:15111:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalCompleteOCL.g:15139:1: ( rule__LetVariableCS__Group_2__0 )?
             int alt128=2;
             int LA128_0 = input.LA(1);
 
@@ -44411,7 +44496,7 @@
             }
             switch (alt128) {
                 case 1 :
-                    // InternalCompleteOCL.g:15111:2: rule__LetVariableCS__Group_2__0
+                    // InternalCompleteOCL.g:15139:2: rule__LetVariableCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__Group_2__0();
@@ -44449,14 +44534,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3"
-    // InternalCompleteOCL.g:15121:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
+    // InternalCompleteOCL.g:15149:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
     public final void rule__LetVariableCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15125:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
-            // InternalCompleteOCL.g:15126:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
+            // InternalCompleteOCL.g:15153:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
+            // InternalCompleteOCL.g:15154:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__LetVariableCS__Group__3__Impl();
@@ -44487,17 +44572,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3__Impl"
-    // InternalCompleteOCL.g:15133:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
+    // InternalCompleteOCL.g:15161:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
     public final void rule__LetVariableCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15137:1: ( ( '=' ) )
-            // InternalCompleteOCL.g:15138:1: ( '=' )
+            // InternalCompleteOCL.g:15165:1: ( ( '=' ) )
+            // InternalCompleteOCL.g:15166:1: ( '=' )
             {
-            // InternalCompleteOCL.g:15138:1: ( '=' )
-            // InternalCompleteOCL.g:15139:1: '='
+            // InternalCompleteOCL.g:15166:1: ( '=' )
+            // InternalCompleteOCL.g:15167:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
@@ -44528,14 +44613,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4"
-    // InternalCompleteOCL.g:15152:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
+    // InternalCompleteOCL.g:15180:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
     public final void rule__LetVariableCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15156:1: ( rule__LetVariableCS__Group__4__Impl )
-            // InternalCompleteOCL.g:15157:2: rule__LetVariableCS__Group__4__Impl
+            // InternalCompleteOCL.g:15184:1: ( rule__LetVariableCS__Group__4__Impl )
+            // InternalCompleteOCL.g:15185:2: rule__LetVariableCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group__4__Impl();
@@ -44561,23 +44646,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4__Impl"
-    // InternalCompleteOCL.g:15163:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
+    // InternalCompleteOCL.g:15191:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
     public final void rule__LetVariableCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15167:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
-            // InternalCompleteOCL.g:15168:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalCompleteOCL.g:15195:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
+            // InternalCompleteOCL.g:15196:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
             {
-            // InternalCompleteOCL.g:15168:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
-            // InternalCompleteOCL.g:15169:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalCompleteOCL.g:15196:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalCompleteOCL.g:15197:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
             }
-            // InternalCompleteOCL.g:15170:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
-            // InternalCompleteOCL.g:15170:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
+            // InternalCompleteOCL.g:15198:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalCompleteOCL.g:15198:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedInitExpressionAssignment_4();
@@ -44612,16 +44697,16 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0"
-    // InternalCompleteOCL.g:15190:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
+    // InternalCompleteOCL.g:15218:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
     public final void rule__LetVariableCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15194:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
-            // InternalCompleteOCL.g:15195:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
+            // InternalCompleteOCL.g:15222:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
+            // InternalCompleteOCL.g:15223:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__LetVariableCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -44650,17 +44735,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:15202:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalCompleteOCL.g:15230:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__LetVariableCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15206:1: ( ( ':' ) )
-            // InternalCompleteOCL.g:15207:1: ( ':' )
+            // InternalCompleteOCL.g:15234:1: ( ( ':' ) )
+            // InternalCompleteOCL.g:15235:1: ( ':' )
             {
-            // InternalCompleteOCL.g:15207:1: ( ':' )
-            // InternalCompleteOCL.g:15208:1: ':'
+            // InternalCompleteOCL.g:15235:1: ( ':' )
+            // InternalCompleteOCL.g:15236:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
@@ -44691,14 +44776,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1"
-    // InternalCompleteOCL.g:15221:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:15249:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
     public final void rule__LetVariableCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15225:1: ( rule__LetVariableCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:15226:2: rule__LetVariableCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:15253:1: ( rule__LetVariableCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:15254:2: rule__LetVariableCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group_2__1__Impl();
@@ -44724,23 +44809,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:15232:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:15260:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__LetVariableCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15236:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:15237:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalCompleteOCL.g:15264:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:15265:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:15237:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
-            // InternalCompleteOCL.g:15238:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalCompleteOCL.g:15265:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalCompleteOCL.g:15266:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalCompleteOCL.g:15239:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
-            // InternalCompleteOCL.g:15239:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
+            // InternalCompleteOCL.g:15267:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalCompleteOCL.g:15267:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedTypeAssignment_2_1();
@@ -44775,14 +44860,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0"
-    // InternalCompleteOCL.g:15253:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
+    // InternalCompleteOCL.g:15281:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
     public final void rule__NestedExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15257:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
-            // InternalCompleteOCL.g:15258:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
+            // InternalCompleteOCL.g:15285:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
+            // InternalCompleteOCL.g:15286:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NestedExpCS__Group__0__Impl();
@@ -44813,17 +44898,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15265:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:15293:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
     public final void rule__NestedExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15269:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:15270:1: ( '(' )
+            // InternalCompleteOCL.g:15297:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:15298:1: ( '(' )
             {
-            // InternalCompleteOCL.g:15270:1: ( '(' )
-            // InternalCompleteOCL.g:15271:1: '('
+            // InternalCompleteOCL.g:15298:1: ( '(' )
+            // InternalCompleteOCL.g:15299:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
@@ -44854,14 +44939,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1"
-    // InternalCompleteOCL.g:15284:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
+    // InternalCompleteOCL.g:15312:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
     public final void rule__NestedExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15288:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
-            // InternalCompleteOCL.g:15289:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
+            // InternalCompleteOCL.g:15316:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
+            // InternalCompleteOCL.g:15317:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__NestedExpCS__Group__1__Impl();
@@ -44892,23 +44977,23 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15296:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
+    // InternalCompleteOCL.g:15324:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
     public final void rule__NestedExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15300:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
-            // InternalCompleteOCL.g:15301:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:15328:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalCompleteOCL.g:15329:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
             {
-            // InternalCompleteOCL.g:15301:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
-            // InternalCompleteOCL.g:15302:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalCompleteOCL.g:15329:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalCompleteOCL.g:15330:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
             }
-            // InternalCompleteOCL.g:15303:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
-            // InternalCompleteOCL.g:15303:2: rule__NestedExpCS__OwnedExpressionAssignment_1
+            // InternalCompleteOCL.g:15331:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalCompleteOCL.g:15331:2: rule__NestedExpCS__OwnedExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__OwnedExpressionAssignment_1();
@@ -44943,14 +45028,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2"
-    // InternalCompleteOCL.g:15313:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:15341:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
     public final void rule__NestedExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15317:1: ( rule__NestedExpCS__Group__2__Impl )
-            // InternalCompleteOCL.g:15318:2: rule__NestedExpCS__Group__2__Impl
+            // InternalCompleteOCL.g:15345:1: ( rule__NestedExpCS__Group__2__Impl )
+            // InternalCompleteOCL.g:15346:2: rule__NestedExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__Group__2__Impl();
@@ -44976,17 +45061,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2__Impl"
-    // InternalCompleteOCL.g:15324:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:15352:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
     public final void rule__NestedExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15328:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:15329:1: ( ')' )
+            // InternalCompleteOCL.g:15356:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:15357:1: ( ')' )
             {
-            // InternalCompleteOCL.g:15329:1: ( ')' )
-            // InternalCompleteOCL.g:15330:1: ')'
+            // InternalCompleteOCL.g:15357:1: ( ')' )
+            // InternalCompleteOCL.g:15358:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
@@ -45017,16 +45102,16 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0"
-    // InternalCompleteOCL.g:15349:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
+    // InternalCompleteOCL.g:15377:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
     public final void rule__SelfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15353:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
-            // InternalCompleteOCL.g:15354:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
+            // InternalCompleteOCL.g:15381:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
+            // InternalCompleteOCL.g:15382:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_75);
+            pushFollow(FollowSets000.FOLLOW_74);
             rule__SelfExpCS__Group__0__Impl();
 
             state._fsp--;
@@ -45055,23 +45140,23 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15361:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:15389:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
     public final void rule__SelfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15365:1: ( ( () ) )
-            // InternalCompleteOCL.g:15366:1: ( () )
+            // InternalCompleteOCL.g:15393:1: ( ( () ) )
+            // InternalCompleteOCL.g:15394:1: ( () )
             {
-            // InternalCompleteOCL.g:15366:1: ( () )
-            // InternalCompleteOCL.g:15367:1: ()
+            // InternalCompleteOCL.g:15394:1: ( () )
+            // InternalCompleteOCL.g:15395:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
             }
-            // InternalCompleteOCL.g:15368:1: ()
-            // InternalCompleteOCL.g:15370:1:
+            // InternalCompleteOCL.g:15396:1: ()
+            // InternalCompleteOCL.g:15398:1:
             {
             }
 
@@ -45096,14 +45181,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1"
-    // InternalCompleteOCL.g:15380:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:15408:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
     public final void rule__SelfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15384:1: ( rule__SelfExpCS__Group__1__Impl )
-            // InternalCompleteOCL.g:15385:2: rule__SelfExpCS__Group__1__Impl
+            // InternalCompleteOCL.g:15412:1: ( rule__SelfExpCS__Group__1__Impl )
+            // InternalCompleteOCL.g:15413:2: rule__SelfExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SelfExpCS__Group__1__Impl();
@@ -45129,17 +45214,17 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15391:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
+    // InternalCompleteOCL.g:15419:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
     public final void rule__SelfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15395:1: ( ( 'self' ) )
-            // InternalCompleteOCL.g:15396:1: ( 'self' )
+            // InternalCompleteOCL.g:15423:1: ( ( 'self' ) )
+            // InternalCompleteOCL.g:15424:1: ( 'self' )
             {
-            // InternalCompleteOCL.g:15396:1: ( 'self' )
-            // InternalCompleteOCL.g:15397:1: 'self'
+            // InternalCompleteOCL.g:15424:1: ( 'self' )
+            // InternalCompleteOCL.g:15425:1: 'self'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
@@ -45170,14 +45255,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0"
-    // InternalCompleteOCL.g:15414:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
+    // InternalCompleteOCL.g:15442:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
     public final void rule__MultiplicityBoundsCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15418:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
-            // InternalCompleteOCL.g:15419:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
+            // InternalCompleteOCL.g:15446:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
+            // InternalCompleteOCL.g:15447:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__MultiplicityBoundsCS__Group__0__Impl();
@@ -45208,23 +45293,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15426:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:15454:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15430:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
-            // InternalCompleteOCL.g:15431:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalCompleteOCL.g:15458:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
+            // InternalCompleteOCL.g:15459:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:15431:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
-            // InternalCompleteOCL.g:15432:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalCompleteOCL.g:15459:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalCompleteOCL.g:15460:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
             }
-            // InternalCompleteOCL.g:15433:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
-            // InternalCompleteOCL.g:15433:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
+            // InternalCompleteOCL.g:15461:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalCompleteOCL.g:15461:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__LowerBoundAssignment_0();
@@ -45259,14 +45344,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1"
-    // InternalCompleteOCL.g:15443:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:15471:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15447:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
-            // InternalCompleteOCL.g:15448:2: rule__MultiplicityBoundsCS__Group__1__Impl
+            // InternalCompleteOCL.g:15475:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
+            // InternalCompleteOCL.g:15476:2: rule__MultiplicityBoundsCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group__1__Impl();
@@ -45292,22 +45377,22 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15454:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:15482:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
     public final void rule__MultiplicityBoundsCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15458:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:15459:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:15486:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:15487:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:15459:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:15460:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalCompleteOCL.g:15487:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:15488:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:15461:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalCompleteOCL.g:15489:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             int alt129=2;
             int LA129_0 = input.LA(1);
 
@@ -45316,7 +45401,7 @@
             }
             switch (alt129) {
                 case 1 :
-                    // InternalCompleteOCL.g:15461:2: rule__MultiplicityBoundsCS__Group_1__0
+                    // InternalCompleteOCL.g:15489:2: rule__MultiplicityBoundsCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityBoundsCS__Group_1__0();
@@ -45354,16 +45439,16 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0"
-    // InternalCompleteOCL.g:15475:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
+    // InternalCompleteOCL.g:15503:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
     public final void rule__MultiplicityBoundsCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15479:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
-            // InternalCompleteOCL.g:15480:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
+            // InternalCompleteOCL.g:15507:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
+            // InternalCompleteOCL.g:15508:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_76);
+            pushFollow(FollowSets000.FOLLOW_75);
             rule__MultiplicityBoundsCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -45392,17 +45477,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:15487:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
+    // InternalCompleteOCL.g:15515:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15491:1: ( ( '..' ) )
-            // InternalCompleteOCL.g:15492:1: ( '..' )
+            // InternalCompleteOCL.g:15519:1: ( ( '..' ) )
+            // InternalCompleteOCL.g:15520:1: ( '..' )
             {
-            // InternalCompleteOCL.g:15492:1: ( '..' )
-            // InternalCompleteOCL.g:15493:1: '..'
+            // InternalCompleteOCL.g:15520:1: ( '..' )
+            // InternalCompleteOCL.g:15521:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
@@ -45433,14 +45518,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1"
-    // InternalCompleteOCL.g:15506:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:15534:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15510:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:15511:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:15538:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:15539:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group_1__1__Impl();
@@ -45466,23 +45551,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:15517:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:15545:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15521:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:15522:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalCompleteOCL.g:15549:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:15550:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:15522:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
-            // InternalCompleteOCL.g:15523:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalCompleteOCL.g:15550:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalCompleteOCL.g:15551:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
             }
-            // InternalCompleteOCL.g:15524:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
-            // InternalCompleteOCL.g:15524:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
+            // InternalCompleteOCL.g:15552:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalCompleteOCL.g:15552:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1();
@@ -45517,16 +45602,16 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0"
-    // InternalCompleteOCL.g:15538:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
+    // InternalCompleteOCL.g:15566:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
     public final void rule__MultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15542:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
-            // InternalCompleteOCL.g:15543:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
+            // InternalCompleteOCL.g:15570:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
+            // InternalCompleteOCL.g:15571:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_77);
+            pushFollow(FollowSets000.FOLLOW_76);
             rule__MultiplicityCS__Group__0__Impl();
 
             state._fsp--;
@@ -45555,17 +45640,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15550:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
+    // InternalCompleteOCL.g:15578:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
     public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15554:1: ( ( '[' ) )
-            // InternalCompleteOCL.g:15555:1: ( '[' )
+            // InternalCompleteOCL.g:15582:1: ( ( '[' ) )
+            // InternalCompleteOCL.g:15583:1: ( '[' )
             {
-            // InternalCompleteOCL.g:15555:1: ( '[' )
-            // InternalCompleteOCL.g:15556:1: '['
+            // InternalCompleteOCL.g:15583:1: ( '[' )
+            // InternalCompleteOCL.g:15584:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
@@ -45596,16 +45681,16 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1"
-    // InternalCompleteOCL.g:15569:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
+    // InternalCompleteOCL.g:15597:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
     public final void rule__MultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15573:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
-            // InternalCompleteOCL.g:15574:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
+            // InternalCompleteOCL.g:15601:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
+            // InternalCompleteOCL.g:15602:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_78);
+            pushFollow(FollowSets000.FOLLOW_77);
             rule__MultiplicityCS__Group__1__Impl();
 
             state._fsp--;
@@ -45634,23 +45719,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15581:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
+    // InternalCompleteOCL.g:15609:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
     public final void rule__MultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15585:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
-            // InternalCompleteOCL.g:15586:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalCompleteOCL.g:15613:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
+            // InternalCompleteOCL.g:15614:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
             {
-            // InternalCompleteOCL.g:15586:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
-            // InternalCompleteOCL.g:15587:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalCompleteOCL.g:15614:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalCompleteOCL.g:15615:1: ( rule__MultiplicityCS__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
             }
-            // InternalCompleteOCL.g:15588:1: ( rule__MultiplicityCS__Alternatives_1 )
-            // InternalCompleteOCL.g:15588:2: rule__MultiplicityCS__Alternatives_1
+            // InternalCompleteOCL.g:15616:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalCompleteOCL.g:15616:2: rule__MultiplicityCS__Alternatives_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Alternatives_1();
@@ -45685,16 +45770,16 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2"
-    // InternalCompleteOCL.g:15598:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
+    // InternalCompleteOCL.g:15626:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
     public final void rule__MultiplicityCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15602:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
-            // InternalCompleteOCL.g:15603:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
+            // InternalCompleteOCL.g:15630:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
+            // InternalCompleteOCL.g:15631:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
             {
-            pushFollow(FollowSets000.FOLLOW_78);
+            pushFollow(FollowSets000.FOLLOW_77);
             rule__MultiplicityCS__Group__2__Impl();
 
             state._fsp--;
@@ -45723,22 +45808,22 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2__Impl"
-    // InternalCompleteOCL.g:15610:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
+    // InternalCompleteOCL.g:15638:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
     public final void rule__MultiplicityCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15614:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
-            // InternalCompleteOCL.g:15615:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalCompleteOCL.g:15642:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
+            // InternalCompleteOCL.g:15643:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
             {
-            // InternalCompleteOCL.g:15615:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
-            // InternalCompleteOCL.g:15616:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalCompleteOCL.g:15643:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalCompleteOCL.g:15644:1: ( rule__MultiplicityCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
             }
-            // InternalCompleteOCL.g:15617:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalCompleteOCL.g:15645:1: ( rule__MultiplicityCS__Alternatives_2 )?
             int alt130=2;
             int LA130_0 = input.LA(1);
 
@@ -45747,7 +45832,7 @@
             }
             switch (alt130) {
                 case 1 :
-                    // InternalCompleteOCL.g:15617:2: rule__MultiplicityCS__Alternatives_2
+                    // InternalCompleteOCL.g:15645:2: rule__MultiplicityCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__Alternatives_2();
@@ -45785,14 +45870,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3"
-    // InternalCompleteOCL.g:15627:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
+    // InternalCompleteOCL.g:15655:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
     public final void rule__MultiplicityCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15631:1: ( rule__MultiplicityCS__Group__3__Impl )
-            // InternalCompleteOCL.g:15632:2: rule__MultiplicityCS__Group__3__Impl
+            // InternalCompleteOCL.g:15659:1: ( rule__MultiplicityCS__Group__3__Impl )
+            // InternalCompleteOCL.g:15660:2: rule__MultiplicityCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Group__3__Impl();
@@ -45818,17 +45903,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3__Impl"
-    // InternalCompleteOCL.g:15638:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
+    // InternalCompleteOCL.g:15666:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
     public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15642:1: ( ( ']' ) )
-            // InternalCompleteOCL.g:15643:1: ( ']' )
+            // InternalCompleteOCL.g:15670:1: ( ( ']' ) )
+            // InternalCompleteOCL.g:15671:1: ( ']' )
             {
-            // InternalCompleteOCL.g:15643:1: ( ']' )
-            // InternalCompleteOCL.g:15644:1: ']'
+            // InternalCompleteOCL.g:15671:1: ( ']' )
+            // InternalCompleteOCL.g:15672:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
@@ -45859,16 +45944,16 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0"
-    // InternalCompleteOCL.g:15665:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
+    // InternalCompleteOCL.g:15693:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
     public final void rule__PathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15669:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
-            // InternalCompleteOCL.g:15670:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
+            // InternalCompleteOCL.g:15697:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
+            // InternalCompleteOCL.g:15698:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_35);
+            pushFollow(FollowSets000.FOLLOW_36);
             rule__PathNameCS__Group__0__Impl();
 
             state._fsp--;
@@ -45897,23 +45982,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15677:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:15705:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__PathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15681:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalCompleteOCL.g:15682:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalCompleteOCL.g:15709:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalCompleteOCL.g:15710:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:15682:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalCompleteOCL.g:15683:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalCompleteOCL.g:15710:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalCompleteOCL.g:15711:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalCompleteOCL.g:15684:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalCompleteOCL.g:15684:2: rule__PathNameCS__OwnedPathElementsAssignment_0
+            // InternalCompleteOCL.g:15712:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalCompleteOCL.g:15712:2: rule__PathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_0();
@@ -45948,14 +46033,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1"
-    // InternalCompleteOCL.g:15694:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:15722:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
     public final void rule__PathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15698:1: ( rule__PathNameCS__Group__1__Impl )
-            // InternalCompleteOCL.g:15699:2: rule__PathNameCS__Group__1__Impl
+            // InternalCompleteOCL.g:15726:1: ( rule__PathNameCS__Group__1__Impl )
+            // InternalCompleteOCL.g:15727:2: rule__PathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group__1__Impl();
@@ -45981,22 +46066,22 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15705:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
+    // InternalCompleteOCL.g:15733:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
     public final void rule__PathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15709:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
-            // InternalCompleteOCL.g:15710:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:15737:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
+            // InternalCompleteOCL.g:15738:1: ( ( rule__PathNameCS__Group_1__0 )* )
             {
-            // InternalCompleteOCL.g:15710:1: ( ( rule__PathNameCS__Group_1__0 )* )
-            // InternalCompleteOCL.g:15711:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalCompleteOCL.g:15738:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:15739:1: ( rule__PathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:15712:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalCompleteOCL.g:15740:1: ( rule__PathNameCS__Group_1__0 )*
             loop131:
             do {
                 int alt131=2;
@@ -46009,9 +46094,9 @@
 
                 switch (alt131) {
             	case 1 :
-            	    // InternalCompleteOCL.g:15712:2: rule__PathNameCS__Group_1__0
+            	    // InternalCompleteOCL.g:15740:2: rule__PathNameCS__Group_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_36);
+            	    pushFollow(FollowSets000.FOLLOW_37);
             	    rule__PathNameCS__Group_1__0();
 
             	    state._fsp--;
@@ -46050,16 +46135,16 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0"
-    // InternalCompleteOCL.g:15726:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
+    // InternalCompleteOCL.g:15754:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
     public final void rule__PathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15730:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
-            // InternalCompleteOCL.g:15731:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
+            // InternalCompleteOCL.g:15758:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
+            // InternalCompleteOCL.g:15759:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_37);
+            pushFollow(FollowSets000.FOLLOW_7);
             rule__PathNameCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -46088,17 +46173,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:15738:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalCompleteOCL.g:15766:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15742:1: ( ( '::' ) )
-            // InternalCompleteOCL.g:15743:1: ( '::' )
+            // InternalCompleteOCL.g:15770:1: ( ( '::' ) )
+            // InternalCompleteOCL.g:15771:1: ( '::' )
             {
-            // InternalCompleteOCL.g:15743:1: ( '::' )
-            // InternalCompleteOCL.g:15744:1: '::'
+            // InternalCompleteOCL.g:15771:1: ( '::' )
+            // InternalCompleteOCL.g:15772:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
@@ -46129,14 +46214,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1"
-    // InternalCompleteOCL.g:15757:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:15785:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
     public final void rule__PathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15761:1: ( rule__PathNameCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:15762:2: rule__PathNameCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:15789:1: ( rule__PathNameCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:15790:2: rule__PathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group_1__1__Impl();
@@ -46162,23 +46247,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:15768:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:15796:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__PathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15772:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:15773:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:15800:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:15801:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:15773:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalCompleteOCL.g:15774:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalCompleteOCL.g:15801:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:15802:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalCompleteOCL.g:15775:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalCompleteOCL.g:15775:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalCompleteOCL.g:15803:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalCompleteOCL.g:15803:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_1_1();
@@ -46212,17 +46297,371 @@
     // $ANTLR end "rule__PathNameCS__Group_1__1__Impl"
 
 
+    // $ANTLR start "rule__UnreservedPathNameCS__Group__0"
+    // InternalCompleteOCL.g:15817:1: rule__UnreservedPathNameCS__Group__0 : rule__UnreservedPathNameCS__Group__0__Impl rule__UnreservedPathNameCS__Group__1 ;
+    public final void rule__UnreservedPathNameCS__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15821:1: ( rule__UnreservedPathNameCS__Group__0__Impl rule__UnreservedPathNameCS__Group__1 )
+            // InternalCompleteOCL.g:15822:2: rule__UnreservedPathNameCS__Group__0__Impl rule__UnreservedPathNameCS__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__UnreservedPathNameCS__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group__0"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group__0__Impl"
+    // InternalCompleteOCL.g:15829:1: rule__UnreservedPathNameCS__Group__0__Impl : ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    public final void rule__UnreservedPathNameCS__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15833:1: ( ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalCompleteOCL.g:15834:1: ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 ) )
+            {
+            // InternalCompleteOCL.g:15834:1: ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalCompleteOCL.g:15835:1: ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0());
+            }
+            // InternalCompleteOCL.g:15836:1: ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalCompleteOCL.g:15836:2: rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group__0__Impl"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group__1"
+    // InternalCompleteOCL.g:15846:1: rule__UnreservedPathNameCS__Group__1 : rule__UnreservedPathNameCS__Group__1__Impl ;
+    public final void rule__UnreservedPathNameCS__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15850:1: ( rule__UnreservedPathNameCS__Group__1__Impl )
+            // InternalCompleteOCL.g:15851:2: rule__UnreservedPathNameCS__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group__1"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group__1__Impl"
+    // InternalCompleteOCL.g:15857:1: rule__UnreservedPathNameCS__Group__1__Impl : ( ( rule__UnreservedPathNameCS__Group_1__0 )* ) ;
+    public final void rule__UnreservedPathNameCS__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15861:1: ( ( ( rule__UnreservedPathNameCS__Group_1__0 )* ) )
+            // InternalCompleteOCL.g:15862:1: ( ( rule__UnreservedPathNameCS__Group_1__0 )* )
+            {
+            // InternalCompleteOCL.g:15862:1: ( ( rule__UnreservedPathNameCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:15863:1: ( rule__UnreservedPathNameCS__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1());
+            }
+            // InternalCompleteOCL.g:15864:1: ( rule__UnreservedPathNameCS__Group_1__0 )*
+            loop132:
+            do {
+                int alt132=2;
+                int LA132_0 = input.LA(1);
+
+                if ( (LA132_0==79) ) {
+                    alt132=1;
+                }
+
+
+                switch (alt132) {
+            	case 1 :
+            	    // InternalCompleteOCL.g:15864:2: rule__UnreservedPathNameCS__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_37);
+            	    rule__UnreservedPathNameCS__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop132;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group_1__0"
+    // InternalCompleteOCL.g:15878:1: rule__UnreservedPathNameCS__Group_1__0 : rule__UnreservedPathNameCS__Group_1__0__Impl rule__UnreservedPathNameCS__Group_1__1 ;
+    public final void rule__UnreservedPathNameCS__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15882:1: ( rule__UnreservedPathNameCS__Group_1__0__Impl rule__UnreservedPathNameCS__Group_1__1 )
+            // InternalCompleteOCL.g:15883:2: rule__UnreservedPathNameCS__Group_1__0__Impl rule__UnreservedPathNameCS__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_7);
+            rule__UnreservedPathNameCS__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group_1__0"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group_1__0__Impl"
+    // InternalCompleteOCL.g:15890:1: rule__UnreservedPathNameCS__Group_1__0__Impl : ( '::' ) ;
+    public final void rule__UnreservedPathNameCS__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15894:1: ( ( '::' ) )
+            // InternalCompleteOCL.g:15895:1: ( '::' )
+            {
+            // InternalCompleteOCL.g:15895:1: ( '::' )
+            // InternalCompleteOCL.g:15896:1: '::'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getColonColonKeyword_1_0());
+            }
+            match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getColonColonKeyword_1_0());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group_1__1"
+    // InternalCompleteOCL.g:15909:1: rule__UnreservedPathNameCS__Group_1__1 : rule__UnreservedPathNameCS__Group_1__1__Impl ;
+    public final void rule__UnreservedPathNameCS__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15913:1: ( rule__UnreservedPathNameCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:15914:2: rule__UnreservedPathNameCS__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group_1__1"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__Group_1__1__Impl"
+    // InternalCompleteOCL.g:15920:1: rule__UnreservedPathNameCS__Group_1__1__Impl : ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    public final void rule__UnreservedPathNameCS__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:15924:1: ( ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:15925:1: ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            {
+            // InternalCompleteOCL.g:15925:1: ( ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:15926:1: ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
+            }
+            // InternalCompleteOCL.g:15927:1: ( rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalCompleteOCL.g:15927:2: rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__Group_1__1__Impl"
+
+
     // $ANTLR start "rule__TemplateBindingCS__Group__0"
-    // InternalCompleteOCL.g:15789:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
+    // InternalCompleteOCL.g:15941:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
     public final void rule__TemplateBindingCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15793:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
-            // InternalCompleteOCL.g:15794:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
+            // InternalCompleteOCL.g:15945:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
+            // InternalCompleteOCL.g:15946:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_79);
+            pushFollow(FollowSets000.FOLLOW_78);
             rule__TemplateBindingCS__Group__0__Impl();
 
             state._fsp--;
@@ -46251,23 +46690,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15801:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:15953:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
     public final void rule__TemplateBindingCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15805:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
-            // InternalCompleteOCL.g:15806:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalCompleteOCL.g:15957:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
+            // InternalCompleteOCL.g:15958:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:15806:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
-            // InternalCompleteOCL.g:15807:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalCompleteOCL.g:15958:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalCompleteOCL.g:15959:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
             }
-            // InternalCompleteOCL.g:15808:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
-            // InternalCompleteOCL.g:15808:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
+            // InternalCompleteOCL.g:15960:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalCompleteOCL.g:15960:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0();
@@ -46302,16 +46741,16 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1"
-    // InternalCompleteOCL.g:15818:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
+    // InternalCompleteOCL.g:15970:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
     public final void rule__TemplateBindingCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15822:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
-            // InternalCompleteOCL.g:15823:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
+            // InternalCompleteOCL.g:15974:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
+            // InternalCompleteOCL.g:15975:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_79);
+            pushFollow(FollowSets000.FOLLOW_78);
             rule__TemplateBindingCS__Group__1__Impl();
 
             state._fsp--;
@@ -46340,37 +46779,37 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15830:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
+    // InternalCompleteOCL.g:15982:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
     public final void rule__TemplateBindingCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15834:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
-            // InternalCompleteOCL.g:15835:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:15986:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
+            // InternalCompleteOCL.g:15987:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
             {
-            // InternalCompleteOCL.g:15835:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
-            // InternalCompleteOCL.g:15836:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalCompleteOCL.g:15987:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalCompleteOCL.g:15988:1: ( rule__TemplateBindingCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:15837:1: ( rule__TemplateBindingCS__Group_1__0 )*
-            loop132:
+            // InternalCompleteOCL.g:15989:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            loop133:
             do {
-                int alt132=2;
-                int LA132_0 = input.LA(1);
+                int alt133=2;
+                int LA133_0 = input.LA(1);
 
-                if ( (LA132_0==71) ) {
-                    alt132=1;
+                if ( (LA133_0==71) ) {
+                    alt133=1;
                 }
 
 
-                switch (alt132) {
+                switch (alt133) {
             	case 1 :
-            	    // InternalCompleteOCL.g:15837:2: rule__TemplateBindingCS__Group_1__0
+            	    // InternalCompleteOCL.g:15989:2: rule__TemplateBindingCS__Group_1__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TemplateBindingCS__Group_1__0();
 
             	    state._fsp--;
@@ -46380,7 +46819,7 @@
             	    break;
 
             	default :
-            	    break loop132;
+            	    break loop133;
                 }
             } while (true);
 
@@ -46409,14 +46848,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2"
-    // InternalCompleteOCL.g:15847:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:15999:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
     public final void rule__TemplateBindingCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15851:1: ( rule__TemplateBindingCS__Group__2__Impl )
-            // InternalCompleteOCL.g:15852:2: rule__TemplateBindingCS__Group__2__Impl
+            // InternalCompleteOCL.g:16003:1: ( rule__TemplateBindingCS__Group__2__Impl )
+            // InternalCompleteOCL.g:16004:2: rule__TemplateBindingCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__2__Impl();
@@ -46442,31 +46881,31 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2__Impl"
-    // InternalCompleteOCL.g:15858:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
+    // InternalCompleteOCL.g:16010:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
     public final void rule__TemplateBindingCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15862:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
-            // InternalCompleteOCL.g:15863:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalCompleteOCL.g:16014:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
+            // InternalCompleteOCL.g:16015:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
             {
-            // InternalCompleteOCL.g:15863:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
-            // InternalCompleteOCL.g:15864:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalCompleteOCL.g:16015:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalCompleteOCL.g:16016:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
             }
-            // InternalCompleteOCL.g:15865:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
-            int alt133=2;
-            int LA133_0 = input.LA(1);
+            // InternalCompleteOCL.g:16017:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            int alt134=2;
+            int LA134_0 = input.LA(1);
 
-            if ( (LA133_0==88) ) {
-                alt133=1;
+            if ( (LA134_0==88) ) {
+                alt134=1;
             }
-            switch (alt133) {
+            switch (alt134) {
                 case 1 :
-                    // InternalCompleteOCL.g:15865:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
+                    // InternalCompleteOCL.g:16017:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateBindingCS__OwnedMultiplicityAssignment_2();
@@ -46504,16 +46943,16 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0"
-    // InternalCompleteOCL.g:15881:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
+    // InternalCompleteOCL.g:16033:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
     public final void rule__TemplateBindingCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15885:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
-            // InternalCompleteOCL.g:15886:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
+            // InternalCompleteOCL.g:16037:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
+            // InternalCompleteOCL.g:16038:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_80);
+            pushFollow(FollowSets000.FOLLOW_79);
             rule__TemplateBindingCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -46542,17 +46981,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:15893:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
+    // InternalCompleteOCL.g:16045:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
     public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15897:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:15898:1: ( ',' )
+            // InternalCompleteOCL.g:16049:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:16050:1: ( ',' )
             {
-            // InternalCompleteOCL.g:15898:1: ( ',' )
-            // InternalCompleteOCL.g:15899:1: ','
+            // InternalCompleteOCL.g:16050:1: ( ',' )
+            // InternalCompleteOCL.g:16051:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
@@ -46583,14 +47022,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1"
-    // InternalCompleteOCL.g:15912:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
+    // InternalCompleteOCL.g:16064:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
     public final void rule__TemplateBindingCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15916:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
-            // InternalCompleteOCL.g:15917:2: rule__TemplateBindingCS__Group_1__1__Impl
+            // InternalCompleteOCL.g:16068:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
+            // InternalCompleteOCL.g:16069:2: rule__TemplateBindingCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group_1__1__Impl();
@@ -46616,23 +47055,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:15923:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:16075:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
     public final void rule__TemplateBindingCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15927:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:15928:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:16079:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:16080:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:15928:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
-            // InternalCompleteOCL.g:15929:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalCompleteOCL.g:16080:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:16081:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
             }
-            // InternalCompleteOCL.g:15930:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
-            // InternalCompleteOCL.g:15930:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
+            // InternalCompleteOCL.g:16082:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalCompleteOCL.g:16082:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1();
@@ -46667,16 +47106,16 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0"
-    // InternalCompleteOCL.g:15944:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
+    // InternalCompleteOCL.g:16096:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
     public final void rule__TypeParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15948:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
-            // InternalCompleteOCL.g:15949:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
+            // InternalCompleteOCL.g:16100:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
+            // InternalCompleteOCL.g:16101:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_81);
+            pushFollow(FollowSets000.FOLLOW_80);
             rule__TypeParameterCS__Group__0__Impl();
 
             state._fsp--;
@@ -46705,23 +47144,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0__Impl"
-    // InternalCompleteOCL.g:15956:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:16108:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
     public final void rule__TypeParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15960:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:15961:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:16112:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:16113:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:15961:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
-            // InternalCompleteOCL.g:15962:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:16113:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalCompleteOCL.g:16114:1: ( rule__TypeParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
             }
-            // InternalCompleteOCL.g:15963:1: ( rule__TypeParameterCS__NameAssignment_0 )
-            // InternalCompleteOCL.g:15963:2: rule__TypeParameterCS__NameAssignment_0
+            // InternalCompleteOCL.g:16115:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalCompleteOCL.g:16115:2: rule__TypeParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__NameAssignment_0();
@@ -46756,14 +47195,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1"
-    // InternalCompleteOCL.g:15973:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:16125:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
     public final void rule__TypeParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15977:1: ( rule__TypeParameterCS__Group__1__Impl )
-            // InternalCompleteOCL.g:15978:2: rule__TypeParameterCS__Group__1__Impl
+            // InternalCompleteOCL.g:16129:1: ( rule__TypeParameterCS__Group__1__Impl )
+            // InternalCompleteOCL.g:16130:2: rule__TypeParameterCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__1__Impl();
@@ -46789,31 +47228,31 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1__Impl"
-    // InternalCompleteOCL.g:15984:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:16136:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
     public final void rule__TypeParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:15988:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:15989:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:16140:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:16141:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:15989:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:15990:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalCompleteOCL.g:16141:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:16142:1: ( rule__TypeParameterCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:15991:1: ( rule__TypeParameterCS__Group_1__0 )?
-            int alt134=2;
-            int LA134_0 = input.LA(1);
+            // InternalCompleteOCL.g:16143:1: ( rule__TypeParameterCS__Group_1__0 )?
+            int alt135=2;
+            int LA135_0 = input.LA(1);
 
-            if ( (LA134_0==98) ) {
-                alt134=1;
+            if ( (LA135_0==98) ) {
+                alt135=1;
             }
-            switch (alt134) {
+            switch (alt135) {
                 case 1 :
-                    // InternalCompleteOCL.g:15991:2: rule__TypeParameterCS__Group_1__0
+                    // InternalCompleteOCL.g:16143:2: rule__TypeParameterCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeParameterCS__Group_1__0();
@@ -46851,16 +47290,16 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0"
-    // InternalCompleteOCL.g:16005:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
+    // InternalCompleteOCL.g:16157:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
     public final void rule__TypeParameterCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16009:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
-            // InternalCompleteOCL.g:16010:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
+            // InternalCompleteOCL.g:16161:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
+            // InternalCompleteOCL.g:16162:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__TypeParameterCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -46889,17 +47328,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:16017:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
+    // InternalCompleteOCL.g:16169:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
     public final void rule__TypeParameterCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16021:1: ( ( 'extends' ) )
-            // InternalCompleteOCL.g:16022:1: ( 'extends' )
+            // InternalCompleteOCL.g:16173:1: ( ( 'extends' ) )
+            // InternalCompleteOCL.g:16174:1: ( 'extends' )
             {
-            // InternalCompleteOCL.g:16022:1: ( 'extends' )
-            // InternalCompleteOCL.g:16023:1: 'extends'
+            // InternalCompleteOCL.g:16174:1: ( 'extends' )
+            // InternalCompleteOCL.g:16175:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
@@ -46930,16 +47369,16 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1"
-    // InternalCompleteOCL.g:16036:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
+    // InternalCompleteOCL.g:16188:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
     public final void rule__TypeParameterCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16040:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
-            // InternalCompleteOCL.g:16041:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
+            // InternalCompleteOCL.g:16192:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
+            // InternalCompleteOCL.g:16193:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
             {
-            pushFollow(FollowSets000.FOLLOW_82);
+            pushFollow(FollowSets000.FOLLOW_81);
             rule__TypeParameterCS__Group_1__1__Impl();
 
             state._fsp--;
@@ -46968,23 +47407,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:16048:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:16200:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16052:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:16053:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:16204:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:16205:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:16053:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
-            // InternalCompleteOCL.g:16054:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalCompleteOCL.g:16205:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalCompleteOCL.g:16206:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
             }
-            // InternalCompleteOCL.g:16055:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
-            // InternalCompleteOCL.g:16055:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
+            // InternalCompleteOCL.g:16207:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalCompleteOCL.g:16207:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_1();
@@ -47019,14 +47458,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2"
-    // InternalCompleteOCL.g:16065:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
+    // InternalCompleteOCL.g:16217:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
     public final void rule__TypeParameterCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16069:1: ( rule__TypeParameterCS__Group_1__2__Impl )
-            // InternalCompleteOCL.g:16070:2: rule__TypeParameterCS__Group_1__2__Impl
+            // InternalCompleteOCL.g:16221:1: ( rule__TypeParameterCS__Group_1__2__Impl )
+            // InternalCompleteOCL.g:16222:2: rule__TypeParameterCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1__2__Impl();
@@ -47052,37 +47491,37 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2__Impl"
-    // InternalCompleteOCL.g:16076:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
+    // InternalCompleteOCL.g:16228:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
     public final void rule__TypeParameterCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16080:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
-            // InternalCompleteOCL.g:16081:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalCompleteOCL.g:16232:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
+            // InternalCompleteOCL.g:16233:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
             {
-            // InternalCompleteOCL.g:16081:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
-            // InternalCompleteOCL.g:16082:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalCompleteOCL.g:16233:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalCompleteOCL.g:16234:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
             }
-            // InternalCompleteOCL.g:16083:1: ( rule__TypeParameterCS__Group_1_2__0 )*
-            loop135:
+            // InternalCompleteOCL.g:16235:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            loop136:
             do {
-                int alt135=2;
-                int LA135_0 = input.LA(1);
+                int alt136=2;
+                int LA136_0 = input.LA(1);
 
-                if ( (LA135_0==99) ) {
-                    alt135=1;
+                if ( (LA136_0==99) ) {
+                    alt136=1;
                 }
 
 
-                switch (alt135) {
+                switch (alt136) {
             	case 1 :
-            	    // InternalCompleteOCL.g:16083:2: rule__TypeParameterCS__Group_1_2__0
+            	    // InternalCompleteOCL.g:16235:2: rule__TypeParameterCS__Group_1_2__0
             	    {
-            	    pushFollow(FollowSets000.FOLLOW_83);
+            	    pushFollow(FollowSets000.FOLLOW_82);
             	    rule__TypeParameterCS__Group_1_2__0();
 
             	    state._fsp--;
@@ -47092,7 +47531,7 @@
             	    break;
 
             	default :
-            	    break loop135;
+            	    break loop136;
                 }
             } while (true);
 
@@ -47121,16 +47560,16 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0"
-    // InternalCompleteOCL.g:16099:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
+    // InternalCompleteOCL.g:16251:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
     public final void rule__TypeParameterCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16103:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
-            // InternalCompleteOCL.g:16104:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
+            // InternalCompleteOCL.g:16255:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
+            // InternalCompleteOCL.g:16256:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__TypeParameterCS__Group_1_2__0__Impl();
 
             state._fsp--;
@@ -47159,17 +47598,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0__Impl"
-    // InternalCompleteOCL.g:16111:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
+    // InternalCompleteOCL.g:16263:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
     public final void rule__TypeParameterCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16115:1: ( ( '&&' ) )
-            // InternalCompleteOCL.g:16116:1: ( '&&' )
+            // InternalCompleteOCL.g:16267:1: ( ( '&&' ) )
+            // InternalCompleteOCL.g:16268:1: ( '&&' )
             {
-            // InternalCompleteOCL.g:16116:1: ( '&&' )
-            // InternalCompleteOCL.g:16117:1: '&&'
+            // InternalCompleteOCL.g:16268:1: ( '&&' )
+            // InternalCompleteOCL.g:16269:1: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
@@ -47200,14 +47639,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1"
-    // InternalCompleteOCL.g:16130:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
+    // InternalCompleteOCL.g:16282:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
     public final void rule__TypeParameterCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16134:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
-            // InternalCompleteOCL.g:16135:2: rule__TypeParameterCS__Group_1_2__1__Impl
+            // InternalCompleteOCL.g:16286:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
+            // InternalCompleteOCL.g:16287:2: rule__TypeParameterCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1_2__1__Impl();
@@ -47233,23 +47672,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1__Impl"
-    // InternalCompleteOCL.g:16141:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
+    // InternalCompleteOCL.g:16293:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16145:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
-            // InternalCompleteOCL.g:16146:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalCompleteOCL.g:16297:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
+            // InternalCompleteOCL.g:16298:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
             {
-            // InternalCompleteOCL.g:16146:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
-            // InternalCompleteOCL.g:16147:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalCompleteOCL.g:16298:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalCompleteOCL.g:16299:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
             }
-            // InternalCompleteOCL.g:16148:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
-            // InternalCompleteOCL.g:16148:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
+            // InternalCompleteOCL.g:16300:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalCompleteOCL.g:16300:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1();
@@ -47284,14 +47723,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0"
-    // InternalCompleteOCL.g:16162:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
+    // InternalCompleteOCL.g:16314:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
     public final void rule__TypedTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16166:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
-            // InternalCompleteOCL.g:16167:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
+            // InternalCompleteOCL.g:16318:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
+            // InternalCompleteOCL.g:16319:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TypedTypeRefCS__Group__0__Impl();
@@ -47322,23 +47761,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0__Impl"
-    // InternalCompleteOCL.g:16174:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalCompleteOCL.g:16326:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypedTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16178:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalCompleteOCL.g:16179:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalCompleteOCL.g:16330:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalCompleteOCL.g:16331:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalCompleteOCL.g:16179:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
-            // InternalCompleteOCL.g:16180:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalCompleteOCL.g:16331:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalCompleteOCL.g:16332:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalCompleteOCL.g:16181:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
-            // InternalCompleteOCL.g:16181:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
+            // InternalCompleteOCL.g:16333:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalCompleteOCL.g:16333:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedPathNameAssignment_0();
@@ -47373,14 +47812,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1"
-    // InternalCompleteOCL.g:16191:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
+    // InternalCompleteOCL.g:16343:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
     public final void rule__TypedTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16195:1: ( rule__TypedTypeRefCS__Group__1__Impl )
-            // InternalCompleteOCL.g:16196:2: rule__TypedTypeRefCS__Group__1__Impl
+            // InternalCompleteOCL.g:16347:1: ( rule__TypedTypeRefCS__Group__1__Impl )
+            // InternalCompleteOCL.g:16348:2: rule__TypedTypeRefCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__1__Impl();
@@ -47406,31 +47845,31 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1__Impl"
-    // InternalCompleteOCL.g:16202:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Group_1__0 )? ) ;
+    // InternalCompleteOCL.g:16354:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Group_1__0 )? ) ;
     public final void rule__TypedTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16206:1: ( ( ( rule__TypedTypeRefCS__Group_1__0 )? ) )
-            // InternalCompleteOCL.g:16207:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:16358:1: ( ( ( rule__TypedTypeRefCS__Group_1__0 )? ) )
+            // InternalCompleteOCL.g:16359:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
             {
-            // InternalCompleteOCL.g:16207:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
-            // InternalCompleteOCL.g:16208:1: ( rule__TypedTypeRefCS__Group_1__0 )?
+            // InternalCompleteOCL.g:16359:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
+            // InternalCompleteOCL.g:16360:1: ( rule__TypedTypeRefCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1());
             }
-            // InternalCompleteOCL.g:16209:1: ( rule__TypedTypeRefCS__Group_1__0 )?
-            int alt136=2;
-            int LA136_0 = input.LA(1);
+            // InternalCompleteOCL.g:16361:1: ( rule__TypedTypeRefCS__Group_1__0 )?
+            int alt137=2;
+            int LA137_0 = input.LA(1);
 
-            if ( (LA136_0==68) ) {
-                alt136=1;
+            if ( (LA137_0==68) ) {
+                alt137=1;
             }
-            switch (alt136) {
+            switch (alt137) {
                 case 1 :
-                    // InternalCompleteOCL.g:16209:2: rule__TypedTypeRefCS__Group_1__0
+                    // InternalCompleteOCL.g:16361:2: rule__TypedTypeRefCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1__0();
@@ -47468,16 +47907,16 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0"
-    // InternalCompleteOCL.g:16223:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
+    // InternalCompleteOCL.g:16375:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
     public final void rule__TypedTypeRefCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16227:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
-            // InternalCompleteOCL.g:16228:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
+            // InternalCompleteOCL.g:16379:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
+            // InternalCompleteOCL.g:16380:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
             {
-            pushFollow(FollowSets000.FOLLOW_80);
+            pushFollow(FollowSets000.FOLLOW_79);
             rule__TypedTypeRefCS__Group_1__0__Impl();
 
             state._fsp--;
@@ -47506,17 +47945,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0__Impl"
-    // InternalCompleteOCL.g:16235:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalCompleteOCL.g:16387:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TypedTypeRefCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16239:1: ( ( '(' ) )
-            // InternalCompleteOCL.g:16240:1: ( '(' )
+            // InternalCompleteOCL.g:16391:1: ( ( '(' ) )
+            // InternalCompleteOCL.g:16392:1: ( '(' )
             {
-            // InternalCompleteOCL.g:16240:1: ( '(' )
-            // InternalCompleteOCL.g:16241:1: '('
+            // InternalCompleteOCL.g:16392:1: ( '(' )
+            // InternalCompleteOCL.g:16393:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());
@@ -47547,14 +47986,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1"
-    // InternalCompleteOCL.g:16254:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 ;
+    // InternalCompleteOCL.g:16406:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 ;
     public final void rule__TypedTypeRefCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16258:1: ( rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 )
-            // InternalCompleteOCL.g:16259:2: rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2
+            // InternalCompleteOCL.g:16410:1: ( rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 )
+            // InternalCompleteOCL.g:16411:2: rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__TypedTypeRefCS__Group_1__1__Impl();
@@ -47585,23 +48024,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1__Impl"
-    // InternalCompleteOCL.g:16266:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) ;
+    // InternalCompleteOCL.g:16418:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16270:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) )
-            // InternalCompleteOCL.g:16271:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
+            // InternalCompleteOCL.g:16422:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) )
+            // InternalCompleteOCL.g:16423:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
             {
-            // InternalCompleteOCL.g:16271:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
-            // InternalCompleteOCL.g:16272:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
+            // InternalCompleteOCL.g:16423:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
+            // InternalCompleteOCL.g:16424:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1());
             }
-            // InternalCompleteOCL.g:16273:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
-            // InternalCompleteOCL.g:16273:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1
+            // InternalCompleteOCL.g:16425:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
+            // InternalCompleteOCL.g:16425:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedBindingAssignment_1_1();
@@ -47636,14 +48075,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__2"
-    // InternalCompleteOCL.g:16283:1: rule__TypedTypeRefCS__Group_1__2 : rule__TypedTypeRefCS__Group_1__2__Impl ;
+    // InternalCompleteOCL.g:16435:1: rule__TypedTypeRefCS__Group_1__2 : rule__TypedTypeRefCS__Group_1__2__Impl ;
     public final void rule__TypedTypeRefCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16287:1: ( rule__TypedTypeRefCS__Group_1__2__Impl )
-            // InternalCompleteOCL.g:16288:2: rule__TypedTypeRefCS__Group_1__2__Impl
+            // InternalCompleteOCL.g:16439:1: ( rule__TypedTypeRefCS__Group_1__2__Impl )
+            // InternalCompleteOCL.g:16440:2: rule__TypedTypeRefCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1__2__Impl();
@@ -47669,17 +48108,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__2__Impl"
-    // InternalCompleteOCL.g:16294:1: rule__TypedTypeRefCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalCompleteOCL.g:16446:1: rule__TypedTypeRefCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TypedTypeRefCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16298:1: ( ( ')' ) )
-            // InternalCompleteOCL.g:16299:1: ( ')' )
+            // InternalCompleteOCL.g:16450:1: ( ( ')' ) )
+            // InternalCompleteOCL.g:16451:1: ( ')' )
             {
-            // InternalCompleteOCL.g:16299:1: ( ')' )
-            // InternalCompleteOCL.g:16300:1: ')'
+            // InternalCompleteOCL.g:16451:1: ( ')' )
+            // InternalCompleteOCL.g:16452:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_2());
@@ -47710,16 +48149,16 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0"
-    // InternalCompleteOCL.g:16319:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
+    // InternalCompleteOCL.g:16471:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
     public final void rule__WildcardTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16323:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
-            // InternalCompleteOCL.g:16324:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
+            // InternalCompleteOCL.g:16475:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
+            // InternalCompleteOCL.g:16476:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
             {
-            pushFollow(FollowSets000.FOLLOW_80);
+            pushFollow(FollowSets000.FOLLOW_79);
             rule__WildcardTypeRefCS__Group__0__Impl();
 
             state._fsp--;
@@ -47748,23 +48187,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0__Impl"
-    // InternalCompleteOCL.g:16331:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
+    // InternalCompleteOCL.g:16483:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
     public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16335:1: ( ( () ) )
-            // InternalCompleteOCL.g:16336:1: ( () )
+            // InternalCompleteOCL.g:16487:1: ( ( () ) )
+            // InternalCompleteOCL.g:16488:1: ( () )
             {
-            // InternalCompleteOCL.g:16336:1: ( () )
-            // InternalCompleteOCL.g:16337:1: ()
+            // InternalCompleteOCL.g:16488:1: ( () )
+            // InternalCompleteOCL.g:16489:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
             }
-            // InternalCompleteOCL.g:16338:1: ()
-            // InternalCompleteOCL.g:16340:1:
+            // InternalCompleteOCL.g:16490:1: ()
+            // InternalCompleteOCL.g:16492:1:
             {
             }
 
@@ -47789,16 +48228,16 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1"
-    // InternalCompleteOCL.g:16350:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
+    // InternalCompleteOCL.g:16502:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
     public final void rule__WildcardTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16354:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
-            // InternalCompleteOCL.g:16355:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
+            // InternalCompleteOCL.g:16506:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
+            // InternalCompleteOCL.g:16507:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
             {
-            pushFollow(FollowSets000.FOLLOW_81);
+            pushFollow(FollowSets000.FOLLOW_80);
             rule__WildcardTypeRefCS__Group__1__Impl();
 
             state._fsp--;
@@ -47827,17 +48266,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1__Impl"
-    // InternalCompleteOCL.g:16362:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
+    // InternalCompleteOCL.g:16514:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
     public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16366:1: ( ( '?' ) )
-            // InternalCompleteOCL.g:16367:1: ( '?' )
+            // InternalCompleteOCL.g:16518:1: ( ( '?' ) )
+            // InternalCompleteOCL.g:16519:1: ( '?' )
             {
-            // InternalCompleteOCL.g:16367:1: ( '?' )
-            // InternalCompleteOCL.g:16368:1: '?'
+            // InternalCompleteOCL.g:16519:1: ( '?' )
+            // InternalCompleteOCL.g:16520:1: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
@@ -47868,14 +48307,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2"
-    // InternalCompleteOCL.g:16381:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
+    // InternalCompleteOCL.g:16533:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
     public final void rule__WildcardTypeRefCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16385:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
-            // InternalCompleteOCL.g:16386:2: rule__WildcardTypeRefCS__Group__2__Impl
+            // InternalCompleteOCL.g:16537:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
+            // InternalCompleteOCL.g:16538:2: rule__WildcardTypeRefCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__2__Impl();
@@ -47901,31 +48340,31 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2__Impl"
-    // InternalCompleteOCL.g:16392:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
+    // InternalCompleteOCL.g:16544:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
     public final void rule__WildcardTypeRefCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16396:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
-            // InternalCompleteOCL.g:16397:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:16548:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
+            // InternalCompleteOCL.g:16549:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
             {
-            // InternalCompleteOCL.g:16397:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
-            // InternalCompleteOCL.g:16398:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalCompleteOCL.g:16549:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalCompleteOCL.g:16550:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
             }
-            // InternalCompleteOCL.g:16399:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
-            int alt137=2;
-            int LA137_0 = input.LA(1);
+            // InternalCompleteOCL.g:16551:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            int alt138=2;
+            int LA138_0 = input.LA(1);
 
-            if ( (LA137_0==98) ) {
-                alt137=1;
+            if ( (LA138_0==98) ) {
+                alt138=1;
             }
-            switch (alt137) {
+            switch (alt138) {
                 case 1 :
-                    // InternalCompleteOCL.g:16399:2: rule__WildcardTypeRefCS__Group_2__0
+                    // InternalCompleteOCL.g:16551:2: rule__WildcardTypeRefCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__WildcardTypeRefCS__Group_2__0();
@@ -47963,16 +48402,16 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0"
-    // InternalCompleteOCL.g:16415:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
+    // InternalCompleteOCL.g:16567:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
     public final void rule__WildcardTypeRefCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16419:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
-            // InternalCompleteOCL.g:16420:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
+            // InternalCompleteOCL.g:16571:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
+            // InternalCompleteOCL.g:16572:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
             {
-            pushFollow(FollowSets000.FOLLOW_21);
+            pushFollow(FollowSets000.FOLLOW_22);
             rule__WildcardTypeRefCS__Group_2__0__Impl();
 
             state._fsp--;
@@ -48001,17 +48440,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0__Impl"
-    // InternalCompleteOCL.g:16427:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
+    // InternalCompleteOCL.g:16579:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
     public final void rule__WildcardTypeRefCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16431:1: ( ( 'extends' ) )
-            // InternalCompleteOCL.g:16432:1: ( 'extends' )
+            // InternalCompleteOCL.g:16583:1: ( ( 'extends' ) )
+            // InternalCompleteOCL.g:16584:1: ( 'extends' )
             {
-            // InternalCompleteOCL.g:16432:1: ( 'extends' )
-            // InternalCompleteOCL.g:16433:1: 'extends'
+            // InternalCompleteOCL.g:16584:1: ( 'extends' )
+            // InternalCompleteOCL.g:16585:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
@@ -48042,14 +48481,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1"
-    // InternalCompleteOCL.g:16446:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
+    // InternalCompleteOCL.g:16598:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
     public final void rule__WildcardTypeRefCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16450:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
-            // InternalCompleteOCL.g:16451:2: rule__WildcardTypeRefCS__Group_2__1__Impl
+            // InternalCompleteOCL.g:16602:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
+            // InternalCompleteOCL.g:16603:2: rule__WildcardTypeRefCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group_2__1__Impl();
@@ -48075,23 +48514,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1__Impl"
-    // InternalCompleteOCL.g:16457:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
+    // InternalCompleteOCL.g:16609:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
     public final void rule__WildcardTypeRefCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16461:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
-            // InternalCompleteOCL.g:16462:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalCompleteOCL.g:16613:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
+            // InternalCompleteOCL.g:16614:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
             {
-            // InternalCompleteOCL.g:16462:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
-            // InternalCompleteOCL.g:16463:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalCompleteOCL.g:16614:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalCompleteOCL.g:16615:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
             }
-            // InternalCompleteOCL.g:16464:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
-            // InternalCompleteOCL.g:16464:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
+            // InternalCompleteOCL.g:16616:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalCompleteOCL.g:16616:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1();
@@ -48126,17 +48565,17 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0"
-    // InternalCompleteOCL.g:16479:1: rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 : ( ruleImportCS ) ;
+    // InternalCompleteOCL.g:16631:1: rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0 : ( ruleImportCS ) ;
     public final void rule__CompleteOCLDocumentCS__OwnedImportsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16483:1: ( ( ruleImportCS ) )
-            // InternalCompleteOCL.g:16484:1: ( ruleImportCS )
+            // InternalCompleteOCL.g:16635:1: ( ( ruleImportCS ) )
+            // InternalCompleteOCL.g:16636:1: ( ruleImportCS )
             {
-            // InternalCompleteOCL.g:16484:1: ( ruleImportCS )
-            // InternalCompleteOCL.g:16485:1: ruleImportCS
+            // InternalCompleteOCL.g:16636:1: ( ruleImportCS )
+            // InternalCompleteOCL.g:16637:1: ruleImportCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCompleteOCLDocumentCSAccess().getOwnedImportsImportCSParserRuleCall_0_0());
@@ -48171,17 +48610,17 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0"
-    // InternalCompleteOCL.g:16494:1: rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 : ( rulePackageDeclarationCS ) ;
+    // InternalCompleteOCL.g:16646:1: rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0 : ( rulePackageDeclarationCS ) ;
     public final void rule__CompleteOCLDocumentCS__OwnedPackagesAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16498:1: ( ( rulePackageDeclarationCS ) )
-            // InternalCompleteOCL.g:16499:1: ( rulePackageDeclarationCS )
+            // InternalCompleteOCL.g:16650:1: ( ( rulePackageDeclarationCS ) )
+            // InternalCompleteOCL.g:16651:1: ( rulePackageDeclarationCS )
             {
-            // InternalCompleteOCL.g:16499:1: ( rulePackageDeclarationCS )
-            // InternalCompleteOCL.g:16500:1: rulePackageDeclarationCS
+            // InternalCompleteOCL.g:16651:1: ( rulePackageDeclarationCS )
+            // InternalCompleteOCL.g:16652:1: rulePackageDeclarationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCompleteOCLDocumentCSAccess().getOwnedPackagesPackageDeclarationCSParserRuleCall_1_0_0());
@@ -48216,17 +48655,17 @@
 
 
     // $ANTLR start "rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1"
-    // InternalCompleteOCL.g:16509:1: rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 : ( ruleContextDeclCS ) ;
+    // InternalCompleteOCL.g:16661:1: rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1 : ( ruleContextDeclCS ) ;
     public final void rule__CompleteOCLDocumentCS__OwnedContextsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16513:1: ( ( ruleContextDeclCS ) )
-            // InternalCompleteOCL.g:16514:1: ( ruleContextDeclCS )
+            // InternalCompleteOCL.g:16665:1: ( ( ruleContextDeclCS ) )
+            // InternalCompleteOCL.g:16666:1: ( ruleContextDeclCS )
             {
-            // InternalCompleteOCL.g:16514:1: ( ruleContextDeclCS )
-            // InternalCompleteOCL.g:16515:1: ruleContextDeclCS
+            // InternalCompleteOCL.g:16666:1: ( ruleContextDeclCS )
+            // InternalCompleteOCL.g:16667:1: ruleContextDeclCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCompleteOCLDocumentCSAccess().getOwnedContextsContextDeclCSParserRuleCall_1_1_0());
@@ -48261,17 +48700,17 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1"
-    // InternalCompleteOCL.g:16524:1: rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 : ( ruleTemplateSignatureCS ) ;
+    // InternalCompleteOCL.g:16676:1: rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1 : ( ruleTemplateSignatureCS ) ;
     public final void rule__ClassifierContextDeclCS__OwnedSignatureAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16528:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalCompleteOCL.g:16529:1: ( ruleTemplateSignatureCS )
+            // InternalCompleteOCL.g:16680:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalCompleteOCL.g:16681:1: ( ruleTemplateSignatureCS )
             {
-            // InternalCompleteOCL.g:16529:1: ( ruleTemplateSignatureCS )
-            // InternalCompleteOCL.g:16530:1: ruleTemplateSignatureCS
+            // InternalCompleteOCL.g:16681:1: ( ruleTemplateSignatureCS )
+            // InternalCompleteOCL.g:16682:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_1_0());
@@ -48306,17 +48745,17 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__SelfNameAssignment_2"
-    // InternalCompleteOCL.g:16539:1: rule__ClassifierContextDeclCS__SelfNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:16691:1: rule__ClassifierContextDeclCS__SelfNameAssignment_2 : ( ruleUnrestrictedName ) ;
     public final void rule__ClassifierContextDeclCS__SelfNameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16543:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:16544:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16695:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:16696:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:16544:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:16545:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:16696:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16697:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getSelfNameUnrestrictedNameParserRuleCall_2_0());
@@ -48351,28 +48790,28 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3"
-    // InternalCompleteOCL.g:16554:1: rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:16706:1: rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3 : ( ruleUnreservedPathNameCS ) ;
     public final void rule__ClassifierContextDeclCS__OwnedPathNameAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16558:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:16559:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:16710:1: ( ( ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:16711:1: ( ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:16559:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:16560:1: rulePathNameCS
+            // InternalCompleteOCL.g:16711:1: ( ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:16712:1: ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_3_0());
+               before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0());
             }
             pushFollow(FollowSets000.FOLLOW_2);
-            rulePathNameCS();
+            ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_3_0());
+               after(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0());
             }
 
             }
@@ -48396,17 +48835,17 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1"
-    // InternalCompleteOCL.g:16569:1: rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 : ( ruleConstraintCS ) ;
+    // InternalCompleteOCL.g:16721:1: rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1 : ( ruleConstraintCS ) ;
     public final void rule__ClassifierContextDeclCS__OwnedInvariantsAssignment_4_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16573:1: ( ( ruleConstraintCS ) )
-            // InternalCompleteOCL.g:16574:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:16725:1: ( ( ruleConstraintCS ) )
+            // InternalCompleteOCL.g:16726:1: ( ruleConstraintCS )
             {
-            // InternalCompleteOCL.g:16574:1: ( ruleConstraintCS )
-            // InternalCompleteOCL.g:16575:1: ruleConstraintCS
+            // InternalCompleteOCL.g:16726:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:16727:1: ruleConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedInvariantsConstraintCSParserRuleCall_4_0_1_0());
@@ -48441,17 +48880,17 @@
 
 
     // $ANTLR start "rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1"
-    // InternalCompleteOCL.g:16584:1: rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 : ( ruleDefCS ) ;
+    // InternalCompleteOCL.g:16736:1: rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1 : ( ruleDefCS ) ;
     public final void rule__ClassifierContextDeclCS__OwnedDefinitionsAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16588:1: ( ( ruleDefCS ) )
-            // InternalCompleteOCL.g:16589:1: ( ruleDefCS )
+            // InternalCompleteOCL.g:16740:1: ( ( ruleDefCS ) )
+            // InternalCompleteOCL.g:16741:1: ( ruleDefCS )
             {
-            // InternalCompleteOCL.g:16589:1: ( ruleDefCS )
-            // InternalCompleteOCL.g:16590:1: ruleDefCS
+            // InternalCompleteOCL.g:16741:1: ( ruleDefCS )
+            // InternalCompleteOCL.g:16742:1: ruleDefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getClassifierContextDeclCSAccess().getOwnedDefinitionsDefCSParserRuleCall_4_1_0());
@@ -48486,17 +48925,17 @@
 
 
     // $ANTLR start "rule__ConstraintCS__NameAssignment_0_0"
-    // InternalCompleteOCL.g:16599:1: rule__ConstraintCS__NameAssignment_0_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:16751:1: rule__ConstraintCS__NameAssignment_0_0 : ( ruleUnrestrictedName ) ;
     public final void rule__ConstraintCS__NameAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16603:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:16604:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16755:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:16756:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:16604:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:16605:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:16756:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16757:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_0());
@@ -48531,17 +48970,17 @@
 
 
     // $ANTLR start "rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1"
-    // InternalCompleteOCL.g:16614:1: rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:16766:1: rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__ConstraintCS__OwnedMessageSpecificationAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16618:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:16619:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16770:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:16771:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:16619:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:16620:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:16771:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16772:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_0_1_1_0());
@@ -48576,17 +49015,17 @@
 
 
     // $ANTLR start "rule__ConstraintCS__OwnedSpecificationAssignment_2"
-    // InternalCompleteOCL.g:16629:1: rule__ConstraintCS__OwnedSpecificationAssignment_2 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:16781:1: rule__ConstraintCS__OwnedSpecificationAssignment_2 : ( ruleSpecificationCS ) ;
     public final void rule__ConstraintCS__OwnedSpecificationAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16633:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:16634:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16785:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:16786:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:16634:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:16635:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:16786:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16787:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_2_0());
@@ -48621,23 +49060,23 @@
 
 
     // $ANTLR start "rule__DefOperationCS__IsStaticAssignment_0"
-    // InternalCompleteOCL.g:16644:1: rule__DefOperationCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
+    // InternalCompleteOCL.g:16796:1: rule__DefOperationCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
     public final void rule__DefOperationCS__IsStaticAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16648:1: ( ( ( 'static' ) ) )
-            // InternalCompleteOCL.g:16649:1: ( ( 'static' ) )
+            // InternalCompleteOCL.g:16800:1: ( ( ( 'static' ) ) )
+            // InternalCompleteOCL.g:16801:1: ( ( 'static' ) )
             {
-            // InternalCompleteOCL.g:16649:1: ( ( 'static' ) )
-            // InternalCompleteOCL.g:16650:1: ( 'static' )
+            // InternalCompleteOCL.g:16801:1: ( ( 'static' ) )
+            // InternalCompleteOCL.g:16802:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getIsStaticStaticKeyword_0_0());
             }
-            // InternalCompleteOCL.g:16651:1: ( 'static' )
-            // InternalCompleteOCL.g:16652:1: 'static'
+            // InternalCompleteOCL.g:16803:1: ( 'static' )
+            // InternalCompleteOCL.g:16804:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getIsStaticStaticKeyword_0_0());
@@ -48674,17 +49113,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__OwnedSignatureAssignment_4"
-    // InternalCompleteOCL.g:16667:1: rule__DefOperationCS__OwnedSignatureAssignment_4 : ( ruleTemplateSignatureCS ) ;
+    // InternalCompleteOCL.g:16819:1: rule__DefOperationCS__OwnedSignatureAssignment_4 : ( ruleTemplateSignatureCS ) ;
     public final void rule__DefOperationCS__OwnedSignatureAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16671:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalCompleteOCL.g:16672:1: ( ruleTemplateSignatureCS )
+            // InternalCompleteOCL.g:16823:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalCompleteOCL.g:16824:1: ( ruleTemplateSignatureCS )
             {
-            // InternalCompleteOCL.g:16672:1: ( ruleTemplateSignatureCS )
-            // InternalCompleteOCL.g:16673:1: ruleTemplateSignatureCS
+            // InternalCompleteOCL.g:16824:1: ( ruleTemplateSignatureCS )
+            // InternalCompleteOCL.g:16825:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_4_0());
@@ -48719,17 +49158,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__NameAssignment_5"
-    // InternalCompleteOCL.g:16682:1: rule__DefOperationCS__NameAssignment_5 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:16834:1: rule__DefOperationCS__NameAssignment_5 : ( ruleUnrestrictedName ) ;
     public final void rule__DefOperationCS__NameAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16686:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:16687:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16838:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:16839:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:16687:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:16688:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:16839:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16840:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getNameUnrestrictedNameParserRuleCall_5_0());
@@ -48764,17 +49203,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__OwnedParametersAssignment_7_0"
-    // InternalCompleteOCL.g:16697:1: rule__DefOperationCS__OwnedParametersAssignment_7_0 : ( ruleDefParameterCS ) ;
+    // InternalCompleteOCL.g:16849:1: rule__DefOperationCS__OwnedParametersAssignment_7_0 : ( ruleDefParameterCS ) ;
     public final void rule__DefOperationCS__OwnedParametersAssignment_7_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16701:1: ( ( ruleDefParameterCS ) )
-            // InternalCompleteOCL.g:16702:1: ( ruleDefParameterCS )
+            // InternalCompleteOCL.g:16853:1: ( ( ruleDefParameterCS ) )
+            // InternalCompleteOCL.g:16854:1: ( ruleDefParameterCS )
             {
-            // InternalCompleteOCL.g:16702:1: ( ruleDefParameterCS )
-            // InternalCompleteOCL.g:16703:1: ruleDefParameterCS
+            // InternalCompleteOCL.g:16854:1: ( ruleDefParameterCS )
+            // InternalCompleteOCL.g:16855:1: ruleDefParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedParametersDefParameterCSParserRuleCall_7_0_0());
@@ -48809,17 +49248,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__OwnedParametersAssignment_7_1_1"
-    // InternalCompleteOCL.g:16712:1: rule__DefOperationCS__OwnedParametersAssignment_7_1_1 : ( ruleDefParameterCS ) ;
+    // InternalCompleteOCL.g:16864:1: rule__DefOperationCS__OwnedParametersAssignment_7_1_1 : ( ruleDefParameterCS ) ;
     public final void rule__DefOperationCS__OwnedParametersAssignment_7_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16716:1: ( ( ruleDefParameterCS ) )
-            // InternalCompleteOCL.g:16717:1: ( ruleDefParameterCS )
+            // InternalCompleteOCL.g:16868:1: ( ( ruleDefParameterCS ) )
+            // InternalCompleteOCL.g:16869:1: ( ruleDefParameterCS )
             {
-            // InternalCompleteOCL.g:16717:1: ( ruleDefParameterCS )
-            // InternalCompleteOCL.g:16718:1: ruleDefParameterCS
+            // InternalCompleteOCL.g:16869:1: ( ruleDefParameterCS )
+            // InternalCompleteOCL.g:16870:1: ruleDefParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedParametersDefParameterCSParserRuleCall_7_1_1_0());
@@ -48854,17 +49293,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__OwnedTypeAssignment_10"
-    // InternalCompleteOCL.g:16727:1: rule__DefOperationCS__OwnedTypeAssignment_10 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:16879:1: rule__DefOperationCS__OwnedTypeAssignment_10 : ( ruleTypeExpCS ) ;
     public final void rule__DefOperationCS__OwnedTypeAssignment_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16731:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:16732:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:16883:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:16884:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:16732:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:16733:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:16884:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:16885:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedTypeTypeExpCSParserRuleCall_10_0());
@@ -48899,17 +49338,17 @@
 
 
     // $ANTLR start "rule__DefOperationCS__OwnedSpecificationAssignment_12"
-    // InternalCompleteOCL.g:16742:1: rule__DefOperationCS__OwnedSpecificationAssignment_12 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:16894:1: rule__DefOperationCS__OwnedSpecificationAssignment_12 : ( ruleSpecificationCS ) ;
     public final void rule__DefOperationCS__OwnedSpecificationAssignment_12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16746:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:16747:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16898:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:16899:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:16747:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:16748:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:16899:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16900:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefOperationCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_12_0());
@@ -48944,17 +49383,17 @@
 
 
     // $ANTLR start "rule__DefParameterCS__NameAssignment_0"
-    // InternalCompleteOCL.g:16757:1: rule__DefParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:16909:1: rule__DefParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__DefParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16761:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:16762:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16913:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:16914:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:16762:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:16763:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:16914:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16915:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -48989,17 +49428,17 @@
 
 
     // $ANTLR start "rule__DefParameterCS__OwnedTypeAssignment_2"
-    // InternalCompleteOCL.g:16772:1: rule__DefParameterCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:16924:1: rule__DefParameterCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__DefParameterCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16776:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:16777:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:16928:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:16929:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:16777:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:16778:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:16929:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:16930:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefParameterCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());
@@ -49034,23 +49473,23 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__IsStaticAssignment_0"
-    // InternalCompleteOCL.g:16787:1: rule__DefPropertyCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
+    // InternalCompleteOCL.g:16939:1: rule__DefPropertyCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
     public final void rule__DefPropertyCS__IsStaticAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16791:1: ( ( ( 'static' ) ) )
-            // InternalCompleteOCL.g:16792:1: ( ( 'static' ) )
+            // InternalCompleteOCL.g:16943:1: ( ( ( 'static' ) ) )
+            // InternalCompleteOCL.g:16944:1: ( ( 'static' ) )
             {
-            // InternalCompleteOCL.g:16792:1: ( ( 'static' ) )
-            // InternalCompleteOCL.g:16793:1: ( 'static' )
+            // InternalCompleteOCL.g:16944:1: ( ( 'static' ) )
+            // InternalCompleteOCL.g:16945:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getIsStaticStaticKeyword_0_0());
             }
-            // InternalCompleteOCL.g:16794:1: ( 'static' )
-            // InternalCompleteOCL.g:16795:1: 'static'
+            // InternalCompleteOCL.g:16946:1: ( 'static' )
+            // InternalCompleteOCL.g:16947:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getIsStaticStaticKeyword_0_0());
@@ -49087,17 +49526,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__NameAssignment_4"
-    // InternalCompleteOCL.g:16810:1: rule__DefPropertyCS__NameAssignment_4 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:16962:1: rule__DefPropertyCS__NameAssignment_4 : ( ruleUnrestrictedName ) ;
     public final void rule__DefPropertyCS__NameAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16814:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:16815:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16966:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:16967:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:16815:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:16816:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:16967:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:16968:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getNameUnrestrictedNameParserRuleCall_4_0());
@@ -49132,17 +49571,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__OwnedTypeAssignment_6"
-    // InternalCompleteOCL.g:16825:1: rule__DefPropertyCS__OwnedTypeAssignment_6 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:16977:1: rule__DefPropertyCS__OwnedTypeAssignment_6 : ( ruleTypeExpCS ) ;
     public final void rule__DefPropertyCS__OwnedTypeAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16829:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:16830:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:16981:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:16982:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:16830:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:16831:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:16982:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:16983:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getOwnedTypeTypeExpCSParserRuleCall_6_0());
@@ -49177,17 +49616,17 @@
 
 
     // $ANTLR start "rule__DefPropertyCS__OwnedSpecificationAssignment_8"
-    // InternalCompleteOCL.g:16840:1: rule__DefPropertyCS__OwnedSpecificationAssignment_8 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:16992:1: rule__DefPropertyCS__OwnedSpecificationAssignment_8 : ( ruleSpecificationCS ) ;
     public final void rule__DefPropertyCS__OwnedSpecificationAssignment_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16844:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:16845:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16996:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:16997:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:16845:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:16846:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:16997:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:16998:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDefPropertyCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_8_0());
@@ -49222,17 +49661,17 @@
 
 
     // $ANTLR start "rule__ImportCS__NameAssignment_1_0"
-    // InternalCompleteOCL.g:16855:1: rule__ImportCS__NameAssignment_1_0 : ( ruleIdentifier ) ;
+    // InternalCompleteOCL.g:17007:1: rule__ImportCS__NameAssignment_1_0 : ( ruleIdentifier ) ;
     public final void rule__ImportCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16859:1: ( ( ruleIdentifier ) )
-            // InternalCompleteOCL.g:16860:1: ( ruleIdentifier )
+            // InternalCompleteOCL.g:17011:1: ( ( ruleIdentifier ) )
+            // InternalCompleteOCL.g:17012:1: ( ruleIdentifier )
             {
-            // InternalCompleteOCL.g:16860:1: ( ruleIdentifier )
-            // InternalCompleteOCL.g:16861:1: ruleIdentifier
+            // InternalCompleteOCL.g:17012:1: ( ruleIdentifier )
+            // InternalCompleteOCL.g:17013:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getNameIdentifierParserRuleCall_1_0_0());
@@ -49267,17 +49706,17 @@
 
 
     // $ANTLR start "rule__ImportCS__OwnedPathNameAssignment_2"
-    // InternalCompleteOCL.g:16870:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
+    // InternalCompleteOCL.g:17022:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
     public final void rule__ImportCS__OwnedPathNameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16874:1: ( ( ruleURIPathNameCS ) )
-            // InternalCompleteOCL.g:16875:1: ( ruleURIPathNameCS )
+            // InternalCompleteOCL.g:17026:1: ( ( ruleURIPathNameCS ) )
+            // InternalCompleteOCL.g:17027:1: ( ruleURIPathNameCS )
             {
-            // InternalCompleteOCL.g:16875:1: ( ruleURIPathNameCS )
-            // InternalCompleteOCL.g:16876:1: ruleURIPathNameCS
+            // InternalCompleteOCL.g:17027:1: ( ruleURIPathNameCS )
+            // InternalCompleteOCL.g:17028:1: ruleURIPathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());
@@ -49312,23 +49751,23 @@
 
 
     // $ANTLR start "rule__ImportCS__IsAllAssignment_3"
-    // InternalCompleteOCL.g:16885:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
+    // InternalCompleteOCL.g:17037:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
     public final void rule__ImportCS__IsAllAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16889:1: ( ( ( '::*' ) ) )
-            // InternalCompleteOCL.g:16890:1: ( ( '::*' ) )
+            // InternalCompleteOCL.g:17041:1: ( ( ( '::*' ) ) )
+            // InternalCompleteOCL.g:17042:1: ( ( '::*' ) )
             {
-            // InternalCompleteOCL.g:16890:1: ( ( '::*' ) )
-            // InternalCompleteOCL.g:16891:1: ( '::*' )
+            // InternalCompleteOCL.g:17042:1: ( ( '::*' ) )
+            // InternalCompleteOCL.g:17043:1: ( '::*' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
             }
-            // InternalCompleteOCL.g:16892:1: ( '::*' )
-            // InternalCompleteOCL.g:16893:1: '::*'
+            // InternalCompleteOCL.g:17044:1: ( '::*' )
+            // InternalCompleteOCL.g:17045:1: '::*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
@@ -49365,17 +49804,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedSignatureAssignment_1"
-    // InternalCompleteOCL.g:16908:1: rule__OperationContextDeclCS__OwnedSignatureAssignment_1 : ( ruleTemplateSignatureCS ) ;
+    // InternalCompleteOCL.g:17060:1: rule__OperationContextDeclCS__OwnedSignatureAssignment_1 : ( ruleTemplateSignatureCS ) ;
     public final void rule__OperationContextDeclCS__OwnedSignatureAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16912:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalCompleteOCL.g:16913:1: ( ruleTemplateSignatureCS )
+            // InternalCompleteOCL.g:17064:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalCompleteOCL.g:17065:1: ( ruleTemplateSignatureCS )
             {
-            // InternalCompleteOCL.g:16913:1: ( ruleTemplateSignatureCS )
-            // InternalCompleteOCL.g:16914:1: ruleTemplateSignatureCS
+            // InternalCompleteOCL.g:17065:1: ( ruleTemplateSignatureCS )
+            // InternalCompleteOCL.g:17066:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_1_0());
@@ -49410,28 +49849,28 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedPathNameAssignment_2"
-    // InternalCompleteOCL.g:16923:1: rule__OperationContextDeclCS__OwnedPathNameAssignment_2 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:17075:1: rule__OperationContextDeclCS__OwnedPathNameAssignment_2 : ( ruleUnreservedPathNameCS ) ;
     public final void rule__OperationContextDeclCS__OwnedPathNameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16927:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:16928:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:17079:1: ( ( ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:17080:1: ( ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:16928:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:16929:1: rulePathNameCS
+            // InternalCompleteOCL.g:17080:1: ( ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:17081:1: ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0());
+               before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0());
             }
             pushFollow(FollowSets000.FOLLOW_2);
-            rulePathNameCS();
+            ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0());
+               after(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0());
             }
 
             }
@@ -49455,17 +49894,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedParametersAssignment_4_0"
-    // InternalCompleteOCL.g:16938:1: rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 : ( ruleParameterCS ) ;
+    // InternalCompleteOCL.g:17090:1: rule__OperationContextDeclCS__OwnedParametersAssignment_4_0 : ( ruleParameterCS ) ;
     public final void rule__OperationContextDeclCS__OwnedParametersAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16942:1: ( ( ruleParameterCS ) )
-            // InternalCompleteOCL.g:16943:1: ( ruleParameterCS )
+            // InternalCompleteOCL.g:17094:1: ( ( ruleParameterCS ) )
+            // InternalCompleteOCL.g:17095:1: ( ruleParameterCS )
             {
-            // InternalCompleteOCL.g:16943:1: ( ruleParameterCS )
-            // InternalCompleteOCL.g:16944:1: ruleParameterCS
+            // InternalCompleteOCL.g:17095:1: ( ruleParameterCS )
+            // InternalCompleteOCL.g:17096:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedParametersParameterCSParserRuleCall_4_0_0());
@@ -49500,17 +49939,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1"
-    // InternalCompleteOCL.g:16953:1: rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 : ( ruleParameterCS ) ;
+    // InternalCompleteOCL.g:17105:1: rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1 : ( ruleParameterCS ) ;
     public final void rule__OperationContextDeclCS__OwnedParametersAssignment_4_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16957:1: ( ( ruleParameterCS ) )
-            // InternalCompleteOCL.g:16958:1: ( ruleParameterCS )
+            // InternalCompleteOCL.g:17109:1: ( ( ruleParameterCS ) )
+            // InternalCompleteOCL.g:17110:1: ( ruleParameterCS )
             {
-            // InternalCompleteOCL.g:16958:1: ( ruleParameterCS )
-            // InternalCompleteOCL.g:16959:1: ruleParameterCS
+            // InternalCompleteOCL.g:17110:1: ( ruleParameterCS )
+            // InternalCompleteOCL.g:17111:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedParametersParameterCSParserRuleCall_4_1_1_0());
@@ -49545,17 +49984,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedTypeAssignment_7"
-    // InternalCompleteOCL.g:16968:1: rule__OperationContextDeclCS__OwnedTypeAssignment_7 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17120:1: rule__OperationContextDeclCS__OwnedTypeAssignment_7 : ( ruleTypeExpCS ) ;
     public final void rule__OperationContextDeclCS__OwnedTypeAssignment_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16972:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:16973:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17124:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17125:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:16973:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:16974:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17125:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17126:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedTypeTypeExpCSParserRuleCall_7_0());
@@ -49590,17 +50029,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1"
-    // InternalCompleteOCL.g:16983:1: rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 : ( ruleConstraintCS ) ;
+    // InternalCompleteOCL.g:17135:1: rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1 : ( ruleConstraintCS ) ;
     public final void rule__OperationContextDeclCS__OwnedPreconditionsAssignment_8_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:16987:1: ( ( ruleConstraintCS ) )
-            // InternalCompleteOCL.g:16988:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:17139:1: ( ( ruleConstraintCS ) )
+            // InternalCompleteOCL.g:17140:1: ( ruleConstraintCS )
             {
-            // InternalCompleteOCL.g:16988:1: ( ruleConstraintCS )
-            // InternalCompleteOCL.g:16989:1: ruleConstraintCS
+            // InternalCompleteOCL.g:17140:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:17141:1: ruleConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPreconditionsConstraintCSParserRuleCall_8_0_1_0());
@@ -49635,17 +50074,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1"
-    // InternalCompleteOCL.g:16998:1: rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 : ( ruleConstraintCS ) ;
+    // InternalCompleteOCL.g:17150:1: rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1 : ( ruleConstraintCS ) ;
     public final void rule__OperationContextDeclCS__OwnedPostconditionsAssignment_8_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17002:1: ( ( ruleConstraintCS ) )
-            // InternalCompleteOCL.g:17003:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:17154:1: ( ( ruleConstraintCS ) )
+            // InternalCompleteOCL.g:17155:1: ( ruleConstraintCS )
             {
-            // InternalCompleteOCL.g:17003:1: ( ruleConstraintCS )
-            // InternalCompleteOCL.g:17004:1: ruleConstraintCS
+            // InternalCompleteOCL.g:17155:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:17156:1: ruleConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedPostconditionsConstraintCSParserRuleCall_8_1_1_0());
@@ -49680,17 +50119,17 @@
 
 
     // $ANTLR start "rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3"
-    // InternalCompleteOCL.g:17013:1: rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:17165:1: rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3 : ( ruleSpecificationCS ) ;
     public final void rule__OperationContextDeclCS__OwnedBodiesAssignment_8_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17017:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:17018:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:17169:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:17170:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:17018:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:17019:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:17170:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:17171:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationContextDeclCSAccess().getOwnedBodiesSpecificationCSParserRuleCall_8_2_3_0());
@@ -49725,28 +50164,28 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__OwnedPathNameAssignment_1"
-    // InternalCompleteOCL.g:17028:1: rule__PackageDeclarationCS__OwnedPathNameAssignment_1 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:17180:1: rule__PackageDeclarationCS__OwnedPathNameAssignment_1 : ( ruleUnreservedPathNameCS ) ;
     public final void rule__PackageDeclarationCS__OwnedPathNameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17032:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:17033:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:17184:1: ( ( ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:17185:1: ( ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:17033:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:17034:1: rulePathNameCS
+            // InternalCompleteOCL.g:17185:1: ( ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:17186:1: ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+               before(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
             }
             pushFollow(FollowSets000.FOLLOW_2);
-            rulePathNameCS();
+            ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+               after(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
             }
 
             }
@@ -49770,17 +50209,17 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1"
-    // InternalCompleteOCL.g:17043:1: rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 : ( ruleConstraintCS ) ;
+    // InternalCompleteOCL.g:17195:1: rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1 : ( ruleConstraintCS ) ;
     public final void rule__PackageDeclarationCS__OwnedInvariantsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17047:1: ( ( ruleConstraintCS ) )
-            // InternalCompleteOCL.g:17048:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:17199:1: ( ( ruleConstraintCS ) )
+            // InternalCompleteOCL.g:17200:1: ( ruleConstraintCS )
             {
-            // InternalCompleteOCL.g:17048:1: ( ruleConstraintCS )
-            // InternalCompleteOCL.g:17049:1: ruleConstraintCS
+            // InternalCompleteOCL.g:17200:1: ( ruleConstraintCS )
+            // InternalCompleteOCL.g:17201:1: ruleConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getOwnedInvariantsConstraintCSParserRuleCall_2_1_0());
@@ -49815,17 +50254,17 @@
 
 
     // $ANTLR start "rule__PackageDeclarationCS__OwnedContextsAssignment_3"
-    // InternalCompleteOCL.g:17058:1: rule__PackageDeclarationCS__OwnedContextsAssignment_3 : ( ruleContextDeclCS ) ;
+    // InternalCompleteOCL.g:17210:1: rule__PackageDeclarationCS__OwnedContextsAssignment_3 : ( ruleContextDeclCS ) ;
     public final void rule__PackageDeclarationCS__OwnedContextsAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17062:1: ( ( ruleContextDeclCS ) )
-            // InternalCompleteOCL.g:17063:1: ( ruleContextDeclCS )
+            // InternalCompleteOCL.g:17214:1: ( ( ruleContextDeclCS ) )
+            // InternalCompleteOCL.g:17215:1: ( ruleContextDeclCS )
             {
-            // InternalCompleteOCL.g:17063:1: ( ruleContextDeclCS )
-            // InternalCompleteOCL.g:17064:1: ruleContextDeclCS
+            // InternalCompleteOCL.g:17215:1: ( ruleContextDeclCS )
+            // InternalCompleteOCL.g:17216:1: ruleContextDeclCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageDeclarationCSAccess().getOwnedContextsContextDeclCSParserRuleCall_3_0());
@@ -49860,17 +50299,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__NameAssignment_0_0"
-    // InternalCompleteOCL.g:17073:1: rule__ParameterCS__NameAssignment_0_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:17225:1: rule__ParameterCS__NameAssignment_0_0 : ( ruleUnrestrictedName ) ;
     public final void rule__ParameterCS__NameAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17077:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:17078:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17229:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17230:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:17078:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:17079:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:17230:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17231:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_0());
@@ -49905,17 +50344,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__OwnedTypeAssignment_1"
-    // InternalCompleteOCL.g:17088:1: rule__ParameterCS__OwnedTypeAssignment_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17240:1: rule__ParameterCS__OwnedTypeAssignment_1 : ( ruleTypeExpCS ) ;
     public final void rule__ParameterCS__OwnedTypeAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17092:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17093:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17244:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17245:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17093:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17094:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17245:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17246:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_0());
@@ -49950,28 +50389,28 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__OwnedPathNameAssignment_1"
-    // InternalCompleteOCL.g:17103:1: rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:17255:1: rule__PropertyContextDeclCS__OwnedPathNameAssignment_1 : ( ruleUnreservedPathNameCS ) ;
     public final void rule__PropertyContextDeclCS__OwnedPathNameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17107:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:17108:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:17259:1: ( ( ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:17260:1: ( ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:17108:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:17109:1: rulePathNameCS
+            // InternalCompleteOCL.g:17260:1: ( ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:17261:1: ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+               before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
             }
             pushFollow(FollowSets000.FOLLOW_2);
-            rulePathNameCS();
+            ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+               after(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
             }
 
             }
@@ -49995,17 +50434,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__OwnedTypeAssignment_3"
-    // InternalCompleteOCL.g:17118:1: rule__PropertyContextDeclCS__OwnedTypeAssignment_3 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17270:1: rule__PropertyContextDeclCS__OwnedTypeAssignment_3 : ( ruleTypeExpCS ) ;
     public final void rule__PropertyContextDeclCS__OwnedTypeAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17122:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17123:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17274:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17275:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17123:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17124:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17275:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17276:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedTypeTypeExpCSParserRuleCall_3_0());
@@ -50040,17 +50479,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3"
-    // InternalCompleteOCL.g:17133:1: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:17285:1: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3 : ( ruleSpecificationCS ) ;
     public final void rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17137:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:17138:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:17289:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:17290:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:17138:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:17139:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:17290:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:17291:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_4_0_3_0());
@@ -50085,17 +50524,17 @@
 
 
     // $ANTLR start "rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3"
-    // InternalCompleteOCL.g:17148:1: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 : ( ruleSpecificationCS ) ;
+    // InternalCompleteOCL.g:17300:1: rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3 : ( ruleSpecificationCS ) ;
     public final void rule__PropertyContextDeclCS__OwnedDefaultExpressionsAssignment_4_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17152:1: ( ( ruleSpecificationCS ) )
-            // InternalCompleteOCL.g:17153:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:17304:1: ( ( ruleSpecificationCS ) )
+            // InternalCompleteOCL.g:17305:1: ( ruleSpecificationCS )
             {
-            // InternalCompleteOCL.g:17153:1: ( ruleSpecificationCS )
-            // InternalCompleteOCL.g:17154:1: ruleSpecificationCS
+            // InternalCompleteOCL.g:17305:1: ( ruleSpecificationCS )
+            // InternalCompleteOCL.g:17306:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPropertyContextDeclCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_4_1_3_0());
@@ -50130,17 +50569,17 @@
 
 
     // $ANTLR start "rule__SpecificationCS__OwnedExpressionAssignment_0"
-    // InternalCompleteOCL.g:17163:1: rule__SpecificationCS__OwnedExpressionAssignment_0 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:17315:1: rule__SpecificationCS__OwnedExpressionAssignment_0 : ( ruleExpCS ) ;
     public final void rule__SpecificationCS__OwnedExpressionAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17167:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17168:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17319:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:17320:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17168:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17169:1: ruleExpCS
+            // InternalCompleteOCL.g:17320:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17321:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0());
@@ -50175,17 +50614,17 @@
 
 
     // $ANTLR start "rule__SpecificationCS__ExprStringAssignment_1"
-    // InternalCompleteOCL.g:17178:1: rule__SpecificationCS__ExprStringAssignment_1 : ( RULE_UNQUOTED_STRING ) ;
+    // InternalCompleteOCL.g:17330:1: rule__SpecificationCS__ExprStringAssignment_1 : ( RULE_UNQUOTED_STRING ) ;
     public final void rule__SpecificationCS__ExprStringAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17182:1: ( ( RULE_UNQUOTED_STRING ) )
-            // InternalCompleteOCL.g:17183:1: ( RULE_UNQUOTED_STRING )
+            // InternalCompleteOCL.g:17334:1: ( ( RULE_UNQUOTED_STRING ) )
+            // InternalCompleteOCL.g:17335:1: ( RULE_UNQUOTED_STRING )
             {
-            // InternalCompleteOCL.g:17183:1: ( RULE_UNQUOTED_STRING )
-            // InternalCompleteOCL.g:17184:1: RULE_UNQUOTED_STRING
+            // InternalCompleteOCL.g:17335:1: ( RULE_UNQUOTED_STRING )
+            // InternalCompleteOCL.g:17336:1: RULE_UNQUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSpecificationCSAccess().getExprStringUNQUOTED_STRINGTerminalRuleCall_1_0());
@@ -50216,17 +50655,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_0_1"
-    // InternalCompleteOCL.g:17193:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 : ( ruleTypeParameterCS ) ;
+    // InternalCompleteOCL.g:17345:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17197:1: ( ( ruleTypeParameterCS ) )
-            // InternalCompleteOCL.g:17198:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17349:1: ( ( ruleTypeParameterCS ) )
+            // InternalCompleteOCL.g:17350:1: ( ruleTypeParameterCS )
             {
-            // InternalCompleteOCL.g:17198:1: ( ruleTypeParameterCS )
-            // InternalCompleteOCL.g:17199:1: ruleTypeParameterCS
+            // InternalCompleteOCL.g:17350:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17351:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_1_0());
@@ -50261,17 +50700,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1"
-    // InternalCompleteOCL.g:17208:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 : ( ruleTypeParameterCS ) ;
+    // InternalCompleteOCL.g:17360:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17212:1: ( ( ruleTypeParameterCS ) )
-            // InternalCompleteOCL.g:17213:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17364:1: ( ( ruleTypeParameterCS ) )
+            // InternalCompleteOCL.g:17365:1: ( ruleTypeParameterCS )
             {
-            // InternalCompleteOCL.g:17213:1: ( ruleTypeParameterCS )
-            // InternalCompleteOCL.g:17214:1: ruleTypeParameterCS
+            // InternalCompleteOCL.g:17365:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17366:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_2_1_0());
@@ -50306,17 +50745,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1_1"
-    // InternalCompleteOCL.g:17223:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 : ( ruleTypeParameterCS ) ;
+    // InternalCompleteOCL.g:17375:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17227:1: ( ( ruleTypeParameterCS ) )
-            // InternalCompleteOCL.g:17228:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17379:1: ( ( ruleTypeParameterCS ) )
+            // InternalCompleteOCL.g:17380:1: ( ruleTypeParameterCS )
             {
-            // InternalCompleteOCL.g:17228:1: ( ruleTypeParameterCS )
-            // InternalCompleteOCL.g:17229:1: ruleTypeParameterCS
+            // InternalCompleteOCL.g:17380:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17381:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_1_0());
@@ -50351,17 +50790,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1"
-    // InternalCompleteOCL.g:17238:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 : ( ruleTypeParameterCS ) ;
+    // InternalCompleteOCL.g:17390:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17242:1: ( ( ruleTypeParameterCS ) )
-            // InternalCompleteOCL.g:17243:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17394:1: ( ( ruleTypeParameterCS ) )
+            // InternalCompleteOCL.g:17395:1: ( ruleTypeParameterCS )
             {
-            // InternalCompleteOCL.g:17243:1: ( ruleTypeParameterCS )
-            // InternalCompleteOCL.g:17244:1: ruleTypeParameterCS
+            // InternalCompleteOCL.g:17395:1: ( ruleTypeParameterCS )
+            // InternalCompleteOCL.g:17396:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_2_1_0());
@@ -50396,17 +50835,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_0"
-    // InternalCompleteOCL.g:17254:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
+    // InternalCompleteOCL.g:17406:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
     public final void rule__URIPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17258:1: ( ( ruleURIFirstPathElementCS ) )
-            // InternalCompleteOCL.g:17259:1: ( ruleURIFirstPathElementCS )
+            // InternalCompleteOCL.g:17410:1: ( ( ruleURIFirstPathElementCS ) )
+            // InternalCompleteOCL.g:17411:1: ( ruleURIFirstPathElementCS )
             {
-            // InternalCompleteOCL.g:17259:1: ( ruleURIFirstPathElementCS )
-            // InternalCompleteOCL.g:17260:1: ruleURIFirstPathElementCS
+            // InternalCompleteOCL.g:17411:1: ( ruleURIFirstPathElementCS )
+            // InternalCompleteOCL.g:17412:1: ruleURIFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());
@@ -50441,17 +50880,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalCompleteOCL.g:17269:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalCompleteOCL.g:17421:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__URIPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17273:1: ( ( ruleNextPathElementCS ) )
-            // InternalCompleteOCL.g:17274:1: ( ruleNextPathElementCS )
+            // InternalCompleteOCL.g:17425:1: ( ( ruleNextPathElementCS ) )
+            // InternalCompleteOCL.g:17426:1: ( ruleNextPathElementCS )
             {
-            // InternalCompleteOCL.g:17274:1: ( ruleNextPathElementCS )
-            // InternalCompleteOCL.g:17275:1: ruleNextPathElementCS
+            // InternalCompleteOCL.g:17426:1: ( ruleNextPathElementCS )
+            // InternalCompleteOCL.g:17427:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -50486,23 +50925,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_0"
-    // InternalCompleteOCL.g:17284:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalCompleteOCL.g:17436:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17288:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalCompleteOCL.g:17289:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17440:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalCompleteOCL.g:17441:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalCompleteOCL.g:17289:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:17290:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17441:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17442:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
             }
-            // InternalCompleteOCL.g:17291:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:17292:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:17443:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17444:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_0_1());
@@ -50543,23 +50982,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_1_1"
-    // InternalCompleteOCL.g:17303:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
+    // InternalCompleteOCL.g:17455:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17307:1: ( ( ( ruleURI ) ) )
-            // InternalCompleteOCL.g:17308:1: ( ( ruleURI ) )
+            // InternalCompleteOCL.g:17459:1: ( ( ( ruleURI ) ) )
+            // InternalCompleteOCL.g:17460:1: ( ( ruleURI ) )
             {
-            // InternalCompleteOCL.g:17308:1: ( ( ruleURI ) )
-            // InternalCompleteOCL.g:17309:1: ( ruleURI )
+            // InternalCompleteOCL.g:17460:1: ( ( ruleURI ) )
+            // InternalCompleteOCL.g:17461:1: ( ruleURI )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
             }
-            // InternalCompleteOCL.g:17310:1: ( ruleURI )
-            // InternalCompleteOCL.g:17311:1: ruleURI
+            // InternalCompleteOCL.g:17462:1: ( ruleURI )
+            // InternalCompleteOCL.g:17463:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceURIParserRuleCall_1_1_0_1());
@@ -50600,17 +51039,17 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeCS__NameAssignment"
-    // InternalCompleteOCL.g:17323:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
+    // InternalCompleteOCL.g:17475:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
     public final void rule__PrimitiveTypeCS__NameAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17327:1: ( ( rulePrimitiveTypeIdentifier ) )
-            // InternalCompleteOCL.g:17328:1: ( rulePrimitiveTypeIdentifier )
+            // InternalCompleteOCL.g:17479:1: ( ( rulePrimitiveTypeIdentifier ) )
+            // InternalCompleteOCL.g:17480:1: ( rulePrimitiveTypeIdentifier )
             {
-            // InternalCompleteOCL.g:17328:1: ( rulePrimitiveTypeIdentifier )
-            // InternalCompleteOCL.g:17329:1: rulePrimitiveTypeIdentifier
+            // InternalCompleteOCL.g:17480:1: ( rulePrimitiveTypeIdentifier )
+            // InternalCompleteOCL.g:17481:1: rulePrimitiveTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());
@@ -50645,17 +51084,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__NameAssignment_0"
-    // InternalCompleteOCL.g:17338:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
+    // InternalCompleteOCL.g:17490:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
     public final void rule__CollectionTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17342:1: ( ( ruleCollectionTypeIdentifier ) )
-            // InternalCompleteOCL.g:17343:1: ( ruleCollectionTypeIdentifier )
+            // InternalCompleteOCL.g:17494:1: ( ( ruleCollectionTypeIdentifier ) )
+            // InternalCompleteOCL.g:17495:1: ( ruleCollectionTypeIdentifier )
             {
-            // InternalCompleteOCL.g:17343:1: ( ruleCollectionTypeIdentifier )
-            // InternalCompleteOCL.g:17344:1: ruleCollectionTypeIdentifier
+            // InternalCompleteOCL.g:17495:1: ( ruleCollectionTypeIdentifier )
+            // InternalCompleteOCL.g:17496:1: ruleCollectionTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());
@@ -50690,17 +51129,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedTypeAssignment_1_1"
-    // InternalCompleteOCL.g:17353:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalCompleteOCL.g:17505:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17357:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalCompleteOCL.g:17358:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalCompleteOCL.g:17509:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalCompleteOCL.g:17510:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalCompleteOCL.g:17358:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalCompleteOCL.g:17359:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalCompleteOCL.g:17510:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalCompleteOCL.g:17511:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());
@@ -50735,17 +51174,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2"
-    // InternalCompleteOCL.g:17368:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
+    // InternalCompleteOCL.g:17520:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17372:1: ( ( ruleMultiplicityCS ) )
-            // InternalCompleteOCL.g:17373:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:17524:1: ( ( ruleMultiplicityCS ) )
+            // InternalCompleteOCL.g:17525:1: ( ruleMultiplicityCS )
             {
-            // InternalCompleteOCL.g:17373:1: ( ruleMultiplicityCS )
-            // InternalCompleteOCL.g:17374:1: ruleMultiplicityCS
+            // InternalCompleteOCL.g:17525:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:17526:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());
@@ -50780,23 +51219,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__NameAssignment_0"
-    // InternalCompleteOCL.g:17383:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
+    // InternalCompleteOCL.g:17535:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
     public final void rule__MapTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17387:1: ( ( ( 'Map' ) ) )
-            // InternalCompleteOCL.g:17388:1: ( ( 'Map' ) )
+            // InternalCompleteOCL.g:17539:1: ( ( ( 'Map' ) ) )
+            // InternalCompleteOCL.g:17540:1: ( ( 'Map' ) )
             {
-            // InternalCompleteOCL.g:17388:1: ( ( 'Map' ) )
-            // InternalCompleteOCL.g:17389:1: ( 'Map' )
+            // InternalCompleteOCL.g:17540:1: ( ( 'Map' ) )
+            // InternalCompleteOCL.g:17541:1: ( 'Map' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
             }
-            // InternalCompleteOCL.g:17390:1: ( 'Map' )
-            // InternalCompleteOCL.g:17391:1: 'Map'
+            // InternalCompleteOCL.g:17542:1: ( 'Map' )
+            // InternalCompleteOCL.g:17543:1: 'Map'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
@@ -50833,17 +51272,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedKeyTypeAssignment_1_1"
-    // InternalCompleteOCL.g:17406:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17558:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedKeyTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17410:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17411:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17562:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17563:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17411:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17412:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17563:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17564:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());
@@ -50878,17 +51317,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedValueTypeAssignment_1_3"
-    // InternalCompleteOCL.g:17421:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17573:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedValueTypeAssignment_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17425:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17426:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17577:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17578:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17426:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17427:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17578:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17579:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());
@@ -50923,23 +51362,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__NameAssignment_0"
-    // InternalCompleteOCL.g:17436:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
+    // InternalCompleteOCL.g:17588:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
     public final void rule__TupleTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17440:1: ( ( ( 'Tuple' ) ) )
-            // InternalCompleteOCL.g:17441:1: ( ( 'Tuple' ) )
+            // InternalCompleteOCL.g:17592:1: ( ( ( 'Tuple' ) ) )
+            // InternalCompleteOCL.g:17593:1: ( ( 'Tuple' ) )
             {
-            // InternalCompleteOCL.g:17441:1: ( ( 'Tuple' ) )
-            // InternalCompleteOCL.g:17442:1: ( 'Tuple' )
+            // InternalCompleteOCL.g:17593:1: ( ( 'Tuple' ) )
+            // InternalCompleteOCL.g:17594:1: ( 'Tuple' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
             }
-            // InternalCompleteOCL.g:17443:1: ( 'Tuple' )
-            // InternalCompleteOCL.g:17444:1: 'Tuple'
+            // InternalCompleteOCL.g:17595:1: ( 'Tuple' )
+            // InternalCompleteOCL.g:17596:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
@@ -50976,17 +51415,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_0"
-    // InternalCompleteOCL.g:17459:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
+    // InternalCompleteOCL.g:17611:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17463:1: ( ( ruleTuplePartCS ) )
-            // InternalCompleteOCL.g:17464:1: ( ruleTuplePartCS )
+            // InternalCompleteOCL.g:17615:1: ( ( ruleTuplePartCS ) )
+            // InternalCompleteOCL.g:17616:1: ( ruleTuplePartCS )
             {
-            // InternalCompleteOCL.g:17464:1: ( ruleTuplePartCS )
-            // InternalCompleteOCL.g:17465:1: ruleTuplePartCS
+            // InternalCompleteOCL.g:17616:1: ( ruleTuplePartCS )
+            // InternalCompleteOCL.g:17617:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
@@ -51021,17 +51460,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1"
-    // InternalCompleteOCL.g:17474:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
+    // InternalCompleteOCL.g:17626:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17478:1: ( ( ruleTuplePartCS ) )
-            // InternalCompleteOCL.g:17479:1: ( ruleTuplePartCS )
+            // InternalCompleteOCL.g:17630:1: ( ( ruleTuplePartCS ) )
+            // InternalCompleteOCL.g:17631:1: ( ruleTuplePartCS )
             {
-            // InternalCompleteOCL.g:17479:1: ( ruleTuplePartCS )
-            // InternalCompleteOCL.g:17480:1: ruleTuplePartCS
+            // InternalCompleteOCL.g:17631:1: ( ruleTuplePartCS )
+            // InternalCompleteOCL.g:17632:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
@@ -51066,17 +51505,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__NameAssignment_0"
-    // InternalCompleteOCL.g:17489:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:17641:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TuplePartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17493:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:17494:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17645:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17646:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:17494:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:17495:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:17646:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17647:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -51111,17 +51550,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__OwnedTypeAssignment_2"
-    // InternalCompleteOCL.g:17504:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17656:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__TuplePartCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17508:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17509:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17660:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17661:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17509:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17510:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17661:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17662:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());
@@ -51156,17 +51595,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalCompleteOCL.g:17519:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalCompleteOCL.g:17671:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17523:1: ( ( ruleCollectionTypeCS ) )
-            // InternalCompleteOCL.g:17524:1: ( ruleCollectionTypeCS )
+            // InternalCompleteOCL.g:17675:1: ( ( ruleCollectionTypeCS ) )
+            // InternalCompleteOCL.g:17676:1: ( ruleCollectionTypeCS )
             {
-            // InternalCompleteOCL.g:17524:1: ( ruleCollectionTypeCS )
-            // InternalCompleteOCL.g:17525:1: ruleCollectionTypeCS
+            // InternalCompleteOCL.g:17676:1: ( ruleCollectionTypeCS )
+            // InternalCompleteOCL.g:17677:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -51201,17 +51640,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalCompleteOCL.g:17534:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalCompleteOCL.g:17686:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17538:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalCompleteOCL.g:17539:1: ( ruleCollectionLiteralPartCS )
+            // InternalCompleteOCL.g:17690:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalCompleteOCL.g:17691:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalCompleteOCL.g:17539:1: ( ruleCollectionLiteralPartCS )
-            // InternalCompleteOCL.g:17540:1: ruleCollectionLiteralPartCS
+            // InternalCompleteOCL.g:17691:1: ( ruleCollectionLiteralPartCS )
+            // InternalCompleteOCL.g:17692:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());
@@ -51246,17 +51685,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalCompleteOCL.g:17549:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalCompleteOCL.g:17701:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17553:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalCompleteOCL.g:17554:1: ( ruleCollectionLiteralPartCS )
+            // InternalCompleteOCL.g:17705:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalCompleteOCL.g:17706:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalCompleteOCL.g:17554:1: ( ruleCollectionLiteralPartCS )
-            // InternalCompleteOCL.g:17555:1: ruleCollectionLiteralPartCS
+            // InternalCompleteOCL.g:17706:1: ( ruleCollectionLiteralPartCS )
+            // InternalCompleteOCL.g:17707:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());
@@ -51291,17 +51730,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0"
-    // InternalCompleteOCL.g:17564:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:17716:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17568:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17569:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17720:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:17721:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17569:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17570:1: ruleExpCS
+            // InternalCompleteOCL.g:17721:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17722:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());
@@ -51336,17 +51775,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1"
-    // InternalCompleteOCL.g:17579:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:17731:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17583:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17584:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17735:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:17736:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17584:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17585:1: ruleExpCS
+            // InternalCompleteOCL.g:17736:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17737:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());
@@ -51381,17 +51820,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1"
-    // InternalCompleteOCL.g:17594:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
+    // InternalCompleteOCL.g:17746:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17598:1: ( ( rulePatternExpCS ) )
-            // InternalCompleteOCL.g:17599:1: ( rulePatternExpCS )
+            // InternalCompleteOCL.g:17750:1: ( ( rulePatternExpCS ) )
+            // InternalCompleteOCL.g:17751:1: ( rulePatternExpCS )
             {
-            // InternalCompleteOCL.g:17599:1: ( rulePatternExpCS )
-            // InternalCompleteOCL.g:17600:1: rulePatternExpCS
+            // InternalCompleteOCL.g:17751:1: ( rulePatternExpCS )
+            // InternalCompleteOCL.g:17752:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());
@@ -51426,17 +51865,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedTypeAssignment_0"
-    // InternalCompleteOCL.g:17609:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalCompleteOCL.g:17761:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionPatternCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17613:1: ( ( ruleCollectionTypeCS ) )
-            // InternalCompleteOCL.g:17614:1: ( ruleCollectionTypeCS )
+            // InternalCompleteOCL.g:17765:1: ( ( ruleCollectionTypeCS ) )
+            // InternalCompleteOCL.g:17766:1: ( ruleCollectionTypeCS )
             {
-            // InternalCompleteOCL.g:17614:1: ( ruleCollectionTypeCS )
-            // InternalCompleteOCL.g:17615:1: ruleCollectionTypeCS
+            // InternalCompleteOCL.g:17766:1: ( ruleCollectionTypeCS )
+            // InternalCompleteOCL.g:17767:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -51471,17 +51910,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_0"
-    // InternalCompleteOCL.g:17624:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
+    // InternalCompleteOCL.g:17776:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17628:1: ( ( rulePatternExpCS ) )
-            // InternalCompleteOCL.g:17629:1: ( rulePatternExpCS )
+            // InternalCompleteOCL.g:17780:1: ( ( rulePatternExpCS ) )
+            // InternalCompleteOCL.g:17781:1: ( rulePatternExpCS )
             {
-            // InternalCompleteOCL.g:17629:1: ( rulePatternExpCS )
-            // InternalCompleteOCL.g:17630:1: rulePatternExpCS
+            // InternalCompleteOCL.g:17781:1: ( rulePatternExpCS )
+            // InternalCompleteOCL.g:17782:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());
@@ -51516,17 +51955,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1"
-    // InternalCompleteOCL.g:17639:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
+    // InternalCompleteOCL.g:17791:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17643:1: ( ( rulePatternExpCS ) )
-            // InternalCompleteOCL.g:17644:1: ( rulePatternExpCS )
+            // InternalCompleteOCL.g:17795:1: ( ( rulePatternExpCS ) )
+            // InternalCompleteOCL.g:17796:1: ( rulePatternExpCS )
             {
-            // InternalCompleteOCL.g:17644:1: ( rulePatternExpCS )
-            // InternalCompleteOCL.g:17645:1: rulePatternExpCS
+            // InternalCompleteOCL.g:17796:1: ( rulePatternExpCS )
+            // InternalCompleteOCL.g:17797:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());
@@ -51561,17 +52000,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1"
-    // InternalCompleteOCL.g:17654:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
+    // InternalCompleteOCL.g:17806:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
     public final void rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17658:1: ( ( ruleIdentifier ) )
-            // InternalCompleteOCL.g:17659:1: ( ruleIdentifier )
+            // InternalCompleteOCL.g:17810:1: ( ( ruleIdentifier ) )
+            // InternalCompleteOCL.g:17811:1: ( ruleIdentifier )
             {
-            // InternalCompleteOCL.g:17659:1: ( ruleIdentifier )
-            // InternalCompleteOCL.g:17660:1: ruleIdentifier
+            // InternalCompleteOCL.g:17811:1: ( ruleIdentifier )
+            // InternalCompleteOCL.g:17812:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());
@@ -51606,23 +52045,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__ReferredPropertyAssignment_0_0"
-    // InternalCompleteOCL.g:17669:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalCompleteOCL.g:17821:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ShadowPartCS__ReferredPropertyAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17673:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalCompleteOCL.g:17674:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17825:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalCompleteOCL.g:17826:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalCompleteOCL.g:17674:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:17675:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17826:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17827:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
             }
-            // InternalCompleteOCL.g:17676:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:17677:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:17828:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17829:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_0_1());
@@ -51663,23 +52102,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2"
-    // InternalCompleteOCL.g:17688:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
+    // InternalCompleteOCL.g:17840:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17692:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
-            // InternalCompleteOCL.g:17693:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalCompleteOCL.g:17844:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
+            // InternalCompleteOCL.g:17845:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
             {
-            // InternalCompleteOCL.g:17693:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
-            // InternalCompleteOCL.g:17694:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalCompleteOCL.g:17845:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalCompleteOCL.g:17846:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_0_2_0());
             }
-            // InternalCompleteOCL.g:17695:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
-            // InternalCompleteOCL.g:17695:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
+            // InternalCompleteOCL.g:17847:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalCompleteOCL.g:17847:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0();
@@ -51714,17 +52153,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_1"
-    // InternalCompleteOCL.g:17704:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
+    // InternalCompleteOCL.g:17856:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17708:1: ( ( ruleStringLiteralExpCS ) )
-            // InternalCompleteOCL.g:17709:1: ( ruleStringLiteralExpCS )
+            // InternalCompleteOCL.g:17860:1: ( ( ruleStringLiteralExpCS ) )
+            // InternalCompleteOCL.g:17861:1: ( ruleStringLiteralExpCS )
             {
-            // InternalCompleteOCL.g:17709:1: ( ruleStringLiteralExpCS )
-            // InternalCompleteOCL.g:17710:1: ruleStringLiteralExpCS
+            // InternalCompleteOCL.g:17861:1: ( ruleStringLiteralExpCS )
+            // InternalCompleteOCL.g:17862:1: ruleStringLiteralExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());
@@ -51759,17 +52198,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__PatternVariableNameAssignment_0"
-    // InternalCompleteOCL.g:17719:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:17871:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PatternExpCS__PatternVariableNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17723:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:17724:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17875:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:17876:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:17724:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:17725:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:17876:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:17877:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());
@@ -51804,17 +52243,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__OwnedPatternTypeAssignment_2"
-    // InternalCompleteOCL.g:17734:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:17886:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__PatternExpCS__OwnedPatternTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17738:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17739:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17890:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:17891:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17739:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17740:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:17891:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:17892:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());
@@ -51849,17 +52288,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2"
-    // InternalCompleteOCL.g:17749:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:17901:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
     public final void rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17753:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17754:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17905:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:17906:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17754:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17755:1: ruleExpCS
+            // InternalCompleteOCL.g:17906:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17907:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());
@@ -51894,17 +52333,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalCompleteOCL.g:17764:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
+    // InternalCompleteOCL.g:17916:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
     public final void rule__MapLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17768:1: ( ( ruleMapTypeCS ) )
-            // InternalCompleteOCL.g:17769:1: ( ruleMapTypeCS )
+            // InternalCompleteOCL.g:17920:1: ( ( ruleMapTypeCS ) )
+            // InternalCompleteOCL.g:17921:1: ( ruleMapTypeCS )
             {
-            // InternalCompleteOCL.g:17769:1: ( ruleMapTypeCS )
-            // InternalCompleteOCL.g:17770:1: ruleMapTypeCS
+            // InternalCompleteOCL.g:17921:1: ( ruleMapTypeCS )
+            // InternalCompleteOCL.g:17922:1: ruleMapTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());
@@ -51939,17 +52378,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalCompleteOCL.g:17779:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
+    // InternalCompleteOCL.g:17931:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17783:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalCompleteOCL.g:17784:1: ( ruleMapLiteralPartCS )
+            // InternalCompleteOCL.g:17935:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalCompleteOCL.g:17936:1: ( ruleMapLiteralPartCS )
             {
-            // InternalCompleteOCL.g:17784:1: ( ruleMapLiteralPartCS )
-            // InternalCompleteOCL.g:17785:1: ruleMapLiteralPartCS
+            // InternalCompleteOCL.g:17936:1: ( ruleMapLiteralPartCS )
+            // InternalCompleteOCL.g:17937:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());
@@ -51984,17 +52423,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalCompleteOCL.g:17794:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
+    // InternalCompleteOCL.g:17946:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17798:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalCompleteOCL.g:17799:1: ( ruleMapLiteralPartCS )
+            // InternalCompleteOCL.g:17950:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalCompleteOCL.g:17951:1: ( ruleMapLiteralPartCS )
             {
-            // InternalCompleteOCL.g:17799:1: ( ruleMapLiteralPartCS )
-            // InternalCompleteOCL.g:17800:1: ruleMapLiteralPartCS
+            // InternalCompleteOCL.g:17951:1: ( ruleMapLiteralPartCS )
+            // InternalCompleteOCL.g:17952:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());
@@ -52029,17 +52468,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedKeyAssignment_0"
-    // InternalCompleteOCL.g:17809:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:17961:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedKeyAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17813:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17814:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17965:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:17966:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17814:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17815:1: ruleExpCS
+            // InternalCompleteOCL.g:17966:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17967:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());
@@ -52074,17 +52513,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedValueAssignment_2"
-    // InternalCompleteOCL.g:17824:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:17976:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17828:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17829:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17980:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:17981:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17829:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17830:1: ruleExpCS
+            // InternalCompleteOCL.g:17981:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:17982:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());
@@ -52119,17 +52558,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_2"
-    // InternalCompleteOCL.g:17839:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
+    // InternalCompleteOCL.g:17991:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17843:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalCompleteOCL.g:17844:1: ( ruleTupleLiteralPartCS )
+            // InternalCompleteOCL.g:17995:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalCompleteOCL.g:17996:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalCompleteOCL.g:17844:1: ( ruleTupleLiteralPartCS )
-            // InternalCompleteOCL.g:17845:1: ruleTupleLiteralPartCS
+            // InternalCompleteOCL.g:17996:1: ( ruleTupleLiteralPartCS )
+            // InternalCompleteOCL.g:17997:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());
@@ -52164,17 +52603,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1"
-    // InternalCompleteOCL.g:17854:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
+    // InternalCompleteOCL.g:18006:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17858:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalCompleteOCL.g:17859:1: ( ruleTupleLiteralPartCS )
+            // InternalCompleteOCL.g:18010:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalCompleteOCL.g:18011:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalCompleteOCL.g:17859:1: ( ruleTupleLiteralPartCS )
-            // InternalCompleteOCL.g:17860:1: ruleTupleLiteralPartCS
+            // InternalCompleteOCL.g:18011:1: ( ruleTupleLiteralPartCS )
+            // InternalCompleteOCL.g:18012:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());
@@ -52209,17 +52648,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__NameAssignment_0"
-    // InternalCompleteOCL.g:17869:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:18021:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TupleLiteralPartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17873:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:17874:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:18025:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:18026:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:17874:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:17875:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:18026:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:18027:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -52254,17 +52693,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1"
-    // InternalCompleteOCL.g:17884:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18036:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17888:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:17889:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18040:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18041:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:17889:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:17890:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18041:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18042:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -52299,17 +52738,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3"
-    // InternalCompleteOCL.g:17899:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18051:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17903:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:17904:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18055:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18056:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:17904:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:17905:1: ruleExpCS
+            // InternalCompleteOCL.g:18056:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18057:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());
@@ -52344,17 +52783,17 @@
 
 
     // $ANTLR start "rule__NumberLiteralExpCS__SymbolAssignment"
-    // InternalCompleteOCL.g:17914:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
+    // InternalCompleteOCL.g:18066:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
     public final void rule__NumberLiteralExpCS__SymbolAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17918:1: ( ( ruleNUMBER_LITERAL ) )
-            // InternalCompleteOCL.g:17919:1: ( ruleNUMBER_LITERAL )
+            // InternalCompleteOCL.g:18070:1: ( ( ruleNUMBER_LITERAL ) )
+            // InternalCompleteOCL.g:18071:1: ( ruleNUMBER_LITERAL )
             {
-            // InternalCompleteOCL.g:17919:1: ( ruleNUMBER_LITERAL )
-            // InternalCompleteOCL.g:17920:1: ruleNUMBER_LITERAL
+            // InternalCompleteOCL.g:18071:1: ( ruleNUMBER_LITERAL )
+            // InternalCompleteOCL.g:18072:1: ruleNUMBER_LITERAL
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());
@@ -52389,17 +52828,17 @@
 
 
     // $ANTLR start "rule__StringLiteralExpCS__SegmentsAssignment"
-    // InternalCompleteOCL.g:17929:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
+    // InternalCompleteOCL.g:18081:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
     public final void rule__StringLiteralExpCS__SegmentsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17933:1: ( ( ruleStringLiteral ) )
-            // InternalCompleteOCL.g:17934:1: ( ruleStringLiteral )
+            // InternalCompleteOCL.g:18085:1: ( ( ruleStringLiteral ) )
+            // InternalCompleteOCL.g:18086:1: ( ruleStringLiteral )
             {
-            // InternalCompleteOCL.g:17934:1: ( ruleStringLiteral )
-            // InternalCompleteOCL.g:17935:1: ruleStringLiteral
+            // InternalCompleteOCL.g:18086:1: ( ruleStringLiteral )
+            // InternalCompleteOCL.g:18087:1: ruleStringLiteral
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());
@@ -52434,23 +52873,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_0"
-    // InternalCompleteOCL.g:17944:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
+    // InternalCompleteOCL.g:18096:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17948:1: ( ( ( 'true' ) ) )
-            // InternalCompleteOCL.g:17949:1: ( ( 'true' ) )
+            // InternalCompleteOCL.g:18100:1: ( ( ( 'true' ) ) )
+            // InternalCompleteOCL.g:18101:1: ( ( 'true' ) )
             {
-            // InternalCompleteOCL.g:17949:1: ( ( 'true' ) )
-            // InternalCompleteOCL.g:17950:1: ( 'true' )
+            // InternalCompleteOCL.g:18101:1: ( ( 'true' ) )
+            // InternalCompleteOCL.g:18102:1: ( 'true' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
             }
-            // InternalCompleteOCL.g:17951:1: ( 'true' )
-            // InternalCompleteOCL.g:17952:1: 'true'
+            // InternalCompleteOCL.g:18103:1: ( 'true' )
+            // InternalCompleteOCL.g:18104:1: 'true'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
@@ -52487,23 +52926,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_1"
-    // InternalCompleteOCL.g:17967:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
+    // InternalCompleteOCL.g:18119:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17971:1: ( ( ( 'false' ) ) )
-            // InternalCompleteOCL.g:17972:1: ( ( 'false' ) )
+            // InternalCompleteOCL.g:18123:1: ( ( ( 'false' ) ) )
+            // InternalCompleteOCL.g:18124:1: ( ( 'false' ) )
             {
-            // InternalCompleteOCL.g:17972:1: ( ( 'false' ) )
-            // InternalCompleteOCL.g:17973:1: ( 'false' )
+            // InternalCompleteOCL.g:18124:1: ( ( 'false' ) )
+            // InternalCompleteOCL.g:18125:1: ( 'false' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
             }
-            // InternalCompleteOCL.g:17974:1: ( 'false' )
-            // InternalCompleteOCL.g:17975:1: 'false'
+            // InternalCompleteOCL.g:18126:1: ( 'false' )
+            // InternalCompleteOCL.g:18127:1: 'false'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
@@ -52540,17 +52979,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1"
-    // InternalCompleteOCL.g:17990:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalCompleteOCL.g:18142:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:17994:1: ( ( ruleMultiplicityCS ) )
-            // InternalCompleteOCL.g:17995:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:18146:1: ( ( ruleMultiplicityCS ) )
+            // InternalCompleteOCL.g:18147:1: ( ruleMultiplicityCS )
             {
-            // InternalCompleteOCL.g:17995:1: ( ruleMultiplicityCS )
-            // InternalCompleteOCL.g:17996:1: ruleMultiplicityCS
+            // InternalCompleteOCL.g:18147:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:18148:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -52585,17 +53024,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralExpCS__OwnedTypeAssignment"
-    // InternalCompleteOCL.g:18005:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
+    // InternalCompleteOCL.g:18157:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
     public final void rule__TypeLiteralExpCS__OwnedTypeAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18009:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
-            // InternalCompleteOCL.g:18010:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalCompleteOCL.g:18161:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
+            // InternalCompleteOCL.g:18162:1: ( ruleTypeLiteralWithMultiplicityCS )
             {
-            // InternalCompleteOCL.g:18010:1: ( ruleTypeLiteralWithMultiplicityCS )
-            // InternalCompleteOCL.g:18011:1: ruleTypeLiteralWithMultiplicityCS
+            // InternalCompleteOCL.g:18162:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalCompleteOCL.g:18163:1: ruleTypeLiteralWithMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());
@@ -52630,17 +53069,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPathNameAssignment_0"
-    // InternalCompleteOCL.g:18020:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:18172:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypeNameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18024:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:18025:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:18176:1: ( ( rulePathNameCS ) )
+            // InternalCompleteOCL.g:18177:1: ( rulePathNameCS )
             {
-            // InternalCompleteOCL.g:18025:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:18026:1: rulePathNameCS
+            // InternalCompleteOCL.g:18177:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:18178:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -52675,17 +53114,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0"
-    // InternalCompleteOCL.g:18035:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalCompleteOCL.g:18187:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18039:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalCompleteOCL.g:18040:1: ( ruleCurlyBracketedClauseCS )
+            // InternalCompleteOCL.g:18191:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalCompleteOCL.g:18192:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalCompleteOCL.g:18040:1: ( ruleCurlyBracketedClauseCS )
-            // InternalCompleteOCL.g:18041:1: ruleCurlyBracketedClauseCS
+            // InternalCompleteOCL.g:18192:1: ( ruleCurlyBracketedClauseCS )
+            // InternalCompleteOCL.g:18193:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());
@@ -52720,17 +53159,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1"
-    // InternalCompleteOCL.g:18050:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18202:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
     public final void rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18054:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18055:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18206:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18207:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18055:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18056:1: ruleExpCS
+            // InternalCompleteOCL.g:18207:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18208:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());
@@ -52765,17 +53204,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__OwnedMultiplicityAssignment_1"
-    // InternalCompleteOCL.g:18065:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalCompleteOCL.g:18217:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeExpCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18069:1: ( ( ruleMultiplicityCS ) )
-            // InternalCompleteOCL.g:18070:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:18221:1: ( ( ruleMultiplicityCS ) )
+            // InternalCompleteOCL.g:18222:1: ( ruleMultiplicityCS )
             {
-            // InternalCompleteOCL.g:18070:1: ( ruleMultiplicityCS )
-            // InternalCompleteOCL.g:18071:1: ruleMultiplicityCS
+            // InternalCompleteOCL.g:18222:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:18223:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -52810,17 +53249,17 @@
 
 
     // $ANTLR start "rule__ExpCS__NameAssignment_0_1_1"
-    // InternalCompleteOCL.g:18080:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
+    // InternalCompleteOCL.g:18232:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
     public final void rule__ExpCS__NameAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18084:1: ( ( ruleBinaryOperatorName ) )
-            // InternalCompleteOCL.g:18085:1: ( ruleBinaryOperatorName )
+            // InternalCompleteOCL.g:18236:1: ( ( ruleBinaryOperatorName ) )
+            // InternalCompleteOCL.g:18237:1: ( ruleBinaryOperatorName )
             {
-            // InternalCompleteOCL.g:18085:1: ( ruleBinaryOperatorName )
-            // InternalCompleteOCL.g:18086:1: ruleBinaryOperatorName
+            // InternalCompleteOCL.g:18237:1: ( ruleBinaryOperatorName )
+            // InternalCompleteOCL.g:18238:1: ruleBinaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());
@@ -52855,17 +53294,17 @@
 
 
     // $ANTLR start "rule__ExpCS__OwnedRightAssignment_0_1_2"
-    // InternalCompleteOCL.g:18095:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18247:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
     public final void rule__ExpCS__OwnedRightAssignment_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18099:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18100:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18251:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18252:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18100:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18101:1: ruleExpCS
+            // InternalCompleteOCL.g:18252:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18253:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());
@@ -52900,17 +53339,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__NameAssignment_0_1"
-    // InternalCompleteOCL.g:18110:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalCompleteOCL.g:18262:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedLetExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18114:1: ( ( ruleUnaryOperatorName ) )
-            // InternalCompleteOCL.g:18115:1: ( ruleUnaryOperatorName )
+            // InternalCompleteOCL.g:18266:1: ( ( ruleUnaryOperatorName ) )
+            // InternalCompleteOCL.g:18267:1: ( ruleUnaryOperatorName )
             {
-            // InternalCompleteOCL.g:18115:1: ( ruleUnaryOperatorName )
-            // InternalCompleteOCL.g:18116:1: ruleUnaryOperatorName
+            // InternalCompleteOCL.g:18267:1: ( ruleUnaryOperatorName )
+            // InternalCompleteOCL.g:18268:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -52945,17 +53384,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__OwnedRightAssignment_0_2"
-    // InternalCompleteOCL.g:18125:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
+    // InternalCompleteOCL.g:18277:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
     public final void rule__PrefixedLetExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18129:1: ( ( rulePrefixedLetExpCS ) )
-            // InternalCompleteOCL.g:18130:1: ( rulePrefixedLetExpCS )
+            // InternalCompleteOCL.g:18281:1: ( ( rulePrefixedLetExpCS ) )
+            // InternalCompleteOCL.g:18282:1: ( rulePrefixedLetExpCS )
             {
-            // InternalCompleteOCL.g:18130:1: ( rulePrefixedLetExpCS )
-            // InternalCompleteOCL.g:18131:1: rulePrefixedLetExpCS
+            // InternalCompleteOCL.g:18282:1: ( rulePrefixedLetExpCS )
+            // InternalCompleteOCL.g:18283:1: rulePrefixedLetExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());
@@ -52990,17 +53429,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__NameAssignment_0_1"
-    // InternalCompleteOCL.g:18140:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalCompleteOCL.g:18292:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedPrimaryExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18144:1: ( ( ruleUnaryOperatorName ) )
-            // InternalCompleteOCL.g:18145:1: ( ruleUnaryOperatorName )
+            // InternalCompleteOCL.g:18296:1: ( ( ruleUnaryOperatorName ) )
+            // InternalCompleteOCL.g:18297:1: ( ruleUnaryOperatorName )
             {
-            // InternalCompleteOCL.g:18145:1: ( ruleUnaryOperatorName )
-            // InternalCompleteOCL.g:18146:1: ruleUnaryOperatorName
+            // InternalCompleteOCL.g:18297:1: ( ruleUnaryOperatorName )
+            // InternalCompleteOCL.g:18298:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -53035,17 +53474,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2"
-    // InternalCompleteOCL.g:18155:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalCompleteOCL.g:18307:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18159:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalCompleteOCL.g:18160:1: ( rulePrefixedPrimaryExpCS )
+            // InternalCompleteOCL.g:18311:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalCompleteOCL.g:18312:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalCompleteOCL.g:18160:1: ( rulePrefixedPrimaryExpCS )
-            // InternalCompleteOCL.g:18161:1: rulePrefixedPrimaryExpCS
+            // InternalCompleteOCL.g:18312:1: ( rulePrefixedPrimaryExpCS )
+            // InternalCompleteOCL.g:18313:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());
@@ -53080,17 +53519,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedPathNameAssignment_0"
-    // InternalCompleteOCL.g:18170:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:18322:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__NameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18174:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:18175:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:18326:1: ( ( rulePathNameCS ) )
+            // InternalCompleteOCL.g:18327:1: ( rulePathNameCS )
             {
-            // InternalCompleteOCL.g:18175:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:18176:1: rulePathNameCS
+            // InternalCompleteOCL.g:18327:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:18328:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -53125,17 +53564,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1"
-    // InternalCompleteOCL.g:18185:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
+    // InternalCompleteOCL.g:18337:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18189:1: ( ( ruleSquareBracketedClauseCS ) )
-            // InternalCompleteOCL.g:18190:1: ( ruleSquareBracketedClauseCS )
+            // InternalCompleteOCL.g:18341:1: ( ( ruleSquareBracketedClauseCS ) )
+            // InternalCompleteOCL.g:18342:1: ( ruleSquareBracketedClauseCS )
             {
-            // InternalCompleteOCL.g:18190:1: ( ruleSquareBracketedClauseCS )
-            // InternalCompleteOCL.g:18191:1: ruleSquareBracketedClauseCS
+            // InternalCompleteOCL.g:18342:1: ( ruleSquareBracketedClauseCS )
+            // InternalCompleteOCL.g:18343:1: ruleSquareBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
@@ -53170,17 +53609,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2"
-    // InternalCompleteOCL.g:18200:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalCompleteOCL.g:18352:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18204:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalCompleteOCL.g:18205:1: ( ruleRoundBracketedClauseCS )
+            // InternalCompleteOCL.g:18356:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalCompleteOCL.g:18357:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalCompleteOCL.g:18205:1: ( ruleRoundBracketedClauseCS )
-            // InternalCompleteOCL.g:18206:1: ruleRoundBracketedClauseCS
+            // InternalCompleteOCL.g:18357:1: ( ruleRoundBracketedClauseCS )
+            // InternalCompleteOCL.g:18358:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
@@ -53215,17 +53654,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3"
-    // InternalCompleteOCL.g:18215:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalCompleteOCL.g:18367:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18219:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalCompleteOCL.g:18220:1: ( ruleCurlyBracketedClauseCS )
+            // InternalCompleteOCL.g:18371:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalCompleteOCL.g:18372:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalCompleteOCL.g:18220:1: ( ruleCurlyBracketedClauseCS )
-            // InternalCompleteOCL.g:18221:1: ruleCurlyBracketedClauseCS
+            // InternalCompleteOCL.g:18372:1: ( ruleCurlyBracketedClauseCS )
+            // InternalCompleteOCL.g:18373:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
@@ -53260,23 +53699,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__IsPreAssignment_4_0"
-    // InternalCompleteOCL.g:18230:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
+    // InternalCompleteOCL.g:18382:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
     public final void rule__NameExpCS__IsPreAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18234:1: ( ( ( '@' ) ) )
-            // InternalCompleteOCL.g:18235:1: ( ( '@' ) )
+            // InternalCompleteOCL.g:18386:1: ( ( ( '@' ) ) )
+            // InternalCompleteOCL.g:18387:1: ( ( '@' ) )
             {
-            // InternalCompleteOCL.g:18235:1: ( ( '@' ) )
-            // InternalCompleteOCL.g:18236:1: ( '@' )
+            // InternalCompleteOCL.g:18387:1: ( ( '@' ) )
+            // InternalCompleteOCL.g:18388:1: ( '@' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
             }
-            // InternalCompleteOCL.g:18237:1: ( '@' )
-            // InternalCompleteOCL.g:18238:1: '@'
+            // InternalCompleteOCL.g:18389:1: ( '@' )
+            // InternalCompleteOCL.g:18390:1: '@'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
@@ -53313,17 +53752,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0"
-    // InternalCompleteOCL.g:18253:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
+    // InternalCompleteOCL.g:18405:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18257:1: ( ( ruleShadowPartCS ) )
-            // InternalCompleteOCL.g:18258:1: ( ruleShadowPartCS )
+            // InternalCompleteOCL.g:18409:1: ( ( ruleShadowPartCS ) )
+            // InternalCompleteOCL.g:18410:1: ( ruleShadowPartCS )
             {
-            // InternalCompleteOCL.g:18258:1: ( ruleShadowPartCS )
-            // InternalCompleteOCL.g:18259:1: ruleShadowPartCS
+            // InternalCompleteOCL.g:18410:1: ( ruleShadowPartCS )
+            // InternalCompleteOCL.g:18411:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());
@@ -53358,17 +53797,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1"
-    // InternalCompleteOCL.g:18268:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
+    // InternalCompleteOCL.g:18420:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18272:1: ( ( ruleShadowPartCS ) )
-            // InternalCompleteOCL.g:18273:1: ( ruleShadowPartCS )
+            // InternalCompleteOCL.g:18424:1: ( ( ruleShadowPartCS ) )
+            // InternalCompleteOCL.g:18425:1: ( ruleShadowPartCS )
             {
-            // InternalCompleteOCL.g:18273:1: ( ruleShadowPartCS )
-            // InternalCompleteOCL.g:18274:1: ruleShadowPartCS
+            // InternalCompleteOCL.g:18425:1: ( ruleShadowPartCS )
+            // InternalCompleteOCL.g:18426:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());
@@ -53403,17 +53842,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0"
-    // InternalCompleteOCL.g:18283:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
+    // InternalCompleteOCL.g:18435:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18287:1: ( ( ruleNavigatingArgCS ) )
-            // InternalCompleteOCL.g:18288:1: ( ruleNavigatingArgCS )
+            // InternalCompleteOCL.g:18439:1: ( ( ruleNavigatingArgCS ) )
+            // InternalCompleteOCL.g:18440:1: ( ruleNavigatingArgCS )
             {
-            // InternalCompleteOCL.g:18288:1: ( ruleNavigatingArgCS )
-            // InternalCompleteOCL.g:18289:1: ruleNavigatingArgCS
+            // InternalCompleteOCL.g:18440:1: ( ruleNavigatingArgCS )
+            // InternalCompleteOCL.g:18441:1: ruleNavigatingArgCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
@@ -53448,23 +53887,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1"
-    // InternalCompleteOCL.g:18298:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
+    // InternalCompleteOCL.g:18450:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18302:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
-            // InternalCompleteOCL.g:18303:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalCompleteOCL.g:18454:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
+            // InternalCompleteOCL.g:18455:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
             {
-            // InternalCompleteOCL.g:18303:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
-            // InternalCompleteOCL.g:18304:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalCompleteOCL.g:18455:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalCompleteOCL.g:18456:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAlternatives_2_1_0());
             }
-            // InternalCompleteOCL.g:18305:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
-            // InternalCompleteOCL.g:18305:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
+            // InternalCompleteOCL.g:18457:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalCompleteOCL.g:18457:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0();
@@ -53499,17 +53938,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_1"
-    // InternalCompleteOCL.g:18314:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18466:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18318:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18319:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18470:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18471:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18319:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18320:1: ruleExpCS
+            // InternalCompleteOCL.g:18471:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18472:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
@@ -53544,17 +53983,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1"
-    // InternalCompleteOCL.g:18329:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18481:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18333:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18334:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18485:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18486:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18334:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18335:1: ruleExpCS
+            // InternalCompleteOCL.g:18486:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18487:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
@@ -53589,17 +54028,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0"
-    // InternalCompleteOCL.g:18344:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
+    // InternalCompleteOCL.g:18496:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18348:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalCompleteOCL.g:18349:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18500:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalCompleteOCL.g:18501:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalCompleteOCL.g:18349:1: ( ruleNavigatingArgExpCS )
-            // InternalCompleteOCL.g:18350:1: ruleNavigatingArgExpCS
+            // InternalCompleteOCL.g:18501:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18502:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
@@ -53634,17 +54073,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1"
-    // InternalCompleteOCL.g:18359:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalCompleteOCL.g:18511:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18363:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalCompleteOCL.g:18364:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18515:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalCompleteOCL.g:18516:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalCompleteOCL.g:18364:1: ( ruleCoIteratorVariableCS )
-            // InternalCompleteOCL.g:18365:1: ruleCoIteratorVariableCS
+            // InternalCompleteOCL.g:18516:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18517:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
@@ -53679,17 +54118,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"
-    // InternalCompleteOCL.g:18374:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18526:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18378:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18379:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18530:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18531:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18379:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18380:1: ruleExpCS
+            // InternalCompleteOCL.g:18531:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18532:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());
@@ -53724,17 +54163,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1"
-    // InternalCompleteOCL.g:18389:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18541:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18393:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18394:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18545:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18546:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18394:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18395:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18546:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18547:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
@@ -53769,17 +54208,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1"
-    // InternalCompleteOCL.g:18404:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalCompleteOCL.g:18556:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18408:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalCompleteOCL.g:18409:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18560:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalCompleteOCL.g:18561:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalCompleteOCL.g:18409:1: ( ruleCoIteratorVariableCS )
-            // InternalCompleteOCL.g:18410:1: ruleCoIteratorVariableCS
+            // InternalCompleteOCL.g:18561:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18562:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
@@ -53814,17 +54253,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1"
-    // InternalCompleteOCL.g:18419:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18571:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18423:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18424:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18575:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18576:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18424:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18425:1: ruleExpCS
+            // InternalCompleteOCL.g:18576:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18577:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());
@@ -53859,17 +54298,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1"
-    // InternalCompleteOCL.g:18434:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18586:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18438:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18439:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18590:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18591:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18439:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18440:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18591:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18592:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
@@ -53904,17 +54343,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1"
-    // InternalCompleteOCL.g:18449:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalCompleteOCL.g:18601:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18453:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalCompleteOCL.g:18454:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18605:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalCompleteOCL.g:18606:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalCompleteOCL.g:18454:1: ( ruleCoIteratorVariableCS )
-            // InternalCompleteOCL.g:18455:1: ruleCoIteratorVariableCS
+            // InternalCompleteOCL.g:18606:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18607:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
@@ -53949,17 +54388,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3"
-    // InternalCompleteOCL.g:18464:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18616:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18468:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18469:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18620:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18621:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18469:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18470:1: ruleExpCS
+            // InternalCompleteOCL.g:18621:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18622:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());
@@ -53994,17 +54433,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_1_1"
-    // InternalCompleteOCL.g:18479:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18631:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18483:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18484:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18635:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18636:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18484:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18485:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18636:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18637:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -54039,23 +54478,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__PrefixAssignment_0"
-    // InternalCompleteOCL.g:18494:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
+    // InternalCompleteOCL.g:18646:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
     public final void rule__NavigatingBarArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18498:1: ( ( ( '|' ) ) )
-            // InternalCompleteOCL.g:18499:1: ( ( '|' ) )
+            // InternalCompleteOCL.g:18650:1: ( ( ( '|' ) ) )
+            // InternalCompleteOCL.g:18651:1: ( ( '|' ) )
             {
-            // InternalCompleteOCL.g:18499:1: ( ( '|' ) )
-            // InternalCompleteOCL.g:18500:1: ( '|' )
+            // InternalCompleteOCL.g:18651:1: ( ( '|' ) )
+            // InternalCompleteOCL.g:18652:1: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
             }
-            // InternalCompleteOCL.g:18501:1: ( '|' )
-            // InternalCompleteOCL.g:18502:1: '|'
+            // InternalCompleteOCL.g:18653:1: ( '|' )
+            // InternalCompleteOCL.g:18654:1: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
@@ -54092,17 +54531,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1"
-    // InternalCompleteOCL.g:18517:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalCompleteOCL.g:18669:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18521:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalCompleteOCL.g:18522:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18673:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalCompleteOCL.g:18674:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalCompleteOCL.g:18522:1: ( ruleNavigatingArgExpCS )
-            // InternalCompleteOCL.g:18523:1: ruleNavigatingArgExpCS
+            // InternalCompleteOCL.g:18674:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18675:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -54137,17 +54576,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1"
-    // InternalCompleteOCL.g:18532:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18684:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18536:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18537:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18688:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18689:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18537:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18538:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18689:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18690:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -54182,17 +54621,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalCompleteOCL.g:18547:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18699:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18551:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18552:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18703:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18704:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18552:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18553:1: ruleExpCS
+            // InternalCompleteOCL.g:18704:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18705:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -54227,23 +54666,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__PrefixAssignment_0"
-    // InternalCompleteOCL.g:18562:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
+    // InternalCompleteOCL.g:18714:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
     public final void rule__NavigatingCommaArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18566:1: ( ( ( ',' ) ) )
-            // InternalCompleteOCL.g:18567:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:18718:1: ( ( ( ',' ) ) )
+            // InternalCompleteOCL.g:18719:1: ( ( ',' ) )
             {
-            // InternalCompleteOCL.g:18567:1: ( ( ',' ) )
-            // InternalCompleteOCL.g:18568:1: ( ',' )
+            // InternalCompleteOCL.g:18719:1: ( ( ',' ) )
+            // InternalCompleteOCL.g:18720:1: ( ',' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
             }
-            // InternalCompleteOCL.g:18569:1: ( ',' )
-            // InternalCompleteOCL.g:18570:1: ','
+            // InternalCompleteOCL.g:18721:1: ( ',' )
+            // InternalCompleteOCL.g:18722:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
@@ -54280,17 +54719,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1"
-    // InternalCompleteOCL.g:18585:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalCompleteOCL.g:18737:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18589:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalCompleteOCL.g:18590:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18741:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalCompleteOCL.g:18742:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalCompleteOCL.g:18590:1: ( ruleNavigatingArgExpCS )
-            // InternalCompleteOCL.g:18591:1: ruleNavigatingArgExpCS
+            // InternalCompleteOCL.g:18742:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18743:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -54325,17 +54764,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1"
-    // InternalCompleteOCL.g:18600:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalCompleteOCL.g:18752:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18604:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalCompleteOCL.g:18605:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18756:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalCompleteOCL.g:18757:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalCompleteOCL.g:18605:1: ( ruleCoIteratorVariableCS )
-            // InternalCompleteOCL.g:18606:1: ruleCoIteratorVariableCS
+            // InternalCompleteOCL.g:18757:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18758:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
@@ -54370,17 +54809,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"
-    // InternalCompleteOCL.g:18615:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18767:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18619:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18620:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18771:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18772:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18620:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18621:1: ruleExpCS
+            // InternalCompleteOCL.g:18772:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18773:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());
@@ -54415,17 +54854,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1"
-    // InternalCompleteOCL.g:18630:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18782:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18634:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18635:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18786:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18787:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18635:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18636:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18787:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18788:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
@@ -54460,17 +54899,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1"
-    // InternalCompleteOCL.g:18645:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalCompleteOCL.g:18797:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18649:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalCompleteOCL.g:18650:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18801:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalCompleteOCL.g:18802:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalCompleteOCL.g:18650:1: ( ruleCoIteratorVariableCS )
-            // InternalCompleteOCL.g:18651:1: ruleCoIteratorVariableCS
+            // InternalCompleteOCL.g:18802:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18803:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
@@ -54505,17 +54944,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1"
-    // InternalCompleteOCL.g:18660:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18812:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18664:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18665:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18816:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18817:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18665:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18666:1: ruleExpCS
+            // InternalCompleteOCL.g:18817:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18818:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());
@@ -54550,17 +54989,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1"
-    // InternalCompleteOCL.g:18675:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18827:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18679:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18680:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18831:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18832:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18680:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18681:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18832:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18833:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
@@ -54595,17 +55034,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1"
-    // InternalCompleteOCL.g:18690:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalCompleteOCL.g:18842:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18694:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalCompleteOCL.g:18695:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18846:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalCompleteOCL.g:18847:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalCompleteOCL.g:18695:1: ( ruleCoIteratorVariableCS )
-            // InternalCompleteOCL.g:18696:1: ruleCoIteratorVariableCS
+            // InternalCompleteOCL.g:18847:1: ( ruleCoIteratorVariableCS )
+            // InternalCompleteOCL.g:18848:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
@@ -54640,17 +55079,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3"
-    // InternalCompleteOCL.g:18705:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18857:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18709:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18710:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18861:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18862:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18710:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18711:1: ruleExpCS
+            // InternalCompleteOCL.g:18862:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18863:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());
@@ -54685,23 +55124,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__PrefixAssignment_0"
-    // InternalCompleteOCL.g:18720:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
+    // InternalCompleteOCL.g:18872:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
     public final void rule__NavigatingSemiArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18724:1: ( ( ( ';' ) ) )
-            // InternalCompleteOCL.g:18725:1: ( ( ';' ) )
+            // InternalCompleteOCL.g:18876:1: ( ( ( ';' ) ) )
+            // InternalCompleteOCL.g:18877:1: ( ( ';' ) )
             {
-            // InternalCompleteOCL.g:18725:1: ( ( ';' ) )
-            // InternalCompleteOCL.g:18726:1: ( ';' )
+            // InternalCompleteOCL.g:18877:1: ( ( ';' ) )
+            // InternalCompleteOCL.g:18878:1: ( ';' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
             }
-            // InternalCompleteOCL.g:18727:1: ( ';' )
-            // InternalCompleteOCL.g:18728:1: ';'
+            // InternalCompleteOCL.g:18879:1: ( ';' )
+            // InternalCompleteOCL.g:18880:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
@@ -54738,17 +55177,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1"
-    // InternalCompleteOCL.g:18743:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalCompleteOCL.g:18895:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18747:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalCompleteOCL.g:18748:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18899:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalCompleteOCL.g:18900:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalCompleteOCL.g:18748:1: ( ruleNavigatingArgExpCS )
-            // InternalCompleteOCL.g:18749:1: ruleNavigatingArgExpCS
+            // InternalCompleteOCL.g:18900:1: ( ruleNavigatingArgExpCS )
+            // InternalCompleteOCL.g:18901:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -54783,17 +55222,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1"
-    // InternalCompleteOCL.g:18758:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18910:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18762:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18763:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18914:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18915:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18763:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18764:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18915:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18916:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -54828,17 +55267,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalCompleteOCL.g:18773:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18925:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18777:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18778:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18929:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18930:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18778:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18779:1: ruleExpCS
+            // InternalCompleteOCL.g:18930:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18931:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -54873,17 +55312,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__NameAssignment_0"
-    // InternalCompleteOCL.g:18788:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:18940:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__CoIteratorVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18792:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:18793:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:18944:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:18945:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:18793:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:18794:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:18945:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:18946:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -54918,17 +55357,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1"
-    // InternalCompleteOCL.g:18803:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:18955:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18807:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18808:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18959:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:18960:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18808:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18809:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:18960:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:18961:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -54963,23 +55402,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAssignment_1"
-    // InternalCompleteOCL.g:18818:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
+    // InternalCompleteOCL.g:18970:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
     public final void rule__IfExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18822:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
-            // InternalCompleteOCL.g:18823:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalCompleteOCL.g:18974:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
+            // InternalCompleteOCL.g:18975:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
             {
-            // InternalCompleteOCL.g:18823:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
-            // InternalCompleteOCL.g:18824:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalCompleteOCL.g:18975:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalCompleteOCL.g:18976:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
             }
-            // InternalCompleteOCL.g:18825:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
-            // InternalCompleteOCL.g:18825:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
+            // InternalCompleteOCL.g:18977:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalCompleteOCL.g:18977:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAlternatives_1_0();
@@ -55014,17 +55453,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedThenExpressionAssignment_3"
-    // InternalCompleteOCL.g:18834:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:18986:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18838:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18839:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18990:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:18991:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18839:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18840:1: ruleExpCS
+            // InternalCompleteOCL.g:18991:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:18992:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -55059,17 +55498,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedIfThenExpressionsAssignment_4"
-    // InternalCompleteOCL.g:18849:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
+    // InternalCompleteOCL.g:19001:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
     public final void rule__IfExpCS__OwnedIfThenExpressionsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18853:1: ( ( ruleElseIfThenExpCS ) )
-            // InternalCompleteOCL.g:18854:1: ( ruleElseIfThenExpCS )
+            // InternalCompleteOCL.g:19005:1: ( ( ruleElseIfThenExpCS ) )
+            // InternalCompleteOCL.g:19006:1: ( ruleElseIfThenExpCS )
             {
-            // InternalCompleteOCL.g:18854:1: ( ruleElseIfThenExpCS )
-            // InternalCompleteOCL.g:18855:1: ruleElseIfThenExpCS
+            // InternalCompleteOCL.g:19006:1: ( ruleElseIfThenExpCS )
+            // InternalCompleteOCL.g:19007:1: ruleElseIfThenExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
@@ -55104,17 +55543,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedElseExpressionAssignment_6"
-    // InternalCompleteOCL.g:18864:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:19016:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedElseExpressionAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18868:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18869:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19020:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:19021:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18869:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18870:1: ruleExpCS
+            // InternalCompleteOCL.g:19021:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19022:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
@@ -55149,17 +55588,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedConditionAssignment_1"
-    // InternalCompleteOCL.g:18879:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:19031:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18883:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18884:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19035:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:19036:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18884:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18885:1: ruleExpCS
+            // InternalCompleteOCL.g:19036:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19037:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
@@ -55194,17 +55633,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3"
-    // InternalCompleteOCL.g:18894:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:19046:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18898:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18899:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19050:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:19051:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18899:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18900:1: ruleExpCS
+            // InternalCompleteOCL.g:19051:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19052:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -55239,17 +55678,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_1"
-    // InternalCompleteOCL.g:18909:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
+    // InternalCompleteOCL.g:19061:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18913:1: ( ( ruleLetVariableCS ) )
-            // InternalCompleteOCL.g:18914:1: ( ruleLetVariableCS )
+            // InternalCompleteOCL.g:19065:1: ( ( ruleLetVariableCS ) )
+            // InternalCompleteOCL.g:19066:1: ( ruleLetVariableCS )
             {
-            // InternalCompleteOCL.g:18914:1: ( ruleLetVariableCS )
-            // InternalCompleteOCL.g:18915:1: ruleLetVariableCS
+            // InternalCompleteOCL.g:19066:1: ( ruleLetVariableCS )
+            // InternalCompleteOCL.g:19067:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
@@ -55284,17 +55723,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_2_1"
-    // InternalCompleteOCL.g:18924:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
+    // InternalCompleteOCL.g:19076:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18928:1: ( ( ruleLetVariableCS ) )
-            // InternalCompleteOCL.g:18929:1: ( ruleLetVariableCS )
+            // InternalCompleteOCL.g:19080:1: ( ( ruleLetVariableCS ) )
+            // InternalCompleteOCL.g:19081:1: ( ruleLetVariableCS )
             {
-            // InternalCompleteOCL.g:18929:1: ( ruleLetVariableCS )
-            // InternalCompleteOCL.g:18930:1: ruleLetVariableCS
+            // InternalCompleteOCL.g:19081:1: ( ruleLetVariableCS )
+            // InternalCompleteOCL.g:19082:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
@@ -55329,17 +55768,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedInExpressionAssignment_4"
-    // InternalCompleteOCL.g:18939:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:19091:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetExpCS__OwnedInExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18943:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:18944:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19095:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:19096:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:18944:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:18945:1: ruleExpCS
+            // InternalCompleteOCL.g:19096:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19097:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());
@@ -55374,17 +55813,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__NameAssignment_0"
-    // InternalCompleteOCL.g:18954:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:19106:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__LetVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18958:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:18959:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:19110:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:19111:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:18959:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:18960:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:19111:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:19112:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -55419,17 +55858,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1"
-    // InternalCompleteOCL.g:18969:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalCompleteOCL.g:19121:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18973:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalCompleteOCL.g:18974:1: ( ruleRoundBracketedClauseCS )
+            // InternalCompleteOCL.g:19125:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalCompleteOCL.g:19126:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalCompleteOCL.g:18974:1: ( ruleRoundBracketedClauseCS )
-            // InternalCompleteOCL.g:18975:1: ruleRoundBracketedClauseCS
+            // InternalCompleteOCL.g:19126:1: ( ruleRoundBracketedClauseCS )
+            // InternalCompleteOCL.g:19127:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());
@@ -55464,17 +55903,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedTypeAssignment_2_1"
-    // InternalCompleteOCL.g:18984:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalCompleteOCL.g:19136:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__LetVariableCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:18988:1: ( ( ruleTypeExpCS ) )
-            // InternalCompleteOCL.g:18989:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:19140:1: ( ( ruleTypeExpCS ) )
+            // InternalCompleteOCL.g:19141:1: ( ruleTypeExpCS )
             {
-            // InternalCompleteOCL.g:18989:1: ( ruleTypeExpCS )
-            // InternalCompleteOCL.g:18990:1: ruleTypeExpCS
+            // InternalCompleteOCL.g:19141:1: ( ruleTypeExpCS )
+            // InternalCompleteOCL.g:19142:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -55509,17 +55948,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedInitExpressionAssignment_4"
-    // InternalCompleteOCL.g:18999:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:19151:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetVariableCS__OwnedInitExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19003:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:19004:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19155:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:19156:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:19004:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:19005:1: ruleExpCS
+            // InternalCompleteOCL.g:19156:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19157:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());
@@ -55554,17 +55993,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__OwnedExpressionAssignment_1"
-    // InternalCompleteOCL.g:19014:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
+    // InternalCompleteOCL.g:19166:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__NestedExpCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19018:1: ( ( ruleExpCS ) )
-            // InternalCompleteOCL.g:19019:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19170:1: ( ( ruleExpCS ) )
+            // InternalCompleteOCL.g:19171:1: ( ruleExpCS )
             {
-            // InternalCompleteOCL.g:19019:1: ( ruleExpCS )
-            // InternalCompleteOCL.g:19020:1: ruleExpCS
+            // InternalCompleteOCL.g:19171:1: ( ruleExpCS )
+            // InternalCompleteOCL.g:19172:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());
@@ -55599,17 +56038,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"
-    // InternalCompleteOCL.g:19029:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
+    // InternalCompleteOCL.g:19181:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
     public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19033:1: ( ( ruleLOWER ) )
-            // InternalCompleteOCL.g:19034:1: ( ruleLOWER )
+            // InternalCompleteOCL.g:19185:1: ( ( ruleLOWER ) )
+            // InternalCompleteOCL.g:19186:1: ( ruleLOWER )
             {
-            // InternalCompleteOCL.g:19034:1: ( ruleLOWER )
-            // InternalCompleteOCL.g:19035:1: ruleLOWER
+            // InternalCompleteOCL.g:19186:1: ( ruleLOWER )
+            // InternalCompleteOCL.g:19187:1: ruleLOWER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
@@ -55644,17 +56083,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"
-    // InternalCompleteOCL.g:19044:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
+    // InternalCompleteOCL.g:19196:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
     public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19048:1: ( ( ruleUPPER ) )
-            // InternalCompleteOCL.g:19049:1: ( ruleUPPER )
+            // InternalCompleteOCL.g:19200:1: ( ( ruleUPPER ) )
+            // InternalCompleteOCL.g:19201:1: ( ruleUPPER )
             {
-            // InternalCompleteOCL.g:19049:1: ( ruleUPPER )
-            // InternalCompleteOCL.g:19050:1: ruleUPPER
+            // InternalCompleteOCL.g:19201:1: ( ruleUPPER )
+            // InternalCompleteOCL.g:19202:1: ruleUPPER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
@@ -55689,23 +56128,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__IsNullFreeAssignment_2_1"
-    // InternalCompleteOCL.g:19059:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
+    // InternalCompleteOCL.g:19211:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
     public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19063:1: ( ( ( '|1' ) ) )
-            // InternalCompleteOCL.g:19064:1: ( ( '|1' ) )
+            // InternalCompleteOCL.g:19215:1: ( ( ( '|1' ) ) )
+            // InternalCompleteOCL.g:19216:1: ( ( '|1' ) )
             {
-            // InternalCompleteOCL.g:19064:1: ( ( '|1' ) )
-            // InternalCompleteOCL.g:19065:1: ( '|1' )
+            // InternalCompleteOCL.g:19216:1: ( ( '|1' ) )
+            // InternalCompleteOCL.g:19217:1: ( '|1' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
             }
-            // InternalCompleteOCL.g:19066:1: ( '|1' )
-            // InternalCompleteOCL.g:19067:1: '|1'
+            // InternalCompleteOCL.g:19218:1: ( '|1' )
+            // InternalCompleteOCL.g:19219:1: '|1'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
@@ -55742,23 +56181,23 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAssignment"
-    // InternalCompleteOCL.g:19082:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
+    // InternalCompleteOCL.g:19234:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
     public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19086:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
-            // InternalCompleteOCL.g:19087:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalCompleteOCL.g:19238:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
+            // InternalCompleteOCL.g:19239:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
             {
-            // InternalCompleteOCL.g:19087:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
-            // InternalCompleteOCL.g:19088:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalCompleteOCL.g:19239:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalCompleteOCL.g:19240:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
             }
-            // InternalCompleteOCL.g:19089:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
-            // InternalCompleteOCL.g:19089:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
+            // InternalCompleteOCL.g:19241:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalCompleteOCL.g:19241:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityStringCS__StringBoundsAlternatives_0();
@@ -55793,17 +56232,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_0"
-    // InternalCompleteOCL.g:19098:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
+    // InternalCompleteOCL.g:19250:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19102:1: ( ( ruleFirstPathElementCS ) )
-            // InternalCompleteOCL.g:19103:1: ( ruleFirstPathElementCS )
+            // InternalCompleteOCL.g:19254:1: ( ( ruleFirstPathElementCS ) )
+            // InternalCompleteOCL.g:19255:1: ( ruleFirstPathElementCS )
             {
-            // InternalCompleteOCL.g:19103:1: ( ruleFirstPathElementCS )
-            // InternalCompleteOCL.g:19104:1: ruleFirstPathElementCS
+            // InternalCompleteOCL.g:19255:1: ( ruleFirstPathElementCS )
+            // InternalCompleteOCL.g:19256:1: ruleFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
@@ -55838,17 +56277,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalCompleteOCL.g:19113:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalCompleteOCL.g:19265:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19117:1: ( ( ruleNextPathElementCS ) )
-            // InternalCompleteOCL.g:19118:1: ( ruleNextPathElementCS )
+            // InternalCompleteOCL.g:19269:1: ( ( ruleNextPathElementCS ) )
+            // InternalCompleteOCL.g:19270:1: ( ruleNextPathElementCS )
             {
-            // InternalCompleteOCL.g:19118:1: ( ruleNextPathElementCS )
-            // InternalCompleteOCL.g:19119:1: ruleNextPathElementCS
+            // InternalCompleteOCL.g:19270:1: ( ruleNextPathElementCS )
+            // InternalCompleteOCL.g:19271:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -55882,24 +56321,114 @@
     // $ANTLR end "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
 
 
+    // $ANTLR start "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0"
+    // InternalCompleteOCL.g:19280:1: rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0 : ( ruleNextPathElementCS ) ;
+    public final void rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:19284:1: ( ( ruleNextPathElementCS ) )
+            // InternalCompleteOCL.g:19285:1: ( ruleNextPathElementCS )
+            {
+            // InternalCompleteOCL.g:19285:1: ( ruleNextPathElementCS )
+            // InternalCompleteOCL.g:19286:1: ruleNextPathElementCS
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_0_0());
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleNextPathElementCS();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_0_0());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0"
+
+
+    // $ANTLR start "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1"
+    // InternalCompleteOCL.g:19295:1: rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    public final void rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+
+        try {
+            // InternalCompleteOCL.g:19299:1: ( ( ruleNextPathElementCS ) )
+            // InternalCompleteOCL.g:19300:1: ( ruleNextPathElementCS )
+            {
+            // InternalCompleteOCL.g:19300:1: ( ruleNextPathElementCS )
+            // InternalCompleteOCL.g:19301:1: ruleNextPathElementCS
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleNextPathElementCS();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1"
+
+
     // $ANTLR start "rule__FirstPathElementCS__ReferredElementAssignment"
-    // InternalCompleteOCL.g:19128:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
+    // InternalCompleteOCL.g:19310:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19132:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalCompleteOCL.g:19133:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:19314:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalCompleteOCL.g:19315:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalCompleteOCL.g:19133:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:19134:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:19315:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:19316:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalCompleteOCL.g:19135:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:19136:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:19317:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:19318:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
@@ -55940,23 +56469,23 @@
 
 
     // $ANTLR start "rule__NextPathElementCS__ReferredElementAssignment"
-    // InternalCompleteOCL.g:19147:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
+    // InternalCompleteOCL.g:19329:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
     public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19151:1: ( ( ( ruleUnreservedName ) ) )
-            // InternalCompleteOCL.g:19152:1: ( ( ruleUnreservedName ) )
+            // InternalCompleteOCL.g:19333:1: ( ( ( ruleUnreservedName ) ) )
+            // InternalCompleteOCL.g:19334:1: ( ( ruleUnreservedName ) )
             {
-            // InternalCompleteOCL.g:19152:1: ( ( ruleUnreservedName ) )
-            // InternalCompleteOCL.g:19153:1: ( ruleUnreservedName )
+            // InternalCompleteOCL.g:19334:1: ( ( ruleUnreservedName ) )
+            // InternalCompleteOCL.g:19335:1: ( ruleUnreservedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalCompleteOCL.g:19154:1: ( ruleUnreservedName )
-            // InternalCompleteOCL.g:19155:1: ruleUnreservedName
+            // InternalCompleteOCL.g:19336:1: ( ruleUnreservedName )
+            // InternalCompleteOCL.g:19337:1: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
@@ -55997,17 +56526,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"
-    // InternalCompleteOCL.g:19166:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalCompleteOCL.g:19348:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19170:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalCompleteOCL.g:19171:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalCompleteOCL.g:19352:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalCompleteOCL.g:19353:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalCompleteOCL.g:19171:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalCompleteOCL.g:19172:1: ruleTemplateParameterSubstitutionCS
+            // InternalCompleteOCL.g:19353:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalCompleteOCL.g:19354:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
@@ -56042,17 +56571,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"
-    // InternalCompleteOCL.g:19181:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalCompleteOCL.g:19363:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19185:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalCompleteOCL.g:19186:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalCompleteOCL.g:19367:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalCompleteOCL.g:19368:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalCompleteOCL.g:19186:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalCompleteOCL.g:19187:1: ruleTemplateParameterSubstitutionCS
+            // InternalCompleteOCL.g:19368:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalCompleteOCL.g:19369:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
@@ -56087,17 +56616,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"
-    // InternalCompleteOCL.g:19196:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
+    // InternalCompleteOCL.g:19378:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
     public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19200:1: ( ( ruleMultiplicityCS ) )
-            // InternalCompleteOCL.g:19201:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:19382:1: ( ( ruleMultiplicityCS ) )
+            // InternalCompleteOCL.g:19383:1: ( ruleMultiplicityCS )
             {
-            // InternalCompleteOCL.g:19201:1: ( ruleMultiplicityCS )
-            // InternalCompleteOCL.g:19202:1: ruleMultiplicityCS
+            // InternalCompleteOCL.g:19383:1: ( ruleMultiplicityCS )
+            // InternalCompleteOCL.g:19384:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
@@ -56132,17 +56661,17 @@
 
 
     // $ANTLR start "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"
-    // InternalCompleteOCL.g:19211:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
+    // InternalCompleteOCL.g:19393:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
     public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19215:1: ( ( ruleTypeRefCS ) )
-            // InternalCompleteOCL.g:19216:1: ( ruleTypeRefCS )
+            // InternalCompleteOCL.g:19397:1: ( ( ruleTypeRefCS ) )
+            // InternalCompleteOCL.g:19398:1: ( ruleTypeRefCS )
             {
-            // InternalCompleteOCL.g:19216:1: ( ruleTypeRefCS )
-            // InternalCompleteOCL.g:19217:1: ruleTypeRefCS
+            // InternalCompleteOCL.g:19398:1: ( ruleTypeRefCS )
+            // InternalCompleteOCL.g:19399:1: ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
@@ -56177,17 +56706,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__NameAssignment_0"
-    // InternalCompleteOCL.g:19226:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalCompleteOCL.g:19408:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19230:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:19231:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:19412:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:19413:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:19231:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:19232:1: ruleUnrestrictedName
+            // InternalCompleteOCL.g:19413:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:19414:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -56222,17 +56751,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"
-    // InternalCompleteOCL.g:19241:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
+    // InternalCompleteOCL.g:19423:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19245:1: ( ( ruleTypedRefCS ) )
-            // InternalCompleteOCL.g:19246:1: ( ruleTypedRefCS )
+            // InternalCompleteOCL.g:19427:1: ( ( ruleTypedRefCS ) )
+            // InternalCompleteOCL.g:19428:1: ( ruleTypedRefCS )
             {
-            // InternalCompleteOCL.g:19246:1: ( ruleTypedRefCS )
-            // InternalCompleteOCL.g:19247:1: ruleTypedRefCS
+            // InternalCompleteOCL.g:19428:1: ( ruleTypedRefCS )
+            // InternalCompleteOCL.g:19429:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
@@ -56267,17 +56796,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"
-    // InternalCompleteOCL.g:19256:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
+    // InternalCompleteOCL.g:19438:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19260:1: ( ( ruleTypedRefCS ) )
-            // InternalCompleteOCL.g:19261:1: ( ruleTypedRefCS )
+            // InternalCompleteOCL.g:19442:1: ( ( ruleTypedRefCS ) )
+            // InternalCompleteOCL.g:19443:1: ( ruleTypedRefCS )
             {
-            // InternalCompleteOCL.g:19261:1: ( ruleTypedRefCS )
-            // InternalCompleteOCL.g:19262:1: ruleTypedRefCS
+            // InternalCompleteOCL.g:19443:1: ( ruleTypedRefCS )
+            // InternalCompleteOCL.g:19444:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
@@ -56312,17 +56841,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_0"
-    // InternalCompleteOCL.g:19271:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalCompleteOCL.g:19453:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19275:1: ( ( rulePathNameCS ) )
-            // InternalCompleteOCL.g:19276:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:19457:1: ( ( rulePathNameCS ) )
+            // InternalCompleteOCL.g:19458:1: ( rulePathNameCS )
             {
-            // InternalCompleteOCL.g:19276:1: ( rulePathNameCS )
-            // InternalCompleteOCL.g:19277:1: rulePathNameCS
+            // InternalCompleteOCL.g:19458:1: ( rulePathNameCS )
+            // InternalCompleteOCL.g:19459:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -56357,17 +56886,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1"
-    // InternalCompleteOCL.g:19286:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 : ( ruleTemplateBindingCS ) ;
+    // InternalCompleteOCL.g:19468:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 : ( ruleTemplateBindingCS ) ;
     public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19290:1: ( ( ruleTemplateBindingCS ) )
-            // InternalCompleteOCL.g:19291:1: ( ruleTemplateBindingCS )
+            // InternalCompleteOCL.g:19472:1: ( ( ruleTemplateBindingCS ) )
+            // InternalCompleteOCL.g:19473:1: ( ruleTemplateBindingCS )
             {
-            // InternalCompleteOCL.g:19291:1: ( ruleTemplateBindingCS )
-            // InternalCompleteOCL.g:19292:1: ruleTemplateBindingCS
+            // InternalCompleteOCL.g:19473:1: ( ruleTemplateBindingCS )
+            // InternalCompleteOCL.g:19474:1: ruleTemplateBindingCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_0());
@@ -56402,17 +56931,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"
-    // InternalCompleteOCL.g:19301:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
+    // InternalCompleteOCL.g:19483:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalCompleteOCL.g:19305:1: ( ( ruleTypedRefCS ) )
-            // InternalCompleteOCL.g:19306:1: ( ruleTypedRefCS )
+            // InternalCompleteOCL.g:19487:1: ( ( ruleTypedRefCS ) )
+            // InternalCompleteOCL.g:19488:1: ( ruleTypedRefCS )
             {
-            // InternalCompleteOCL.g:19306:1: ( ruleTypedRefCS )
-            // InternalCompleteOCL.g:19307:1: ruleTypedRefCS
+            // InternalCompleteOCL.g:19488:1: ( ruleTypedRefCS )
+            // InternalCompleteOCL.g:19489:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
@@ -56447,11 +56976,11 @@
 
     // $ANTLR start synpred5_InternalCompleteOCL
     public final void synpred5_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:2928:1: ( ( rulePropertyContextDeclCS ) )
-        // InternalCompleteOCL.g:2928:1: ( rulePropertyContextDeclCS )
+        // InternalCompleteOCL.g:2956:1: ( ( rulePropertyContextDeclCS ) )
+        // InternalCompleteOCL.g:2956:1: ( rulePropertyContextDeclCS )
         {
-        // InternalCompleteOCL.g:2928:1: ( rulePropertyContextDeclCS )
-        // InternalCompleteOCL.g:2929:1: rulePropertyContextDeclCS
+        // InternalCompleteOCL.g:2956:1: ( rulePropertyContextDeclCS )
+        // InternalCompleteOCL.g:2957:1: rulePropertyContextDeclCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getContextDeclCSAccess().getPropertyContextDeclCSParserRuleCall_0());
@@ -56471,11 +57000,11 @@
 
     // $ANTLR start synpred6_InternalCompleteOCL
     public final void synpred6_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:2934:6: ( ( ruleClassifierContextDeclCS ) )
-        // InternalCompleteOCL.g:2934:6: ( ruleClassifierContextDeclCS )
+        // InternalCompleteOCL.g:2962:6: ( ( ruleClassifierContextDeclCS ) )
+        // InternalCompleteOCL.g:2962:6: ( ruleClassifierContextDeclCS )
         {
-        // InternalCompleteOCL.g:2934:6: ( ruleClassifierContextDeclCS )
-        // InternalCompleteOCL.g:2935:1: ruleClassifierContextDeclCS
+        // InternalCompleteOCL.g:2962:6: ( ruleClassifierContextDeclCS )
+        // InternalCompleteOCL.g:2963:1: ruleClassifierContextDeclCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getContextDeclCSAccess().getClassifierContextDeclCSParserRuleCall_1());
@@ -56495,11 +57024,11 @@
 
     // $ANTLR start synpred75_InternalCompleteOCL
     public final void synpred75_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:3845:6: ( ( ruleTypeLiteralCS ) )
-        // InternalCompleteOCL.g:3845:6: ( ruleTypeLiteralCS )
+        // InternalCompleteOCL.g:3873:6: ( ( ruleTypeLiteralCS ) )
+        // InternalCompleteOCL.g:3873:6: ( ruleTypeLiteralCS )
         {
-        // InternalCompleteOCL.g:3845:6: ( ruleTypeLiteralCS )
-        // InternalCompleteOCL.g:3846:1: ruleTypeLiteralCS
+        // InternalCompleteOCL.g:3873:6: ( ruleTypeLiteralCS )
+        // InternalCompleteOCL.g:3874:1: ruleTypeLiteralCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -56519,17 +57048,17 @@
 
     // $ANTLR start synpred76_InternalCompleteOCL
     public final void synpred76_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:3867:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
-        // InternalCompleteOCL.g:3867:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalCompleteOCL.g:3895:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
+        // InternalCompleteOCL.g:3895:1: ( ( rule__ExpCS__Group_0__0 ) )
         {
-        // InternalCompleteOCL.g:3867:1: ( ( rule__ExpCS__Group_0__0 ) )
-        // InternalCompleteOCL.g:3868:1: ( rule__ExpCS__Group_0__0 )
+        // InternalCompleteOCL.g:3895:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalCompleteOCL.g:3896:1: ( rule__ExpCS__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getExpCSAccess().getGroup_0());
         }
-        // InternalCompleteOCL.g:3869:1: ( rule__ExpCS__Group_0__0 )
-        // InternalCompleteOCL.g:3869:2: rule__ExpCS__Group_0__0
+        // InternalCompleteOCL.g:3897:1: ( rule__ExpCS__Group_0__0 )
+        // InternalCompleteOCL.g:3897:2: rule__ExpCS__Group_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__ExpCS__Group_0__0();
@@ -56549,11 +57078,11 @@
 
     // $ANTLR start synpred83_InternalCompleteOCL
     public final void synpred83_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:3957:6: ( ( ruleTupleLiteralExpCS ) )
-        // InternalCompleteOCL.g:3957:6: ( ruleTupleLiteralExpCS )
+        // InternalCompleteOCL.g:3985:6: ( ( ruleTupleLiteralExpCS ) )
+        // InternalCompleteOCL.g:3985:6: ( ruleTupleLiteralExpCS )
         {
-        // InternalCompleteOCL.g:3957:6: ( ruleTupleLiteralExpCS )
-        // InternalCompleteOCL.g:3958:1: ruleTupleLiteralExpCS
+        // InternalCompleteOCL.g:3985:6: ( ruleTupleLiteralExpCS )
+        // InternalCompleteOCL.g:3986:1: ruleTupleLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -56573,11 +57102,11 @@
 
     // $ANTLR start synpred84_InternalCompleteOCL
     public final void synpred84_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:3963:6: ( ( ruleMapLiteralExpCS ) )
-        // InternalCompleteOCL.g:3963:6: ( ruleMapLiteralExpCS )
+        // InternalCompleteOCL.g:3991:6: ( ( ruleMapLiteralExpCS ) )
+        // InternalCompleteOCL.g:3991:6: ( ruleMapLiteralExpCS )
         {
-        // InternalCompleteOCL.g:3963:6: ( ruleMapLiteralExpCS )
-        // InternalCompleteOCL.g:3964:1: ruleMapLiteralExpCS
+        // InternalCompleteOCL.g:3991:6: ( ruleMapLiteralExpCS )
+        // InternalCompleteOCL.g:3992:1: ruleMapLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -56597,11 +57126,11 @@
 
     // $ANTLR start synpred85_InternalCompleteOCL
     public final void synpred85_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:3969:6: ( ( ruleCollectionLiteralExpCS ) )
-        // InternalCompleteOCL.g:3969:6: ( ruleCollectionLiteralExpCS )
+        // InternalCompleteOCL.g:3997:6: ( ( ruleCollectionLiteralExpCS ) )
+        // InternalCompleteOCL.g:3997:6: ( ruleCollectionLiteralExpCS )
         {
-        // InternalCompleteOCL.g:3969:6: ( ruleCollectionLiteralExpCS )
-        // InternalCompleteOCL.g:3970:1: ruleCollectionLiteralExpCS
+        // InternalCompleteOCL.g:3997:6: ( ruleCollectionLiteralExpCS )
+        // InternalCompleteOCL.g:3998:1: ruleCollectionLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -56621,11 +57150,11 @@
 
     // $ANTLR start synpred87_InternalCompleteOCL
     public final void synpred87_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:3981:6: ( ( ruleTypeLiteralExpCS ) )
-        // InternalCompleteOCL.g:3981:6: ( ruleTypeLiteralExpCS )
+        // InternalCompleteOCL.g:4009:6: ( ( ruleTypeLiteralExpCS ) )
+        // InternalCompleteOCL.g:4009:6: ( ruleTypeLiteralExpCS )
         {
-        // InternalCompleteOCL.g:3981:6: ( ruleTypeLiteralExpCS )
-        // InternalCompleteOCL.g:3982:1: ruleTypeLiteralExpCS
+        // InternalCompleteOCL.g:4009:6: ( ruleTypeLiteralExpCS )
+        // InternalCompleteOCL.g:4010:1: ruleTypeLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -56645,17 +57174,17 @@
 
     // $ANTLR start synpred91_InternalCompleteOCL
     public final void synpred91_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:4053:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
-        // InternalCompleteOCL.g:4053:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalCompleteOCL.g:4081:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
+        // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
         {
-        // InternalCompleteOCL.g:4053:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-        // InternalCompleteOCL.g:4054:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalCompleteOCL.g:4082:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
         }
-        // InternalCompleteOCL.g:4055:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-        // InternalCompleteOCL.g:4055:2: rule__NavigatingArgCS__Group_0_1_0__0
+        // InternalCompleteOCL.g:4083:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalCompleteOCL.g:4083:2: rule__NavigatingArgCS__Group_0_1_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_0__0();
@@ -56675,17 +57204,17 @@
 
     // $ANTLR start synpred92_InternalCompleteOCL
     public final void synpred92_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:4059:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
-        // InternalCompleteOCL.g:4059:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalCompleteOCL.g:4087:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
+        // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
         {
-        // InternalCompleteOCL.g:4059:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-        // InternalCompleteOCL.g:4060:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalCompleteOCL.g:4088:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
         }
-        // InternalCompleteOCL.g:4061:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-        // InternalCompleteOCL.g:4061:2: rule__NavigatingArgCS__Group_0_1_1__0
+        // InternalCompleteOCL.g:4089:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalCompleteOCL.g:4089:2: rule__NavigatingArgCS__Group_0_1_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_1__0();
@@ -56705,17 +57234,17 @@
 
     // $ANTLR start synpred93_InternalCompleteOCL
     public final void synpred93_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:4081:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
-        // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalCompleteOCL.g:4109:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
+        // InternalCompleteOCL.g:4109:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
         {
-        // InternalCompleteOCL.g:4081:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-        // InternalCompleteOCL.g:4082:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalCompleteOCL.g:4109:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalCompleteOCL.g:4110:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
         }
-        // InternalCompleteOCL.g:4083:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-        // InternalCompleteOCL.g:4083:2: rule__NavigatingCommaArgCS__Group_2_0__0
+        // InternalCompleteOCL.g:4111:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalCompleteOCL.g:4111:2: rule__NavigatingCommaArgCS__Group_2_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -56735,17 +57264,17 @@
 
     // $ANTLR start synpred94_InternalCompleteOCL
     public final void synpred94_InternalCompleteOCL_fragment() throws RecognitionException {
-        // InternalCompleteOCL.g:4087:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
-        // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalCompleteOCL.g:4115:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
+        // InternalCompleteOCL.g:4115:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
         {
-        // InternalCompleteOCL.g:4087:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-        // InternalCompleteOCL.g:4088:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalCompleteOCL.g:4115:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalCompleteOCL.g:4116:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
         }
-        // InternalCompleteOCL.g:4089:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-        // InternalCompleteOCL.g:4089:2: rule__NavigatingCommaArgCS__Group_2_1__0
+        // InternalCompleteOCL.g:4117:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalCompleteOCL.g:4117:2: rule__NavigatingCommaArgCS__Group_2_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -56984,7 +57513,7 @@
             this.transition = dfa_6;
         }
         public String getDescription() {
-            return "2951:1: rule__DefCS__Alternatives : ( ( ruleDefOperationCS ) | ( ruleDefPropertyCS ) );";
+            return "2979:1: rule__DefCS__Alternatives : ( ( ruleDefOperationCS ) | ( ruleDefPropertyCS ) );";
         }
     }
     static final String dfa_7s = "\30\uffff";
@@ -57040,7 +57569,7 @@
             this.transition = dfa_12;
         }
         public String getDescription() {
-            return "3834:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
+            return "3862:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -57196,7 +57725,7 @@
             this.transition = dfa_18;
         }
         public String getDescription() {
-            return "3862:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
+            return "3890:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -57321,7 +57850,7 @@
             this.transition = dfa_24;
         }
         public String getDescription() {
-            return "3928:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
+            return "3956:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -57450,47 +57979,47 @@
         public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000802L});
         public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000380002L});
         public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000802L});
-        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x00000080003800C0L,0x0000000000000010L});
+        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x7F000080FFF800C0L,0x0000000000000010L});
         public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000044L});
         public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000000002L,0x0000001000000044L});
         public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x00000000003800C0L,0x0000000000000008L});
-        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x7F00008FFFF801F0L,0x000000C308D00010L});
+        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x7F00000FFFF801F0L,0x000000C308D00010L});
         public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000010L});
         public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L});
         public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000040L});
-        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x00000000003800C0L,0x0000000000000020L});
-        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
-        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x7F000480FFF800C0L,0x0000000000000010L});
-        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
-        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000080L});
-        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x00000000003800C0L});
-        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x7F000080FFF800C0L,0x0000000000000010L});
-        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000040000000000L});
-        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x00000000003800E0L});
-        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
-        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x7F000080FFF800C0L,0x0000000000000030L});
-        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x7F000080FFF800C0L,0x0000000000000710L});
-        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000700L});
-        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001806L});
-        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000004L});
-        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000000L,0x0000000000006000L});
-        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000002L,0x0000000000006000L});
-        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x00000000000000A0L});
-        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000004000000000L,0x0000000000000080L});
-        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
-        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008000L});
-        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000002L,0x0000000000008000L});
-        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x7F000000FFF800C0L});
+        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x00000080003800C0L,0x0000000000000010L});
+        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x00000000003800C0L,0x0000000000000020L});
+        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x7F00040FFFF800F0L,0x000000C208D00010L});
+        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000080L});
+        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x00000000003800C0L});
+        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C208D00010L});
+        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000040000000000L});
+        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x00000000003800E0L});
+        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C208D00030L});
+        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C208D00710L});
+        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000700L});
+        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001806L});
+        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000004L});
+        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000000L,0x0000000000006000L});
+        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000002L,0x0000000000006000L});
+        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000000000L,0x00000000000000A0L});
+        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000004000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
+        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000000002L,0x0000000000008000L});
         public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000020L});
         public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000000000L,0x0000000000010000L});
-        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C308D20018L});
-        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C308D00018L});
+        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C308D20018L});
+        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C308D00018L});
         public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
-        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C308D00010L});
+        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C308D00010L});
         public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x0000000000080080L});
         public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x00000000000000C0L});
         public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
-        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C308D20010L});
+        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C308D20010L});
         public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000000L,0x0000000000200000L});
         public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020080L});
         public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000040000000000L,0x0000000000000008L});
@@ -57500,33 +58029,32 @@
         public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000000L});
         public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x00FFFFF900060000L});
         public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000700000000L});
-        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C208D00010L});
-        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000000L,0x0000010001010010L});
-        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000002L,0x0000000001000000L});
-        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
-        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x00000000003800E0L,0x0000000000020000L});
-        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C308D00039L});
-        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000060000000080L});
-        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000002L,0x0000060000000080L});
-        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000080L});
-        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000004200008L});
-        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000040000000000L,0x0000000000200000L});
-        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x7F00008FFFF800F0L,0x000000C308D00011L});
-        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
-        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x00000000A0000000L});
-        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
-        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
-        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000080L});
-        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000040000000000L,0x0000000000000018L});
-        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
-        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000800000010L});
-        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000002800000010L,0x0000000000000001L});
-        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x8000000000000000L,0x0000080002000000L});
-        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000080L});
-        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x7F000080FFF800C0L,0x0000000000000011L});
-        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
-        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
-        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000002L,0x0000000800000000L});
+        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x0000010001010010L});
+        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000002L,0x0000000001000000L});
+        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x00000000003800E0L,0x0000000000020000L});
+        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C308D00039L});
+        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0000060000000080L});
+        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000002L,0x0000060000000080L});
+        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000080L});
+        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0000000004200008L});
+        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000040000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C308D00011L});
+        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
+        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x00000000A0000000L});
+        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
+        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000080L});
+        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000040000000000L,0x0000000000000018L});
+        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
+        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000800000010L});
+        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000002800000010L,0x0000000000000001L});
+        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x8000000000000000L,0x0000080002000000L});
+        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000080L});
+        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x7F00000FFFF800F0L,0x000000C208D00011L});
+        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
+        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000002L,0x0000000800000000L});
     }
 
 
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCL.xtextbin b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCL.xtextbin
index adb6424..4c4bcf2 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCL.xtextbin
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCL.xtextbin
Binary files differ
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCLGrammarResource.java b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCLGrammarResource.java
index 469ce80..dbdf82f 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCLGrammarResource.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/CompleteOCLGrammarResource.java
@@ -129,7 +129,7 @@
 					createKeyword("context"),
 					setCardinality("?", createAssignment("ownedSignature", "=", createRuleCall(PR_TemplateSignatureCS))),
 					setCardinality("?", createAssignment("selfName", "=", createRuleCall(PR_UnrestrictedName))),
-					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_PathNameCS)),
+					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_UnreservedPathNameCS)),
 					setCardinality("+", createAlternatives(
 						createGroup(
 							createKeyword("inv"),
@@ -226,7 +226,7 @@
 				createGroup(
 					createKeyword("context"),
 					setCardinality("?", createAssignment("ownedSignature", "=", createRuleCall(PR_TemplateSignatureCS))),
-					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_PathNameCS)),
+					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_UnreservedPathNameCS)),
 					createKeyword("("),
 					setCardinality("?", createGroup(
 						createAssignment("ownedParameters", "+=", createRuleCall(PR_ParameterCS)),
@@ -251,7 +251,7 @@
 			PR_PackageDeclarationCS.setAlternatives(
 				createGroup(
 					createKeyword("package"),
-					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_PathNameCS)),
+					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_UnreservedPathNameCS)),
 					setCardinality("*", createGroup(
 						createKeyword("inv"),
 						createAssignment("ownedInvariants", "+=", createRuleCall(PR_ConstraintCS)))),
@@ -279,7 +279,7 @@
 			PR_PropertyContextDeclCS.setAlternatives(
 				createGroup(
 					createKeyword("context"),
-					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_PathNameCS)),
+					createAssignment("ownedPathName", "=", createRuleCall(_Base.PR_UnreservedPathNameCS)),
 					createKeyword(":"),
 					createAssignment("ownedType", "=", createRuleCall(_EssentialOCL.PR_TypeExpCS)),
 					setCardinality("*", createAlternatives(
@@ -1148,6 +1148,7 @@
 		private static final @NonNull ParserRule PR_UPPER = createParserRule("UPPER", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.EINT));
 		private static final @NonNull ParserRule PR_URI = createParserRule("URI", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_UnreservedName = createParserRule("UnreservedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
+		private static final @NonNull ParserRule PR_UnreservedPathNameCS = createParserRule("UnreservedPathNameCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.PATH_NAME_CS));
 		private static final @NonNull ParserRule PR_UnrestrictedName = createParserRule("UnrestrictedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_WildcardTypeRefCS = createParserRule("WildcardTypeRefCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.WILDCARD_TYPE_REF_CS));
 
@@ -1244,6 +1245,12 @@
 				createRuleCall(TR_SINGLE_QUOTED_STRING));
 			PR_UnreservedName.setAlternatives(
 				createRuleCall(_CompleteOCL.PR_UnrestrictedName));
+			PR_UnreservedPathNameCS.setAlternatives(
+				createGroup(
+					createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS)),
+					setCardinality("*", createGroup(
+						createKeyword("::"),
+						createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS))))));
 			PR_UnrestrictedName.setAlternatives(
 				createRuleCall(PR_Identifier));
 			PR_WildcardTypeRefCS.setAlternatives(
@@ -1272,6 +1279,7 @@
 				rules.add(PR_MultiplicityCS);
 				rules.add(PR_MultiplicityStringCS);
 				rules.add(PR_PathNameCS);
+				rules.add(PR_UnreservedPathNameCS);
 				rules.add(PR_FirstPathElementCS);
 				rules.add(PR_NextPathElementCS);
 				rules.add(PR_TemplateBindingCS);
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCL.g b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCL.g
index 8078e76..9f2e9e4 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCL.g
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCL.g
@@ -243,9 +243,9 @@
 )?(
 (
 		{
-	        newCompositeNode(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_3_0());
+	        newCompositeNode(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0());
 	    }
-		lv_ownedPathName_3_0=rulePathNameCS		{
+		lv_ownedPathName_3_0=ruleUnreservedPathNameCS		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getClassifierContextDeclCSRule());
 	        }
@@ -253,7 +253,7 @@
        			$current,
        			"ownedPathName",
         		lv_ownedPathName_3_0,
-        		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+        		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
 	        afterParserOrEnumRuleCall();
 	    }
 
@@ -988,9 +988,9 @@
 )?(
 (
 		{
-	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0());
+	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0());
 	    }
-		lv_ownedPathName_2_0=rulePathNameCS		{
+		lv_ownedPathName_2_0=ruleUnreservedPathNameCS		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getOperationContextDeclCSRule());
 	        }
@@ -998,7 +998,7 @@
        			$current,
        			"ownedPathName",
         		lv_ownedPathName_2_0,
-        		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+        		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
 	        afterParserOrEnumRuleCall();
 	    }
 
@@ -1184,9 +1184,9 @@
 (
 (
 		{
-	        newCompositeNode(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+	        newCompositeNode(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
 	    }
-		lv_ownedPathName_1_0=rulePathNameCS		{
+		lv_ownedPathName_1_0=ruleUnreservedPathNameCS		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getPackageDeclarationCSRule());
 	        }
@@ -1194,7 +1194,7 @@
        			$current,
        			"ownedPathName",
         		lv_ownedPathName_1_0,
-        		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+        		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
 	        afterParserOrEnumRuleCall();
 	    }
 
@@ -1332,9 +1332,9 @@
 (
 (
 		{
-	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
 	    }
-		lv_ownedPathName_1_0=rulePathNameCS		{
+		lv_ownedPathName_1_0=ruleUnreservedPathNameCS		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getPropertyContextDeclCSRule());
 	        }
@@ -1342,7 +1342,7 @@
        			$current,
        			"ownedPathName",
         		lv_ownedPathName_1_0,
-        		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+        		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
 	        afterParserOrEnumRuleCall();
 	    }
 
@@ -6613,6 +6613,67 @@
 
 
 
+// Entry rule entryRuleUnreservedPathNameCS
+entryRuleUnreservedPathNameCS returns [EObject current=null]
+	:
+	{ newCompositeNode(grammarAccess.getUnreservedPathNameCSRule()); }
+	 iv_ruleUnreservedPathNameCS=ruleUnreservedPathNameCS
+	 { $current=$iv_ruleUnreservedPathNameCS.current; }
+	 EOF
+;
+
+// Rule UnreservedPathNameCS
+ruleUnreservedPathNameCS returns [EObject current=null]
+    @init { enterRule();
+    }
+    @after { leaveRule(); }:
+((
+(
+		{
+	        newCompositeNode(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_0_0());
+	    }
+		lv_ownedPathElements_0_0=ruleNextPathElementCS		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getUnreservedPathNameCSRule());
+	        }
+       		add(
+       			$current,
+       			"ownedPathElements",
+        		lv_ownedPathElements_0_0,
+        		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(	otherlv_1='::'
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getUnreservedPathNameCSAccess().getColonColonKeyword_1_0());
+    }
+(
+(
+		{
+	        newCompositeNode(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
+	    }
+		lv_ownedPathElements_2_0=ruleNextPathElementCS		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getUnreservedPathNameCSRule());
+	        }
+       		add(
+       			$current,
+       			"ownedPathElements",
+        		lv_ownedPathElements_2_0,
+        		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS returns [EObject current=null]
 	:
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLLexer.java b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLLexer.java
index 81d919d..dd92947 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLLexer.java
@@ -2036,8 +2036,8 @@
         try {
             int _type = RULE_UNQUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7277:22: ( '\\u00A3$%^\\u00A3$%^' )
-            // InternalCompleteOCL.g:7277:24: '\\u00A3$%^\\u00A3$%^'
+            // InternalCompleteOCL.g:7338:22: ( '\\u00A3$%^\\u00A3$%^' )
+            // InternalCompleteOCL.g:7338:24: '\\u00A3$%^\\u00A3$%^'
             {
             match("\u00A3$%^\u00A3$%^");
 
@@ -2055,8 +2055,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:7279:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalCompleteOCL.g:7279:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalCompleteOCL.g:7340:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalCompleteOCL.g:7340:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -2080,8 +2080,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalCompleteOCL.g:7281:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalCompleteOCL.g:7281:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalCompleteOCL.g:7342:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalCompleteOCL.g:7342:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2106,11 +2106,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7283:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalCompleteOCL.g:7283:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalCompleteOCL.g:7344:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalCompleteOCL.g:7344:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalCompleteOCL.g:7283:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalCompleteOCL.g:7344:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -2126,14 +2126,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7283:34: RULE_ESCAPED_CHARACTER
+            	    // InternalCompleteOCL.g:7344:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalCompleteOCL.g:7283:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalCompleteOCL.g:7344:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2170,11 +2170,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7285:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalCompleteOCL.g:7285:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalCompleteOCL.g:7346:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalCompleteOCL.g:7346:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalCompleteOCL.g:7285:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalCompleteOCL.g:7346:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -2190,14 +2190,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7285:35: RULE_ESCAPED_CHARACTER
+            	    // InternalCompleteOCL.g:7346:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalCompleteOCL.g:7285:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalCompleteOCL.g:7346:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2234,12 +2234,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7287:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalCompleteOCL.g:7287:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalCompleteOCL.g:7348:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalCompleteOCL.g:7348:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalCompleteOCL.g:7287:38: ( options {greedy=false; } : . )*
+            // InternalCompleteOCL.g:7348:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -2264,7 +2264,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7287:66: .
+            	    // InternalCompleteOCL.g:7348:66: .
             	    {
             	    matchAny();
 
@@ -2294,11 +2294,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7289:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalCompleteOCL.g:7289:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalCompleteOCL.g:7350:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalCompleteOCL.g:7350:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalCompleteOCL.g:7289:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalCompleteOCL.g:7350:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -2347,8 +2347,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7291:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalCompleteOCL.g:7291:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalCompleteOCL.g:7352:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:7352:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -2368,10 +2368,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7293:10: ( ( '0' .. '9' )+ )
-            // InternalCompleteOCL.g:7293:12: ( '0' .. '9' )+
+            // InternalCompleteOCL.g:7354:10: ( ( '0' .. '9' )+ )
+            // InternalCompleteOCL.g:7354:12: ( '0' .. '9' )+
             {
-            // InternalCompleteOCL.g:7293:12: ( '0' .. '9' )+
+            // InternalCompleteOCL.g:7354:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -2385,7 +2385,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7293:13: '0' .. '9'
+            	    // InternalCompleteOCL.g:7354:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -2417,12 +2417,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7295:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalCompleteOCL.g:7295:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalCompleteOCL.g:7356:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalCompleteOCL.g:7356:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalCompleteOCL.g:7295:24: ( options {greedy=false; } : . )*
+            // InternalCompleteOCL.g:7356:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -2447,7 +2447,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7295:52: .
+            	    // InternalCompleteOCL.g:7356:52: .
             	    {
             	    matchAny();
 
@@ -2477,12 +2477,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7297:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalCompleteOCL.g:7297:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalCompleteOCL.g:7358:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalCompleteOCL.g:7358:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalCompleteOCL.g:7297:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalCompleteOCL.g:7358:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -2495,7 +2495,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalCompleteOCL.g:7297:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalCompleteOCL.g:7358:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2515,7 +2515,7 @@
                 }
             } while (true);
 
-            // InternalCompleteOCL.g:7297:40: ( ( '\\r' )? '\\n' )?
+            // InternalCompleteOCL.g:7358:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2524,9 +2524,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalCompleteOCL.g:7297:41: ( '\\r' )? '\\n'
+                    // InternalCompleteOCL.g:7358:41: ( '\\r' )? '\\n'
                     {
-                    // InternalCompleteOCL.g:7297:41: ( '\\r' )?
+                    // InternalCompleteOCL.g:7358:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -2535,7 +2535,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalCompleteOCL.g:7297:41: '\\r'
+                            // InternalCompleteOCL.g:7358:41: '\\r'
                             {
                             match('\r');
 
@@ -2567,10 +2567,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7299:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalCompleteOCL.g:7299:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalCompleteOCL.g:7360:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalCompleteOCL.g:7360:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalCompleteOCL.g:7299:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalCompleteOCL.g:7360:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -2624,8 +2624,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalCompleteOCL.g:7301:16: ( . )
-            // InternalCompleteOCL.g:7301:18: .
+            // InternalCompleteOCL.g:7362:16: ( . )
+            // InternalCompleteOCL.g:7362:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLParser.java b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLParser.java
index d569b7d..f4f6b72 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLParser.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/parser/antlr/internal/InternalCompleteOCLParser.java
@@ -582,7 +582,7 @@
 
 
     // $ANTLR start "ruleClassifierContextDeclCS"
-    // InternalCompleteOCL.g:199:1: ruleClassifierContextDeclCS returns [EObject current=null] : (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= rulePathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ ) ;
+    // InternalCompleteOCL.g:199:1: ruleClassifierContextDeclCS returns [EObject current=null] : (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= ruleUnreservedPathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ ) ;
     public final EObject ruleClassifierContextDeclCS() throws RecognitionException {
         EObject current = null;
 
@@ -602,11 +602,11 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:202:28: ( (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= rulePathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ ) )
-            // InternalCompleteOCL.g:203:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= rulePathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ )
+            // InternalCompleteOCL.g:202:28: ( (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= ruleUnreservedPathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ ) )
+            // InternalCompleteOCL.g:203:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= ruleUnreservedPathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ )
             {
-            // InternalCompleteOCL.g:203:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= rulePathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ )
-            // InternalCompleteOCL.g:203:3: otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= rulePathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+
+            // InternalCompleteOCL.g:203:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= ruleUnreservedPathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+ )
+            // InternalCompleteOCL.g:203:3: otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_selfName_2_0= ruleUnrestrictedName ) )? ( (lv_ownedPathName_3_0= ruleUnreservedPathNameCS ) ) ( (otherlv_4= 'inv' ( (lv_ownedInvariants_5_0= ruleConstraintCS ) ) ) | ( (lv_ownedDefinitions_6_0= ruleDefCS ) ) )+
             {
             otherlv_0=(Token)match(input,19,FollowSets000.FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -667,7 +667,7 @@
                     {
                     int LA5_1 = input.LA(2);
 
-                    if ( ((LA5_1>=RULE_SIMPLE_ID && LA5_1<=RULE_ESCAPED_ID)||(LA5_1>=28 && LA5_1<=30)) ) {
+                    if ( ((LA5_1>=RULE_SIMPLE_ID && LA5_1<=RULE_ESCAPED_ID)||(LA5_1>=28 && LA5_1<=30)||(LA5_1>=42 && LA5_1<=51)||(LA5_1>=73 && LA5_1<=74)||(LA5_1>=76 && LA5_1<=80)) ) {
                         alt5=1;
                     }
                     }
@@ -676,7 +676,7 @@
                     {
                     int LA5_2 = input.LA(2);
 
-                    if ( ((LA5_2>=RULE_SIMPLE_ID && LA5_2<=RULE_ESCAPED_ID)||(LA5_2>=28 && LA5_2<=30)) ) {
+                    if ( ((LA5_2>=RULE_SIMPLE_ID && LA5_2<=RULE_ESCAPED_ID)||(LA5_2>=28 && LA5_2<=30)||(LA5_2>=42 && LA5_2<=51)||(LA5_2>=73 && LA5_2<=74)||(LA5_2>=76 && LA5_2<=80)) ) {
                         alt5=1;
                     }
                     }
@@ -685,7 +685,7 @@
                     {
                     int LA5_3 = input.LA(2);
 
-                    if ( ((LA5_3>=RULE_SIMPLE_ID && LA5_3<=RULE_ESCAPED_ID)||(LA5_3>=28 && LA5_3<=30)) ) {
+                    if ( ((LA5_3>=RULE_SIMPLE_ID && LA5_3<=RULE_ESCAPED_ID)||(LA5_3>=28 && LA5_3<=30)||(LA5_3>=42 && LA5_3<=51)||(LA5_3>=73 && LA5_3<=74)||(LA5_3>=76 && LA5_3<=80)) ) {
                         alt5=1;
                     }
                     }
@@ -694,7 +694,7 @@
                     {
                     int LA5_4 = input.LA(2);
 
-                    if ( ((LA5_4>=RULE_SIMPLE_ID && LA5_4<=RULE_ESCAPED_ID)||(LA5_4>=28 && LA5_4<=30)) ) {
+                    if ( ((LA5_4>=RULE_SIMPLE_ID && LA5_4<=RULE_ESCAPED_ID)||(LA5_4>=28 && LA5_4<=30)||(LA5_4>=42 && LA5_4<=51)||(LA5_4>=73 && LA5_4<=74)||(LA5_4>=76 && LA5_4<=80)) ) {
                         alt5=1;
                     }
                     }
@@ -703,7 +703,7 @@
                     {
                     int LA5_5 = input.LA(2);
 
-                    if ( ((LA5_5>=RULE_SIMPLE_ID && LA5_5<=RULE_ESCAPED_ID)||(LA5_5>=28 && LA5_5<=30)) ) {
+                    if ( ((LA5_5>=RULE_SIMPLE_ID && LA5_5<=RULE_ESCAPED_ID)||(LA5_5>=28 && LA5_5<=30)||(LA5_5>=42 && LA5_5<=51)||(LA5_5>=73 && LA5_5<=74)||(LA5_5>=76 && LA5_5<=80)) ) {
                         alt5=1;
                     }
                     }
@@ -749,19 +749,19 @@
 
             }
 
-            // InternalCompleteOCL.g:243:3: ( (lv_ownedPathName_3_0= rulePathNameCS ) )
-            // InternalCompleteOCL.g:244:1: (lv_ownedPathName_3_0= rulePathNameCS )
+            // InternalCompleteOCL.g:243:3: ( (lv_ownedPathName_3_0= ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:244:1: (lv_ownedPathName_3_0= ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:244:1: (lv_ownedPathName_3_0= rulePathNameCS )
-            // InternalCompleteOCL.g:245:3: lv_ownedPathName_3_0= rulePathNameCS
+            // InternalCompleteOCL.g:244:1: (lv_ownedPathName_3_0= ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:245:3: lv_ownedPathName_3_0= ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
 
-              	        newCompositeNode(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_3_0());
+              	        newCompositeNode(grammarAccess.getClassifierContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0());
 
             }
             pushFollow(FollowSets000.FOLLOW_6);
-            lv_ownedPathName_3_0=rulePathNameCS();
+            lv_ownedPathName_3_0=ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return current;
@@ -774,7 +774,7 @@
                      			current,
                      			"ownedPathName",
                       		lv_ownedPathName_3_0,
-                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+                      		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
               	        afterParserOrEnumRuleCall();
 
             }
@@ -1654,7 +1654,7 @@
 
             }
 
-            otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
+            otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_14); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_3, grammarAccess.getDefOperationCSAccess().getColonKeyword_3());
@@ -1679,7 +1679,7 @@
                       	        newCompositeNode(grammarAccess.getDefOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_4_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_14);
+                    pushFollow(FollowSets000.FOLLOW_15);
                     lv_ownedSignature_4_0=ruleTemplateSignatureCS();
 
                     state._fsp--;
@@ -1717,7 +1717,7 @@
               	        newCompositeNode(grammarAccess.getDefOperationCSAccess().getNameUnrestrictedNameParserRuleCall_5_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_15);
+            pushFollow(FollowSets000.FOLLOW_16);
             lv_name_5_0=ruleUnrestrictedName();
 
             state._fsp--;
@@ -1741,7 +1741,7 @@
 
             }
 
-            otherlv_6=(Token)match(input,21,FollowSets000.FOLLOW_16); if (state.failed) return current;
+            otherlv_6=(Token)match(input,21,FollowSets000.FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_6, grammarAccess.getDefOperationCSAccess().getLeftParenthesisKeyword_6());
@@ -1769,7 +1769,7 @@
                       	        newCompositeNode(grammarAccess.getDefOperationCSAccess().getOwnedParametersDefParameterCSParserRuleCall_7_0_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_17);
+                    pushFollow(FollowSets000.FOLLOW_18);
                     lv_ownedParameters_7_0=ruleDefParameterCS();
 
                     state._fsp--;
@@ -1808,7 +1808,7 @@
                     	case 1 :
                     	    // InternalCompleteOCL.g:607:4: otherlv_8= ',' ( (lv_ownedParameters_9_0= ruleDefParameterCS ) )
                     	    {
-                    	    otherlv_8=(Token)match(input,26,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    	    otherlv_8=(Token)match(input,26,FollowSets000.FOLLOW_15); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	          	newLeafNode(otherlv_8, grammarAccess.getDefOperationCSAccess().getCommaKeyword_7_1_0());
@@ -1825,7 +1825,7 @@
                     	      	        newCompositeNode(grammarAccess.getDefOperationCSAccess().getOwnedParametersDefParameterCSParserRuleCall_7_1_1_0());
 
                     	    }
-                    	    pushFollow(FollowSets000.FOLLOW_17);
+                    	    pushFollow(FollowSets000.FOLLOW_18);
                     	    lv_ownedParameters_9_0=ruleDefParameterCS();
 
                     	    state._fsp--;
@@ -1870,7 +1870,7 @@
                   	newLeafNode(otherlv_10, grammarAccess.getDefOperationCSAccess().getRightParenthesisKeyword_8());
 
             }
-            otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_18); if (state.failed) return current;
+            otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_19); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_11, grammarAccess.getDefOperationCSAccess().getColonKeyword_9());
@@ -1895,7 +1895,7 @@
                       	        newCompositeNode(grammarAccess.getDefOperationCSAccess().getOwnedTypeTypeExpCSParserRuleCall_10_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_19);
+                    pushFollow(FollowSets000.FOLLOW_20);
                     lv_ownedType_12_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -2080,7 +2080,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getDefParameterCSAccess().getColonKeyword_1());
@@ -2289,7 +2289,7 @@
 
             }
 
-            otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_15); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_3, grammarAccess.getDefPropertyCSAccess().getColonKeyword_3());
@@ -2330,7 +2330,7 @@
 
             }
 
-            otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_5, grammarAccess.getDefPropertyCSAccess().getColonKeyword_5());
@@ -2347,7 +2347,7 @@
               	        newCompositeNode(grammarAccess.getDefPropertyCSAccess().getOwnedTypeTypeExpCSParserRuleCall_6_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_19);
+            pushFollow(FollowSets000.FOLLOW_20);
             lv_ownedType_6_0=ruleTypeExpCS();
 
             state._fsp--;
@@ -2528,7 +2528,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:876:4: otherlv_0= 'import'
                     {
-                    otherlv_0=(Token)match(input,28,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    otherlv_0=(Token)match(input,28,FollowSets000.FOLLOW_22); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_0, grammarAccess.getImportCSAccess().getImportKeyword_0_0());
@@ -2540,7 +2540,7 @@
                 case 2 :
                     // InternalCompleteOCL.g:881:7: otherlv_1= 'include'
                     {
-                    otherlv_1=(Token)match(input,29,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,29,FollowSets000.FOLLOW_22); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getImportCSAccess().getIncludeKeyword_0_1());
@@ -2552,7 +2552,7 @@
                 case 3 :
                     // InternalCompleteOCL.g:886:7: otherlv_2= 'library'
                     {
-                    otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_22); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_2, grammarAccess.getImportCSAccess().getLibraryKeyword_0_2());
@@ -2621,7 +2621,7 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,23,FollowSets000.FOLLOW_22); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_4, grammarAccess.getImportCSAccess().getColonKeyword_1_1());
@@ -2644,7 +2644,7 @@
               	        newCompositeNode(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_22);
+            pushFollow(FollowSets000.FOLLOW_23);
             lv_ownedPathName_5_0=ruleURIPathNameCS();
 
             state._fsp--;
@@ -2768,7 +2768,7 @@
 
 
     // $ANTLR start "ruleOperationContextDeclCS"
-    // InternalCompleteOCL.g:962:1: ruleOperationContextDeclCS returns [EObject current=null] : (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= rulePathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* ) ;
+    // InternalCompleteOCL.g:962:1: ruleOperationContextDeclCS returns [EObject current=null] : (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= ruleUnreservedPathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* ) ;
     public final EObject ruleOperationContextDeclCS() throws RecognitionException {
         EObject current = null;
 
@@ -2801,11 +2801,11 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:965:28: ( (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= rulePathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* ) )
-            // InternalCompleteOCL.g:966:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= rulePathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* )
+            // InternalCompleteOCL.g:965:28: ( (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= ruleUnreservedPathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* ) )
+            // InternalCompleteOCL.g:966:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= ruleUnreservedPathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* )
             {
-            // InternalCompleteOCL.g:966:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= rulePathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* )
-            // InternalCompleteOCL.g:966:3: otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= rulePathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )*
+            // InternalCompleteOCL.g:966:1: (otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= ruleUnreservedPathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )* )
+            // InternalCompleteOCL.g:966:3: otherlv_0= 'context' ( (lv_ownedSignature_1_0= ruleTemplateSignatureCS ) )? ( (lv_ownedPathName_2_0= ruleUnreservedPathNameCS ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParameterCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) )? ( (otherlv_10= 'pre' ( (lv_ownedPreconditions_11_0= ruleConstraintCS ) ) ) | (otherlv_12= 'post' ( (lv_ownedPostconditions_13_0= ruleConstraintCS ) ) ) | (otherlv_14= 'body' ( ruleUnrestrictedName )? otherlv_16= ':' ( (lv_ownedBodies_17_0= ruleSpecificationCS ) ) ) )*
             {
             otherlv_0=(Token)match(input,19,FollowSets000.FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -2859,19 +2859,19 @@
 
             }
 
-            // InternalCompleteOCL.g:988:3: ( (lv_ownedPathName_2_0= rulePathNameCS ) )
-            // InternalCompleteOCL.g:989:1: (lv_ownedPathName_2_0= rulePathNameCS )
+            // InternalCompleteOCL.g:988:3: ( (lv_ownedPathName_2_0= ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:989:1: (lv_ownedPathName_2_0= ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:989:1: (lv_ownedPathName_2_0= rulePathNameCS )
-            // InternalCompleteOCL.g:990:3: lv_ownedPathName_2_0= rulePathNameCS
+            // InternalCompleteOCL.g:989:1: (lv_ownedPathName_2_0= ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:990:3: lv_ownedPathName_2_0= ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
 
-              	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_2_0());
+              	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_15);
-            lv_ownedPathName_2_0=rulePathNameCS();
+            pushFollow(FollowSets000.FOLLOW_16);
+            lv_ownedPathName_2_0=ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return current;
@@ -2884,7 +2884,7 @@
                      			current,
                      			"ownedPathName",
                       		lv_ownedPathName_2_0,
-                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+                      		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
               	        afterParserOrEnumRuleCall();
 
             }
@@ -2894,7 +2894,7 @@
 
             }
 
-            otherlv_3=(Token)match(input,21,FollowSets000.FOLLOW_23); if (state.failed) return current;
+            otherlv_3=(Token)match(input,21,FollowSets000.FOLLOW_24); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_3, grammarAccess.getOperationContextDeclCSAccess().getLeftParenthesisKeyword_3());
@@ -2922,7 +2922,7 @@
                       	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedParametersParameterCSParserRuleCall_4_0_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_17);
+                    pushFollow(FollowSets000.FOLLOW_18);
                     lv_ownedParameters_4_0=ruleParameterCS();
 
                     state._fsp--;
@@ -2961,7 +2961,7 @@
                     	case 1 :
                     	    // InternalCompleteOCL.g:1028:4: otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParameterCS ) )
                     	    {
-                    	    otherlv_5=(Token)match(input,26,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    	    otherlv_5=(Token)match(input,26,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	          	newLeafNode(otherlv_5, grammarAccess.getOperationContextDeclCSAccess().getCommaKeyword_4_1_0());
@@ -2978,7 +2978,7 @@
                     	      	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedParametersParameterCSParserRuleCall_4_1_1_0());
 
                     	    }
-                    	    pushFollow(FollowSets000.FOLLOW_17);
+                    	    pushFollow(FollowSets000.FOLLOW_18);
                     	    lv_ownedParameters_6_0=ruleParameterCS();
 
                     	    state._fsp--;
@@ -3023,7 +3023,7 @@
                   	newLeafNode(otherlv_7, grammarAccess.getOperationContextDeclCSAccess().getRightParenthesisKeyword_5());
 
             }
-            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_24); if (state.failed) return current;
+            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_25); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_8, grammarAccess.getOperationContextDeclCSAccess().getColonKeyword_6());
@@ -3048,7 +3048,7 @@
                       	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedTypeTypeExpCSParserRuleCall_7_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_25);
+                    pushFollow(FollowSets000.FOLLOW_26);
                     lv_ownedType_9_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -3122,7 +3122,7 @@
             	      	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedPreconditionsConstraintCSParserRuleCall_8_0_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    pushFollow(FollowSets000.FOLLOW_26);
             	    lv_ownedPreconditions_11_0=ruleConstraintCS();
 
             	    state._fsp--;
@@ -3175,7 +3175,7 @@
             	      	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedPostconditionsConstraintCSParserRuleCall_8_1_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    pushFollow(FollowSets000.FOLLOW_26);
             	    lv_ownedPostconditions_13_0=ruleConstraintCS();
 
             	    state._fsp--;
@@ -3271,7 +3271,7 @@
             	      	        newCompositeNode(grammarAccess.getOperationContextDeclCSAccess().getOwnedBodiesSpecificationCSParserRuleCall_8_2_3_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    pushFollow(FollowSets000.FOLLOW_26);
             	    lv_ownedBodies_17_0=ruleSpecificationCS();
 
             	    state._fsp--;
@@ -3370,7 +3370,7 @@
 
 
     // $ANTLR start "rulePackageDeclarationCS"
-    // InternalCompleteOCL.g:1176:1: rulePackageDeclarationCS returns [EObject current=null] : (otherlv_0= 'package' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' ) ;
+    // InternalCompleteOCL.g:1176:1: rulePackageDeclarationCS returns [EObject current=null] : (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' ) ;
     public final EObject rulePackageDeclarationCS() throws RecognitionException {
         EObject current = null;
 
@@ -3387,11 +3387,11 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:1179:28: ( (otherlv_0= 'package' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' ) )
-            // InternalCompleteOCL.g:1180:1: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' )
+            // InternalCompleteOCL.g:1179:28: ( (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' ) )
+            // InternalCompleteOCL.g:1180:1: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' )
             {
-            // InternalCompleteOCL.g:1180:1: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' )
-            // InternalCompleteOCL.g:1180:3: otherlv_0= 'package' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage'
+            // InternalCompleteOCL.g:1180:1: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage' )
+            // InternalCompleteOCL.g:1180:3: otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) (otherlv_2= 'inv' ( (lv_ownedInvariants_3_0= ruleConstraintCS ) ) )* ( (lv_ownedContexts_4_0= ruleContextDeclCS ) )* otherlv_5= 'endpackage'
             {
             otherlv_0=(Token)match(input,35,FollowSets000.FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -3399,19 +3399,19 @@
                   	newLeafNode(otherlv_0, grammarAccess.getPackageDeclarationCSAccess().getPackageKeyword_0());
 
             }
-            // InternalCompleteOCL.g:1184:1: ( (lv_ownedPathName_1_0= rulePathNameCS ) )
-            // InternalCompleteOCL.g:1185:1: (lv_ownedPathName_1_0= rulePathNameCS )
+            // InternalCompleteOCL.g:1184:1: ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:1185:1: (lv_ownedPathName_1_0= ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:1185:1: (lv_ownedPathName_1_0= rulePathNameCS )
-            // InternalCompleteOCL.g:1186:3: lv_ownedPathName_1_0= rulePathNameCS
+            // InternalCompleteOCL.g:1185:1: (lv_ownedPathName_1_0= ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:1186:3: lv_ownedPathName_1_0= ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
 
-              	        newCompositeNode(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+              	        newCompositeNode(grammarAccess.getPackageDeclarationCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_26);
-            lv_ownedPathName_1_0=rulePathNameCS();
+            pushFollow(FollowSets000.FOLLOW_27);
+            lv_ownedPathName_1_0=ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return current;
@@ -3424,7 +3424,7 @@
                      			current,
                      			"ownedPathName",
                       		lv_ownedPathName_1_0,
-                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+                      		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
               	        afterParserOrEnumRuleCall();
 
             }
@@ -3466,7 +3466,7 @@
             	      	        newCompositeNode(grammarAccess.getPackageDeclarationCSAccess().getOwnedInvariantsConstraintCSParserRuleCall_2_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_26);
+            	    pushFollow(FollowSets000.FOLLOW_27);
             	    lv_ownedInvariants_3_0=ruleConstraintCS();
 
             	    state._fsp--;
@@ -3522,7 +3522,7 @@
             	      	        newCompositeNode(grammarAccess.getPackageDeclarationCSAccess().getOwnedContextsContextDeclCSParserRuleCall_3_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_27);
+            	    pushFollow(FollowSets000.FOLLOW_28);
             	    lv_ownedContexts_4_0=ruleContextDeclCS();
 
             	    state._fsp--;
@@ -3729,7 +3729,7 @@
 
                     }
 
-                    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getParameterCSAccess().getColonKeyword_0_1());
@@ -3839,7 +3839,7 @@
 
 
     // $ANTLR start "rulePropertyContextDeclCS"
-    // InternalCompleteOCL.g:1324:1: rulePropertyContextDeclCS returns [EObject current=null] : (otherlv_0= 'context' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* ) ;
+    // InternalCompleteOCL.g:1324:1: rulePropertyContextDeclCS returns [EObject current=null] : (otherlv_0= 'context' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* ) ;
     public final EObject rulePropertyContextDeclCS() throws RecognitionException {
         EObject current = null;
 
@@ -3861,11 +3861,11 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:1327:28: ( (otherlv_0= 'context' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* ) )
-            // InternalCompleteOCL.g:1328:1: (otherlv_0= 'context' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* )
+            // InternalCompleteOCL.g:1327:28: ( (otherlv_0= 'context' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* ) )
+            // InternalCompleteOCL.g:1328:1: (otherlv_0= 'context' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* )
             {
-            // InternalCompleteOCL.g:1328:1: (otherlv_0= 'context' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* )
-            // InternalCompleteOCL.g:1328:3: otherlv_0= 'context' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )*
+            // InternalCompleteOCL.g:1328:1: (otherlv_0= 'context' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )* )
+            // InternalCompleteOCL.g:1328:3: otherlv_0= 'context' ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) ) otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) ( (otherlv_4= 'derive' ( ruleUnrestrictedName )? otherlv_6= ':' ( (lv_ownedDefaultExpressions_7_0= ruleSpecificationCS ) ) ) | (otherlv_8= 'init' ( ruleUnrestrictedName )? otherlv_10= ':' ( (lv_ownedDefaultExpressions_11_0= ruleSpecificationCS ) ) ) )*
             {
             otherlv_0=(Token)match(input,19,FollowSets000.FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -3873,19 +3873,19 @@
                   	newLeafNode(otherlv_0, grammarAccess.getPropertyContextDeclCSAccess().getContextKeyword_0());
 
             }
-            // InternalCompleteOCL.g:1332:1: ( (lv_ownedPathName_1_0= rulePathNameCS ) )
-            // InternalCompleteOCL.g:1333:1: (lv_ownedPathName_1_0= rulePathNameCS )
+            // InternalCompleteOCL.g:1332:1: ( (lv_ownedPathName_1_0= ruleUnreservedPathNameCS ) )
+            // InternalCompleteOCL.g:1333:1: (lv_ownedPathName_1_0= ruleUnreservedPathNameCS )
             {
-            // InternalCompleteOCL.g:1333:1: (lv_ownedPathName_1_0= rulePathNameCS )
-            // InternalCompleteOCL.g:1334:3: lv_ownedPathName_1_0= rulePathNameCS
+            // InternalCompleteOCL.g:1333:1: (lv_ownedPathName_1_0= ruleUnreservedPathNameCS )
+            // InternalCompleteOCL.g:1334:3: lv_ownedPathName_1_0= ruleUnreservedPathNameCS
             {
             if ( state.backtracking==0 ) {
 
-              	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
+              	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0());
 
             }
             pushFollow(FollowSets000.FOLLOW_12);
-            lv_ownedPathName_1_0=rulePathNameCS();
+            lv_ownedPathName_1_0=ruleUnreservedPathNameCS();
 
             state._fsp--;
             if (state.failed) return current;
@@ -3898,7 +3898,7 @@
                      			current,
                      			"ownedPathName",
                       		lv_ownedPathName_1_0,
-                      		"org.eclipse.ocl.xtext.base.Base.PathNameCS");
+                      		"org.eclipse.ocl.xtext.base.Base.UnreservedPathNameCS");
               	        afterParserOrEnumRuleCall();
 
             }
@@ -3908,7 +3908,7 @@
 
             }
 
-            otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_2, grammarAccess.getPropertyContextDeclCSAccess().getColonKeyword_2());
@@ -3925,7 +3925,7 @@
               	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedTypeTypeExpCSParserRuleCall_3_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_28);
+            pushFollow(FollowSets000.FOLLOW_29);
             lv_ownedType_3_0=ruleTypeExpCS();
 
             state._fsp--;
@@ -4030,7 +4030,7 @@
             	      	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_4_0_3_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_28);
+            	    pushFollow(FollowSets000.FOLLOW_29);
             	    lv_ownedDefaultExpressions_7_0=ruleSpecificationCS();
 
             	    state._fsp--;
@@ -4126,7 +4126,7 @@
             	      	        newCompositeNode(grammarAccess.getPropertyContextDeclCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_4_1_3_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_28);
+            	    pushFollow(FollowSets000.FOLLOW_29);
             	    lv_ownedDefaultExpressions_11_0=ruleSpecificationCS();
 
             	    state._fsp--;
@@ -4446,7 +4446,7 @@
                     // InternalCompleteOCL.g:1526:2: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
                     // InternalCompleteOCL.g:1526:4: otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')'
                     {
-                    otherlv_0=(Token)match(input,21,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    otherlv_0=(Token)match(input,21,FollowSets000.FOLLOW_15); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_0, grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());
@@ -4463,7 +4463,7 @@
                       	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_17);
+                    pushFollow(FollowSets000.FOLLOW_18);
                     lv_ownedParameters_1_0=ruleTypeParameterCS();
 
                     state._fsp--;
@@ -4502,7 +4502,7 @@
                     	case 1 :
                     	    // InternalCompleteOCL.g:1548:4: otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
                     	    {
-                    	    otherlv_2=(Token)match(input,26,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    	    otherlv_2=(Token)match(input,26,FollowSets000.FOLLOW_15); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	          	newLeafNode(otherlv_2, grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_0_2_0());
@@ -4519,7 +4519,7 @@
                     	      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_2_1_0());
 
                     	    }
-                    	    pushFollow(FollowSets000.FOLLOW_17);
+                    	    pushFollow(FollowSets000.FOLLOW_18);
                     	    lv_ownedParameters_3_0=ruleTypeParameterCS();
 
                     	    state._fsp--;
@@ -4570,7 +4570,7 @@
                     // InternalCompleteOCL.g:1575:6: (otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>' )
                     // InternalCompleteOCL.g:1575:8: otherlv_5= '<' ( (lv_ownedParameters_6_0= ruleTypeParameterCS ) ) (otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) ) )* otherlv_9= '>'
                     {
-                    otherlv_5=(Token)match(input,39,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,39,FollowSets000.FOLLOW_15); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_5, grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());
@@ -4587,7 +4587,7 @@
                       	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_29);
+                    pushFollow(FollowSets000.FOLLOW_30);
                     lv_ownedParameters_6_0=ruleTypeParameterCS();
 
                     state._fsp--;
@@ -4626,7 +4626,7 @@
                     	case 1 :
                     	    // InternalCompleteOCL.g:1597:4: otherlv_7= ',' ( (lv_ownedParameters_8_0= ruleTypeParameterCS ) )
                     	    {
-                    	    otherlv_7=(Token)match(input,26,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    	    otherlv_7=(Token)match(input,26,FollowSets000.FOLLOW_15); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	          	newLeafNode(otherlv_7, grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());
@@ -4643,7 +4643,7 @@
                     	      	        newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_2_1_0());
 
                     	    }
-                    	    pushFollow(FollowSets000.FOLLOW_29);
+                    	    pushFollow(FollowSets000.FOLLOW_30);
                     	    lv_ownedParameters_8_0=ruleTypeParameterCS();
 
                     	    state._fsp--;
@@ -7149,7 +7149,7 @@
               	        newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_30);
+            pushFollow(FollowSets000.FOLLOW_31);
             lv_ownedPathElements_0_0=ruleURIFirstPathElementCS();
 
             state._fsp--;
@@ -7188,7 +7188,7 @@
             	case 1 :
             	    // InternalCompleteOCL.g:2423:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
             	    {
-            	    otherlv_1=(Token)match(input,75,FollowSets000.FOLLOW_31); if (state.failed) return current;
+            	    otherlv_1=(Token)match(input,75,FollowSets000.FOLLOW_5); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	          	newLeafNode(otherlv_1, grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
@@ -7205,7 +7205,7 @@
             	      	        newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_30);
+            	    pushFollow(FollowSets000.FOLLOW_31);
             	    lv_ownedPathElements_2_0=ruleNextPathElementCS();
 
             	    state._fsp--;
@@ -7859,7 +7859,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:2647:4: otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')'
                     {
-                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -8080,7 +8080,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:2727:4: otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')'
                     {
-                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -8121,7 +8121,7 @@
 
                     }
 
-                    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_3, grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
@@ -8296,7 +8296,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:2811:4: otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')'
                     {
-                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_16); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_17); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -8324,7 +8324,7 @@
                               	        newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
 
                             }
-                            pushFollow(FollowSets000.FOLLOW_17);
+                            pushFollow(FollowSets000.FOLLOW_18);
                             lv_ownedParts_2_0=ruleTuplePartCS();
 
                             state._fsp--;
@@ -8363,7 +8363,7 @@
                             	case 1 :
                             	    // InternalCompleteOCL.g:2833:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                             	    {
-                            	    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            	    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_15); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	          	newLeafNode(otherlv_3, grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
@@ -8380,7 +8380,7 @@
                             	      	        newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
 
                             	    }
-                            	    pushFollow(FollowSets000.FOLLOW_17);
+                            	    pushFollow(FollowSets000.FOLLOW_18);
                             	    lv_ownedParts_4_0=ruleTuplePartCS();
 
                             	    state._fsp--;
@@ -8548,7 +8548,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
@@ -9642,7 +9642,7 @@
                       	        newCompositeNode(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_19);
+                    pushFollow(FollowSets000.FOLLOW_20);
                     ruleUnrestrictedName();
 
                     state._fsp--;
@@ -9751,12 +9751,12 @@
                         {
                         int LA63_4 = input.LA(2);
 
-                        if ( (LA63_4==23) ) {
-                            alt63=2;
-                        }
-                        else if ( (LA63_4==EOF||(LA63_4>=17 && LA63_4<=18)||LA63_4==21||(LA63_4>=26 && LA63_4<=27)||(LA63_4>=39 && LA63_4<=40)||LA63_4==52||(LA63_4>=55 && LA63_4<=72)||LA63_4==75||(LA63_4>=81 && LA63_4<=82)||(LA63_4>=91 && LA63_4<=92)) ) {
+                        if ( (LA63_4==EOF||(LA63_4>=17 && LA63_4<=18)||LA63_4==21||(LA63_4>=26 && LA63_4<=27)||(LA63_4>=39 && LA63_4<=40)||LA63_4==52||(LA63_4>=55 && LA63_4<=72)||LA63_4==75||(LA63_4>=81 && LA63_4<=82)||(LA63_4>=91 && LA63_4<=92)) ) {
                             alt63=1;
                         }
+                        else if ( (LA63_4==23) ) {
+                            alt63=2;
+                        }
                         else {
                             if (state.backtracking>0) {state.failed=true; return current;}
                             NoViableAltException nvae =
@@ -10060,7 +10060,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
@@ -11026,7 +11026,7 @@
                   	newLeafNode(otherlv_0, grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
 
             }
-            otherlv_1=(Token)match(input,81,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            otherlv_1=(Token)match(input,81,FollowSets000.FOLLOW_15); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -11082,7 +11082,7 @@
             	case 1 :
             	    // InternalCompleteOCL.g:3699:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
             	    {
-            	    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            	    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_15); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	          	newLeafNode(otherlv_3, grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
@@ -11269,7 +11269,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:3764:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                     {
-                    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
@@ -11286,7 +11286,7 @@
                       	        newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_19);
+                    pushFollow(FollowSets000.FOLLOW_20);
                     lv_ownedType_2_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -13710,7 +13710,7 @@
                       	        newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_51);
+                    pushFollow(FollowSets000.FOLLOW_21);
                     lv_name_1_0=ruleUnaryOperatorName();
 
                     state._fsp--;
@@ -14268,7 +14268,7 @@
               	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_52);
+            pushFollow(FollowSets000.FOLLOW_51);
             lv_ownedPathName_0_0=rulePathNameCS();
 
             state._fsp--;
@@ -14315,7 +14315,7 @@
             	      	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_52);
+            	    pushFollow(FollowSets000.FOLLOW_51);
             	    lv_ownedSquareBracketedClauses_1_0=ruleSquareBracketedClauseCS();
 
             	    state._fsp--;
@@ -14364,7 +14364,7 @@
                       	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_53);
+                    pushFollow(FollowSets000.FOLLOW_52);
                     lv_ownedRoundBracketedClause_2_0=ruleRoundBracketedClauseCS();
 
                     state._fsp--;
@@ -14410,7 +14410,7 @@
                       	        newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_54);
+                    pushFollow(FollowSets000.FOLLOW_53);
                     lv_ownedCurlyBracketedClause_3_0=ruleCurlyBracketedClauseCS();
 
                     state._fsp--;
@@ -14454,7 +14454,7 @@
                     // InternalCompleteOCL.g:4888:1: (lv_isPre_4_0= '@' )
                     // InternalCompleteOCL.g:4889:3: lv_isPre_4_0= '@'
                     {
-                    lv_isPre_4_0=(Token)match(input,91,FollowSets000.FOLLOW_55); if (state.failed) return current;
+                    lv_isPre_4_0=(Token)match(input,91,FollowSets000.FOLLOW_54); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                               newLeafNode(lv_isPre_4_0, grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
@@ -14588,7 +14588,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,81,FollowSets000.FOLLOW_56); if (state.failed) return current;
+            otherlv_1=(Token)match(input,81,FollowSets000.FOLLOW_55); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
@@ -14655,7 +14655,7 @@
                     	case 1 :
                     	    // InternalCompleteOCL.g:4958:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                     	    {
-                    	    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,26,FollowSets000.FOLLOW_22); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	          	newLeafNode(otherlv_3, grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
@@ -14822,7 +14822,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_57); if (state.failed) return current;
+            otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_56); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
@@ -14850,7 +14850,7 @@
                       	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_58);
+                    pushFollow(FollowSets000.FOLLOW_57);
                     lv_ownedArguments_2_0=ruleNavigatingArgCS();
 
                     state._fsp--;
@@ -14927,7 +14927,7 @@
                     	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
 
                     	            }
-                    	            pushFollow(FollowSets000.FOLLOW_58);
+                    	            pushFollow(FollowSets000.FOLLOW_57);
                     	            lv_ownedArguments_3_1=ruleNavigatingCommaArgCS();
 
                     	            state._fsp--;
@@ -14956,7 +14956,7 @@
                     	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
 
                     	            }
-                    	            pushFollow(FollowSets000.FOLLOW_58);
+                    	            pushFollow(FollowSets000.FOLLOW_57);
                     	            lv_ownedArguments_3_2=ruleNavigatingSemiArgCS();
 
                     	            state._fsp--;
@@ -14985,7 +14985,7 @@
                     	              	        newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
 
                     	            }
-                    	            pushFollow(FollowSets000.FOLLOW_58);
+                    	            pushFollow(FollowSets000.FOLLOW_57);
                     	            lv_ownedArguments_3_3=ruleNavigatingBarArgCS();
 
                     	            state._fsp--;
@@ -15134,7 +15134,7 @@
               	        newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_59);
+            pushFollow(FollowSets000.FOLLOW_58);
             lv_ownedTerms_1_0=ruleExpCS();
 
             state._fsp--;
@@ -15190,7 +15190,7 @@
             	      	        newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_59);
+            	    pushFollow(FollowSets000.FOLLOW_58);
             	    lv_ownedTerms_3_0=ruleExpCS();
 
             	    state._fsp--;
@@ -15367,7 +15367,7 @@
                       	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_60);
+                    pushFollow(FollowSets000.FOLLOW_59);
                     lv_ownedNameExpression_0_0=ruleNavigatingArgExpCS();
 
                     state._fsp--;
@@ -15401,7 +15401,7 @@
                             // InternalCompleteOCL.g:5199:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                             // InternalCompleteOCL.g:5199:5: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                             {
-                            otherlv_1=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            otherlv_1=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                                   	newLeafNode(otherlv_1, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
@@ -15418,7 +15418,7 @@
                               	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
 
                             }
-                            pushFollow(FollowSets000.FOLLOW_61);
+                            pushFollow(FollowSets000.FOLLOW_60);
                             lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();
 
                             state._fsp--;
@@ -15512,7 +15512,7 @@
                             // InternalCompleteOCL.g:5244:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                             // InternalCompleteOCL.g:5244:8: otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
                             {
-                            otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                            otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                                   	newLeafNode(otherlv_5, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
@@ -15529,7 +15529,7 @@
                               	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
 
                             }
-                            pushFollow(FollowSets000.FOLLOW_62);
+                            pushFollow(FollowSets000.FOLLOW_61);
                             lv_ownedType_6_0=ruleTypeExpCS();
 
                             state._fsp--;
@@ -15564,7 +15564,7 @@
                                 case 1 :
                                     // InternalCompleteOCL.g:5266:4: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                     {
-                                    otherlv_7=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                                    otherlv_7=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
 
                                           	newLeafNode(otherlv_7, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
@@ -15581,7 +15581,7 @@
                                       	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
 
                                     }
-                                    pushFollow(FollowSets000.FOLLOW_61);
+                                    pushFollow(FollowSets000.FOLLOW_60);
                                     lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();
 
                                     state._fsp--;
@@ -15692,7 +15692,7 @@
                                 case 1 :
                                     // InternalCompleteOCL.g:5311:9: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                     {
-                                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
 
                                           	newLeafNode(otherlv_11, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
@@ -15709,7 +15709,7 @@
                                       	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
 
                                     }
-                                    pushFollow(FollowSets000.FOLLOW_63);
+                                    pushFollow(FollowSets000.FOLLOW_62);
                                     lv_ownedType_12_0=ruleTypeExpCS();
 
                                     state._fsp--;
@@ -15750,7 +15750,7 @@
                                 case 1 :
                                     // InternalCompleteOCL.g:5333:6: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                     {
-                                    otherlv_13=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                                    otherlv_13=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
 
                                           	newLeafNode(otherlv_13, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
@@ -15767,7 +15767,7 @@
                                       	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
 
                                     }
-                                    pushFollow(FollowSets000.FOLLOW_64);
+                                    pushFollow(FollowSets000.FOLLOW_63);
                                     lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();
 
                                     state._fsp--;
@@ -15859,7 +15859,7 @@
                     // InternalCompleteOCL.g:5378:6: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                     // InternalCompleteOCL.g:5378:8: otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                     {
-                    otherlv_17=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_17=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_17, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
@@ -15998,7 +15998,7 @@
             // InternalCompleteOCL.g:5422:1: (lv_prefix_0_0= '|' )
             // InternalCompleteOCL.g:5423:3: lv_prefix_0_0= '|'
             {
-            lv_prefix_0_0=(Token)match(input,95,FollowSets000.FOLLOW_65); if (state.failed) return current;
+            lv_prefix_0_0=(Token)match(input,95,FollowSets000.FOLLOW_64); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                       newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
@@ -16029,7 +16029,7 @@
               	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();
 
             state._fsp--;
@@ -16064,7 +16064,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:5454:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                     {
-                    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_2, grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
@@ -16081,7 +16081,7 @@
                       	        newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_61);
+                    pushFollow(FollowSets000.FOLLOW_60);
                     lv_ownedType_3_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -16279,7 +16279,7 @@
             // InternalCompleteOCL.g:5520:1: (lv_prefix_0_0= ',' )
             // InternalCompleteOCL.g:5521:3: lv_prefix_0_0= ','
             {
-            lv_prefix_0_0=(Token)match(input,26,FollowSets000.FOLLOW_65); if (state.failed) return current;
+            lv_prefix_0_0=(Token)match(input,26,FollowSets000.FOLLOW_64); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                       newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
@@ -16310,7 +16310,7 @@
               	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_60);
+            pushFollow(FollowSets000.FOLLOW_59);
             lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();
 
             state._fsp--;
@@ -16344,7 +16344,7 @@
                     // InternalCompleteOCL.g:5552:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                     // InternalCompleteOCL.g:5552:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                     {
-                    otherlv_2=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_2, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
@@ -16361,7 +16361,7 @@
                       	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_61);
+                    pushFollow(FollowSets000.FOLLOW_60);
                     lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();
 
                     state._fsp--;
@@ -16455,7 +16455,7 @@
                     // InternalCompleteOCL.g:5597:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                     // InternalCompleteOCL.g:5597:8: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
                     {
-                    otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_6, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
@@ -16472,7 +16472,7 @@
                       	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_62);
+                    pushFollow(FollowSets000.FOLLOW_61);
                     lv_ownedType_7_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -16507,7 +16507,7 @@
                         case 1 :
                             // InternalCompleteOCL.g:5619:4: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                             {
-                            otherlv_8=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            otherlv_8=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                                   	newLeafNode(otherlv_8, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
@@ -16524,7 +16524,7 @@
                               	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
 
                             }
-                            pushFollow(FollowSets000.FOLLOW_61);
+                            pushFollow(FollowSets000.FOLLOW_60);
                             lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();
 
                             state._fsp--;
@@ -16635,7 +16635,7 @@
                         case 1 :
                             // InternalCompleteOCL.g:5664:9: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                             {
-                            otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                            otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                                   	newLeafNode(otherlv_12, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
@@ -16652,7 +16652,7 @@
                               	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
 
                             }
-                            pushFollow(FollowSets000.FOLLOW_63);
+                            pushFollow(FollowSets000.FOLLOW_62);
                             lv_ownedType_13_0=ruleTypeExpCS();
 
                             state._fsp--;
@@ -16693,7 +16693,7 @@
                         case 1 :
                             // InternalCompleteOCL.g:5686:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                             {
-                            otherlv_14=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            otherlv_14=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                                   	newLeafNode(otherlv_14, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
@@ -16710,7 +16710,7 @@
                               	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
 
                             }
-                            pushFollow(FollowSets000.FOLLOW_64);
+                            pushFollow(FollowSets000.FOLLOW_63);
                             lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();
 
                             state._fsp--;
@@ -16882,7 +16882,7 @@
             // InternalCompleteOCL.g:5752:1: (lv_prefix_0_0= ';' )
             // InternalCompleteOCL.g:5753:3: lv_prefix_0_0= ';'
             {
-            lv_prefix_0_0=(Token)match(input,96,FollowSets000.FOLLOW_65); if (state.failed) return current;
+            lv_prefix_0_0=(Token)match(input,96,FollowSets000.FOLLOW_64); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                       newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
@@ -16913,7 +16913,7 @@
               	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();
 
             state._fsp--;
@@ -16948,7 +16948,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:5784:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                     {
-                    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_2, grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
@@ -16965,7 +16965,7 @@
                       	        newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_61);
+                    pushFollow(FollowSets000.FOLLOW_60);
                     lv_ownedType_3_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -17146,7 +17146,7 @@
               	        newCompositeNode(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_66);
+            pushFollow(FollowSets000.FOLLOW_65);
             lv_name_0_0=ruleUnrestrictedName();
 
             state._fsp--;
@@ -17181,7 +17181,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:5867:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                     {
-                    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
@@ -17393,12 +17393,12 @@
                 {
                 int LA112_3 = input.LA(2);
 
-                if ( (LA112_3==23) ) {
-                    alt112=2;
-                }
-                else if ( ((LA112_3>=17 && LA112_3<=18)||LA112_3==21||LA112_3==27||(LA112_3>=39 && LA112_3<=40)||LA112_3==52||(LA112_3>=55 && LA112_3<=72)||LA112_3==75||LA112_3==81||(LA112_3>=91 && LA112_3<=92)||LA112_3==98) ) {
+                if ( ((LA112_3>=17 && LA112_3<=18)||LA112_3==21||LA112_3==27||(LA112_3>=39 && LA112_3<=40)||LA112_3==52||(LA112_3>=55 && LA112_3<=72)||LA112_3==75||LA112_3==81||(LA112_3>=91 && LA112_3<=92)||LA112_3==98) ) {
                     alt112=1;
                 }
+                else if ( (LA112_3==23) ) {
+                    alt112=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
@@ -17450,12 +17450,12 @@
                 {
                 int LA112_6 = input.LA(2);
 
-                if ( (LA112_6==23) ) {
-                    alt112=2;
-                }
-                else if ( ((LA112_6>=17 && LA112_6<=18)||LA112_6==21||LA112_6==27||(LA112_6>=39 && LA112_6<=40)||LA112_6==52||(LA112_6>=55 && LA112_6<=72)||LA112_6==75||LA112_6==81||(LA112_6>=91 && LA112_6<=92)||LA112_6==98) ) {
+                if ( ((LA112_6>=17 && LA112_6<=18)||LA112_6==21||LA112_6==27||(LA112_6>=39 && LA112_6<=40)||LA112_6==52||(LA112_6>=55 && LA112_6<=72)||LA112_6==75||LA112_6==81||(LA112_6>=91 && LA112_6<=92)||LA112_6==98) ) {
                     alt112=1;
                 }
+                else if ( (LA112_6==23) ) {
+                    alt112=2;
+                }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
@@ -17487,7 +17487,7 @@
                       	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_67);
+                    pushFollow(FollowSets000.FOLLOW_66);
                     lv_ownedCondition_1_1=ruleExpCS();
 
                     state._fsp--;
@@ -17516,7 +17516,7 @@
                       	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_67);
+                    pushFollow(FollowSets000.FOLLOW_66);
                     lv_ownedCondition_1_2=rulePatternExpCS();
 
                     state._fsp--;
@@ -17563,7 +17563,7 @@
               	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_68);
+            pushFollow(FollowSets000.FOLLOW_67);
             lv_ownedThenExpression_3_0=ruleExpCS();
 
             state._fsp--;
@@ -17610,7 +17610,7 @@
             	      	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_68);
+            	    pushFollow(FollowSets000.FOLLOW_67);
             	    lv_ownedIfThenExpressions_4_0=ruleElseIfThenExpCS();
 
             	    state._fsp--;
@@ -17657,7 +17657,7 @@
               	        newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_69);
+            pushFollow(FollowSets000.FOLLOW_68);
             lv_ownedElseExpression_6_0=ruleExpCS();
 
             state._fsp--;
@@ -17787,7 +17787,7 @@
               	        newCompositeNode(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_67);
+            pushFollow(FollowSets000.FOLLOW_66);
             lv_ownedCondition_1_0=ruleExpCS();
 
             state._fsp--;
@@ -17938,7 +17938,7 @@
             // InternalCompleteOCL.g:6102:1: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
             // InternalCompleteOCL.g:6102:3: otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) )
             {
-            otherlv_0=(Token)match(input,102,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            otherlv_0=(Token)match(input,102,FollowSets000.FOLLOW_15); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_0, grammarAccess.getLetExpCSAccess().getLetKeyword_0());
@@ -17955,7 +17955,7 @@
               	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_70);
+            pushFollow(FollowSets000.FOLLOW_69);
             lv_ownedVariables_1_0=ruleLetVariableCS();
 
             state._fsp--;
@@ -17994,7 +17994,7 @@
             	case 1 :
             	    // InternalCompleteOCL.g:6124:4: otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
             	    {
-            	    otherlv_2=(Token)match(input,26,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            	    otherlv_2=(Token)match(input,26,FollowSets000.FOLLOW_15); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	          	newLeafNode(otherlv_2, grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
@@ -18011,7 +18011,7 @@
             	      	        newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_70);
+            	    pushFollow(FollowSets000.FOLLOW_69);
             	    lv_ownedVariables_3_0=ruleLetVariableCS();
 
             	    state._fsp--;
@@ -18183,7 +18183,7 @@
               	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_71);
+            pushFollow(FollowSets000.FOLLOW_70);
             lv_name_0_0=ruleUnrestrictedName();
 
             state._fsp--;
@@ -18264,7 +18264,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:6225:5: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                     {
-                    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_2, grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
@@ -18281,7 +18281,7 @@
                       	        newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_19);
+                    pushFollow(FollowSets000.FOLLOW_20);
                     lv_ownedType_3_0=ruleTypeExpCS();
 
                     state._fsp--;
@@ -18710,7 +18710,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:6389:4: otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) )
                     {
-                    otherlv_1=(Token)match(input,83,FollowSets000.FOLLOW_72); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,83,FollowSets000.FOLLOW_71); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
@@ -18842,7 +18842,7 @@
             // InternalCompleteOCL.g:6432:1: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
             // InternalCompleteOCL.g:6432:3: otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']'
             {
-            otherlv_0=(Token)match(input,92,FollowSets000.FOLLOW_73); if (state.failed) return current;
+            otherlv_0=(Token)match(input,92,FollowSets000.FOLLOW_72); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_0, grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
@@ -18879,7 +18879,7 @@
                               newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_74);
+                    pushFollow(FollowSets000.FOLLOW_73);
                     this_MultiplicityBoundsCS_1=ruleMultiplicityBoundsCS();
 
                     state._fsp--;
@@ -18906,7 +18906,7 @@
                               newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_74);
+                    pushFollow(FollowSets000.FOLLOW_73);
                     this_MultiplicityStringCS_2=ruleMultiplicityStringCS();
 
                     state._fsp--;
@@ -18937,7 +18937,7 @@
                 case 1 :
                     // InternalCompleteOCL.g:6461:4: otherlv_3= '|?'
                     {
-                    otherlv_3=(Token)match(input,104,FollowSets000.FOLLOW_75); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,104,FollowSets000.FOLLOW_74); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_3, grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
@@ -18955,7 +18955,7 @@
                     // InternalCompleteOCL.g:6467:1: (lv_isNullFree_4_0= '|1' )
                     // InternalCompleteOCL.g:6468:3: lv_isNullFree_4_0= '|1'
                     {
-                    lv_isNullFree_4_0=(Token)match(input,105,FollowSets000.FOLLOW_75); if (state.failed) return current;
+                    lv_isNullFree_4_0=(Token)match(input,105,FollowSets000.FOLLOW_74); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                               newLeafNode(lv_isNullFree_4_0, grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
@@ -19256,7 +19256,7 @@
               	        newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_30);
+            pushFollow(FollowSets000.FOLLOW_31);
             lv_ownedPathElements_0_0=ruleFirstPathElementCS();
 
             state._fsp--;
@@ -19295,7 +19295,7 @@
             	case 1 :
             	    // InternalCompleteOCL.g:6587:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
             	    {
-            	    otherlv_1=(Token)match(input,75,FollowSets000.FOLLOW_31); if (state.failed) return current;
+            	    otherlv_1=(Token)match(input,75,FollowSets000.FOLLOW_5); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	          	newLeafNode(otherlv_1, grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
@@ -19312,7 +19312,7 @@
             	      	        newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_30);
+            	    pushFollow(FollowSets000.FOLLOW_31);
             	    lv_ownedPathElements_2_0=ruleNextPathElementCS();
 
             	    state._fsp--;
@@ -19367,8 +19367,190 @@
     // $ANTLR end "rulePathNameCS"
 
 
+    // $ANTLR start "entryRuleUnreservedPathNameCS"
+    // InternalCompleteOCL.g:6617:1: entryRuleUnreservedPathNameCS returns [EObject current=null] : iv_ruleUnreservedPathNameCS= ruleUnreservedPathNameCS EOF ;
+    public final EObject entryRuleUnreservedPathNameCS() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUnreservedPathNameCS = null;
+
+
+        try {
+            // InternalCompleteOCL.g:6618:2: (iv_ruleUnreservedPathNameCS= ruleUnreservedPathNameCS EOF )
+            // InternalCompleteOCL.g:6619:2: iv_ruleUnreservedPathNameCS= ruleUnreservedPathNameCS EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnreservedPathNameCSRule());
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnreservedPathNameCS=ruleUnreservedPathNameCS();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnreservedPathNameCS;
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnreservedPathNameCS"
+
+
+    // $ANTLR start "ruleUnreservedPathNameCS"
+    // InternalCompleteOCL.g:6626:1: ruleUnreservedPathNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleNextPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) ;
+    public final EObject ruleUnreservedPathNameCS() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_ownedPathElements_0_0 = null;
+
+        EObject lv_ownedPathElements_2_0 = null;
+
+
+         enterRule();
+
+        try {
+            // InternalCompleteOCL.g:6629:28: ( ( ( (lv_ownedPathElements_0_0= ruleNextPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
+            // InternalCompleteOCL.g:6630:1: ( ( (lv_ownedPathElements_0_0= ruleNextPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
+            {
+            // InternalCompleteOCL.g:6630:1: ( ( (lv_ownedPathElements_0_0= ruleNextPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
+            // InternalCompleteOCL.g:6630:2: ( (lv_ownedPathElements_0_0= ruleNextPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
+            {
+            // InternalCompleteOCL.g:6630:2: ( (lv_ownedPathElements_0_0= ruleNextPathElementCS ) )
+            // InternalCompleteOCL.g:6631:1: (lv_ownedPathElements_0_0= ruleNextPathElementCS )
+            {
+            // InternalCompleteOCL.g:6631:1: (lv_ownedPathElements_0_0= ruleNextPathElementCS )
+            // InternalCompleteOCL.g:6632:3: lv_ownedPathElements_0_0= ruleNextPathElementCS
+            {
+            if ( state.backtracking==0 ) {
+
+              	        newCompositeNode(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_0_0());
+
+            }
+            pushFollow(FollowSets000.FOLLOW_31);
+            lv_ownedPathElements_0_0=ruleNextPathElementCS();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElementForParent(grammarAccess.getUnreservedPathNameCSRule());
+              	        }
+                     		add(
+                     			current,
+                     			"ownedPathElements",
+                      		lv_ownedPathElements_0_0,
+                      		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
+              	        afterParserOrEnumRuleCall();
+
+            }
+
+            }
+
+
+            }
+
+            // InternalCompleteOCL.g:6648:2: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
+            loop122:
+            do {
+                int alt122=2;
+                int LA122_0 = input.LA(1);
+
+                if ( (LA122_0==75) ) {
+                    alt122=1;
+                }
+
+
+                switch (alt122) {
+            	case 1 :
+            	    // InternalCompleteOCL.g:6648:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
+            	    {
+            	    otherlv_1=(Token)match(input,75,FollowSets000.FOLLOW_5); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	          	newLeafNode(otherlv_1, grammarAccess.getUnreservedPathNameCSAccess().getColonColonKeyword_1_0());
+
+            	    }
+            	    // InternalCompleteOCL.g:6652:1: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
+            	    // InternalCompleteOCL.g:6653:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
+            	    {
+            	    // InternalCompleteOCL.g:6653:1: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
+            	    // InternalCompleteOCL.g:6654:3: lv_ownedPathElements_2_0= ruleNextPathElementCS
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      	        newCompositeNode(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
+
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_31);
+            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      	        if (current==null) {
+            	      	            current = createModelElementForParent(grammarAccess.getUnreservedPathNameCSRule());
+            	      	        }
+            	             		add(
+            	             			current,
+            	             			"ownedPathElements",
+            	              		lv_ownedPathElements_2_0,
+            	              		"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
+            	      	        afterParserOrEnumRuleCall();
+
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop122;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule();
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnreservedPathNameCS"
+
+
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalCompleteOCL.g:6617:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
+    // InternalCompleteOCL.g:6678:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
     public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -19376,8 +19558,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6618:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
-            // InternalCompleteOCL.g:6619:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
+            // InternalCompleteOCL.g:6679:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
+            // InternalCompleteOCL.g:6680:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFirstPathElementCSRule());
@@ -19408,21 +19590,21 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalCompleteOCL.g:6626:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
+    // InternalCompleteOCL.g:6687:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
     public final EObject ruleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6629:28: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalCompleteOCL.g:6630:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:6690:28: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalCompleteOCL.g:6691:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalCompleteOCL.g:6630:1: ( ( ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:6631:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:6691:1: ( ( ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:6692:1: ( ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:6631:1: ( ruleUnrestrictedName )
-            // InternalCompleteOCL.g:6632:3: ruleUnrestrictedName
+            // InternalCompleteOCL.g:6692:1: ( ruleUnrestrictedName )
+            // InternalCompleteOCL.g:6693:3: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -19477,7 +19659,7 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalCompleteOCL.g:6656:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
+    // InternalCompleteOCL.g:6717:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
     public final EObject entryRuleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -19485,8 +19667,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6657:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
-            // InternalCompleteOCL.g:6658:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
+            // InternalCompleteOCL.g:6718:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
+            // InternalCompleteOCL.g:6719:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNextPathElementCSRule());
@@ -19517,21 +19699,21 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalCompleteOCL.g:6665:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
+    // InternalCompleteOCL.g:6726:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
     public final EObject ruleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6668:28: ( ( ( ruleUnreservedName ) ) )
-            // InternalCompleteOCL.g:6669:1: ( ( ruleUnreservedName ) )
+            // InternalCompleteOCL.g:6729:28: ( ( ( ruleUnreservedName ) ) )
+            // InternalCompleteOCL.g:6730:1: ( ( ruleUnreservedName ) )
             {
-            // InternalCompleteOCL.g:6669:1: ( ( ruleUnreservedName ) )
-            // InternalCompleteOCL.g:6670:1: ( ruleUnreservedName )
+            // InternalCompleteOCL.g:6730:1: ( ( ruleUnreservedName ) )
+            // InternalCompleteOCL.g:6731:1: ( ruleUnreservedName )
             {
-            // InternalCompleteOCL.g:6670:1: ( ruleUnreservedName )
-            // InternalCompleteOCL.g:6671:3: ruleUnreservedName
+            // InternalCompleteOCL.g:6731:1: ( ruleUnreservedName )
+            // InternalCompleteOCL.g:6732:3: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
 
@@ -19586,7 +19768,7 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalCompleteOCL.g:6695:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
+    // InternalCompleteOCL.g:6756:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
     public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -19594,8 +19776,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6696:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
-            // InternalCompleteOCL.g:6697:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
+            // InternalCompleteOCL.g:6757:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
+            // InternalCompleteOCL.g:6758:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateBindingCSRule());
@@ -19626,7 +19808,7 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalCompleteOCL.g:6704:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
+    // InternalCompleteOCL.g:6765:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
     public final EObject ruleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -19641,24 +19823,24 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6707:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
-            // InternalCompleteOCL.g:6708:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalCompleteOCL.g:6768:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
+            // InternalCompleteOCL.g:6769:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
             {
-            // InternalCompleteOCL.g:6708:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
-            // InternalCompleteOCL.g:6708:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalCompleteOCL.g:6769:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalCompleteOCL.g:6769:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             {
-            // InternalCompleteOCL.g:6708:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
-            // InternalCompleteOCL.g:6709:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalCompleteOCL.g:6769:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
+            // InternalCompleteOCL.g:6770:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
             {
-            // InternalCompleteOCL.g:6709:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
-            // InternalCompleteOCL.g:6710:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
+            // InternalCompleteOCL.g:6770:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalCompleteOCL.g:6771:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
 
               	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_76);
+            pushFollow(FollowSets000.FOLLOW_75);
             lv_ownedSubstitutions_0_0=ruleTemplateParameterSubstitutionCS();
 
             state._fsp--;
@@ -19682,39 +19864,39 @@
 
             }
 
-            // InternalCompleteOCL.g:6726:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
-            loop122:
+            // InternalCompleteOCL.g:6787:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
+            loop123:
             do {
-                int alt122=2;
-                int LA122_0 = input.LA(1);
+                int alt123=2;
+                int LA123_0 = input.LA(1);
 
-                if ( (LA122_0==26) ) {
-                    alt122=1;
+                if ( (LA123_0==26) ) {
+                    alt123=1;
                 }
 
 
-                switch (alt122) {
+                switch (alt123) {
             	case 1 :
-            	    // InternalCompleteOCL.g:6726:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalCompleteOCL.g:6787:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
             	    {
-            	    otherlv_1=(Token)match(input,26,FollowSets000.FOLLOW_77); if (state.failed) return current;
+            	    otherlv_1=(Token)match(input,26,FollowSets000.FOLLOW_76); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
 
             	    }
-            	    // InternalCompleteOCL.g:6730:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
-            	    // InternalCompleteOCL.g:6731:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalCompleteOCL.g:6791:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalCompleteOCL.g:6792:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
             	    {
-            	    // InternalCompleteOCL.g:6731:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
-            	    // InternalCompleteOCL.g:6732:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
+            	    // InternalCompleteOCL.g:6792:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalCompleteOCL.g:6793:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      	        newCompositeNode(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
 
             	    }
-            	    pushFollow(FollowSets000.FOLLOW_76);
+            	    pushFollow(FollowSets000.FOLLOW_75);
             	    lv_ownedSubstitutions_2_0=ruleTemplateParameterSubstitutionCS();
 
             	    state._fsp--;
@@ -19743,23 +19925,23 @@
             	    break;
 
             	default :
-            	    break loop122;
+            	    break loop123;
                 }
             } while (true);
 
-            // InternalCompleteOCL.g:6748:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
-            int alt123=2;
-            int LA123_0 = input.LA(1);
+            // InternalCompleteOCL.g:6809:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            int alt124=2;
+            int LA124_0 = input.LA(1);
 
-            if ( (LA123_0==92) ) {
-                alt123=1;
+            if ( (LA124_0==92) ) {
+                alt124=1;
             }
-            switch (alt123) {
+            switch (alt124) {
                 case 1 :
-                    // InternalCompleteOCL.g:6749:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalCompleteOCL.g:6810:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                     {
-                    // InternalCompleteOCL.g:6749:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
-                    // InternalCompleteOCL.g:6750:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
+                    // InternalCompleteOCL.g:6810:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalCompleteOCL.g:6811:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19816,7 +19998,7 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalCompleteOCL.g:6774:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalCompleteOCL.g:6835:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
     public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -19824,8 +20006,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6775:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
-            // InternalCompleteOCL.g:6776:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
+            // InternalCompleteOCL.g:6836:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
+            // InternalCompleteOCL.g:6837:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -19856,7 +20038,7 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalCompleteOCL.g:6783:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
+    // InternalCompleteOCL.g:6844:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
     public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -19866,14 +20048,14 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6786:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
-            // InternalCompleteOCL.g:6787:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalCompleteOCL.g:6847:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
+            // InternalCompleteOCL.g:6848:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
             {
-            // InternalCompleteOCL.g:6787:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
-            // InternalCompleteOCL.g:6788:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalCompleteOCL.g:6848:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalCompleteOCL.g:6849:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
             {
-            // InternalCompleteOCL.g:6788:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
-            // InternalCompleteOCL.g:6789:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
+            // InternalCompleteOCL.g:6849:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalCompleteOCL.g:6850:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -19924,7 +20106,7 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalCompleteOCL.g:6813:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
+    // InternalCompleteOCL.g:6874:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
     public final EObject entryRuleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -19932,8 +20114,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6814:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
-            // InternalCompleteOCL.g:6815:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
+            // InternalCompleteOCL.g:6875:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
+            // InternalCompleteOCL.g:6876:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeParameterCSRule());
@@ -19964,7 +20146,7 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalCompleteOCL.g:6822:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
+    // InternalCompleteOCL.g:6883:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
     public final EObject ruleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -19980,24 +20162,24 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6825:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
-            // InternalCompleteOCL.g:6826:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalCompleteOCL.g:6886:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
+            // InternalCompleteOCL.g:6887:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
             {
-            // InternalCompleteOCL.g:6826:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
-            // InternalCompleteOCL.g:6826:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalCompleteOCL.g:6887:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalCompleteOCL.g:6887:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             {
-            // InternalCompleteOCL.g:6826:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
-            // InternalCompleteOCL.g:6827:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalCompleteOCL.g:6887:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
+            // InternalCompleteOCL.g:6888:1: (lv_name_0_0= ruleUnrestrictedName )
             {
-            // InternalCompleteOCL.g:6827:1: (lv_name_0_0= ruleUnrestrictedName )
-            // InternalCompleteOCL.g:6828:3: lv_name_0_0= ruleUnrestrictedName
+            // InternalCompleteOCL.g:6888:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalCompleteOCL.g:6889:3: lv_name_0_0= ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
               	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
 
             }
-            pushFollow(FollowSets000.FOLLOW_78);
+            pushFollow(FollowSets000.FOLLOW_77);
             lv_name_0_0=ruleUnrestrictedName();
 
             state._fsp--;
@@ -20021,35 +20203,35 @@
 
             }
 
-            // InternalCompleteOCL.g:6844:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
-            int alt125=2;
-            int LA125_0 = input.LA(1);
+            // InternalCompleteOCL.g:6905:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            int alt126=2;
+            int LA126_0 = input.LA(1);
 
-            if ( (LA125_0==106) ) {
-                alt125=1;
+            if ( (LA126_0==106) ) {
+                alt126=1;
             }
-            switch (alt125) {
+            switch (alt126) {
                 case 1 :
-                    // InternalCompleteOCL.g:6844:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalCompleteOCL.g:6905:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     {
-                    otherlv_1=(Token)match(input,106,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,106,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
 
                     }
-                    // InternalCompleteOCL.g:6848:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
-                    // InternalCompleteOCL.g:6849:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalCompleteOCL.g:6909:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
+                    // InternalCompleteOCL.g:6910:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                     {
-                    // InternalCompleteOCL.g:6849:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
-                    // InternalCompleteOCL.g:6850:3: lv_ownedExtends_2_0= ruleTypedRefCS
+                    // InternalCompleteOCL.g:6910:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalCompleteOCL.g:6911:3: lv_ownedExtends_2_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
                       	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
 
                     }
-                    pushFollow(FollowSets000.FOLLOW_79);
+                    pushFollow(FollowSets000.FOLLOW_78);
                     lv_ownedExtends_2_0=ruleTypedRefCS();
 
                     state._fsp--;
@@ -20073,39 +20255,39 @@
 
                     }
 
-                    // InternalCompleteOCL.g:6866:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
-                    loop124:
+                    // InternalCompleteOCL.g:6927:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    loop125:
                     do {
-                        int alt124=2;
-                        int LA124_0 = input.LA(1);
+                        int alt125=2;
+                        int LA125_0 = input.LA(1);
 
-                        if ( (LA124_0==107) ) {
-                            alt124=1;
+                        if ( (LA125_0==107) ) {
+                            alt125=1;
                         }
 
 
-                        switch (alt124) {
+                        switch (alt125) {
                     	case 1 :
-                    	    // InternalCompleteOCL.g:6866:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalCompleteOCL.g:6927:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                     	    {
-                    	    otherlv_3=(Token)match(input,107,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,107,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
 
                     	    }
-                    	    // InternalCompleteOCL.g:6870:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
-                    	    // InternalCompleteOCL.g:6871:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalCompleteOCL.g:6931:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalCompleteOCL.g:6932:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                     	    {
-                    	    // InternalCompleteOCL.g:6871:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
-                    	    // InternalCompleteOCL.g:6872:3: lv_ownedExtends_4_0= ruleTypedRefCS
+                    	    // InternalCompleteOCL.g:6932:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalCompleteOCL.g:6933:3: lv_ownedExtends_4_0= ruleTypedRefCS
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      	        newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
 
                     	    }
-                    	    pushFollow(FollowSets000.FOLLOW_79);
+                    	    pushFollow(FollowSets000.FOLLOW_78);
                     	    lv_ownedExtends_4_0=ruleTypedRefCS();
 
                     	    state._fsp--;
@@ -20134,7 +20316,7 @@
                     	    break;
 
                     	default :
-                    	    break loop124;
+                    	    break loop125;
                         }
                     } while (true);
 
@@ -20167,7 +20349,7 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalCompleteOCL.g:6896:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
+    // InternalCompleteOCL.g:6957:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
     public final EObject entryRuleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -20175,8 +20357,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6897:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
-            // InternalCompleteOCL.g:6898:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
+            // InternalCompleteOCL.g:6958:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
+            // InternalCompleteOCL.g:6959:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeRefCSRule());
@@ -20207,7 +20389,7 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalCompleteOCL.g:6905:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
+    // InternalCompleteOCL.g:6966:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
     public final EObject ruleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -20219,29 +20401,29 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6908:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
-            // InternalCompleteOCL.g:6909:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalCompleteOCL.g:6969:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
+            // InternalCompleteOCL.g:6970:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             {
-            // InternalCompleteOCL.g:6909:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
-            int alt126=2;
-            int LA126_0 = input.LA(1);
+            // InternalCompleteOCL.g:6970:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            int alt127=2;
+            int LA127_0 = input.LA(1);
 
-            if ( ((LA126_0>=RULE_SIMPLE_ID && LA126_0<=RULE_ESCAPED_ID)||(LA126_0>=28 && LA126_0<=30)||(LA126_0>=42 && LA126_0<=51)||(LA126_0>=73 && LA126_0<=74)||(LA126_0>=76 && LA126_0<=80)) ) {
-                alt126=1;
+            if ( ((LA127_0>=RULE_SIMPLE_ID && LA127_0<=RULE_ESCAPED_ID)||(LA127_0>=28 && LA127_0<=30)||(LA127_0>=42 && LA127_0<=51)||(LA127_0>=73 && LA127_0<=74)||(LA127_0>=76 && LA127_0<=80)) ) {
+                alt127=1;
             }
-            else if ( (LA126_0==41) ) {
-                alt126=2;
+            else if ( (LA127_0==41) ) {
+                alt127=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 126, 0, input);
+                    new NoViableAltException("", 127, 0, input);
 
                 throw nvae;
             }
-            switch (alt126) {
+            switch (alt127) {
                 case 1 :
-                    // InternalCompleteOCL.g:6910:2: this_TypedRefCS_0= ruleTypedRefCS
+                    // InternalCompleteOCL.g:6971:2: this_TypedRefCS_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20268,7 +20450,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:6923:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
+                    // InternalCompleteOCL.g:6984:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20317,7 +20499,7 @@
 
 
     // $ANTLR start "entryRuleTypedTypeRefCS"
-    // InternalCompleteOCL.g:6942:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
+    // InternalCompleteOCL.g:7003:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
     public final EObject entryRuleTypedTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -20325,8 +20507,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:6943:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
-            // InternalCompleteOCL.g:6944:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
+            // InternalCompleteOCL.g:7004:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
+            // InternalCompleteOCL.g:7005:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypedTypeRefCSRule());
@@ -20357,7 +20539,7 @@
 
 
     // $ANTLR start "ruleTypedTypeRefCS"
-    // InternalCompleteOCL.g:6951:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
+    // InternalCompleteOCL.g:7012:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
     public final EObject ruleTypedTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -20371,17 +20553,17 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:6954:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
-            // InternalCompleteOCL.g:6955:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
+            // InternalCompleteOCL.g:7015:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
+            // InternalCompleteOCL.g:7016:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
             {
-            // InternalCompleteOCL.g:6955:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
-            // InternalCompleteOCL.g:6955:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
+            // InternalCompleteOCL.g:7016:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
+            // InternalCompleteOCL.g:7016:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
             {
-            // InternalCompleteOCL.g:6955:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
-            // InternalCompleteOCL.g:6956:1: (lv_ownedPathName_0_0= rulePathNameCS )
+            // InternalCompleteOCL.g:7016:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
+            // InternalCompleteOCL.g:7017:1: (lv_ownedPathName_0_0= rulePathNameCS )
             {
-            // InternalCompleteOCL.g:6956:1: (lv_ownedPathName_0_0= rulePathNameCS )
-            // InternalCompleteOCL.g:6957:3: lv_ownedPathName_0_0= rulePathNameCS
+            // InternalCompleteOCL.g:7017:1: (lv_ownedPathName_0_0= rulePathNameCS )
+            // InternalCompleteOCL.g:7018:3: lv_ownedPathName_0_0= rulePathNameCS
             {
             if ( state.backtracking==0 ) {
 
@@ -20412,28 +20594,28 @@
 
             }
 
-            // InternalCompleteOCL.g:6973:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
-            int alt127=2;
-            int LA127_0 = input.LA(1);
+            // InternalCompleteOCL.g:7034:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
+            int alt128=2;
+            int LA128_0 = input.LA(1);
 
-            if ( (LA127_0==21) ) {
-                alt127=1;
+            if ( (LA128_0==21) ) {
+                alt128=1;
             }
-            switch (alt127) {
+            switch (alt128) {
                 case 1 :
-                    // InternalCompleteOCL.g:6973:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
+                    // InternalCompleteOCL.g:7034:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
                     {
-                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_77); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_76); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_1, grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());
 
                     }
-                    // InternalCompleteOCL.g:6977:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
-                    // InternalCompleteOCL.g:6978:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
+                    // InternalCompleteOCL.g:7038:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
+                    // InternalCompleteOCL.g:7039:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                     {
-                    // InternalCompleteOCL.g:6978:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
-                    // InternalCompleteOCL.g:6979:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
+                    // InternalCompleteOCL.g:7039:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
+                    // InternalCompleteOCL.g:7040:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20499,7 +20681,7 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalCompleteOCL.g:7007:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
+    // InternalCompleteOCL.g:7068:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
     public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -20507,8 +20689,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7008:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
-            // InternalCompleteOCL.g:7009:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
+            // InternalCompleteOCL.g:7069:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
+            // InternalCompleteOCL.g:7070:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
@@ -20539,7 +20721,7 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalCompleteOCL.g:7016:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
+    // InternalCompleteOCL.g:7077:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
     public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -20551,14 +20733,14 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7019:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
-            // InternalCompleteOCL.g:7020:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalCompleteOCL.g:7080:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
+            // InternalCompleteOCL.g:7081:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
             {
-            // InternalCompleteOCL.g:7020:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
-            // InternalCompleteOCL.g:7020:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalCompleteOCL.g:7081:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalCompleteOCL.g:7081:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             {
-            // InternalCompleteOCL.g:7020:2: ()
-            // InternalCompleteOCL.g:7021:2:
+            // InternalCompleteOCL.g:7081:2: ()
+            // InternalCompleteOCL.g:7082:2:
             {
             if ( state.backtracking==0 ) {
 
@@ -20575,34 +20757,34 @@
 
             }
 
-            otherlv_1=(Token)match(input,41,FollowSets000.FOLLOW_78); if (state.failed) return current;
+            otherlv_1=(Token)match(input,41,FollowSets000.FOLLOW_77); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
                   	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
 
             }
-            // InternalCompleteOCL.g:7033:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
-            int alt128=2;
-            int LA128_0 = input.LA(1);
+            // InternalCompleteOCL.g:7094:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            int alt129=2;
+            int LA129_0 = input.LA(1);
 
-            if ( (LA128_0==106) ) {
-                alt128=1;
+            if ( (LA129_0==106) ) {
+                alt129=1;
             }
-            switch (alt128) {
+            switch (alt129) {
                 case 1 :
-                    // InternalCompleteOCL.g:7033:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalCompleteOCL.g:7094:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                     {
-                    otherlv_2=(Token)match(input,106,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,106,FollowSets000.FOLLOW_21); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                           	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
 
                     }
-                    // InternalCompleteOCL.g:7037:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
-                    // InternalCompleteOCL.g:7038:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalCompleteOCL.g:7098:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalCompleteOCL.g:7099:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                     {
-                    // InternalCompleteOCL.g:7038:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
-                    // InternalCompleteOCL.g:7039:3: lv_ownedExtends_3_0= ruleTypedRefCS
+                    // InternalCompleteOCL.g:7099:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalCompleteOCL.g:7100:3: lv_ownedExtends_3_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20662,7 +20844,7 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalCompleteOCL.g:7063:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
+    // InternalCompleteOCL.g:7124:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
     public final String entryRuleID() throws RecognitionException {
         String current = null;
 
@@ -20670,8 +20852,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7064:2: (iv_ruleID= ruleID EOF )
-            // InternalCompleteOCL.g:7065:2: iv_ruleID= ruleID EOF
+            // InternalCompleteOCL.g:7125:2: (iv_ruleID= ruleID EOF )
+            // InternalCompleteOCL.g:7126:2: iv_ruleID= ruleID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIDRule());
@@ -20702,7 +20884,7 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalCompleteOCL.g:7072:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
+    // InternalCompleteOCL.g:7133:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
     public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -20712,29 +20894,29 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7075:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
-            // InternalCompleteOCL.g:7076:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalCompleteOCL.g:7136:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
+            // InternalCompleteOCL.g:7137:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             {
-            // InternalCompleteOCL.g:7076:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
-            int alt129=2;
-            int LA129_0 = input.LA(1);
+            // InternalCompleteOCL.g:7137:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            int alt130=2;
+            int LA130_0 = input.LA(1);
 
-            if ( (LA129_0==RULE_SIMPLE_ID) ) {
-                alt129=1;
+            if ( (LA130_0==RULE_SIMPLE_ID) ) {
+                alt130=1;
             }
-            else if ( (LA129_0==RULE_ESCAPED_ID) ) {
-                alt129=2;
+            else if ( (LA130_0==RULE_ESCAPED_ID) ) {
+                alt130=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 129, 0, input);
+                    new NoViableAltException("", 130, 0, input);
 
                 throw nvae;
             }
-            switch (alt129) {
+            switch (alt130) {
                 case 1 :
-                    // InternalCompleteOCL.g:7076:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
+                    // InternalCompleteOCL.g:7137:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                     {
                     this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -20751,7 +20933,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:7084:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
+                    // InternalCompleteOCL.g:7145:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                     {
                     this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -20790,7 +20972,7 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalCompleteOCL.g:7099:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
+    // InternalCompleteOCL.g:7160:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
     public final String entryRuleIdentifier() throws RecognitionException {
         String current = null;
 
@@ -20798,8 +20980,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7100:2: (iv_ruleIdentifier= ruleIdentifier EOF )
-            // InternalCompleteOCL.g:7101:2: iv_ruleIdentifier= ruleIdentifier EOF
+            // InternalCompleteOCL.g:7161:2: (iv_ruleIdentifier= ruleIdentifier EOF )
+            // InternalCompleteOCL.g:7162:2: iv_ruleIdentifier= ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIdentifierRule());
@@ -20830,7 +21012,7 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalCompleteOCL.g:7108:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
+    // InternalCompleteOCL.g:7169:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
     public final AntlrDatatypeRuleToken ruleIdentifier() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -20840,8 +21022,8 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7111:28: (this_ID_0= ruleID )
-            // InternalCompleteOCL.g:7113:5: this_ID_0= ruleID
+            // InternalCompleteOCL.g:7172:28: (this_ID_0= ruleID )
+            // InternalCompleteOCL.g:7174:5: this_ID_0= ruleID
             {
             if ( state.backtracking==0 ) {
 
@@ -20883,7 +21065,7 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalCompleteOCL.g:7131:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
+    // InternalCompleteOCL.g:7192:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
     public final String entryRuleLOWER() throws RecognitionException {
         String current = null;
 
@@ -20891,8 +21073,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7132:2: (iv_ruleLOWER= ruleLOWER EOF )
-            // InternalCompleteOCL.g:7133:2: iv_ruleLOWER= ruleLOWER EOF
+            // InternalCompleteOCL.g:7193:2: (iv_ruleLOWER= ruleLOWER EOF )
+            // InternalCompleteOCL.g:7194:2: iv_ruleLOWER= ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLOWERRule());
@@ -20923,7 +21105,7 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalCompleteOCL.g:7140:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalCompleteOCL.g:7201:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -20932,8 +21114,8 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7143:28: (this_INT_0= RULE_INT )
-            // InternalCompleteOCL.g:7144:5: this_INT_0= RULE_INT
+            // InternalCompleteOCL.g:7204:28: (this_INT_0= RULE_INT )
+            // InternalCompleteOCL.g:7205:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -20966,7 +21148,7 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalCompleteOCL.g:7159:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
+    // InternalCompleteOCL.g:7220:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
     public final String entryRuleNUMBER_LITERAL() throws RecognitionException {
         String current = null;
 
@@ -20974,8 +21156,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7160:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
-            // InternalCompleteOCL.g:7161:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
+            // InternalCompleteOCL.g:7221:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
+            // InternalCompleteOCL.g:7222:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNUMBER_LITERALRule());
@@ -21006,7 +21188,7 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalCompleteOCL.g:7168:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalCompleteOCL.g:7229:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleNUMBER_LITERAL() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21015,8 +21197,8 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7171:28: (this_INT_0= RULE_INT )
-            // InternalCompleteOCL.g:7172:5: this_INT_0= RULE_INT
+            // InternalCompleteOCL.g:7232:28: (this_INT_0= RULE_INT )
+            // InternalCompleteOCL.g:7233:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -21049,7 +21231,7 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalCompleteOCL.g:7187:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
+    // InternalCompleteOCL.g:7248:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
     public final String entryRuleStringLiteral() throws RecognitionException {
         String current = null;
 
@@ -21057,8 +21239,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7188:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
-            // InternalCompleteOCL.g:7189:2: iv_ruleStringLiteral= ruleStringLiteral EOF
+            // InternalCompleteOCL.g:7249:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
+            // InternalCompleteOCL.g:7250:2: iv_ruleStringLiteral= ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getStringLiteralRule());
@@ -21089,7 +21271,7 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalCompleteOCL.g:7196:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalCompleteOCL.g:7257:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleStringLiteral() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21098,8 +21280,8 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7199:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalCompleteOCL.g:7200:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalCompleteOCL.g:7260:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:7261:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -21132,7 +21314,7 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalCompleteOCL.g:7215:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
+    // InternalCompleteOCL.g:7276:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
     public final String entryRuleUPPER() throws RecognitionException {
         String current = null;
 
@@ -21140,8 +21322,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7216:2: (iv_ruleUPPER= ruleUPPER EOF )
-            // InternalCompleteOCL.g:7217:2: iv_ruleUPPER= ruleUPPER EOF
+            // InternalCompleteOCL.g:7277:2: (iv_ruleUPPER= ruleUPPER EOF )
+            // InternalCompleteOCL.g:7278:2: iv_ruleUPPER= ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUPPERRule());
@@ -21172,7 +21354,7 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalCompleteOCL.g:7224:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
+    // InternalCompleteOCL.g:7285:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21182,29 +21364,29 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7227:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
-            // InternalCompleteOCL.g:7228:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalCompleteOCL.g:7288:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
+            // InternalCompleteOCL.g:7289:1: (this_INT_0= RULE_INT | kw= '*' )
             {
-            // InternalCompleteOCL.g:7228:1: (this_INT_0= RULE_INT | kw= '*' )
-            int alt130=2;
-            int LA130_0 = input.LA(1);
+            // InternalCompleteOCL.g:7289:1: (this_INT_0= RULE_INT | kw= '*' )
+            int alt131=2;
+            int LA131_0 = input.LA(1);
 
-            if ( (LA130_0==RULE_INT) ) {
-                alt130=1;
+            if ( (LA131_0==RULE_INT) ) {
+                alt131=1;
             }
-            else if ( (LA130_0==55) ) {
-                alt130=2;
+            else if ( (LA131_0==55) ) {
+                alt131=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 130, 0, input);
+                    new NoViableAltException("", 131, 0, input);
 
                 throw nvae;
             }
-            switch (alt130) {
+            switch (alt131) {
                 case 1 :
-                    // InternalCompleteOCL.g:7228:6: this_INT_0= RULE_INT
+                    // InternalCompleteOCL.g:7289:6: this_INT_0= RULE_INT
                     {
                     this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -21221,7 +21403,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalCompleteOCL.g:7237:2: kw= '*'
+                    // InternalCompleteOCL.g:7298:2: kw= '*'
                     {
                     kw=(Token)match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -21256,7 +21438,7 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalCompleteOCL.g:7250:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
+    // InternalCompleteOCL.g:7311:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
     public final String entryRuleURI() throws RecognitionException {
         String current = null;
 
@@ -21264,8 +21446,8 @@
 
 
         try {
-            // InternalCompleteOCL.g:7251:2: (iv_ruleURI= ruleURI EOF )
-            // InternalCompleteOCL.g:7252:2: iv_ruleURI= ruleURI EOF
+            // InternalCompleteOCL.g:7312:2: (iv_ruleURI= ruleURI EOF )
+            // InternalCompleteOCL.g:7313:2: iv_ruleURI= ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getURIRule());
@@ -21296,7 +21478,7 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalCompleteOCL.g:7259:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalCompleteOCL.g:7320:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleURI() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21305,8 +21487,8 @@
          enterRule();
 
         try {
-            // InternalCompleteOCL.g:7262:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalCompleteOCL.g:7263:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalCompleteOCL.g:7323:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalCompleteOCL.g:7324:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -21432,13 +21614,13 @@
         state._fsp--;
         if (state.failed) return ;
         // InternalCompleteOCL.g:4428:1: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
-        int alt148=2;
-        int LA148_0 = input.LA(1);
+        int alt149=2;
+        int LA149_0 = input.LA(1);
 
-        if ( ((LA148_0>=17 && LA148_0<=18)||LA148_0==27||(LA148_0>=39 && LA148_0<=40)||LA148_0==52||(LA148_0>=55 && LA148_0<=72)) ) {
-            alt148=1;
+        if ( ((LA149_0>=17 && LA149_0<=18)||LA149_0==27||(LA149_0>=39 && LA149_0<=40)||LA149_0==52||(LA149_0>=55 && LA149_0<=72)) ) {
+            alt149=1;
         }
-        switch (alt148) {
+        switch (alt149) {
             case 1 :
                 // InternalCompleteOCL.g:4428:2: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                 {
@@ -21618,7 +21800,7 @@
         // InternalCompleteOCL.g:5199:3: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
         // InternalCompleteOCL.g:5199:5: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
         {
-        otherlv_1=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return ;
+        otherlv_1=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return ;
         // InternalCompleteOCL.g:5203:1: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
         // InternalCompleteOCL.g:5204:1: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
         {
@@ -21630,7 +21812,7 @@
           	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
 
         }
-        pushFollow(FollowSets000.FOLLOW_61);
+        pushFollow(FollowSets000.FOLLOW_60);
         lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();
 
         state._fsp--;
@@ -21642,13 +21824,13 @@
         }
 
         // InternalCompleteOCL.g:5221:2: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
-        int alt153=2;
-        int LA153_0 = input.LA(1);
+        int alt154=2;
+        int LA154_0 = input.LA(1);
 
-        if ( (LA153_0==27) ) {
-            alt153=1;
+        if ( (LA154_0==27) ) {
+            alt154=1;
         }
-        switch (alt153) {
+        switch (alt154) {
             case 1 :
                 // InternalCompleteOCL.g:5221:4: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                 {
@@ -21707,7 +21889,7 @@
         // InternalCompleteOCL.g:5244:6: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
         // InternalCompleteOCL.g:5244:8: otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
         {
-        otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return ;
+        otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return ;
         // InternalCompleteOCL.g:5248:1: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
         // InternalCompleteOCL.g:5249:1: (lv_ownedType_6_0= ruleTypeExpCS )
         {
@@ -21719,7 +21901,7 @@
           	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
 
         }
-        pushFollow(FollowSets000.FOLLOW_62);
+        pushFollow(FollowSets000.FOLLOW_61);
         lv_ownedType_6_0=ruleTypeExpCS();
 
         state._fsp--;
@@ -21731,17 +21913,17 @@
         }
 
         // InternalCompleteOCL.g:5266:2: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
-        int alt154=2;
-        int LA154_0 = input.LA(1);
+        int alt155=2;
+        int LA155_0 = input.LA(1);
 
-        if ( (LA154_0==86) ) {
-            alt154=1;
+        if ( (LA155_0==86) ) {
+            alt155=1;
         }
-        switch (alt154) {
+        switch (alt155) {
             case 1 :
                 // InternalCompleteOCL.g:5266:4: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                 {
-                otherlv_7=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return ;
+                otherlv_7=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return ;
                 // InternalCompleteOCL.g:5270:1: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                 // InternalCompleteOCL.g:5271:1: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                 {
@@ -21753,7 +21935,7 @@
                   	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
 
                 }
-                pushFollow(FollowSets000.FOLLOW_61);
+                pushFollow(FollowSets000.FOLLOW_60);
                 lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();
 
                 state._fsp--;
@@ -21771,13 +21953,13 @@
         }
 
         // InternalCompleteOCL.g:5288:4: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
-        int alt155=2;
-        int LA155_0 = input.LA(1);
+        int alt156=2;
+        int LA156_0 = input.LA(1);
 
-        if ( (LA155_0==27) ) {
-            alt155=1;
+        if ( (LA156_0==27) ) {
+            alt156=1;
         }
-        switch (alt155) {
+        switch (alt156) {
             case 1 :
                 // InternalCompleteOCL.g:5288:6: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                 {
@@ -21837,17 +22019,17 @@
         // InternalCompleteOCL.g:5311:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
         {
         // InternalCompleteOCL.g:5311:7: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
-        int alt156=2;
-        int LA156_0 = input.LA(1);
+        int alt157=2;
+        int LA157_0 = input.LA(1);
 
-        if ( (LA156_0==23) ) {
-            alt156=1;
+        if ( (LA157_0==23) ) {
+            alt157=1;
         }
-        switch (alt156) {
+        switch (alt157) {
             case 1 :
                 // InternalCompleteOCL.g:5311:9: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                 {
-                otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return ;
+                otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return ;
                 // InternalCompleteOCL.g:5315:1: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                 // InternalCompleteOCL.g:5316:1: (lv_ownedType_12_0= ruleTypeExpCS )
                 {
@@ -21859,7 +22041,7 @@
                   	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
 
                 }
-                pushFollow(FollowSets000.FOLLOW_63);
+                pushFollow(FollowSets000.FOLLOW_62);
                 lv_ownedType_12_0=ruleTypeExpCS();
 
                 state._fsp--;
@@ -21877,17 +22059,17 @@
         }
 
         // InternalCompleteOCL.g:5333:4: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
-        int alt157=2;
-        int LA157_0 = input.LA(1);
+        int alt158=2;
+        int LA158_0 = input.LA(1);
 
-        if ( (LA157_0==86) ) {
-            alt157=1;
+        if ( (LA158_0==86) ) {
+            alt158=1;
         }
-        switch (alt157) {
+        switch (alt158) {
             case 1 :
                 // InternalCompleteOCL.g:5333:6: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                 {
-                otherlv_13=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return ;
+                otherlv_13=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return ;
                 // InternalCompleteOCL.g:5337:1: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                 // InternalCompleteOCL.g:5338:1: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                 {
@@ -21899,7 +22081,7 @@
                   	        newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
 
                 }
-                pushFollow(FollowSets000.FOLLOW_64);
+                pushFollow(FollowSets000.FOLLOW_63);
                 lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();
 
                 state._fsp--;
@@ -21962,7 +22144,7 @@
         // InternalCompleteOCL.g:5552:3: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
         // InternalCompleteOCL.g:5552:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
         {
-        otherlv_2=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return ;
+        otherlv_2=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return ;
         // InternalCompleteOCL.g:5556:1: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
         // InternalCompleteOCL.g:5557:1: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
         {
@@ -21974,7 +22156,7 @@
           	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
 
         }
-        pushFollow(FollowSets000.FOLLOW_61);
+        pushFollow(FollowSets000.FOLLOW_60);
         lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();
 
         state._fsp--;
@@ -21986,13 +22168,13 @@
         }
 
         // InternalCompleteOCL.g:5574:2: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
-        int alt165=2;
-        int LA165_0 = input.LA(1);
+        int alt166=2;
+        int LA166_0 = input.LA(1);
 
-        if ( (LA165_0==27) ) {
-            alt165=1;
+        if ( (LA166_0==27) ) {
+            alt166=1;
         }
-        switch (alt165) {
+        switch (alt166) {
             case 1 :
                 // InternalCompleteOCL.g:5574:4: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                 {
@@ -22051,7 +22233,7 @@
         // InternalCompleteOCL.g:5597:6: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
         // InternalCompleteOCL.g:5597:8: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
         {
-        otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return ;
+        otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return ;
         // InternalCompleteOCL.g:5601:1: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
         // InternalCompleteOCL.g:5602:1: (lv_ownedType_7_0= ruleTypeExpCS )
         {
@@ -22063,7 +22245,7 @@
           	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
 
         }
-        pushFollow(FollowSets000.FOLLOW_62);
+        pushFollow(FollowSets000.FOLLOW_61);
         lv_ownedType_7_0=ruleTypeExpCS();
 
         state._fsp--;
@@ -22075,17 +22257,17 @@
         }
 
         // InternalCompleteOCL.g:5619:2: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
-        int alt166=2;
-        int LA166_0 = input.LA(1);
+        int alt167=2;
+        int LA167_0 = input.LA(1);
 
-        if ( (LA166_0==86) ) {
-            alt166=1;
+        if ( (LA167_0==86) ) {
+            alt167=1;
         }
-        switch (alt166) {
+        switch (alt167) {
             case 1 :
                 // InternalCompleteOCL.g:5619:4: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                 {
-                otherlv_8=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return ;
+                otherlv_8=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return ;
                 // InternalCompleteOCL.g:5623:1: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                 // InternalCompleteOCL.g:5624:1: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                 {
@@ -22097,7 +22279,7 @@
                   	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
 
                 }
-                pushFollow(FollowSets000.FOLLOW_61);
+                pushFollow(FollowSets000.FOLLOW_60);
                 lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();
 
                 state._fsp--;
@@ -22115,13 +22297,13 @@
         }
 
         // InternalCompleteOCL.g:5641:4: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
-        int alt167=2;
-        int LA167_0 = input.LA(1);
+        int alt168=2;
+        int LA168_0 = input.LA(1);
 
-        if ( (LA167_0==27) ) {
-            alt167=1;
+        if ( (LA168_0==27) ) {
+            alt168=1;
         }
-        switch (alt167) {
+        switch (alt168) {
             case 1 :
                 // InternalCompleteOCL.g:5641:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                 {
@@ -22181,17 +22363,17 @@
         // InternalCompleteOCL.g:5664:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
         {
         // InternalCompleteOCL.g:5664:7: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
-        int alt168=2;
-        int LA168_0 = input.LA(1);
+        int alt169=2;
+        int LA169_0 = input.LA(1);
 
-        if ( (LA168_0==23) ) {
-            alt168=1;
+        if ( (LA169_0==23) ) {
+            alt169=1;
         }
-        switch (alt168) {
+        switch (alt169) {
             case 1 :
                 // InternalCompleteOCL.g:5664:9: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                 {
-                otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_20); if (state.failed) return ;
+                otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_21); if (state.failed) return ;
                 // InternalCompleteOCL.g:5668:1: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                 // InternalCompleteOCL.g:5669:1: (lv_ownedType_13_0= ruleTypeExpCS )
                 {
@@ -22203,7 +22385,7 @@
                   	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
 
                 }
-                pushFollow(FollowSets000.FOLLOW_63);
+                pushFollow(FollowSets000.FOLLOW_62);
                 lv_ownedType_13_0=ruleTypeExpCS();
 
                 state._fsp--;
@@ -22221,17 +22403,17 @@
         }
 
         // InternalCompleteOCL.g:5686:4: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
-        int alt169=2;
-        int LA169_0 = input.LA(1);
+        int alt170=2;
+        int LA170_0 = input.LA(1);
 
-        if ( (LA169_0==86) ) {
-            alt169=1;
+        if ( (LA170_0==86) ) {
+            alt170=1;
         }
-        switch (alt169) {
+        switch (alt170) {
             case 1 :
                 // InternalCompleteOCL.g:5686:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                 {
-                otherlv_14=(Token)match(input,86,FollowSets000.FOLLOW_14); if (state.failed) return ;
+                otherlv_14=(Token)match(input,86,FollowSets000.FOLLOW_15); if (state.failed) return ;
                 // InternalCompleteOCL.g:5690:1: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                 // InternalCompleteOCL.g:5691:1: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                 {
@@ -22243,7 +22425,7 @@
                   	        newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
 
                 }
-                pushFollow(FollowSets000.FOLLOW_64);
+                pushFollow(FollowSets000.FOLLOW_63);
                 lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();
 
                 state._fsp--;
@@ -23151,81 +23333,80 @@
         public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
         public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000870080002L});
         public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000800080002L});
-        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000008070200060L});
+        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x000FFC8070200060L,0x000000000001F600L});
         public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000003100000L});
         public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000070800060L});
         public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000003100002L});
         public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000A00000L});
-        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x00FFFC80702001F0L,0x000000C207A1F600L});
+        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x00FFFC00702001F0L,0x000000C207A1F600L});
         public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000400000L});
         public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000800000L});
         public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000002000000L});
-        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000070000060L});
-        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000200000L});
-        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000070400060L});
-        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000004400000L});
-        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x000FFC8078200060L,0x000000000001F600L});
-        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000008000000L});
-        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x000FFC8070200060L,0x000000000001F600L});
-        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000070000160L});
-        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000080000002L});
-        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x000FFC8070600060L,0x000000000001F600L});
-        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x000FFC8770200062L,0x000000000001F600L});
-        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000700000002L});
-        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000001800180000L});
-        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000001800080000L});
-        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000006000000002L});
-        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000010004000000L});
-        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000800L});
-        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x000FFC0070000060L,0x000000000001F600L});
+        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000008070200060L});
+        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000070000060L});
+        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000200000L});
+        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000070400060L});
+        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000004400000L});
+        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x00FFFC00782001E0L,0x0000008207A1F600L});
+        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000008000000L});
+        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x00FFFC00702001E0L,0x0000008207A1F600L});
+        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000070000160L});
+        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000080000002L});
+        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x00FFFC00706001E0L,0x0000008207A1F600L});
+        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x00FFFC07702001E2L,0x0000008207A1F600L});
+        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000700000002L});
+        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000001800180000L});
+        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000001800080000L});
+        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000006000000002L});
+        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000010004000000L});
+        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000800L});
         public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000200002L});
         public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000400000L,0x0000000010000000L});
         public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000004000000L});
         public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
-        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x00FFFC8070A001E0L,0x000000C207A5F600L});
+        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x00FFFC0070A001E0L,0x000000C207A5F600L});
         public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000004000000L,0x0000000000040000L});
-        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x00FFFC8070A001E0L,0x000000C207A1F600L});
+        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x00FFFC0070A001E0L,0x000000C207A1F600L});
         public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000000002L,0x0000000000080000L});
-        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x00FFFC80702001E0L,0x000000C207A1F600L});
+        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x00FFFC00702001E0L,0x000000C207A1F600L});
         public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000004000000L,0x0000000000100000L});
         public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000060L});
         public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000000L,0x0000000000040000L});
-        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x00FFFC80702001E0L,0x000000C207A5F600L});
+        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x00FFFC00702001E0L,0x000000C207A5F600L});
         public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
         public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000008800000L});
         public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000102L});
         public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000002L,0x0000000010000000L});
         public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
         public static final BitSet FOLLOW_50 = new BitSet(new long[]{0xFF90018008060002L,0x00000000000001FFL});
-        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x00FFFC80702001E0L,0x0000008207A1F600L});
-        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000200002L,0x0000000018020000L});
-        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000002L,0x0000000008020000L});
-        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000002L,0x0000000008000000L});
-        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000100000000L});
-        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000070000160L,0x0000000000040000L});
-        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x00FFFE8070E001E0L,0x000000C207A1F600L});
-        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000004400000L,0x0000000180000000L});
-        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000004000000L,0x0000000020000000L});
-        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000800002L,0x0000000040400000L});
-        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000008000002L});
-        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000008000002L,0x0000000000400000L});
-        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000040400000L});
-        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
-        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x00FFFE80702001E0L,0x000000C207A1F600L});
-        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000800002L});
-        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
-        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000002800000000L});
-        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
-        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000004000000L,0x0000000040000000L});
-        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000008A00000L});
-        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0080000000000080L});
-        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0280020000000080L});
-        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000000L,0x0000030020000000L});
-        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
-        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000004000002L,0x0000000010000000L});
-        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x000FFE8070200060L,0x000000000001F600L});
-        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000002L,0x0000040000000000L});
-        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000002L,0x0000080000000000L});
+        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000200002L,0x0000000018020000L});
+        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000002L,0x0000000008020000L});
+        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000002L,0x0000000008000000L});
+        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000100000000L});
+        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000070000160L,0x0000000000040000L});
+        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x00FFFE0070E001E0L,0x000000C207A1F600L});
+        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000004400000L,0x0000000180000000L});
+        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000004000000L,0x0000000020000000L});
+        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000800002L,0x0000000040400000L});
+        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000008000002L});
+        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000008000002L,0x0000000000400000L});
+        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0000000040400000L});
+        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x00FFFE00702001E0L,0x000000C207A1F600L});
+        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000800002L});
+        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000400000000L});
+        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000002800000000L});
+        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
+        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000004000000L,0x0000000040000000L});
+        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000008A00000L});
+        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0080000000000080L});
+        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0280020000000080L});
+        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000000L,0x0000030020000000L});
+        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000004000002L,0x0000000010000000L});
+        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x00FFFE00702001E0L,0x0000008207A1F600L});
+        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000002L,0x0000040000000000L});
+        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000002L,0x0000080000000000L});
     }
 
 
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSemanticSequencer.java b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSemanticSequencer.java
index da38d48..10de139 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSemanticSequencer.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSemanticSequencer.java
@@ -167,6 +167,10 @@
 					sequence_URIPathNameCS(context, (PathNameCS) semanticObject);
 					return;
 				}
+				else if (rule == grammarAccess.getUnreservedPathNameCSRule()) {
+					sequence_UnreservedPathNameCS(context, (PathNameCS) semanticObject);
+					return;
+				}
 				else break;
 			case BaseCSPackage.PRIMITIVE_TYPE_REF_CS:
 				if (rule == grammarAccess.getTypedRefCSRule()
@@ -451,7 +455,7 @@
 	 *     (
 	 *         ownedSignature=TemplateSignatureCS?
 	 *         selfName=UnrestrictedName?
-	 *         ownedPathName=PathNameCS
+	 *         ownedPathName=UnreservedPathNameCS
 	 *         (ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+
 	 *     )
 	 */
@@ -570,7 +574,7 @@
 	 * Constraint:
 	 *     (
 	 *         ownedSignature=TemplateSignatureCS?
-	 *         ownedPathName=PathNameCS
+	 *         ownedPathName=UnreservedPathNameCS
 	 *         (ownedParameters+=ParameterCS ownedParameters+=ParameterCS*)?
 	 *         ownedType=TypeExpCS?
 	 *         (ownedPreconditions+=ConstraintCS | ownedPostconditions+=ConstraintCS | ownedBodies+=SpecificationCS)*
@@ -586,7 +590,7 @@
 	 *     PackageDeclarationCS returns PackageDeclarationCS
 	 *
 	 * Constraint:
-	 *     (ownedPathName=PathNameCS ownedInvariants+=ConstraintCS* ownedContexts+=ContextDeclCS*)
+	 *     (ownedPathName=UnreservedPathNameCS ownedInvariants+=ConstraintCS* ownedContexts+=ContextDeclCS*)
 	 */
 	protected void sequence_PackageDeclarationCS(ISerializationContext context, PackageDeclarationCS semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
@@ -611,7 +615,7 @@
 	 *     PropertyContextDeclCS returns PropertyContextDeclCS
 	 *
 	 * Constraint:
-	 *     (ownedPathName=PathNameCS ownedType=TypeExpCS (ownedDefaultExpressions+=SpecificationCS | ownedDefaultExpressions+=SpecificationCS)*)
+	 *     (ownedPathName=UnreservedPathNameCS ownedType=TypeExpCS (ownedDefaultExpressions+=SpecificationCS | ownedDefaultExpressions+=SpecificationCS)*)
 	 */
 	protected void sequence_PropertyContextDeclCS(ISerializationContext context, PropertyContextDeclCS semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSyntacticSequencer.java b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSyntacticSequencer.java
index 79e543a..bdc39f1 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSyntacticSequencer.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/serializer/AbstractCompleteOCLSyntacticSequencer.java
@@ -159,7 +159,7 @@
 	 * This ambiguous syntax occurs at:
 	 *     ownedBodies+=SpecificationCS 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
 	 *     ownedParameters+=ParameterCS ')' ':' 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
-	 *     ownedPathName=PathNameCS '(' ')' ':' 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
+	 *     ownedPathName=UnreservedPathNameCS '(' ')' ':' 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
 	 *     ownedPostconditions+=ConstraintCS 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
 	 *     ownedPreconditions+=ConstraintCS 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
 	 *     ownedType=TypeExpCS 'body' (ambiguity) ':' ownedBodies+=SpecificationCS
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/services/CompleteOCLGrammarAccess.java b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/services/CompleteOCLGrammarAccess.java
index bb98da5..f4a915a 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/services/CompleteOCLGrammarAccess.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/src-gen/org/eclipse/ocl/xtext/completeocl/services/CompleteOCLGrammarAccess.java
@@ -103,7 +103,7 @@
 		private final Assignment cSelfNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cSelfNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cSelfNameAssignment_2.eContents().get(0);
 		private final Assignment cOwnedPathNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
-		private final RuleCall cOwnedPathNamePathNameCSParserRuleCall_3_0 = (RuleCall)cOwnedPathNameAssignment_3.eContents().get(0);
+		private final RuleCall cOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0 = (RuleCall)cOwnedPathNameAssignment_3.eContents().get(0);
 		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
 		private final Group cGroup_4_0 = (Group)cAlternatives_4.eContents().get(0);
 		private final Keyword cInvKeyword_4_0_0 = (Keyword)cGroup_4_0.eContents().get(0);
@@ -114,11 +114,11 @@
 
 		//ClassifierContextDeclCS:
 		//	'context' ownedSignature=TemplateSignatureCS? selfName=UnrestrictedName?
-		//	ownedPathName=PathNameCS ('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+;
+		//	ownedPathName=UnreservedPathNameCS ('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+;
 		@Override public ParserRule getRule() { return rule; }
 
 		//'context' ownedSignature=TemplateSignatureCS? selfName=UnrestrictedName?
-		//ownedPathName=PathNameCS ('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+
+		//ownedPathName=UnreservedPathNameCS ('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+
 		public Group getGroup() { return cGroup; }
 
 		//'context'
@@ -136,11 +136,11 @@
 		//UnrestrictedName
 		public RuleCall getSelfNameUnrestrictedNameParserRuleCall_2_0() { return cSelfNameUnrestrictedNameParserRuleCall_2_0; }
 
-		//ownedPathName=PathNameCS
+		//ownedPathName=UnreservedPathNameCS
 		public Assignment getOwnedPathNameAssignment_3() { return cOwnedPathNameAssignment_3; }
 
-		//PathNameCS
-		public RuleCall getOwnedPathNamePathNameCSParserRuleCall_3_0() { return cOwnedPathNamePathNameCSParserRuleCall_3_0; }
+		//UnreservedPathNameCS
+		public RuleCall getOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0() { return cOwnedPathNameUnreservedPathNameCSParserRuleCall_3_0; }
 
 		//('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+
 		public Alternatives getAlternatives_4() { return cAlternatives_4; }
@@ -189,7 +189,8 @@
 		// * expression to be evaluated to provide an error message.
 		// */
 		//ConstraintCS base::ConstraintCS:
-		//	(name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS;
+		//	(name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS
+		//;
 		@Override public ParserRule getRule() { return rule; }
 
 		//(name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS
@@ -582,7 +583,7 @@
 		private final Assignment cOwnedSignatureAssignment_1 = (Assignment)cGroup.eContents().get(1);
 		private final RuleCall cOwnedSignatureTemplateSignatureCSParserRuleCall_1_0 = (RuleCall)cOwnedSignatureAssignment_1.eContents().get(0);
 		private final Assignment cOwnedPathNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final RuleCall cOwnedPathNamePathNameCSParserRuleCall_2_0 = (RuleCall)cOwnedPathNameAssignment_2.eContents().get(0);
+		private final RuleCall cOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0 = (RuleCall)cOwnedPathNameAssignment_2.eContents().get(0);
 		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
 		private final Assignment cOwnedParametersAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
@@ -628,13 +629,13 @@
 		// * For compatibility with invariants the body expression may have a name that is never used.
 		// */
 		//OperationContextDeclCS:
-		//	'context' ownedSignature=TemplateSignatureCS? ownedPathName=PathNameCS
+		//	'context' ownedSignature=TemplateSignatureCS? ownedPathName=UnreservedPathNameCS
 		//	'(' (ownedParameters+=ParameterCS (',' ownedParameters+=ParameterCS)*)? ')' ':' ownedType=TypeExpCS? ('pre'
 		//	ownedPreconditions+=ConstraintCS | 'post' ownedPostconditions+=ConstraintCS | 'body' UnrestrictedName? ':'
 		//	ownedBodies+=SpecificationCS)*;
 		@Override public ParserRule getRule() { return rule; }
 
-		//'context' ownedSignature=TemplateSignatureCS? ownedPathName=PathNameCS
+		//'context' ownedSignature=TemplateSignatureCS? ownedPathName=UnreservedPathNameCS
 		//'(' (ownedParameters+=ParameterCS (',' ownedParameters+=ParameterCS)*)? ')' ':' ownedType=TypeExpCS? ('pre'
 		//ownedPreconditions+=ConstraintCS | 'post' ownedPostconditions+=ConstraintCS | 'body' UnrestrictedName? ':'
 		//ownedBodies+=SpecificationCS)*
@@ -649,11 +650,11 @@
 		//TemplateSignatureCS
 		public RuleCall getOwnedSignatureTemplateSignatureCSParserRuleCall_1_0() { return cOwnedSignatureTemplateSignatureCSParserRuleCall_1_0; }
 
-		//ownedPathName=PathNameCS
+		//ownedPathName=UnreservedPathNameCS
 		public Assignment getOwnedPathNameAssignment_2() { return cOwnedPathNameAssignment_2; }
 
-		//PathNameCS
-		public RuleCall getOwnedPathNamePathNameCSParserRuleCall_2_0() { return cOwnedPathNamePathNameCSParserRuleCall_2_0; }
+		//UnreservedPathNameCS
+		public RuleCall getOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0() { return cOwnedPathNameUnreservedPathNameCSParserRuleCall_2_0; }
 
 		//'('
 		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
@@ -743,7 +744,7 @@
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cPackageKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cOwnedPathNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cOwnedPathNamePathNameCSParserRuleCall_1_0 = (RuleCall)cOwnedPathNameAssignment_1.eContents().get(0);
+		private final RuleCall cOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0 = (RuleCall)cOwnedPathNameAssignment_1.eContents().get(0);
 		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
 		private final Keyword cInvKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
 		private final Assignment cOwnedInvariantsAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
@@ -753,21 +754,22 @@
 		private final Keyword cEndpackageKeyword_4 = (Keyword)cGroup.eContents().get(4);
 
 		//PackageDeclarationCS:
-		//	'package' ownedPathName=PathNameCS ('inv' ownedInvariants+=ConstraintCS)* ownedContexts+=ContextDeclCS* 'endpackage'
-		//;
+		//	'package' ownedPathName=UnreservedPathNameCS ('inv' ownedInvariants+=ConstraintCS)* ownedContexts+=ContextDeclCS*
+		//	'endpackage';
 		@Override public ParserRule getRule() { return rule; }
 
-		//'package' ownedPathName=PathNameCS ('inv' ownedInvariants+=ConstraintCS)* ownedContexts+=ContextDeclCS* 'endpackage'
+		//'package' ownedPathName=UnreservedPathNameCS ('inv' ownedInvariants+=ConstraintCS)* ownedContexts+=ContextDeclCS*
+		//'endpackage'
 		public Group getGroup() { return cGroup; }
 
 		//'package'
 		public Keyword getPackageKeyword_0() { return cPackageKeyword_0; }
 
-		//ownedPathName=PathNameCS
+		//ownedPathName=UnreservedPathNameCS
 		public Assignment getOwnedPathNameAssignment_1() { return cOwnedPathNameAssignment_1; }
 
-		//PathNameCS
-		public RuleCall getOwnedPathNamePathNameCSParserRuleCall_1_0() { return cOwnedPathNamePathNameCSParserRuleCall_1_0; }
+		//UnreservedPathNameCS
+		public RuleCall getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0() { return cOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0; }
 
 		//('inv' ownedInvariants+=ConstraintCS)*
 		public Group getGroup_2() { return cGroup_2; }
@@ -832,7 +834,7 @@
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cContextKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cOwnedPathNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cOwnedPathNamePathNameCSParserRuleCall_1_0 = (RuleCall)cOwnedPathNameAssignment_1.eContents().get(0);
+		private final RuleCall cOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0 = (RuleCall)cOwnedPathNameAssignment_1.eContents().get(0);
 		private final Keyword cColonKeyword_2 = (Keyword)cGroup.eContents().get(2);
 		private final Assignment cOwnedTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cOwnedTypeTypeExpCSParserRuleCall_3_0 = (RuleCall)cOwnedTypeAssignment_3.eContents().get(0);
@@ -874,22 +876,22 @@
 		// * NB. RoyalAndLoyal gratuitously names its derived values.
 		// */
 		//PropertyContextDeclCS:
-		//	'context' ownedPathName=PathNameCS ':' ownedType=TypeExpCS ('derive' UnrestrictedName? ':'
+		//	'context' ownedPathName=UnreservedPathNameCS ':' ownedType=TypeExpCS ('derive' UnrestrictedName? ':'
 		//	ownedDefaultExpressions+=SpecificationCS | 'init' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS)*;
 		@Override public ParserRule getRule() { return rule; }
 
-		//'context' ownedPathName=PathNameCS ':' ownedType=TypeExpCS ('derive' UnrestrictedName? ':'
+		//'context' ownedPathName=UnreservedPathNameCS ':' ownedType=TypeExpCS ('derive' UnrestrictedName? ':'
 		//ownedDefaultExpressions+=SpecificationCS | 'init' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS)*
 		public Group getGroup() { return cGroup; }
 
 		//'context'
 		public Keyword getContextKeyword_0() { return cContextKeyword_0; }
 
-		//ownedPathName=PathNameCS
+		//ownedPathName=UnreservedPathNameCS
 		public Assignment getOwnedPathNameAssignment_1() { return cOwnedPathNameAssignment_1; }
 
-		//PathNameCS
-		public RuleCall getOwnedPathNamePathNameCSParserRuleCall_1_0() { return cOwnedPathNamePathNameCSParserRuleCall_1_0; }
+		//UnreservedPathNameCS
+		public RuleCall getOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0() { return cOwnedPathNameUnreservedPathNameCSParserRuleCall_1_0; }
 
 		//':'
 		public Keyword getColonKeyword_2() { return cColonKeyword_2; }
@@ -1380,7 +1382,7 @@
 
 	//ClassifierContextDeclCS:
 	//	'context' ownedSignature=TemplateSignatureCS? selfName=UnrestrictedName?
-	//	ownedPathName=PathNameCS ('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+;
+	//	ownedPathName=UnreservedPathNameCS ('inv' ownedInvariants+=ConstraintCS | ownedDefinitions+=DefCS)+;
 	public ClassifierContextDeclCSElements getClassifierContextDeclCSAccess() {
 		return pClassifierContextDeclCS;
 	}
@@ -1399,7 +1401,8 @@
 	// * expression to be evaluated to provide an error message.
 	// */
 	//ConstraintCS base::ConstraintCS:
-	//	(name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS;
+	//	(name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS
+	//;
 	public ConstraintCSElements getConstraintCSAccess() {
 		return pConstraintCS;
 	}
@@ -1517,7 +1520,7 @@
 	// * For compatibility with invariants the body expression may have a name that is never used.
 	// */
 	//OperationContextDeclCS:
-	//	'context' ownedSignature=TemplateSignatureCS? ownedPathName=PathNameCS
+	//	'context' ownedSignature=TemplateSignatureCS? ownedPathName=UnreservedPathNameCS
 	//	'(' (ownedParameters+=ParameterCS (',' ownedParameters+=ParameterCS)*)? ')' ':' ownedType=TypeExpCS? ('pre'
 	//	ownedPreconditions+=ConstraintCS | 'post' ownedPostconditions+=ConstraintCS | 'body' UnrestrictedName? ':'
 	//	ownedBodies+=SpecificationCS)*;
@@ -1530,8 +1533,8 @@
 	}
 
 	//PackageDeclarationCS:
-	//	'package' ownedPathName=PathNameCS ('inv' ownedInvariants+=ConstraintCS)* ownedContexts+=ContextDeclCS* 'endpackage'
-	//;
+	//	'package' ownedPathName=UnreservedPathNameCS ('inv' ownedInvariants+=ConstraintCS)* ownedContexts+=ContextDeclCS*
+	//	'endpackage';
 	public PackageDeclarationCSElements getPackageDeclarationCSAccess() {
 		return pPackageDeclarationCS;
 	}
@@ -1574,7 +1577,7 @@
 	// * NB. RoyalAndLoyal gratuitously names its derived values.
 	// */
 	//PropertyContextDeclCS:
-	//	'context' ownedPathName=PathNameCS ':' ownedType=TypeExpCS ('derive' UnrestrictedName? ':'
+	//	'context' ownedPathName=UnreservedPathNameCS ':' ownedType=TypeExpCS ('derive' UnrestrictedName? ':'
 	//	ownedDefaultExpressions+=SpecificationCS | 'init' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS)*;
 	public PropertyContextDeclCSElements getPropertyContextDeclCSAccess() {
 		return pPropertyContextDeclCS;
@@ -1881,8 +1884,8 @@
 	}
 
 	//CollectionTypeCS:
-	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS?
-	//	')')?;
+	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS
+	//	? ')')?;
 	public EssentialOCLGrammarAccess.CollectionTypeCSElements getCollectionTypeCSAccess() {
 		return gaEssentialOCL.getCollectionTypeCSAccess();
 	}
@@ -2461,6 +2464,16 @@
 		return getPathNameCSAccess().getRule();
 	}
 
+	//UnreservedPathNameCS PathNameCS:
+	//	ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*;
+	public BaseGrammarAccess.UnreservedPathNameCSElements getUnreservedPathNameCSAccess() {
+		return gaBase.getUnreservedPathNameCSAccess();
+	}
+
+	public ParserRule getUnreservedPathNameCSRule() {
+		return getUnreservedPathNameCSAccess().getRule();
+	}
+
 	//FirstPathElementCS PathElementCS:
 	//	referredElement=[pivot::NamedElement|super::UnrestrictedName];
 	public BaseGrammarAccess.FirstPathElementCSElements getFirstPathElementCSAccess() {
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/EssentialOCLParser.java b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/EssentialOCLParser.java
index 14ae7b0..656f219 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/EssentialOCLParser.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/EssentialOCLParser.java
@@ -168,6 +168,8 @@
 					put(grammarAccess.getMultiplicityCSAccess().getGroup(), "rule__MultiplicityCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup(), "rule__PathNameCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup_1(), "rule__PathNameCS__Group_1__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup(), "rule__UnreservedPathNameCS__Group__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1(), "rule__UnreservedPathNameCS__Group_1__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup(), "rule__TemplateBindingCS__Group__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup_1(), "rule__TemplateBindingCS__Group_1__0");
 					put(grammarAccess.getTemplateSignatureCSAccess().getGroup(), "rule__TemplateSignatureCS__Group__0");
@@ -300,6 +302,8 @@
 					put(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment(), "rule__MultiplicityStringCS__StringBoundsAssignment");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__PathNameCS__OwnedPathElementsAssignment_0");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__PathNameCS__OwnedPathElementsAssignment_1_1");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1");
 					put(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment(), "rule__FirstPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment(), "rule__NextPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0(), "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0");
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCL.g b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCL.g
index d9599a9..247608f 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCL.g
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCL.g
@@ -1953,6 +1953,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS
 :
@@ -11341,6 +11343,8 @@
 
 
 
+
+
 rule__TemplateBindingCS__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -13894,6 +13898,8 @@
 	restoreStackSize(stackSize);
 }
 
+
+
 rule__FirstPathElementCS__ReferredElementAssignment
     @init {
 		int stackSize = keepStackSize();
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLLexer.java b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLLexer.java
index 19cfb55..3531909 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLLexer.java
@@ -1638,8 +1638,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:14088:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalEssentialOCL.g:14088:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalEssentialOCL.g:14094:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalEssentialOCL.g:14094:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -1663,8 +1663,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:14090:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalEssentialOCL.g:14090:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalEssentialOCL.g:14096:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalEssentialOCL.g:14096:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -1689,11 +1689,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14092:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalEssentialOCL.g:14092:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalEssentialOCL.g:14098:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalEssentialOCL.g:14098:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalEssentialOCL.g:14092:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalEssentialOCL.g:14098:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -1709,14 +1709,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalEssentialOCL.g:14092:34: RULE_ESCAPED_CHARACTER
+            	    // InternalEssentialOCL.g:14098:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalEssentialOCL.g:14092:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalEssentialOCL.g:14098:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -1753,11 +1753,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14094:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalEssentialOCL.g:14094:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalEssentialOCL.g:14100:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalEssentialOCL.g:14100:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalEssentialOCL.g:14094:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalEssentialOCL.g:14100:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -1773,14 +1773,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalEssentialOCL.g:14094:35: RULE_ESCAPED_CHARACTER
+            	    // InternalEssentialOCL.g:14100:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalEssentialOCL.g:14094:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalEssentialOCL.g:14100:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -1817,12 +1817,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14096:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalEssentialOCL.g:14096:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalEssentialOCL.g:14102:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalEssentialOCL.g:14102:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalEssentialOCL.g:14096:38: ( options {greedy=false; } : . )*
+            // InternalEssentialOCL.g:14102:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -1847,7 +1847,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalEssentialOCL.g:14096:66: .
+            	    // InternalEssentialOCL.g:14102:66: .
             	    {
             	    matchAny();
 
@@ -1877,11 +1877,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14098:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalEssentialOCL.g:14098:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalEssentialOCL.g:14104:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalEssentialOCL.g:14104:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalEssentialOCL.g:14098:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalEssentialOCL.g:14104:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -1930,8 +1930,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14100:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalEssentialOCL.g:14100:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalEssentialOCL.g:14106:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:14106:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -1951,10 +1951,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14102:10: ( ( '0' .. '9' )+ )
-            // InternalEssentialOCL.g:14102:12: ( '0' .. '9' )+
+            // InternalEssentialOCL.g:14108:10: ( ( '0' .. '9' )+ )
+            // InternalEssentialOCL.g:14108:12: ( '0' .. '9' )+
             {
-            // InternalEssentialOCL.g:14102:12: ( '0' .. '9' )+
+            // InternalEssentialOCL.g:14108:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -1968,7 +1968,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalEssentialOCL.g:14102:13: '0' .. '9'
+            	    // InternalEssentialOCL.g:14108:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -2000,12 +2000,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14104:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalEssentialOCL.g:14104:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalEssentialOCL.g:14110:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalEssentialOCL.g:14110:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalEssentialOCL.g:14104:24: ( options {greedy=false; } : . )*
+            // InternalEssentialOCL.g:14110:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -2030,7 +2030,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalEssentialOCL.g:14104:52: .
+            	    // InternalEssentialOCL.g:14110:52: .
             	    {
             	    matchAny();
 
@@ -2060,12 +2060,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14106:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalEssentialOCL.g:14106:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalEssentialOCL.g:14112:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalEssentialOCL.g:14112:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalEssentialOCL.g:14106:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalEssentialOCL.g:14112:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -2078,7 +2078,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalEssentialOCL.g:14106:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalEssentialOCL.g:14112:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2098,7 +2098,7 @@
                 }
             } while (true);
 
-            // InternalEssentialOCL.g:14106:40: ( ( '\\r' )? '\\n' )?
+            // InternalEssentialOCL.g:14112:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2107,9 +2107,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalEssentialOCL.g:14106:41: ( '\\r' )? '\\n'
+                    // InternalEssentialOCL.g:14112:41: ( '\\r' )? '\\n'
                     {
-                    // InternalEssentialOCL.g:14106:41: ( '\\r' )?
+                    // InternalEssentialOCL.g:14112:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -2118,7 +2118,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalEssentialOCL.g:14106:41: '\\r'
+                            // InternalEssentialOCL.g:14112:41: '\\r'
                             {
                             match('\r');
 
@@ -2150,10 +2150,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14108:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalEssentialOCL.g:14108:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalEssentialOCL.g:14114:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalEssentialOCL.g:14114:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalEssentialOCL.g:14108:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalEssentialOCL.g:14114:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -2207,8 +2207,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:14110:16: ( . )
-            // InternalEssentialOCL.g:14110:18: .
+            // InternalEssentialOCL.g:14116:16: ( . )
+            // InternalEssentialOCL.g:14116:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLParser.java b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLParser.java
index f89694c..b08b47d 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLParser.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl.ui/src-gen/org/eclipse/ocl/xtext/essentialocl/ui/contentassist/antlr/internal/InternalEssentialOCLParser.java
@@ -5860,11 +5860,11 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalEssentialOCL.g:1957:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
+    // InternalEssentialOCL.g:1959:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
     public final void entryRuleFirstPathElementCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:1958:1: ( ruleFirstPathElementCS EOF )
-            // InternalEssentialOCL.g:1959:1: ruleFirstPathElementCS EOF
+            // InternalEssentialOCL.g:1960:1: ( ruleFirstPathElementCS EOF )
+            // InternalEssentialOCL.g:1961:1: ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSRule());
@@ -5894,23 +5894,23 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalEssentialOCL.g:1966:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalEssentialOCL.g:1968:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleFirstPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:1970:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
-            // InternalEssentialOCL.g:1971:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalEssentialOCL.g:1972:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
+            // InternalEssentialOCL.g:1973:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalEssentialOCL.g:1971:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
-            // InternalEssentialOCL.g:1972:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalEssentialOCL.g:1973:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalEssentialOCL.g:1974:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalEssentialOCL.g:1973:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
-            // InternalEssentialOCL.g:1973:2: rule__FirstPathElementCS__ReferredElementAssignment
+            // InternalEssentialOCL.g:1975:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalEssentialOCL.g:1975:2: rule__FirstPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__FirstPathElementCS__ReferredElementAssignment();
@@ -5945,11 +5945,11 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalEssentialOCL.g:1985:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
+    // InternalEssentialOCL.g:1987:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
     public final void entryRuleNextPathElementCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:1986:1: ( ruleNextPathElementCS EOF )
-            // InternalEssentialOCL.g:1987:1: ruleNextPathElementCS EOF
+            // InternalEssentialOCL.g:1988:1: ( ruleNextPathElementCS EOF )
+            // InternalEssentialOCL.g:1989:1: ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSRule());
@@ -5979,23 +5979,23 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalEssentialOCL.g:1994:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalEssentialOCL.g:1996:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleNextPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:1998:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
-            // InternalEssentialOCL.g:1999:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalEssentialOCL.g:2000:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
+            // InternalEssentialOCL.g:2001:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalEssentialOCL.g:1999:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
-            // InternalEssentialOCL.g:2000:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalEssentialOCL.g:2001:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalEssentialOCL.g:2002:1: ( rule__NextPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalEssentialOCL.g:2001:1: ( rule__NextPathElementCS__ReferredElementAssignment )
-            // InternalEssentialOCL.g:2001:2: rule__NextPathElementCS__ReferredElementAssignment
+            // InternalEssentialOCL.g:2003:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalEssentialOCL.g:2003:2: rule__NextPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NextPathElementCS__ReferredElementAssignment();
@@ -6030,11 +6030,11 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalEssentialOCL.g:2013:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
+    // InternalEssentialOCL.g:2015:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
     public final void entryRuleTemplateBindingCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2014:1: ( ruleTemplateBindingCS EOF )
-            // InternalEssentialOCL.g:2015:1: ruleTemplateBindingCS EOF
+            // InternalEssentialOCL.g:2016:1: ( ruleTemplateBindingCS EOF )
+            // InternalEssentialOCL.g:2017:1: ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSRule());
@@ -6064,23 +6064,23 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalEssentialOCL.g:2022:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
+    // InternalEssentialOCL.g:2024:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
     public final void ruleTemplateBindingCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2026:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
-            // InternalEssentialOCL.g:2027:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalEssentialOCL.g:2028:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
+            // InternalEssentialOCL.g:2029:1: ( ( rule__TemplateBindingCS__Group__0 ) )
             {
-            // InternalEssentialOCL.g:2027:1: ( ( rule__TemplateBindingCS__Group__0 ) )
-            // InternalEssentialOCL.g:2028:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalEssentialOCL.g:2029:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalEssentialOCL.g:2030:1: ( rule__TemplateBindingCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup());
             }
-            // InternalEssentialOCL.g:2029:1: ( rule__TemplateBindingCS__Group__0 )
-            // InternalEssentialOCL.g:2029:2: rule__TemplateBindingCS__Group__0
+            // InternalEssentialOCL.g:2031:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalEssentialOCL.g:2031:2: rule__TemplateBindingCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__0();
@@ -6115,11 +6115,11 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalEssentialOCL.g:2041:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalEssentialOCL.g:2043:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
     public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2042:1: ( ruleTemplateParameterSubstitutionCS EOF )
-            // InternalEssentialOCL.g:2043:1: ruleTemplateParameterSubstitutionCS EOF
+            // InternalEssentialOCL.g:2044:1: ( ruleTemplateParameterSubstitutionCS EOF )
+            // InternalEssentialOCL.g:2045:1: ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -6149,23 +6149,23 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalEssentialOCL.g:2050:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
+    // InternalEssentialOCL.g:2052:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
     public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2054:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
-            // InternalEssentialOCL.g:2055:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalEssentialOCL.g:2056:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
+            // InternalEssentialOCL.g:2057:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
             {
-            // InternalEssentialOCL.g:2055:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
-            // InternalEssentialOCL.g:2056:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalEssentialOCL.g:2057:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalEssentialOCL.g:2058:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
             }
-            // InternalEssentialOCL.g:2057:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
-            // InternalEssentialOCL.g:2057:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
+            // InternalEssentialOCL.g:2059:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalEssentialOCL.g:2059:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment();
@@ -6200,11 +6200,11 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalEssentialOCL.g:2071:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
+    // InternalEssentialOCL.g:2073:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
     public final void entryRuleTypeParameterCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2072:1: ( ruleTypeParameterCS EOF )
-            // InternalEssentialOCL.g:2073:1: ruleTypeParameterCS EOF
+            // InternalEssentialOCL.g:2074:1: ( ruleTypeParameterCS EOF )
+            // InternalEssentialOCL.g:2075:1: ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSRule());
@@ -6234,23 +6234,23 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalEssentialOCL.g:2080:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
+    // InternalEssentialOCL.g:2082:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
     public final void ruleTypeParameterCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2084:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
-            // InternalEssentialOCL.g:2085:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalEssentialOCL.g:2086:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
+            // InternalEssentialOCL.g:2087:1: ( ( rule__TypeParameterCS__Group__0 ) )
             {
-            // InternalEssentialOCL.g:2085:1: ( ( rule__TypeParameterCS__Group__0 ) )
-            // InternalEssentialOCL.g:2086:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalEssentialOCL.g:2087:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalEssentialOCL.g:2088:1: ( rule__TypeParameterCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup());
             }
-            // InternalEssentialOCL.g:2087:1: ( rule__TypeParameterCS__Group__0 )
-            // InternalEssentialOCL.g:2087:2: rule__TypeParameterCS__Group__0
+            // InternalEssentialOCL.g:2089:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalEssentialOCL.g:2089:2: rule__TypeParameterCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__0();
@@ -6285,11 +6285,11 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalEssentialOCL.g:2099:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
+    // InternalEssentialOCL.g:2101:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
     public final void entryRuleTypeRefCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2100:1: ( ruleTypeRefCS EOF )
-            // InternalEssentialOCL.g:2101:1: ruleTypeRefCS EOF
+            // InternalEssentialOCL.g:2102:1: ( ruleTypeRefCS EOF )
+            // InternalEssentialOCL.g:2103:1: ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSRule());
@@ -6319,23 +6319,23 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalEssentialOCL.g:2108:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
+    // InternalEssentialOCL.g:2110:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
     public final void ruleTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2112:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
-            // InternalEssentialOCL.g:2113:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalEssentialOCL.g:2114:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
+            // InternalEssentialOCL.g:2115:1: ( ( rule__TypeRefCS__Alternatives ) )
             {
-            // InternalEssentialOCL.g:2113:1: ( ( rule__TypeRefCS__Alternatives ) )
-            // InternalEssentialOCL.g:2114:1: ( rule__TypeRefCS__Alternatives )
+            // InternalEssentialOCL.g:2115:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalEssentialOCL.g:2116:1: ( rule__TypeRefCS__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSAccess().getAlternatives());
             }
-            // InternalEssentialOCL.g:2115:1: ( rule__TypeRefCS__Alternatives )
-            // InternalEssentialOCL.g:2115:2: rule__TypeRefCS__Alternatives
+            // InternalEssentialOCL.g:2117:1: ( rule__TypeRefCS__Alternatives )
+            // InternalEssentialOCL.g:2117:2: rule__TypeRefCS__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeRefCS__Alternatives();
@@ -6370,11 +6370,11 @@
 
 
     // $ANTLR start "entryRuleTypedRefCS"
-    // InternalEssentialOCL.g:2127:1: entryRuleTypedRefCS : ruleTypedRefCS EOF ;
+    // InternalEssentialOCL.g:2129:1: entryRuleTypedRefCS : ruleTypedRefCS EOF ;
     public final void entryRuleTypedRefCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2128:1: ( ruleTypedRefCS EOF )
-            // InternalEssentialOCL.g:2129:1: ruleTypedRefCS EOF
+            // InternalEssentialOCL.g:2130:1: ( ruleTypedRefCS EOF )
+            // InternalEssentialOCL.g:2131:1: ruleTypedRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedRefCSRule());
@@ -6404,17 +6404,17 @@
 
 
     // $ANTLR start "ruleTypedRefCS"
-    // InternalEssentialOCL.g:2136:1: ruleTypedRefCS : ( ruleTypedTypeRefCS ) ;
+    // InternalEssentialOCL.g:2138:1: ruleTypedRefCS : ( ruleTypedTypeRefCS ) ;
     public final void ruleTypedRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2140:2: ( ( ruleTypedTypeRefCS ) )
-            // InternalEssentialOCL.g:2141:1: ( ruleTypedTypeRefCS )
+            // InternalEssentialOCL.g:2142:2: ( ( ruleTypedTypeRefCS ) )
+            // InternalEssentialOCL.g:2143:1: ( ruleTypedTypeRefCS )
             {
-            // InternalEssentialOCL.g:2141:1: ( ruleTypedTypeRefCS )
-            // InternalEssentialOCL.g:2142:1: ruleTypedTypeRefCS
+            // InternalEssentialOCL.g:2143:1: ( ruleTypedTypeRefCS )
+            // InternalEssentialOCL.g:2144:1: ruleTypedTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall());
@@ -6449,11 +6449,11 @@
 
 
     // $ANTLR start "entryRuleTypedTypeRefCS"
-    // InternalEssentialOCL.g:2155:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
+    // InternalEssentialOCL.g:2157:1: entryRuleTypedTypeRefCS : ruleTypedTypeRefCS EOF ;
     public final void entryRuleTypedTypeRefCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2156:1: ( ruleTypedTypeRefCS EOF )
-            // InternalEssentialOCL.g:2157:1: ruleTypedTypeRefCS EOF
+            // InternalEssentialOCL.g:2158:1: ( ruleTypedTypeRefCS EOF )
+            // InternalEssentialOCL.g:2159:1: ruleTypedTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSRule());
@@ -6483,23 +6483,23 @@
 
 
     // $ANTLR start "ruleTypedTypeRefCS"
-    // InternalEssentialOCL.g:2164:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
+    // InternalEssentialOCL.g:2166:1: ruleTypedTypeRefCS : ( ( rule__TypedTypeRefCS__Group__0 ) ) ;
     public final void ruleTypedTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2168:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
-            // InternalEssentialOCL.g:2169:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
+            // InternalEssentialOCL.g:2170:2: ( ( ( rule__TypedTypeRefCS__Group__0 ) ) )
+            // InternalEssentialOCL.g:2171:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
             {
-            // InternalEssentialOCL.g:2169:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
-            // InternalEssentialOCL.g:2170:1: ( rule__TypedTypeRefCS__Group__0 )
+            // InternalEssentialOCL.g:2171:1: ( ( rule__TypedTypeRefCS__Group__0 ) )
+            // InternalEssentialOCL.g:2172:1: ( rule__TypedTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup());
             }
-            // InternalEssentialOCL.g:2171:1: ( rule__TypedTypeRefCS__Group__0 )
-            // InternalEssentialOCL.g:2171:2: rule__TypedTypeRefCS__Group__0
+            // InternalEssentialOCL.g:2173:1: ( rule__TypedTypeRefCS__Group__0 )
+            // InternalEssentialOCL.g:2173:2: rule__TypedTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__0();
@@ -6534,11 +6534,11 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalEssentialOCL.g:2183:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
+    // InternalEssentialOCL.g:2185:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
     public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2184:1: ( ruleWildcardTypeRefCS EOF )
-            // InternalEssentialOCL.g:2185:1: ruleWildcardTypeRefCS EOF
+            // InternalEssentialOCL.g:2186:1: ( ruleWildcardTypeRefCS EOF )
+            // InternalEssentialOCL.g:2187:1: ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSRule());
@@ -6568,23 +6568,23 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalEssentialOCL.g:2192:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
+    // InternalEssentialOCL.g:2194:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
     public final void ruleWildcardTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2196:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
-            // InternalEssentialOCL.g:2197:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalEssentialOCL.g:2198:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
+            // InternalEssentialOCL.g:2199:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
             {
-            // InternalEssentialOCL.g:2197:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
-            // InternalEssentialOCL.g:2198:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalEssentialOCL.g:2199:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalEssentialOCL.g:2200:1: ( rule__WildcardTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
             }
-            // InternalEssentialOCL.g:2199:1: ( rule__WildcardTypeRefCS__Group__0 )
-            // InternalEssentialOCL.g:2199:2: rule__WildcardTypeRefCS__Group__0
+            // InternalEssentialOCL.g:2201:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalEssentialOCL.g:2201:2: rule__WildcardTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__0();
@@ -6619,11 +6619,11 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalEssentialOCL.g:2211:1: entryRuleID : ruleID EOF ;
+    // InternalEssentialOCL.g:2213:1: entryRuleID : ruleID EOF ;
     public final void entryRuleID() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2212:1: ( ruleID EOF )
-            // InternalEssentialOCL.g:2213:1: ruleID EOF
+            // InternalEssentialOCL.g:2214:1: ( ruleID EOF )
+            // InternalEssentialOCL.g:2215:1: ruleID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDRule());
@@ -6653,23 +6653,23 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalEssentialOCL.g:2220:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
+    // InternalEssentialOCL.g:2222:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
     public final void ruleID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2224:2: ( ( ( rule__ID__Alternatives ) ) )
-            // InternalEssentialOCL.g:2225:1: ( ( rule__ID__Alternatives ) )
+            // InternalEssentialOCL.g:2226:2: ( ( ( rule__ID__Alternatives ) ) )
+            // InternalEssentialOCL.g:2227:1: ( ( rule__ID__Alternatives ) )
             {
-            // InternalEssentialOCL.g:2225:1: ( ( rule__ID__Alternatives ) )
-            // InternalEssentialOCL.g:2226:1: ( rule__ID__Alternatives )
+            // InternalEssentialOCL.g:2227:1: ( ( rule__ID__Alternatives ) )
+            // InternalEssentialOCL.g:2228:1: ( rule__ID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDAccess().getAlternatives());
             }
-            // InternalEssentialOCL.g:2227:1: ( rule__ID__Alternatives )
-            // InternalEssentialOCL.g:2227:2: rule__ID__Alternatives
+            // InternalEssentialOCL.g:2229:1: ( rule__ID__Alternatives )
+            // InternalEssentialOCL.g:2229:2: rule__ID__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ID__Alternatives();
@@ -6704,11 +6704,11 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalEssentialOCL.g:2239:1: entryRuleIdentifier : ruleIdentifier EOF ;
+    // InternalEssentialOCL.g:2241:1: entryRuleIdentifier : ruleIdentifier EOF ;
     public final void entryRuleIdentifier() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2240:1: ( ruleIdentifier EOF )
-            // InternalEssentialOCL.g:2241:1: ruleIdentifier EOF
+            // InternalEssentialOCL.g:2242:1: ( ruleIdentifier EOF )
+            // InternalEssentialOCL.g:2243:1: ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierRule());
@@ -6738,17 +6738,17 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalEssentialOCL.g:2248:1: ruleIdentifier : ( ruleID ) ;
+    // InternalEssentialOCL.g:2250:1: ruleIdentifier : ( ruleID ) ;
     public final void ruleIdentifier() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2252:2: ( ( ruleID ) )
-            // InternalEssentialOCL.g:2253:1: ( ruleID )
+            // InternalEssentialOCL.g:2254:2: ( ( ruleID ) )
+            // InternalEssentialOCL.g:2255:1: ( ruleID )
             {
-            // InternalEssentialOCL.g:2253:1: ( ruleID )
-            // InternalEssentialOCL.g:2254:1: ruleID
+            // InternalEssentialOCL.g:2255:1: ( ruleID )
+            // InternalEssentialOCL.g:2256:1: ruleID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierAccess().getIDParserRuleCall());
@@ -6783,11 +6783,11 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalEssentialOCL.g:2267:1: entryRuleLOWER : ruleLOWER EOF ;
+    // InternalEssentialOCL.g:2269:1: entryRuleLOWER : ruleLOWER EOF ;
     public final void entryRuleLOWER() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2268:1: ( ruleLOWER EOF )
-            // InternalEssentialOCL.g:2269:1: ruleLOWER EOF
+            // InternalEssentialOCL.g:2270:1: ( ruleLOWER EOF )
+            // InternalEssentialOCL.g:2271:1: ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERRule());
@@ -6817,17 +6817,17 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalEssentialOCL.g:2276:1: ruleLOWER : ( RULE_INT ) ;
+    // InternalEssentialOCL.g:2278:1: ruleLOWER : ( RULE_INT ) ;
     public final void ruleLOWER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2280:2: ( ( RULE_INT ) )
-            // InternalEssentialOCL.g:2281:1: ( RULE_INT )
+            // InternalEssentialOCL.g:2282:2: ( ( RULE_INT ) )
+            // InternalEssentialOCL.g:2283:1: ( RULE_INT )
             {
-            // InternalEssentialOCL.g:2281:1: ( RULE_INT )
-            // InternalEssentialOCL.g:2282:1: RULE_INT
+            // InternalEssentialOCL.g:2283:1: ( RULE_INT )
+            // InternalEssentialOCL.g:2284:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
@@ -6858,11 +6858,11 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalEssentialOCL.g:2295:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
+    // InternalEssentialOCL.g:2297:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
     public final void entryRuleNUMBER_LITERAL() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2296:1: ( ruleNUMBER_LITERAL EOF )
-            // InternalEssentialOCL.g:2297:1: ruleNUMBER_LITERAL EOF
+            // InternalEssentialOCL.g:2298:1: ( ruleNUMBER_LITERAL EOF )
+            // InternalEssentialOCL.g:2299:1: ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALRule());
@@ -6892,17 +6892,17 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalEssentialOCL.g:2304:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
+    // InternalEssentialOCL.g:2306:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
     public final void ruleNUMBER_LITERAL() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2308:2: ( ( RULE_INT ) )
-            // InternalEssentialOCL.g:2309:1: ( RULE_INT )
+            // InternalEssentialOCL.g:2310:2: ( ( RULE_INT ) )
+            // InternalEssentialOCL.g:2311:1: ( RULE_INT )
             {
-            // InternalEssentialOCL.g:2309:1: ( RULE_INT )
-            // InternalEssentialOCL.g:2310:1: RULE_INT
+            // InternalEssentialOCL.g:2311:1: ( RULE_INT )
+            // InternalEssentialOCL.g:2312:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());
@@ -6933,11 +6933,11 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalEssentialOCL.g:2323:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
+    // InternalEssentialOCL.g:2325:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
     public final void entryRuleStringLiteral() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2324:1: ( ruleStringLiteral EOF )
-            // InternalEssentialOCL.g:2325:1: ruleStringLiteral EOF
+            // InternalEssentialOCL.g:2326:1: ( ruleStringLiteral EOF )
+            // InternalEssentialOCL.g:2327:1: ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralRule());
@@ -6967,17 +6967,17 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalEssentialOCL.g:2332:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalEssentialOCL.g:2334:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleStringLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2336:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalEssentialOCL.g:2337:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:2338:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalEssentialOCL.g:2339:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalEssentialOCL.g:2337:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalEssentialOCL.g:2338:1: RULE_SINGLE_QUOTED_STRING
+            // InternalEssentialOCL.g:2339:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:2340:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -7008,11 +7008,11 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalEssentialOCL.g:2351:1: entryRuleUPPER : ruleUPPER EOF ;
+    // InternalEssentialOCL.g:2353:1: entryRuleUPPER : ruleUPPER EOF ;
     public final void entryRuleUPPER() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2352:1: ( ruleUPPER EOF )
-            // InternalEssentialOCL.g:2353:1: ruleUPPER EOF
+            // InternalEssentialOCL.g:2354:1: ( ruleUPPER EOF )
+            // InternalEssentialOCL.g:2355:1: ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERRule());
@@ -7042,23 +7042,23 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalEssentialOCL.g:2360:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
+    // InternalEssentialOCL.g:2362:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
     public final void ruleUPPER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2364:2: ( ( ( rule__UPPER__Alternatives ) ) )
-            // InternalEssentialOCL.g:2365:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalEssentialOCL.g:2366:2: ( ( ( rule__UPPER__Alternatives ) ) )
+            // InternalEssentialOCL.g:2367:1: ( ( rule__UPPER__Alternatives ) )
             {
-            // InternalEssentialOCL.g:2365:1: ( ( rule__UPPER__Alternatives ) )
-            // InternalEssentialOCL.g:2366:1: ( rule__UPPER__Alternatives )
+            // InternalEssentialOCL.g:2367:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalEssentialOCL.g:2368:1: ( rule__UPPER__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERAccess().getAlternatives());
             }
-            // InternalEssentialOCL.g:2367:1: ( rule__UPPER__Alternatives )
-            // InternalEssentialOCL.g:2367:2: rule__UPPER__Alternatives
+            // InternalEssentialOCL.g:2369:1: ( rule__UPPER__Alternatives )
+            // InternalEssentialOCL.g:2369:2: rule__UPPER__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UPPER__Alternatives();
@@ -7093,11 +7093,11 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalEssentialOCL.g:2379:1: entryRuleURI : ruleURI EOF ;
+    // InternalEssentialOCL.g:2381:1: entryRuleURI : ruleURI EOF ;
     public final void entryRuleURI() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:2380:1: ( ruleURI EOF )
-            // InternalEssentialOCL.g:2381:1: ruleURI EOF
+            // InternalEssentialOCL.g:2382:1: ( ruleURI EOF )
+            // InternalEssentialOCL.g:2383:1: ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIRule());
@@ -7127,17 +7127,17 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalEssentialOCL.g:2388:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalEssentialOCL.g:2390:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleURI() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2392:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalEssentialOCL.g:2393:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:2394:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalEssentialOCL.g:2395:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalEssentialOCL.g:2393:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalEssentialOCL.g:2394:1: RULE_SINGLE_QUOTED_STRING
+            // InternalEssentialOCL.g:2395:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:2396:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -7168,13 +7168,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnaryOperatorName__Alternatives"
-    // InternalEssentialOCL.g:2408:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
+    // InternalEssentialOCL.g:2410:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
     public final void rule__EssentialOCLUnaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2412:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
+            // InternalEssentialOCL.g:2414:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
             int alt2=3;
             switch ( input.LA(1) ) {
             case 16:
@@ -7202,10 +7202,10 @@
 
             switch (alt2) {
                 case 1 :
-                    // InternalEssentialOCL.g:2413:1: ( '-' )
+                    // InternalEssentialOCL.g:2415:1: ( '-' )
                     {
-                    // InternalEssentialOCL.g:2413:1: ( '-' )
-                    // InternalEssentialOCL.g:2414:1: '-'
+                    // InternalEssentialOCL.g:2415:1: ( '-' )
+                    // InternalEssentialOCL.g:2416:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
@@ -7221,10 +7221,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2421:6: ( 'not' )
+                    // InternalEssentialOCL.g:2423:6: ( 'not' )
                     {
-                    // InternalEssentialOCL.g:2421:6: ( 'not' )
-                    // InternalEssentialOCL.g:2422:1: 'not'
+                    // InternalEssentialOCL.g:2423:6: ( 'not' )
+                    // InternalEssentialOCL.g:2424:1: 'not'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
@@ -7240,10 +7240,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2429:6: ( 'not2' )
+                    // InternalEssentialOCL.g:2431:6: ( 'not2' )
                     {
-                    // InternalEssentialOCL.g:2429:6: ( 'not2' )
-                    // InternalEssentialOCL.g:2430:1: 'not2'
+                    // InternalEssentialOCL.g:2431:6: ( 'not2' )
+                    // InternalEssentialOCL.g:2432:1: 'not2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());
@@ -7276,13 +7276,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLInfixOperatorName__Alternatives"
-    // InternalEssentialOCL.g:2442:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
+    // InternalEssentialOCL.g:2444:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
     public final void rule__EssentialOCLInfixOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2446:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
+            // InternalEssentialOCL.g:2448:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
             int alt3=18;
             switch ( input.LA(1) ) {
             case 19:
@@ -7385,10 +7385,10 @@
 
             switch (alt3) {
                 case 1 :
-                    // InternalEssentialOCL.g:2447:1: ( '*' )
+                    // InternalEssentialOCL.g:2449:1: ( '*' )
                     {
-                    // InternalEssentialOCL.g:2447:1: ( '*' )
-                    // InternalEssentialOCL.g:2448:1: '*'
+                    // InternalEssentialOCL.g:2449:1: ( '*' )
+                    // InternalEssentialOCL.g:2450:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
@@ -7404,10 +7404,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2455:6: ( '/' )
+                    // InternalEssentialOCL.g:2457:6: ( '/' )
                     {
-                    // InternalEssentialOCL.g:2455:6: ( '/' )
-                    // InternalEssentialOCL.g:2456:1: '/'
+                    // InternalEssentialOCL.g:2457:6: ( '/' )
+                    // InternalEssentialOCL.g:2458:1: '/'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
@@ -7423,10 +7423,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2463:6: ( '+' )
+                    // InternalEssentialOCL.g:2465:6: ( '+' )
                     {
-                    // InternalEssentialOCL.g:2463:6: ( '+' )
-                    // InternalEssentialOCL.g:2464:1: '+'
+                    // InternalEssentialOCL.g:2465:6: ( '+' )
+                    // InternalEssentialOCL.g:2466:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
@@ -7442,10 +7442,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:2471:6: ( '-' )
+                    // InternalEssentialOCL.g:2473:6: ( '-' )
                     {
-                    // InternalEssentialOCL.g:2471:6: ( '-' )
-                    // InternalEssentialOCL.g:2472:1: '-'
+                    // InternalEssentialOCL.g:2473:6: ( '-' )
+                    // InternalEssentialOCL.g:2474:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
@@ -7461,10 +7461,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalEssentialOCL.g:2479:6: ( '>' )
+                    // InternalEssentialOCL.g:2481:6: ( '>' )
                     {
-                    // InternalEssentialOCL.g:2479:6: ( '>' )
-                    // InternalEssentialOCL.g:2480:1: '>'
+                    // InternalEssentialOCL.g:2481:6: ( '>' )
+                    // InternalEssentialOCL.g:2482:1: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
@@ -7480,10 +7480,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalEssentialOCL.g:2487:6: ( '<' )
+                    // InternalEssentialOCL.g:2489:6: ( '<' )
                     {
-                    // InternalEssentialOCL.g:2487:6: ( '<' )
-                    // InternalEssentialOCL.g:2488:1: '<'
+                    // InternalEssentialOCL.g:2489:6: ( '<' )
+                    // InternalEssentialOCL.g:2490:1: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
@@ -7499,10 +7499,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalEssentialOCL.g:2495:6: ( '>=' )
+                    // InternalEssentialOCL.g:2497:6: ( '>=' )
                     {
-                    // InternalEssentialOCL.g:2495:6: ( '>=' )
-                    // InternalEssentialOCL.g:2496:1: '>='
+                    // InternalEssentialOCL.g:2497:6: ( '>=' )
+                    // InternalEssentialOCL.g:2498:1: '>='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
@@ -7518,10 +7518,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalEssentialOCL.g:2503:6: ( '<=' )
+                    // InternalEssentialOCL.g:2505:6: ( '<=' )
                     {
-                    // InternalEssentialOCL.g:2503:6: ( '<=' )
-                    // InternalEssentialOCL.g:2504:1: '<='
+                    // InternalEssentialOCL.g:2505:6: ( '<=' )
+                    // InternalEssentialOCL.g:2506:1: '<='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
@@ -7537,10 +7537,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalEssentialOCL.g:2511:6: ( '=' )
+                    // InternalEssentialOCL.g:2513:6: ( '=' )
                     {
-                    // InternalEssentialOCL.g:2511:6: ( '=' )
-                    // InternalEssentialOCL.g:2512:1: '='
+                    // InternalEssentialOCL.g:2513:6: ( '=' )
+                    // InternalEssentialOCL.g:2514:1: '='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
@@ -7556,10 +7556,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalEssentialOCL.g:2519:6: ( '<>' )
+                    // InternalEssentialOCL.g:2521:6: ( '<>' )
                     {
-                    // InternalEssentialOCL.g:2519:6: ( '<>' )
-                    // InternalEssentialOCL.g:2520:1: '<>'
+                    // InternalEssentialOCL.g:2521:6: ( '<>' )
+                    // InternalEssentialOCL.g:2522:1: '<>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
@@ -7575,10 +7575,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalEssentialOCL.g:2527:6: ( 'and' )
+                    // InternalEssentialOCL.g:2529:6: ( 'and' )
                     {
-                    // InternalEssentialOCL.g:2527:6: ( 'and' )
-                    // InternalEssentialOCL.g:2528:1: 'and'
+                    // InternalEssentialOCL.g:2529:6: ( 'and' )
+                    // InternalEssentialOCL.g:2530:1: 'and'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
@@ -7594,10 +7594,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalEssentialOCL.g:2535:6: ( 'and2' )
+                    // InternalEssentialOCL.g:2537:6: ( 'and2' )
                     {
-                    // InternalEssentialOCL.g:2535:6: ( 'and2' )
-                    // InternalEssentialOCL.g:2536:1: 'and2'
+                    // InternalEssentialOCL.g:2537:6: ( 'and2' )
+                    // InternalEssentialOCL.g:2538:1: 'and2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());
@@ -7613,10 +7613,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalEssentialOCL.g:2543:6: ( 'implies' )
+                    // InternalEssentialOCL.g:2545:6: ( 'implies' )
                     {
-                    // InternalEssentialOCL.g:2543:6: ( 'implies' )
-                    // InternalEssentialOCL.g:2544:1: 'implies'
+                    // InternalEssentialOCL.g:2545:6: ( 'implies' )
+                    // InternalEssentialOCL.g:2546:1: 'implies'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());
@@ -7632,10 +7632,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalEssentialOCL.g:2551:6: ( 'implies2' )
+                    // InternalEssentialOCL.g:2553:6: ( 'implies2' )
                     {
-                    // InternalEssentialOCL.g:2551:6: ( 'implies2' )
-                    // InternalEssentialOCL.g:2552:1: 'implies2'
+                    // InternalEssentialOCL.g:2553:6: ( 'implies2' )
+                    // InternalEssentialOCL.g:2554:1: 'implies2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());
@@ -7651,10 +7651,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalEssentialOCL.g:2559:6: ( 'or' )
+                    // InternalEssentialOCL.g:2561:6: ( 'or' )
                     {
-                    // InternalEssentialOCL.g:2559:6: ( 'or' )
-                    // InternalEssentialOCL.g:2560:1: 'or'
+                    // InternalEssentialOCL.g:2561:6: ( 'or' )
+                    // InternalEssentialOCL.g:2562:1: 'or'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());
@@ -7670,10 +7670,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalEssentialOCL.g:2567:6: ( 'or2' )
+                    // InternalEssentialOCL.g:2569:6: ( 'or2' )
                     {
-                    // InternalEssentialOCL.g:2567:6: ( 'or2' )
-                    // InternalEssentialOCL.g:2568:1: 'or2'
+                    // InternalEssentialOCL.g:2569:6: ( 'or2' )
+                    // InternalEssentialOCL.g:2570:1: 'or2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());
@@ -7689,10 +7689,10 @@
                     }
                     break;
                 case 17 :
-                    // InternalEssentialOCL.g:2575:6: ( 'xor' )
+                    // InternalEssentialOCL.g:2577:6: ( 'xor' )
                     {
-                    // InternalEssentialOCL.g:2575:6: ( 'xor' )
-                    // InternalEssentialOCL.g:2576:1: 'xor'
+                    // InternalEssentialOCL.g:2577:6: ( 'xor' )
+                    // InternalEssentialOCL.g:2578:1: 'xor'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());
@@ -7708,10 +7708,10 @@
                     }
                     break;
                 case 18 :
-                    // InternalEssentialOCL.g:2583:6: ( 'xor2' )
+                    // InternalEssentialOCL.g:2585:6: ( 'xor2' )
                     {
-                    // InternalEssentialOCL.g:2583:6: ( 'xor2' )
-                    // InternalEssentialOCL.g:2584:1: 'xor2'
+                    // InternalEssentialOCL.g:2585:6: ( 'xor2' )
+                    // InternalEssentialOCL.g:2586:1: 'xor2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());
@@ -7744,13 +7744,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLNavigationOperatorName__Alternatives"
-    // InternalEssentialOCL.g:2596:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
+    // InternalEssentialOCL.g:2598:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
     public final void rule__EssentialOCLNavigationOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2600:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
+            // InternalEssentialOCL.g:2602:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
             int alt4=4;
             switch ( input.LA(1) ) {
             case 36:
@@ -7783,10 +7783,10 @@
 
             switch (alt4) {
                 case 1 :
-                    // InternalEssentialOCL.g:2601:1: ( '.' )
+                    // InternalEssentialOCL.g:2603:1: ( '.' )
                     {
-                    // InternalEssentialOCL.g:2601:1: ( '.' )
-                    // InternalEssentialOCL.g:2602:1: '.'
+                    // InternalEssentialOCL.g:2603:1: ( '.' )
+                    // InternalEssentialOCL.g:2604:1: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
@@ -7802,10 +7802,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2609:6: ( '->' )
+                    // InternalEssentialOCL.g:2611:6: ( '->' )
                     {
-                    // InternalEssentialOCL.g:2609:6: ( '->' )
-                    // InternalEssentialOCL.g:2610:1: '->'
+                    // InternalEssentialOCL.g:2611:6: ( '->' )
+                    // InternalEssentialOCL.g:2612:1: '->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
@@ -7821,10 +7821,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2617:6: ( '?.' )
+                    // InternalEssentialOCL.g:2619:6: ( '?.' )
                     {
-                    // InternalEssentialOCL.g:2617:6: ( '?.' )
-                    // InternalEssentialOCL.g:2618:1: '?.'
+                    // InternalEssentialOCL.g:2619:6: ( '?.' )
+                    // InternalEssentialOCL.g:2620:1: '?.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
@@ -7840,10 +7840,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:2625:6: ( '?->' )
+                    // InternalEssentialOCL.g:2627:6: ( '?->' )
                     {
-                    // InternalEssentialOCL.g:2625:6: ( '?->' )
-                    // InternalEssentialOCL.g:2626:1: '?->'
+                    // InternalEssentialOCL.g:2627:6: ( '?->' )
+                    // InternalEssentialOCL.g:2628:1: '?->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
@@ -7876,13 +7876,13 @@
 
 
     // $ANTLR start "rule__BinaryOperatorName__Alternatives"
-    // InternalEssentialOCL.g:2638:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
+    // InternalEssentialOCL.g:2640:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
     public final void rule__BinaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2642:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
+            // InternalEssentialOCL.g:2644:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -7901,10 +7901,10 @@
             }
             switch (alt5) {
                 case 1 :
-                    // InternalEssentialOCL.g:2643:1: ( ruleInfixOperatorName )
+                    // InternalEssentialOCL.g:2645:1: ( ruleInfixOperatorName )
                     {
-                    // InternalEssentialOCL.g:2643:1: ( ruleInfixOperatorName )
-                    // InternalEssentialOCL.g:2644:1: ruleInfixOperatorName
+                    // InternalEssentialOCL.g:2645:1: ( ruleInfixOperatorName )
+                    // InternalEssentialOCL.g:2646:1: ruleInfixOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());
@@ -7924,10 +7924,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2649:6: ( ruleNavigationOperatorName )
+                    // InternalEssentialOCL.g:2651:6: ( ruleNavigationOperatorName )
                     {
-                    // InternalEssentialOCL.g:2649:6: ( ruleNavigationOperatorName )
-                    // InternalEssentialOCL.g:2650:1: ruleNavigationOperatorName
+                    // InternalEssentialOCL.g:2651:6: ( ruleNavigationOperatorName )
+                    // InternalEssentialOCL.g:2652:1: ruleNavigationOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());
@@ -7964,13 +7964,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnreservedName__Alternatives"
-    // InternalEssentialOCL.g:2660:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
+    // InternalEssentialOCL.g:2662:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
     public final void rule__EssentialOCLUnreservedName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2664:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
+            // InternalEssentialOCL.g:2666:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
             int alt6=5;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -8020,10 +8020,10 @@
 
             switch (alt6) {
                 case 1 :
-                    // InternalEssentialOCL.g:2665:1: ( ruleUnrestrictedName )
+                    // InternalEssentialOCL.g:2667:1: ( ruleUnrestrictedName )
                     {
-                    // InternalEssentialOCL.g:2665:1: ( ruleUnrestrictedName )
-                    // InternalEssentialOCL.g:2666:1: ruleUnrestrictedName
+                    // InternalEssentialOCL.g:2667:1: ( ruleUnrestrictedName )
+                    // InternalEssentialOCL.g:2668:1: ruleUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());
@@ -8043,10 +8043,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2671:6: ( ruleCollectionTypeIdentifier )
+                    // InternalEssentialOCL.g:2673:6: ( ruleCollectionTypeIdentifier )
                     {
-                    // InternalEssentialOCL.g:2671:6: ( ruleCollectionTypeIdentifier )
-                    // InternalEssentialOCL.g:2672:1: ruleCollectionTypeIdentifier
+                    // InternalEssentialOCL.g:2673:6: ( ruleCollectionTypeIdentifier )
+                    // InternalEssentialOCL.g:2674:1: ruleCollectionTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());
@@ -8066,10 +8066,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2677:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalEssentialOCL.g:2679:6: ( rulePrimitiveTypeIdentifier )
                     {
-                    // InternalEssentialOCL.g:2677:6: ( rulePrimitiveTypeIdentifier )
-                    // InternalEssentialOCL.g:2678:1: rulePrimitiveTypeIdentifier
+                    // InternalEssentialOCL.g:2679:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalEssentialOCL.g:2680:1: rulePrimitiveTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());
@@ -8089,10 +8089,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:2683:6: ( 'Map' )
+                    // InternalEssentialOCL.g:2685:6: ( 'Map' )
                     {
-                    // InternalEssentialOCL.g:2683:6: ( 'Map' )
-                    // InternalEssentialOCL.g:2684:1: 'Map'
+                    // InternalEssentialOCL.g:2685:6: ( 'Map' )
+                    // InternalEssentialOCL.g:2686:1: 'Map'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
@@ -8108,10 +8108,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalEssentialOCL.g:2691:6: ( 'Tuple' )
+                    // InternalEssentialOCL.g:2693:6: ( 'Tuple' )
                     {
-                    // InternalEssentialOCL.g:2691:6: ( 'Tuple' )
-                    // InternalEssentialOCL.g:2692:1: 'Tuple'
+                    // InternalEssentialOCL.g:2693:6: ( 'Tuple' )
+                    // InternalEssentialOCL.g:2694:1: 'Tuple'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
@@ -8144,13 +8144,13 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Alternatives"
-    // InternalEssentialOCL.g:2704:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
+    // InternalEssentialOCL.g:2706:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
     public final void rule__URIFirstPathElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2708:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
+            // InternalEssentialOCL.g:2710:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -8169,16 +8169,16 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalEssentialOCL.g:2709:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalEssentialOCL.g:2711:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                     {
-                    // InternalEssentialOCL.g:2709:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
-                    // InternalEssentialOCL.g:2710:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalEssentialOCL.g:2711:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalEssentialOCL.g:2712:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                     }
-                    // InternalEssentialOCL.g:2711:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
-                    // InternalEssentialOCL.g:2711:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
+                    // InternalEssentialOCL.g:2713:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalEssentialOCL.g:2713:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__ReferredElementAssignment_0();
@@ -8198,16 +8198,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2715:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalEssentialOCL.g:2717:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                     {
-                    // InternalEssentialOCL.g:2715:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
-                    // InternalEssentialOCL.g:2716:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalEssentialOCL.g:2717:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalEssentialOCL.g:2718:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                     }
-                    // InternalEssentialOCL.g:2717:1: ( rule__URIFirstPathElementCS__Group_1__0 )
-                    // InternalEssentialOCL.g:2717:2: rule__URIFirstPathElementCS__Group_1__0
+                    // InternalEssentialOCL.g:2719:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalEssentialOCL.g:2719:2: rule__URIFirstPathElementCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__Group_1__0();
@@ -8244,13 +8244,13 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeIdentifier__Alternatives"
-    // InternalEssentialOCL.g:2726:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
+    // InternalEssentialOCL.g:2728:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
     public final void rule__PrimitiveTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2730:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
+            // InternalEssentialOCL.g:2732:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
             int alt8=8;
             switch ( input.LA(1) ) {
             case 42:
@@ -8303,10 +8303,10 @@
 
             switch (alt8) {
                 case 1 :
-                    // InternalEssentialOCL.g:2731:1: ( 'Boolean' )
+                    // InternalEssentialOCL.g:2733:1: ( 'Boolean' )
                     {
-                    // InternalEssentialOCL.g:2731:1: ( 'Boolean' )
-                    // InternalEssentialOCL.g:2732:1: 'Boolean'
+                    // InternalEssentialOCL.g:2733:1: ( 'Boolean' )
+                    // InternalEssentialOCL.g:2734:1: 'Boolean'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
@@ -8322,10 +8322,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2739:6: ( 'Integer' )
+                    // InternalEssentialOCL.g:2741:6: ( 'Integer' )
                     {
-                    // InternalEssentialOCL.g:2739:6: ( 'Integer' )
-                    // InternalEssentialOCL.g:2740:1: 'Integer'
+                    // InternalEssentialOCL.g:2741:6: ( 'Integer' )
+                    // InternalEssentialOCL.g:2742:1: 'Integer'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
@@ -8341,10 +8341,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2747:6: ( 'Real' )
+                    // InternalEssentialOCL.g:2749:6: ( 'Real' )
                     {
-                    // InternalEssentialOCL.g:2747:6: ( 'Real' )
-                    // InternalEssentialOCL.g:2748:1: 'Real'
+                    // InternalEssentialOCL.g:2749:6: ( 'Real' )
+                    // InternalEssentialOCL.g:2750:1: 'Real'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
@@ -8360,10 +8360,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:2755:6: ( 'String' )
+                    // InternalEssentialOCL.g:2757:6: ( 'String' )
                     {
-                    // InternalEssentialOCL.g:2755:6: ( 'String' )
-                    // InternalEssentialOCL.g:2756:1: 'String'
+                    // InternalEssentialOCL.g:2757:6: ( 'String' )
+                    // InternalEssentialOCL.g:2758:1: 'String'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
@@ -8379,10 +8379,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalEssentialOCL.g:2763:6: ( 'UnlimitedNatural' )
+                    // InternalEssentialOCL.g:2765:6: ( 'UnlimitedNatural' )
                     {
-                    // InternalEssentialOCL.g:2763:6: ( 'UnlimitedNatural' )
-                    // InternalEssentialOCL.g:2764:1: 'UnlimitedNatural'
+                    // InternalEssentialOCL.g:2765:6: ( 'UnlimitedNatural' )
+                    // InternalEssentialOCL.g:2766:1: 'UnlimitedNatural'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
@@ -8398,10 +8398,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalEssentialOCL.g:2771:6: ( 'OclAny' )
+                    // InternalEssentialOCL.g:2773:6: ( 'OclAny' )
                     {
-                    // InternalEssentialOCL.g:2771:6: ( 'OclAny' )
-                    // InternalEssentialOCL.g:2772:1: 'OclAny'
+                    // InternalEssentialOCL.g:2773:6: ( 'OclAny' )
+                    // InternalEssentialOCL.g:2774:1: 'OclAny'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
@@ -8417,10 +8417,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalEssentialOCL.g:2779:6: ( 'OclInvalid' )
+                    // InternalEssentialOCL.g:2781:6: ( 'OclInvalid' )
                     {
-                    // InternalEssentialOCL.g:2779:6: ( 'OclInvalid' )
-                    // InternalEssentialOCL.g:2780:1: 'OclInvalid'
+                    // InternalEssentialOCL.g:2781:6: ( 'OclInvalid' )
+                    // InternalEssentialOCL.g:2782:1: 'OclInvalid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
@@ -8436,10 +8436,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalEssentialOCL.g:2787:6: ( 'OclVoid' )
+                    // InternalEssentialOCL.g:2789:6: ( 'OclVoid' )
                     {
-                    // InternalEssentialOCL.g:2787:6: ( 'OclVoid' )
-                    // InternalEssentialOCL.g:2788:1: 'OclVoid'
+                    // InternalEssentialOCL.g:2789:6: ( 'OclVoid' )
+                    // InternalEssentialOCL.g:2790:1: 'OclVoid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());
@@ -8472,13 +8472,13 @@
 
 
     // $ANTLR start "rule__CollectionTypeIdentifier__Alternatives"
-    // InternalEssentialOCL.g:2800:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
+    // InternalEssentialOCL.g:2802:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
     public final void rule__CollectionTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2804:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
+            // InternalEssentialOCL.g:2806:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
             int alt9=5;
             switch ( input.LA(1) ) {
             case 50:
@@ -8516,10 +8516,10 @@
 
             switch (alt9) {
                 case 1 :
-                    // InternalEssentialOCL.g:2805:1: ( 'Set' )
+                    // InternalEssentialOCL.g:2807:1: ( 'Set' )
                     {
-                    // InternalEssentialOCL.g:2805:1: ( 'Set' )
-                    // InternalEssentialOCL.g:2806:1: 'Set'
+                    // InternalEssentialOCL.g:2807:1: ( 'Set' )
+                    // InternalEssentialOCL.g:2808:1: 'Set'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
@@ -8535,10 +8535,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2813:6: ( 'Bag' )
+                    // InternalEssentialOCL.g:2815:6: ( 'Bag' )
                     {
-                    // InternalEssentialOCL.g:2813:6: ( 'Bag' )
-                    // InternalEssentialOCL.g:2814:1: 'Bag'
+                    // InternalEssentialOCL.g:2815:6: ( 'Bag' )
+                    // InternalEssentialOCL.g:2816:1: 'Bag'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
@@ -8554,10 +8554,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2821:6: ( 'Sequence' )
+                    // InternalEssentialOCL.g:2823:6: ( 'Sequence' )
                     {
-                    // InternalEssentialOCL.g:2821:6: ( 'Sequence' )
-                    // InternalEssentialOCL.g:2822:1: 'Sequence'
+                    // InternalEssentialOCL.g:2823:6: ( 'Sequence' )
+                    // InternalEssentialOCL.g:2824:1: 'Sequence'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
@@ -8573,10 +8573,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:2829:6: ( 'Collection' )
+                    // InternalEssentialOCL.g:2831:6: ( 'Collection' )
                     {
-                    // InternalEssentialOCL.g:2829:6: ( 'Collection' )
-                    // InternalEssentialOCL.g:2830:1: 'Collection'
+                    // InternalEssentialOCL.g:2831:6: ( 'Collection' )
+                    // InternalEssentialOCL.g:2832:1: 'Collection'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
@@ -8592,10 +8592,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalEssentialOCL.g:2837:6: ( 'OrderedSet' )
+                    // InternalEssentialOCL.g:2839:6: ( 'OrderedSet' )
                     {
-                    // InternalEssentialOCL.g:2837:6: ( 'OrderedSet' )
-                    // InternalEssentialOCL.g:2838:1: 'OrderedSet'
+                    // InternalEssentialOCL.g:2839:6: ( 'OrderedSet' )
+                    // InternalEssentialOCL.g:2840:1: 'OrderedSet'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
@@ -8628,13 +8628,13 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Alternatives"
-    // InternalEssentialOCL.g:2850:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
+    // InternalEssentialOCL.g:2852:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
     public final void rule__CollectionLiteralPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2854:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:2856:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
             int alt10=2;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -8724,16 +8724,16 @@
 
             switch (alt10) {
                 case 1 :
-                    // InternalEssentialOCL.g:2855:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:2857:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:2855:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
-                    // InternalEssentialOCL.g:2856:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalEssentialOCL.g:2857:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:2858:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                     }
-                    // InternalEssentialOCL.g:2857:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
-                    // InternalEssentialOCL.g:2857:2: rule__CollectionLiteralPartCS__Group_0__0
+                    // InternalEssentialOCL.g:2859:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalEssentialOCL.g:2859:2: rule__CollectionLiteralPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0__0();
@@ -8753,16 +8753,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2861:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalEssentialOCL.g:2863:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                     {
-                    // InternalEssentialOCL.g:2861:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
-                    // InternalEssentialOCL.g:2862:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalEssentialOCL.g:2863:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalEssentialOCL.g:2864:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                     }
-                    // InternalEssentialOCL.g:2863:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
-                    // InternalEssentialOCL.g:2863:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
+                    // InternalEssentialOCL.g:2865:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalEssentialOCL.g:2865:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1();
@@ -8799,13 +8799,13 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Alternatives"
-    // InternalEssentialOCL.g:2872:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
+    // InternalEssentialOCL.g:2874:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
     public final void rule__ShadowPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2876:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:2878:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -8824,16 +8824,16 @@
             }
             switch (alt11) {
                 case 1 :
-                    // InternalEssentialOCL.g:2877:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:2879:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:2877:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
-                    // InternalEssentialOCL.g:2878:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalEssentialOCL.g:2879:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:2880:1: ( rule__ShadowPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getGroup_0());
                     }
-                    // InternalEssentialOCL.g:2879:1: ( rule__ShadowPartCS__Group_0__0 )
-                    // InternalEssentialOCL.g:2879:2: rule__ShadowPartCS__Group_0__0
+                    // InternalEssentialOCL.g:2881:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalEssentialOCL.g:2881:2: rule__ShadowPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__Group_0__0();
@@ -8853,16 +8853,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2883:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalEssentialOCL.g:2885:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
                     {
-                    // InternalEssentialOCL.g:2883:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
-                    // InternalEssentialOCL.g:2884:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalEssentialOCL.g:2885:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalEssentialOCL.g:2886:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_1());
                     }
-                    // InternalEssentialOCL.g:2885:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
-                    // InternalEssentialOCL.g:2885:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
+                    // InternalEssentialOCL.g:2887:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalEssentialOCL.g:2887:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__OwnedInitExpressionAssignment_1();
@@ -8899,13 +8899,13 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0"
-    // InternalEssentialOCL.g:2894:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalEssentialOCL.g:2896:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2898:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalEssentialOCL.g:2900:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt12=2;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -8995,10 +8995,10 @@
 
             switch (alt12) {
                 case 1 :
-                    // InternalEssentialOCL.g:2899:1: ( ruleExpCS )
+                    // InternalEssentialOCL.g:2901:1: ( ruleExpCS )
                     {
-                    // InternalEssentialOCL.g:2899:1: ( ruleExpCS )
-                    // InternalEssentialOCL.g:2900:1: ruleExpCS
+                    // InternalEssentialOCL.g:2901:1: ( ruleExpCS )
+                    // InternalEssentialOCL.g:2902:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());
@@ -9018,10 +9018,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2905:6: ( rulePatternExpCS )
+                    // InternalEssentialOCL.g:2907:6: ( rulePatternExpCS )
                     {
-                    // InternalEssentialOCL.g:2905:6: ( rulePatternExpCS )
-                    // InternalEssentialOCL.g:2906:1: rulePatternExpCS
+                    // InternalEssentialOCL.g:2907:6: ( rulePatternExpCS )
+                    // InternalEssentialOCL.g:2908:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());
@@ -9058,13 +9058,13 @@
 
 
     // $ANTLR start "rule__PrimitiveLiteralExpCS__Alternatives"
-    // InternalEssentialOCL.g:2916:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
+    // InternalEssentialOCL.g:2918:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
     public final void rule__PrimitiveLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2920:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
+            // InternalEssentialOCL.g:2922:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
             int alt13=6;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -9108,10 +9108,10 @@
 
             switch (alt13) {
                 case 1 :
-                    // InternalEssentialOCL.g:2921:1: ( ruleNumberLiteralExpCS )
+                    // InternalEssentialOCL.g:2923:1: ( ruleNumberLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:2921:1: ( ruleNumberLiteralExpCS )
-                    // InternalEssentialOCL.g:2922:1: ruleNumberLiteralExpCS
+                    // InternalEssentialOCL.g:2923:1: ( ruleNumberLiteralExpCS )
+                    // InternalEssentialOCL.g:2924:1: ruleNumberLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());
@@ -9131,10 +9131,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2927:6: ( ruleStringLiteralExpCS )
+                    // InternalEssentialOCL.g:2929:6: ( ruleStringLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:2927:6: ( ruleStringLiteralExpCS )
-                    // InternalEssentialOCL.g:2928:1: ruleStringLiteralExpCS
+                    // InternalEssentialOCL.g:2929:6: ( ruleStringLiteralExpCS )
+                    // InternalEssentialOCL.g:2930:1: ruleStringLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());
@@ -9154,10 +9154,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:2933:6: ( ruleBooleanLiteralExpCS )
+                    // InternalEssentialOCL.g:2935:6: ( ruleBooleanLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:2933:6: ( ruleBooleanLiteralExpCS )
-                    // InternalEssentialOCL.g:2934:1: ruleBooleanLiteralExpCS
+                    // InternalEssentialOCL.g:2935:6: ( ruleBooleanLiteralExpCS )
+                    // InternalEssentialOCL.g:2936:1: ruleBooleanLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());
@@ -9177,10 +9177,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:2939:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalEssentialOCL.g:2941:6: ( ruleUnlimitedNaturalLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:2939:6: ( ruleUnlimitedNaturalLiteralExpCS )
-                    // InternalEssentialOCL.g:2940:1: ruleUnlimitedNaturalLiteralExpCS
+                    // InternalEssentialOCL.g:2941:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalEssentialOCL.g:2942:1: ruleUnlimitedNaturalLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());
@@ -9200,10 +9200,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalEssentialOCL.g:2945:6: ( ruleInvalidLiteralExpCS )
+                    // InternalEssentialOCL.g:2947:6: ( ruleInvalidLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:2945:6: ( ruleInvalidLiteralExpCS )
-                    // InternalEssentialOCL.g:2946:1: ruleInvalidLiteralExpCS
+                    // InternalEssentialOCL.g:2947:6: ( ruleInvalidLiteralExpCS )
+                    // InternalEssentialOCL.g:2948:1: ruleInvalidLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());
@@ -9223,10 +9223,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalEssentialOCL.g:2951:6: ( ruleNullLiteralExpCS )
+                    // InternalEssentialOCL.g:2953:6: ( ruleNullLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:2951:6: ( ruleNullLiteralExpCS )
-                    // InternalEssentialOCL.g:2952:1: ruleNullLiteralExpCS
+                    // InternalEssentialOCL.g:2953:6: ( ruleNullLiteralExpCS )
+                    // InternalEssentialOCL.g:2954:1: ruleNullLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());
@@ -9263,13 +9263,13 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__Alternatives"
-    // InternalEssentialOCL.g:2962:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
+    // InternalEssentialOCL.g:2964:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
     public final void rule__BooleanLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2966:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
+            // InternalEssentialOCL.g:2968:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -9288,16 +9288,16 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalEssentialOCL.g:2967:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalEssentialOCL.g:2969:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                     {
-                    // InternalEssentialOCL.g:2967:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
-                    // InternalEssentialOCL.g:2968:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalEssentialOCL.g:2969:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalEssentialOCL.g:2970:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                     }
-                    // InternalEssentialOCL.g:2969:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
-                    // InternalEssentialOCL.g:2969:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
+                    // InternalEssentialOCL.g:2971:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalEssentialOCL.g:2971:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_0();
@@ -9317,16 +9317,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2973:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalEssentialOCL.g:2975:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                     {
-                    // InternalEssentialOCL.g:2973:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
-                    // InternalEssentialOCL.g:2974:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalEssentialOCL.g:2975:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalEssentialOCL.g:2976:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                     }
-                    // InternalEssentialOCL.g:2975:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
-                    // InternalEssentialOCL.g:2975:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
+                    // InternalEssentialOCL.g:2977:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalEssentialOCL.g:2977:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_1();
@@ -9363,13 +9363,13 @@
 
 
     // $ANTLR start "rule__TypeLiteralCS__Alternatives"
-    // InternalEssentialOCL.g:2984:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
+    // InternalEssentialOCL.g:2986:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
     public final void rule__TypeLiteralCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:2988:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
+            // InternalEssentialOCL.g:2990:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
             int alt15=4;
             switch ( input.LA(1) ) {
             case 42:
@@ -9413,10 +9413,10 @@
 
             switch (alt15) {
                 case 1 :
-                    // InternalEssentialOCL.g:2989:1: ( rulePrimitiveTypeCS )
+                    // InternalEssentialOCL.g:2991:1: ( rulePrimitiveTypeCS )
                     {
-                    // InternalEssentialOCL.g:2989:1: ( rulePrimitiveTypeCS )
-                    // InternalEssentialOCL.g:2990:1: rulePrimitiveTypeCS
+                    // InternalEssentialOCL.g:2991:1: ( rulePrimitiveTypeCS )
+                    // InternalEssentialOCL.g:2992:1: rulePrimitiveTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());
@@ -9436,10 +9436,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:2995:6: ( ruleCollectionTypeCS )
+                    // InternalEssentialOCL.g:2997:6: ( ruleCollectionTypeCS )
                     {
-                    // InternalEssentialOCL.g:2995:6: ( ruleCollectionTypeCS )
-                    // InternalEssentialOCL.g:2996:1: ruleCollectionTypeCS
+                    // InternalEssentialOCL.g:2997:6: ( ruleCollectionTypeCS )
+                    // InternalEssentialOCL.g:2998:1: ruleCollectionTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());
@@ -9459,10 +9459,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3001:6: ( ruleMapTypeCS )
+                    // InternalEssentialOCL.g:3003:6: ( ruleMapTypeCS )
                     {
-                    // InternalEssentialOCL.g:3001:6: ( ruleMapTypeCS )
-                    // InternalEssentialOCL.g:3002:1: ruleMapTypeCS
+                    // InternalEssentialOCL.g:3003:6: ( ruleMapTypeCS )
+                    // InternalEssentialOCL.g:3004:1: ruleMapTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());
@@ -9482,10 +9482,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:3007:6: ( ruleTupleTypeCS )
+                    // InternalEssentialOCL.g:3009:6: ( ruleTupleTypeCS )
                     {
-                    // InternalEssentialOCL.g:3007:6: ( ruleTupleTypeCS )
-                    // InternalEssentialOCL.g:3008:1: ruleTupleTypeCS
+                    // InternalEssentialOCL.g:3009:6: ( ruleTupleTypeCS )
+                    // InternalEssentialOCL.g:3010:1: ruleTupleTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());
@@ -9522,21 +9522,21 @@
 
 
     // $ANTLR start "rule__TypeExpWithoutMultiplicityCS__Alternatives"
-    // InternalEssentialOCL.g:3018:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
+    // InternalEssentialOCL.g:3020:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
     public final void rule__TypeExpWithoutMultiplicityCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3022:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
+            // InternalEssentialOCL.g:3024:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
             int alt16=3;
             alt16 = dfa16.predict(input);
             switch (alt16) {
                 case 1 :
-                    // InternalEssentialOCL.g:3023:1: ( ruleTypeNameExpCS )
+                    // InternalEssentialOCL.g:3025:1: ( ruleTypeNameExpCS )
                     {
-                    // InternalEssentialOCL.g:3023:1: ( ruleTypeNameExpCS )
-                    // InternalEssentialOCL.g:3024:1: ruleTypeNameExpCS
+                    // InternalEssentialOCL.g:3025:1: ( ruleTypeNameExpCS )
+                    // InternalEssentialOCL.g:3026:1: ruleTypeNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());
@@ -9556,10 +9556,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3029:6: ( ruleTypeLiteralCS )
+                    // InternalEssentialOCL.g:3031:6: ( ruleTypeLiteralCS )
                     {
-                    // InternalEssentialOCL.g:3029:6: ( ruleTypeLiteralCS )
-                    // InternalEssentialOCL.g:3030:1: ruleTypeLiteralCS
+                    // InternalEssentialOCL.g:3031:6: ( ruleTypeLiteralCS )
+                    // InternalEssentialOCL.g:3032:1: ruleTypeLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -9579,10 +9579,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3035:6: ( ruleCollectionPatternCS )
+                    // InternalEssentialOCL.g:3037:6: ( ruleCollectionPatternCS )
                     {
-                    // InternalEssentialOCL.g:3035:6: ( ruleCollectionPatternCS )
-                    // InternalEssentialOCL.g:3036:1: ruleCollectionPatternCS
+                    // InternalEssentialOCL.g:3037:6: ( ruleCollectionPatternCS )
+                    // InternalEssentialOCL.g:3038:1: ruleCollectionPatternCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());
@@ -9619,27 +9619,27 @@
 
 
     // $ANTLR start "rule__ExpCS__Alternatives"
-    // InternalEssentialOCL.g:3046:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
+    // InternalEssentialOCL.g:3048:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
     public final void rule__ExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3050:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
+            // InternalEssentialOCL.g:3052:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
             int alt17=2;
             alt17 = dfa17.predict(input);
             switch (alt17) {
                 case 1 :
-                    // InternalEssentialOCL.g:3051:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3053:1: ( ( rule__ExpCS__Group_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:3051:1: ( ( rule__ExpCS__Group_0__0 ) )
-                    // InternalEssentialOCL.g:3052:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3053:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3054:1: ( rule__ExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getGroup_0());
                     }
-                    // InternalEssentialOCL.g:3053:1: ( rule__ExpCS__Group_0__0 )
-                    // InternalEssentialOCL.g:3053:2: rule__ExpCS__Group_0__0
+                    // InternalEssentialOCL.g:3055:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3055:2: rule__ExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0__0();
@@ -9659,10 +9659,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3057:6: ( rulePrefixedLetExpCS )
+                    // InternalEssentialOCL.g:3059:6: ( rulePrefixedLetExpCS )
                     {
-                    // InternalEssentialOCL.g:3057:6: ( rulePrefixedLetExpCS )
-                    // InternalEssentialOCL.g:3058:1: rulePrefixedLetExpCS
+                    // InternalEssentialOCL.g:3059:6: ( rulePrefixedLetExpCS )
+                    // InternalEssentialOCL.g:3060:1: rulePrefixedLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());
@@ -9699,13 +9699,13 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Alternatives"
-    // InternalEssentialOCL.g:3068:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
+    // InternalEssentialOCL.g:3070:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
     public final void rule__PrefixedLetExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3072:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
+            // InternalEssentialOCL.g:3074:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
             int alt18=2;
             int LA18_0 = input.LA(1);
 
@@ -9724,16 +9724,16 @@
             }
             switch (alt18) {
                 case 1 :
-                    // InternalEssentialOCL.g:3073:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3075:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:3073:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
-                    // InternalEssentialOCL.g:3074:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3075:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3076:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                     }
-                    // InternalEssentialOCL.g:3075:1: ( rule__PrefixedLetExpCS__Group_0__0 )
-                    // InternalEssentialOCL.g:3075:2: rule__PrefixedLetExpCS__Group_0__0
+                    // InternalEssentialOCL.g:3077:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3077:2: rule__PrefixedLetExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedLetExpCS__Group_0__0();
@@ -9753,10 +9753,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3079:6: ( ruleLetExpCS )
+                    // InternalEssentialOCL.g:3081:6: ( ruleLetExpCS )
                     {
-                    // InternalEssentialOCL.g:3079:6: ( ruleLetExpCS )
-                    // InternalEssentialOCL.g:3080:1: ruleLetExpCS
+                    // InternalEssentialOCL.g:3081:6: ( ruleLetExpCS )
+                    // InternalEssentialOCL.g:3082:1: ruleLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());
@@ -9793,13 +9793,13 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Alternatives"
-    // InternalEssentialOCL.g:3090:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
+    // InternalEssentialOCL.g:3092:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
     public final void rule__PrefixedPrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3094:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
+            // InternalEssentialOCL.g:3096:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -9818,16 +9818,16 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalEssentialOCL.g:3095:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3097:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:3095:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
-                    // InternalEssentialOCL.g:3096:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3097:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3098:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                     }
-                    // InternalEssentialOCL.g:3097:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
-                    // InternalEssentialOCL.g:3097:2: rule__PrefixedPrimaryExpCS__Group_0__0
+                    // InternalEssentialOCL.g:3099:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3099:2: rule__PrefixedPrimaryExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedPrimaryExpCS__Group_0__0();
@@ -9847,10 +9847,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3101:6: ( rulePrimaryExpCS )
+                    // InternalEssentialOCL.g:3103:6: ( rulePrimaryExpCS )
                     {
-                    // InternalEssentialOCL.g:3101:6: ( rulePrimaryExpCS )
-                    // InternalEssentialOCL.g:3102:1: rulePrimaryExpCS
+                    // InternalEssentialOCL.g:3103:6: ( rulePrimaryExpCS )
+                    // InternalEssentialOCL.g:3104:1: rulePrimaryExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());
@@ -9887,21 +9887,21 @@
 
 
     // $ANTLR start "rule__PrimaryExpCS__Alternatives"
-    // InternalEssentialOCL.g:3112:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
+    // InternalEssentialOCL.g:3114:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
     public final void rule__PrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3116:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
+            // InternalEssentialOCL.g:3118:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
             int alt20=10;
             alt20 = dfa20.predict(input);
             switch (alt20) {
                 case 1 :
-                    // InternalEssentialOCL.g:3117:1: ( ruleNestedExpCS )
+                    // InternalEssentialOCL.g:3119:1: ( ruleNestedExpCS )
                     {
-                    // InternalEssentialOCL.g:3117:1: ( ruleNestedExpCS )
-                    // InternalEssentialOCL.g:3118:1: ruleNestedExpCS
+                    // InternalEssentialOCL.g:3119:1: ( ruleNestedExpCS )
+                    // InternalEssentialOCL.g:3120:1: ruleNestedExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());
@@ -9921,10 +9921,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3123:6: ( ruleIfExpCS )
+                    // InternalEssentialOCL.g:3125:6: ( ruleIfExpCS )
                     {
-                    // InternalEssentialOCL.g:3123:6: ( ruleIfExpCS )
-                    // InternalEssentialOCL.g:3124:1: ruleIfExpCS
+                    // InternalEssentialOCL.g:3125:6: ( ruleIfExpCS )
+                    // InternalEssentialOCL.g:3126:1: ruleIfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());
@@ -9944,10 +9944,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3129:6: ( ruleSelfExpCS )
+                    // InternalEssentialOCL.g:3131:6: ( ruleSelfExpCS )
                     {
-                    // InternalEssentialOCL.g:3129:6: ( ruleSelfExpCS )
-                    // InternalEssentialOCL.g:3130:1: ruleSelfExpCS
+                    // InternalEssentialOCL.g:3131:6: ( ruleSelfExpCS )
+                    // InternalEssentialOCL.g:3132:1: ruleSelfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());
@@ -9967,10 +9967,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalEssentialOCL.g:3135:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalEssentialOCL.g:3137:6: ( rulePrimitiveLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:3135:6: ( rulePrimitiveLiteralExpCS )
-                    // InternalEssentialOCL.g:3136:1: rulePrimitiveLiteralExpCS
+                    // InternalEssentialOCL.g:3137:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalEssentialOCL.g:3138:1: rulePrimitiveLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());
@@ -9990,10 +9990,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalEssentialOCL.g:3141:6: ( ruleTupleLiteralExpCS )
+                    // InternalEssentialOCL.g:3143:6: ( ruleTupleLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:3141:6: ( ruleTupleLiteralExpCS )
-                    // InternalEssentialOCL.g:3142:1: ruleTupleLiteralExpCS
+                    // InternalEssentialOCL.g:3143:6: ( ruleTupleLiteralExpCS )
+                    // InternalEssentialOCL.g:3144:1: ruleTupleLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -10013,10 +10013,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalEssentialOCL.g:3147:6: ( ruleMapLiteralExpCS )
+                    // InternalEssentialOCL.g:3149:6: ( ruleMapLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:3147:6: ( ruleMapLiteralExpCS )
-                    // InternalEssentialOCL.g:3148:1: ruleMapLiteralExpCS
+                    // InternalEssentialOCL.g:3149:6: ( ruleMapLiteralExpCS )
+                    // InternalEssentialOCL.g:3150:1: ruleMapLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -10036,10 +10036,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalEssentialOCL.g:3153:6: ( ruleCollectionLiteralExpCS )
+                    // InternalEssentialOCL.g:3155:6: ( ruleCollectionLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:3153:6: ( ruleCollectionLiteralExpCS )
-                    // InternalEssentialOCL.g:3154:1: ruleCollectionLiteralExpCS
+                    // InternalEssentialOCL.g:3155:6: ( ruleCollectionLiteralExpCS )
+                    // InternalEssentialOCL.g:3156:1: ruleCollectionLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -10059,10 +10059,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalEssentialOCL.g:3159:6: ( ruleLambdaLiteralExpCS )
+                    // InternalEssentialOCL.g:3161:6: ( ruleLambdaLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:3159:6: ( ruleLambdaLiteralExpCS )
-                    // InternalEssentialOCL.g:3160:1: ruleLambdaLiteralExpCS
+                    // InternalEssentialOCL.g:3161:6: ( ruleLambdaLiteralExpCS )
+                    // InternalEssentialOCL.g:3162:1: ruleLambdaLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());
@@ -10082,10 +10082,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalEssentialOCL.g:3165:6: ( ruleTypeLiteralExpCS )
+                    // InternalEssentialOCL.g:3167:6: ( ruleTypeLiteralExpCS )
                     {
-                    // InternalEssentialOCL.g:3165:6: ( ruleTypeLiteralExpCS )
-                    // InternalEssentialOCL.g:3166:1: ruleTypeLiteralExpCS
+                    // InternalEssentialOCL.g:3167:6: ( ruleTypeLiteralExpCS )
+                    // InternalEssentialOCL.g:3168:1: ruleTypeLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -10105,10 +10105,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalEssentialOCL.g:3171:6: ( ruleNameExpCS )
+                    // InternalEssentialOCL.g:3173:6: ( ruleNameExpCS )
                     {
-                    // InternalEssentialOCL.g:3171:6: ( ruleNameExpCS )
-                    // InternalEssentialOCL.g:3172:1: ruleNameExpCS
+                    // InternalEssentialOCL.g:3173:6: ( ruleNameExpCS )
+                    // InternalEssentialOCL.g:3174:1: ruleNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());
@@ -10145,13 +10145,13 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0"
-    // InternalEssentialOCL.g:3182:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
+    // InternalEssentialOCL.g:3184:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3186:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
+            // InternalEssentialOCL.g:3188:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
             int alt21=3;
             switch ( input.LA(1) ) {
             case 59:
@@ -10179,10 +10179,10 @@
 
             switch (alt21) {
                 case 1 :
-                    // InternalEssentialOCL.g:3187:1: ( ruleNavigatingCommaArgCS )
+                    // InternalEssentialOCL.g:3189:1: ( ruleNavigatingCommaArgCS )
                     {
-                    // InternalEssentialOCL.g:3187:1: ( ruleNavigatingCommaArgCS )
-                    // InternalEssentialOCL.g:3188:1: ruleNavigatingCommaArgCS
+                    // InternalEssentialOCL.g:3189:1: ( ruleNavigatingCommaArgCS )
+                    // InternalEssentialOCL.g:3190:1: ruleNavigatingCommaArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
@@ -10202,10 +10202,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3193:6: ( ruleNavigatingSemiArgCS )
+                    // InternalEssentialOCL.g:3195:6: ( ruleNavigatingSemiArgCS )
                     {
-                    // InternalEssentialOCL.g:3193:6: ( ruleNavigatingSemiArgCS )
-                    // InternalEssentialOCL.g:3194:1: ruleNavigatingSemiArgCS
+                    // InternalEssentialOCL.g:3195:6: ( ruleNavigatingSemiArgCS )
+                    // InternalEssentialOCL.g:3196:1: ruleNavigatingSemiArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
@@ -10225,10 +10225,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3199:6: ( ruleNavigatingBarArgCS )
+                    // InternalEssentialOCL.g:3201:6: ( ruleNavigatingBarArgCS )
                     {
-                    // InternalEssentialOCL.g:3199:6: ( ruleNavigatingBarArgCS )
-                    // InternalEssentialOCL.g:3200:1: ruleNavigatingBarArgCS
+                    // InternalEssentialOCL.g:3201:6: ( ruleNavigatingBarArgCS )
+                    // InternalEssentialOCL.g:3202:1: ruleNavigatingBarArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
@@ -10265,13 +10265,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives"
-    // InternalEssentialOCL.g:3210:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
+    // InternalEssentialOCL.g:3212:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3214:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
+            // InternalEssentialOCL.g:3216:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
             int alt22=2;
             int LA22_0 = input.LA(1);
 
@@ -10290,16 +10290,16 @@
             }
             switch (alt22) {
                 case 1 :
-                    // InternalEssentialOCL.g:3215:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3217:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:3215:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
-                    // InternalEssentialOCL.g:3216:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3217:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalEssentialOCL.g:3218:1: ( rule__NavigatingArgCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                     }
-                    // InternalEssentialOCL.g:3217:1: ( rule__NavigatingArgCS__Group_0__0 )
-                    // InternalEssentialOCL.g:3217:2: rule__NavigatingArgCS__Group_0__0
+                    // InternalEssentialOCL.g:3219:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalEssentialOCL.g:3219:2: rule__NavigatingArgCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0__0();
@@ -10319,16 +10319,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3221:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalEssentialOCL.g:3223:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                     {
-                    // InternalEssentialOCL.g:3221:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
-                    // InternalEssentialOCL.g:3222:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalEssentialOCL.g:3223:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalEssentialOCL.g:3224:1: ( rule__NavigatingArgCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                     }
-                    // InternalEssentialOCL.g:3223:1: ( rule__NavigatingArgCS__Group_1__0 )
-                    // InternalEssentialOCL.g:3223:2: rule__NavigatingArgCS__Group_1__0
+                    // InternalEssentialOCL.g:3225:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalEssentialOCL.g:3225:2: rule__NavigatingArgCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_1__0();
@@ -10365,13 +10365,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives_0_1"
-    // InternalEssentialOCL.g:3232:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
+    // InternalEssentialOCL.g:3234:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3236:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
+            // InternalEssentialOCL.g:3238:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
             int alt23=3;
             switch ( input.LA(1) ) {
             case 66:
@@ -10427,16 +10427,16 @@
 
             switch (alt23) {
                 case 1 :
-                    // InternalEssentialOCL.g:3237:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalEssentialOCL.g:3239:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:3237:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-                    // InternalEssentialOCL.g:3238:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalEssentialOCL.g:3239:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalEssentialOCL.g:3240:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                     }
-                    // InternalEssentialOCL.g:3239:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-                    // InternalEssentialOCL.g:3239:2: rule__NavigatingArgCS__Group_0_1_0__0
+                    // InternalEssentialOCL.g:3241:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalEssentialOCL.g:3241:2: rule__NavigatingArgCS__Group_0_1_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0__0();
@@ -10456,16 +10456,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3243:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalEssentialOCL.g:3245:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                     {
-                    // InternalEssentialOCL.g:3243:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-                    // InternalEssentialOCL.g:3244:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalEssentialOCL.g:3245:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalEssentialOCL.g:3246:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                     }
-                    // InternalEssentialOCL.g:3245:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-                    // InternalEssentialOCL.g:3245:2: rule__NavigatingArgCS__Group_0_1_1__0
+                    // InternalEssentialOCL.g:3247:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalEssentialOCL.g:3247:2: rule__NavigatingArgCS__Group_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1__0();
@@ -10485,16 +10485,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3249:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalEssentialOCL.g:3251:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
                     {
-                    // InternalEssentialOCL.g:3249:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
-                    // InternalEssentialOCL.g:3250:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalEssentialOCL.g:3251:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalEssentialOCL.g:3252:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2());
                     }
-                    // InternalEssentialOCL.g:3251:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
-                    // InternalEssentialOCL.g:3251:2: rule__NavigatingArgCS__Group_0_1_2__0
+                    // InternalEssentialOCL.g:3253:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalEssentialOCL.g:3253:2: rule__NavigatingArgCS__Group_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2__0();
@@ -10531,13 +10531,13 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Alternatives_2"
-    // InternalEssentialOCL.g:3260:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
+    // InternalEssentialOCL.g:3262:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
     public final void rule__NavigatingCommaArgCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3264:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
+            // InternalEssentialOCL.g:3266:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
             int alt24=3;
             switch ( input.LA(1) ) {
             case 66:
@@ -10593,16 +10593,16 @@
 
             switch (alt24) {
                 case 1 :
-                    // InternalEssentialOCL.g:3265:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalEssentialOCL.g:3267:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                     {
-                    // InternalEssentialOCL.g:3265:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-                    // InternalEssentialOCL.g:3266:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalEssentialOCL.g:3267:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalEssentialOCL.g:3268:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                     }
-                    // InternalEssentialOCL.g:3267:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-                    // InternalEssentialOCL.g:3267:2: rule__NavigatingCommaArgCS__Group_2_0__0
+                    // InternalEssentialOCL.g:3269:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalEssentialOCL.g:3269:2: rule__NavigatingCommaArgCS__Group_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -10622,16 +10622,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3271:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalEssentialOCL.g:3273:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                     {
-                    // InternalEssentialOCL.g:3271:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-                    // InternalEssentialOCL.g:3272:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalEssentialOCL.g:3273:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalEssentialOCL.g:3274:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                     }
-                    // InternalEssentialOCL.g:3273:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-                    // InternalEssentialOCL.g:3273:2: rule__NavigatingCommaArgCS__Group_2_1__0
+                    // InternalEssentialOCL.g:3275:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalEssentialOCL.g:3275:2: rule__NavigatingCommaArgCS__Group_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -10651,16 +10651,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3277:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalEssentialOCL.g:3279:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
                     {
-                    // InternalEssentialOCL.g:3277:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
-                    // InternalEssentialOCL.g:3278:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalEssentialOCL.g:3279:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalEssentialOCL.g:3280:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2());
                     }
-                    // InternalEssentialOCL.g:3279:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
-                    // InternalEssentialOCL.g:3279:2: rule__NavigatingCommaArgCS__Group_2_2__0
+                    // InternalEssentialOCL.g:3281:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalEssentialOCL.g:3281:2: rule__NavigatingCommaArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2__0();
@@ -10697,13 +10697,13 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAlternatives_1_0"
-    // InternalEssentialOCL.g:3288:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalEssentialOCL.g:3290:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__IfExpCS__OwnedConditionAlternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3292:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalEssentialOCL.g:3294:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt25=2;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -10793,10 +10793,10 @@
 
             switch (alt25) {
                 case 1 :
-                    // InternalEssentialOCL.g:3293:1: ( ruleExpCS )
+                    // InternalEssentialOCL.g:3295:1: ( ruleExpCS )
                     {
-                    // InternalEssentialOCL.g:3293:1: ( ruleExpCS )
-                    // InternalEssentialOCL.g:3294:1: ruleExpCS
+                    // InternalEssentialOCL.g:3295:1: ( ruleExpCS )
+                    // InternalEssentialOCL.g:3296:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
@@ -10816,10 +10816,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3299:6: ( rulePatternExpCS )
+                    // InternalEssentialOCL.g:3301:6: ( rulePatternExpCS )
                     {
-                    // InternalEssentialOCL.g:3299:6: ( rulePatternExpCS )
-                    // InternalEssentialOCL.g:3300:1: rulePatternExpCS
+                    // InternalEssentialOCL.g:3301:6: ( rulePatternExpCS )
+                    // InternalEssentialOCL.g:3302:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
@@ -10856,13 +10856,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_1"
-    // InternalEssentialOCL.g:3310:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
+    // InternalEssentialOCL.g:3312:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
     public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3314:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
+            // InternalEssentialOCL.g:3316:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
             int alt26=2;
             int LA26_0 = input.LA(1);
 
@@ -10881,10 +10881,10 @@
             }
             switch (alt26) {
                 case 1 :
-                    // InternalEssentialOCL.g:3315:1: ( ruleMultiplicityBoundsCS )
+                    // InternalEssentialOCL.g:3317:1: ( ruleMultiplicityBoundsCS )
                     {
-                    // InternalEssentialOCL.g:3315:1: ( ruleMultiplicityBoundsCS )
-                    // InternalEssentialOCL.g:3316:1: ruleMultiplicityBoundsCS
+                    // InternalEssentialOCL.g:3317:1: ( ruleMultiplicityBoundsCS )
+                    // InternalEssentialOCL.g:3318:1: ruleMultiplicityBoundsCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
@@ -10904,10 +10904,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3321:6: ( ruleMultiplicityStringCS )
+                    // InternalEssentialOCL.g:3323:6: ( ruleMultiplicityStringCS )
                     {
-                    // InternalEssentialOCL.g:3321:6: ( ruleMultiplicityStringCS )
-                    // InternalEssentialOCL.g:3322:1: ruleMultiplicityStringCS
+                    // InternalEssentialOCL.g:3323:6: ( ruleMultiplicityStringCS )
+                    // InternalEssentialOCL.g:3324:1: ruleMultiplicityStringCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
@@ -10944,13 +10944,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_2"
-    // InternalEssentialOCL.g:3332:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
+    // InternalEssentialOCL.g:3334:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
     public final void rule__MultiplicityCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3336:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:3338:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
             int alt27=2;
             int LA27_0 = input.LA(1);
 
@@ -10969,10 +10969,10 @@
             }
             switch (alt27) {
                 case 1 :
-                    // InternalEssentialOCL.g:3337:1: ( '|?' )
+                    // InternalEssentialOCL.g:3339:1: ( '|?' )
                     {
-                    // InternalEssentialOCL.g:3337:1: ( '|?' )
-                    // InternalEssentialOCL.g:3338:1: '|?'
+                    // InternalEssentialOCL.g:3339:1: ( '|?' )
+                    // InternalEssentialOCL.g:3340:1: '|?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
@@ -10988,16 +10988,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3345:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalEssentialOCL.g:3347:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                     {
-                    // InternalEssentialOCL.g:3345:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
-                    // InternalEssentialOCL.g:3346:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalEssentialOCL.g:3347:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalEssentialOCL.g:3348:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                     }
-                    // InternalEssentialOCL.g:3347:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
-                    // InternalEssentialOCL.g:3347:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
+                    // InternalEssentialOCL.g:3349:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalEssentialOCL.g:3349:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__IsNullFreeAssignment_2_1();
@@ -11034,13 +11034,13 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAlternatives_0"
-    // InternalEssentialOCL.g:3356:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
+    // InternalEssentialOCL.g:3358:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
     public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3360:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
+            // InternalEssentialOCL.g:3362:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
             int alt28=3;
             switch ( input.LA(1) ) {
             case 19:
@@ -11068,10 +11068,10 @@
 
             switch (alt28) {
                 case 1 :
-                    // InternalEssentialOCL.g:3361:1: ( '*' )
+                    // InternalEssentialOCL.g:3363:1: ( '*' )
                     {
-                    // InternalEssentialOCL.g:3361:1: ( '*' )
-                    // InternalEssentialOCL.g:3362:1: '*'
+                    // InternalEssentialOCL.g:3363:1: ( '*' )
+                    // InternalEssentialOCL.g:3364:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
@@ -11087,10 +11087,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3369:6: ( '+' )
+                    // InternalEssentialOCL.g:3371:6: ( '+' )
                     {
-                    // InternalEssentialOCL.g:3369:6: ( '+' )
-                    // InternalEssentialOCL.g:3370:1: '+'
+                    // InternalEssentialOCL.g:3371:6: ( '+' )
+                    // InternalEssentialOCL.g:3372:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
@@ -11106,10 +11106,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalEssentialOCL.g:3377:6: ( '?' )
+                    // InternalEssentialOCL.g:3379:6: ( '?' )
                     {
-                    // InternalEssentialOCL.g:3377:6: ( '?' )
-                    // InternalEssentialOCL.g:3378:1: '?'
+                    // InternalEssentialOCL.g:3379:6: ( '?' )
+                    // InternalEssentialOCL.g:3380:1: '?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
@@ -11142,13 +11142,13 @@
 
 
     // $ANTLR start "rule__TypeRefCS__Alternatives"
-    // InternalEssentialOCL.g:3390:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
+    // InternalEssentialOCL.g:3392:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
     public final void rule__TypeRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3394:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
+            // InternalEssentialOCL.g:3396:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
             int alt29=2;
             int LA29_0 = input.LA(1);
 
@@ -11167,10 +11167,10 @@
             }
             switch (alt29) {
                 case 1 :
-                    // InternalEssentialOCL.g:3395:1: ( ruleTypedRefCS )
+                    // InternalEssentialOCL.g:3397:1: ( ruleTypedRefCS )
                     {
-                    // InternalEssentialOCL.g:3395:1: ( ruleTypedRefCS )
-                    // InternalEssentialOCL.g:3396:1: ruleTypedRefCS
+                    // InternalEssentialOCL.g:3397:1: ( ruleTypedRefCS )
+                    // InternalEssentialOCL.g:3398:1: ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
@@ -11190,10 +11190,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3401:6: ( ruleWildcardTypeRefCS )
+                    // InternalEssentialOCL.g:3403:6: ( ruleWildcardTypeRefCS )
                     {
-                    // InternalEssentialOCL.g:3401:6: ( ruleWildcardTypeRefCS )
-                    // InternalEssentialOCL.g:3402:1: ruleWildcardTypeRefCS
+                    // InternalEssentialOCL.g:3403:6: ( ruleWildcardTypeRefCS )
+                    // InternalEssentialOCL.g:3404:1: ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
@@ -11230,13 +11230,13 @@
 
 
     // $ANTLR start "rule__ID__Alternatives"
-    // InternalEssentialOCL.g:3412:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
+    // InternalEssentialOCL.g:3414:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
     public final void rule__ID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3416:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
+            // InternalEssentialOCL.g:3418:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
             int alt30=2;
             int LA30_0 = input.LA(1);
 
@@ -11255,10 +11255,10 @@
             }
             switch (alt30) {
                 case 1 :
-                    // InternalEssentialOCL.g:3417:1: ( RULE_SIMPLE_ID )
+                    // InternalEssentialOCL.g:3419:1: ( RULE_SIMPLE_ID )
                     {
-                    // InternalEssentialOCL.g:3417:1: ( RULE_SIMPLE_ID )
-                    // InternalEssentialOCL.g:3418:1: RULE_SIMPLE_ID
+                    // InternalEssentialOCL.g:3419:1: ( RULE_SIMPLE_ID )
+                    // InternalEssentialOCL.g:3420:1: RULE_SIMPLE_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
@@ -11274,10 +11274,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3423:6: ( RULE_ESCAPED_ID )
+                    // InternalEssentialOCL.g:3425:6: ( RULE_ESCAPED_ID )
                     {
-                    // InternalEssentialOCL.g:3423:6: ( RULE_ESCAPED_ID )
-                    // InternalEssentialOCL.g:3424:1: RULE_ESCAPED_ID
+                    // InternalEssentialOCL.g:3425:6: ( RULE_ESCAPED_ID )
+                    // InternalEssentialOCL.g:3426:1: RULE_ESCAPED_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
@@ -11310,13 +11310,13 @@
 
 
     // $ANTLR start "rule__UPPER__Alternatives"
-    // InternalEssentialOCL.g:3434:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
+    // InternalEssentialOCL.g:3436:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
     public final void rule__UPPER__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3438:1: ( ( RULE_INT ) | ( '*' ) )
+            // InternalEssentialOCL.g:3440:1: ( ( RULE_INT ) | ( '*' ) )
             int alt31=2;
             int LA31_0 = input.LA(1);
 
@@ -11335,10 +11335,10 @@
             }
             switch (alt31) {
                 case 1 :
-                    // InternalEssentialOCL.g:3439:1: ( RULE_INT )
+                    // InternalEssentialOCL.g:3441:1: ( RULE_INT )
                     {
-                    // InternalEssentialOCL.g:3439:1: ( RULE_INT )
-                    // InternalEssentialOCL.g:3440:1: RULE_INT
+                    // InternalEssentialOCL.g:3441:1: ( RULE_INT )
+                    // InternalEssentialOCL.g:3442:1: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
@@ -11354,10 +11354,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:3445:6: ( '*' )
+                    // InternalEssentialOCL.g:3447:6: ( '*' )
                     {
-                    // InternalEssentialOCL.g:3445:6: ( '*' )
-                    // InternalEssentialOCL.g:3446:1: '*'
+                    // InternalEssentialOCL.g:3447:6: ( '*' )
+                    // InternalEssentialOCL.g:3448:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
@@ -11390,14 +11390,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0"
-    // InternalEssentialOCL.g:3462:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
+    // InternalEssentialOCL.g:3464:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
     public final void rule__URIFirstPathElementCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3466:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
-            // InternalEssentialOCL.g:3467:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
+            // InternalEssentialOCL.g:3468:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
+            // InternalEssentialOCL.g:3469:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__URIFirstPathElementCS__Group_1__0__Impl();
@@ -11428,23 +11428,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:3474:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:3476:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
     public final void rule__URIFirstPathElementCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3478:1: ( ( () ) )
-            // InternalEssentialOCL.g:3479:1: ( () )
+            // InternalEssentialOCL.g:3480:1: ( ( () ) )
+            // InternalEssentialOCL.g:3481:1: ( () )
             {
-            // InternalEssentialOCL.g:3479:1: ( () )
-            // InternalEssentialOCL.g:3480:1: ()
+            // InternalEssentialOCL.g:3481:1: ( () )
+            // InternalEssentialOCL.g:3482:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
             }
-            // InternalEssentialOCL.g:3481:1: ()
-            // InternalEssentialOCL.g:3483:1:
+            // InternalEssentialOCL.g:3483:1: ()
+            // InternalEssentialOCL.g:3485:1:
             {
             }
 
@@ -11469,14 +11469,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1"
-    // InternalEssentialOCL.g:3493:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:3495:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
     public final void rule__URIFirstPathElementCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3497:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:3498:2: rule__URIFirstPathElementCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:3499:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:3500:2: rule__URIFirstPathElementCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__Group_1__1__Impl();
@@ -11502,23 +11502,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:3504:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:3506:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
     public final void rule__URIFirstPathElementCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3508:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:3509:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalEssentialOCL.g:3510:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:3511:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:3509:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
-            // InternalEssentialOCL.g:3510:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalEssentialOCL.g:3511:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalEssentialOCL.g:3512:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
             }
-            // InternalEssentialOCL.g:3511:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
-            // InternalEssentialOCL.g:3511:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
+            // InternalEssentialOCL.g:3513:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalEssentialOCL.g:3513:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__ReferredElementAssignment_1_1();
@@ -11553,14 +11553,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0"
-    // InternalEssentialOCL.g:3525:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
+    // InternalEssentialOCL.g:3527:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
     public final void rule__CollectionTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3529:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
-            // InternalEssentialOCL.g:3530:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
+            // InternalEssentialOCL.g:3531:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
+            // InternalEssentialOCL.g:3532:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_5);
             rule__CollectionTypeCS__Group__0__Impl();
@@ -11591,23 +11591,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0__Impl"
-    // InternalEssentialOCL.g:3537:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:3539:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
     public final void rule__CollectionTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3541:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:3542:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:3543:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:3544:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:3542:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:3543:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:3544:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:3545:1: ( rule__CollectionTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:3544:1: ( rule__CollectionTypeCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:3544:2: rule__CollectionTypeCS__NameAssignment_0
+            // InternalEssentialOCL.g:3546:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:3546:2: rule__CollectionTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__NameAssignment_0();
@@ -11642,14 +11642,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1"
-    // InternalEssentialOCL.g:3554:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:3556:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
     public final void rule__CollectionTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3558:1: ( rule__CollectionTypeCS__Group__1__Impl )
-            // InternalEssentialOCL.g:3559:2: rule__CollectionTypeCS__Group__1__Impl
+            // InternalEssentialOCL.g:3560:1: ( rule__CollectionTypeCS__Group__1__Impl )
+            // InternalEssentialOCL.g:3561:2: rule__CollectionTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group__1__Impl();
@@ -11675,22 +11675,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1__Impl"
-    // InternalEssentialOCL.g:3565:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:3567:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
     public final void rule__CollectionTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3569:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:3570:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:3571:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:3572:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:3570:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:3571:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalEssentialOCL.g:3572:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:3573:1: ( rule__CollectionTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:3572:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalEssentialOCL.g:3574:1: ( rule__CollectionTypeCS__Group_1__0 )?
             int alt32=2;
             int LA32_0 = input.LA(1);
 
@@ -11699,7 +11699,7 @@
             }
             switch (alt32) {
                 case 1 :
-                    // InternalEssentialOCL.g:3572:2: rule__CollectionTypeCS__Group_1__0
+                    // InternalEssentialOCL.g:3574:2: rule__CollectionTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__Group_1__0();
@@ -11737,14 +11737,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0"
-    // InternalEssentialOCL.g:3586:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
+    // InternalEssentialOCL.g:3588:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
     public final void rule__CollectionTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3590:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
-            // InternalEssentialOCL.g:3591:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
+            // InternalEssentialOCL.g:3592:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
+            // InternalEssentialOCL.g:3593:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__CollectionTypeCS__Group_1__0__Impl();
@@ -11775,17 +11775,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:3598:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalEssentialOCL.g:3600:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__CollectionTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3602:1: ( ( '(' ) )
-            // InternalEssentialOCL.g:3603:1: ( '(' )
+            // InternalEssentialOCL.g:3604:1: ( ( '(' ) )
+            // InternalEssentialOCL.g:3605:1: ( '(' )
             {
-            // InternalEssentialOCL.g:3603:1: ( '(' )
-            // InternalEssentialOCL.g:3604:1: '('
+            // InternalEssentialOCL.g:3605:1: ( '(' )
+            // InternalEssentialOCL.g:3606:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -11816,14 +11816,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1"
-    // InternalEssentialOCL.g:3617:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
+    // InternalEssentialOCL.g:3619:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
     public final void rule__CollectionTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3621:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
-            // InternalEssentialOCL.g:3622:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
+            // InternalEssentialOCL.g:3623:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
+            // InternalEssentialOCL.g:3624:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__CollectionTypeCS__Group_1__1__Impl();
@@ -11854,23 +11854,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:3629:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:3631:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CollectionTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3633:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:3634:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:3635:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:3636:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:3634:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
-            // InternalEssentialOCL.g:3635:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:3636:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:3637:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalEssentialOCL.g:3636:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
-            // InternalEssentialOCL.g:3636:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
+            // InternalEssentialOCL.g:3638:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:3638:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__OwnedTypeAssignment_1_1();
@@ -11905,14 +11905,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2"
-    // InternalEssentialOCL.g:3646:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
+    // InternalEssentialOCL.g:3648:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
     public final void rule__CollectionTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3650:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
-            // InternalEssentialOCL.g:3651:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
+            // InternalEssentialOCL.g:3652:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
+            // InternalEssentialOCL.g:3653:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__CollectionTypeCS__Group_1__2__Impl();
@@ -11943,22 +11943,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2__Impl"
-    // InternalEssentialOCL.g:3658:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
+    // InternalEssentialOCL.g:3660:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
     public final void rule__CollectionTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3662:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
-            // InternalEssentialOCL.g:3663:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalEssentialOCL.g:3664:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
+            // InternalEssentialOCL.g:3665:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
             {
-            // InternalEssentialOCL.g:3663:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
-            // InternalEssentialOCL.g:3664:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalEssentialOCL.g:3665:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalEssentialOCL.g:3666:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityAssignment_1_2());
             }
-            // InternalEssentialOCL.g:3665:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalEssentialOCL.g:3667:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             int alt33=2;
             int LA33_0 = input.LA(1);
 
@@ -11967,7 +11967,7 @@
             }
             switch (alt33) {
                 case 1 :
-                    // InternalEssentialOCL.g:3665:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
+                    // InternalEssentialOCL.g:3667:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2();
@@ -12005,14 +12005,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3"
-    // InternalEssentialOCL.g:3675:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
+    // InternalEssentialOCL.g:3677:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
     public final void rule__CollectionTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3679:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
-            // InternalEssentialOCL.g:3680:2: rule__CollectionTypeCS__Group_1__3__Impl
+            // InternalEssentialOCL.g:3681:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
+            // InternalEssentialOCL.g:3682:2: rule__CollectionTypeCS__Group_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group_1__3__Impl();
@@ -12038,17 +12038,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3__Impl"
-    // InternalEssentialOCL.g:3686:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
+    // InternalEssentialOCL.g:3688:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
     public final void rule__CollectionTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3690:1: ( ( ')' ) )
-            // InternalEssentialOCL.g:3691:1: ( ')' )
+            // InternalEssentialOCL.g:3692:1: ( ( ')' ) )
+            // InternalEssentialOCL.g:3693:1: ( ')' )
             {
-            // InternalEssentialOCL.g:3691:1: ( ')' )
-            // InternalEssentialOCL.g:3692:1: ')'
+            // InternalEssentialOCL.g:3693:1: ( ')' )
+            // InternalEssentialOCL.g:3694:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());
@@ -12079,14 +12079,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0"
-    // InternalEssentialOCL.g:3713:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
+    // InternalEssentialOCL.g:3715:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
     public final void rule__MapTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3717:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
-            // InternalEssentialOCL.g:3718:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
+            // InternalEssentialOCL.g:3719:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
+            // InternalEssentialOCL.g:3720:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_5);
             rule__MapTypeCS__Group__0__Impl();
@@ -12117,23 +12117,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0__Impl"
-    // InternalEssentialOCL.g:3725:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:3727:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
     public final void rule__MapTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3729:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:3730:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:3731:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:3732:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:3730:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:3731:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:3732:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:3733:1: ( rule__MapTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:3732:1: ( rule__MapTypeCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:3732:2: rule__MapTypeCS__NameAssignment_0
+            // InternalEssentialOCL.g:3734:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:3734:2: rule__MapTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__NameAssignment_0();
@@ -12168,14 +12168,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1"
-    // InternalEssentialOCL.g:3742:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:3744:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
     public final void rule__MapTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3746:1: ( rule__MapTypeCS__Group__1__Impl )
-            // InternalEssentialOCL.g:3747:2: rule__MapTypeCS__Group__1__Impl
+            // InternalEssentialOCL.g:3748:1: ( rule__MapTypeCS__Group__1__Impl )
+            // InternalEssentialOCL.g:3749:2: rule__MapTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group__1__Impl();
@@ -12201,22 +12201,22 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1__Impl"
-    // InternalEssentialOCL.g:3753:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:3755:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
     public final void rule__MapTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3757:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:3758:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:3759:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:3760:1: ( ( rule__MapTypeCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:3758:1: ( ( rule__MapTypeCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:3759:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalEssentialOCL.g:3760:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:3761:1: ( rule__MapTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:3760:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalEssentialOCL.g:3762:1: ( rule__MapTypeCS__Group_1__0 )?
             int alt34=2;
             int LA34_0 = input.LA(1);
 
@@ -12225,7 +12225,7 @@
             }
             switch (alt34) {
                 case 1 :
-                    // InternalEssentialOCL.g:3760:2: rule__MapTypeCS__Group_1__0
+                    // InternalEssentialOCL.g:3762:2: rule__MapTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapTypeCS__Group_1__0();
@@ -12263,14 +12263,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0"
-    // InternalEssentialOCL.g:3774:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
+    // InternalEssentialOCL.g:3776:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
     public final void rule__MapTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3778:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
-            // InternalEssentialOCL.g:3779:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
+            // InternalEssentialOCL.g:3780:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
+            // InternalEssentialOCL.g:3781:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__MapTypeCS__Group_1__0__Impl();
@@ -12301,17 +12301,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:3786:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalEssentialOCL.g:3788:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__MapTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3790:1: ( ( '(' ) )
-            // InternalEssentialOCL.g:3791:1: ( '(' )
+            // InternalEssentialOCL.g:3792:1: ( ( '(' ) )
+            // InternalEssentialOCL.g:3793:1: ( '(' )
             {
-            // InternalEssentialOCL.g:3791:1: ( '(' )
-            // InternalEssentialOCL.g:3792:1: '('
+            // InternalEssentialOCL.g:3793:1: ( '(' )
+            // InternalEssentialOCL.g:3794:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -12342,14 +12342,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1"
-    // InternalEssentialOCL.g:3805:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
+    // InternalEssentialOCL.g:3807:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
     public final void rule__MapTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3809:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
-            // InternalEssentialOCL.g:3810:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
+            // InternalEssentialOCL.g:3811:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
+            // InternalEssentialOCL.g:3812:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__MapTypeCS__Group_1__1__Impl();
@@ -12380,23 +12380,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:3817:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:3819:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
     public final void rule__MapTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3821:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:3822:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:3823:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:3824:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:3822:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
-            // InternalEssentialOCL.g:3823:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:3824:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:3825:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
             }
-            // InternalEssentialOCL.g:3824:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
-            // InternalEssentialOCL.g:3824:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
+            // InternalEssentialOCL.g:3826:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:3826:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedKeyTypeAssignment_1_1();
@@ -12431,14 +12431,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2"
-    // InternalEssentialOCL.g:3834:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
+    // InternalEssentialOCL.g:3836:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
     public final void rule__MapTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3838:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
-            // InternalEssentialOCL.g:3839:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
+            // InternalEssentialOCL.g:3840:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
+            // InternalEssentialOCL.g:3841:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__MapTypeCS__Group_1__2__Impl();
@@ -12469,17 +12469,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2__Impl"
-    // InternalEssentialOCL.g:3846:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:3848:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
     public final void rule__MapTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3850:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:3851:1: ( ',' )
+            // InternalEssentialOCL.g:3852:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:3853:1: ( ',' )
             {
-            // InternalEssentialOCL.g:3851:1: ( ',' )
-            // InternalEssentialOCL.g:3852:1: ','
+            // InternalEssentialOCL.g:3853:1: ( ',' )
+            // InternalEssentialOCL.g:3854:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
@@ -12510,14 +12510,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3"
-    // InternalEssentialOCL.g:3865:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
+    // InternalEssentialOCL.g:3867:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
     public final void rule__MapTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3869:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
-            // InternalEssentialOCL.g:3870:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
+            // InternalEssentialOCL.g:3871:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
+            // InternalEssentialOCL.g:3872:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__MapTypeCS__Group_1__3__Impl();
@@ -12548,23 +12548,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3__Impl"
-    // InternalEssentialOCL.g:3877:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
+    // InternalEssentialOCL.g:3879:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
     public final void rule__MapTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3881:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
-            // InternalEssentialOCL.g:3882:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalEssentialOCL.g:3883:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
+            // InternalEssentialOCL.g:3884:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
             {
-            // InternalEssentialOCL.g:3882:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
-            // InternalEssentialOCL.g:3883:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalEssentialOCL.g:3884:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalEssentialOCL.g:3885:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
             }
-            // InternalEssentialOCL.g:3884:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
-            // InternalEssentialOCL.g:3884:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
+            // InternalEssentialOCL.g:3886:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalEssentialOCL.g:3886:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedValueTypeAssignment_1_3();
@@ -12599,14 +12599,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4"
-    // InternalEssentialOCL.g:3894:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
+    // InternalEssentialOCL.g:3896:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
     public final void rule__MapTypeCS__Group_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3898:1: ( rule__MapTypeCS__Group_1__4__Impl )
-            // InternalEssentialOCL.g:3899:2: rule__MapTypeCS__Group_1__4__Impl
+            // InternalEssentialOCL.g:3900:1: ( rule__MapTypeCS__Group_1__4__Impl )
+            // InternalEssentialOCL.g:3901:2: rule__MapTypeCS__Group_1__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group_1__4__Impl();
@@ -12632,17 +12632,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4__Impl"
-    // InternalEssentialOCL.g:3905:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
+    // InternalEssentialOCL.g:3907:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
     public final void rule__MapTypeCS__Group_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3909:1: ( ( ')' ) )
-            // InternalEssentialOCL.g:3910:1: ( ')' )
+            // InternalEssentialOCL.g:3911:1: ( ( ')' ) )
+            // InternalEssentialOCL.g:3912:1: ( ')' )
             {
-            // InternalEssentialOCL.g:3910:1: ( ')' )
-            // InternalEssentialOCL.g:3911:1: ')'
+            // InternalEssentialOCL.g:3912:1: ( ')' )
+            // InternalEssentialOCL.g:3913:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
@@ -12673,14 +12673,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0"
-    // InternalEssentialOCL.g:3934:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
+    // InternalEssentialOCL.g:3936:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
     public final void rule__TupleTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3938:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
-            // InternalEssentialOCL.g:3939:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
+            // InternalEssentialOCL.g:3940:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
+            // InternalEssentialOCL.g:3941:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_5);
             rule__TupleTypeCS__Group__0__Impl();
@@ -12711,23 +12711,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0__Impl"
-    // InternalEssentialOCL.g:3946:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:3948:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
     public final void rule__TupleTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3950:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:3951:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:3952:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:3953:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:3951:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:3952:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:3953:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:3954:1: ( rule__TupleTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:3953:1: ( rule__TupleTypeCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:3953:2: rule__TupleTypeCS__NameAssignment_0
+            // InternalEssentialOCL.g:3955:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:3955:2: rule__TupleTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__NameAssignment_0();
@@ -12762,14 +12762,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1"
-    // InternalEssentialOCL.g:3963:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:3965:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
     public final void rule__TupleTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3967:1: ( rule__TupleTypeCS__Group__1__Impl )
-            // InternalEssentialOCL.g:3968:2: rule__TupleTypeCS__Group__1__Impl
+            // InternalEssentialOCL.g:3969:1: ( rule__TupleTypeCS__Group__1__Impl )
+            // InternalEssentialOCL.g:3970:2: rule__TupleTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group__1__Impl();
@@ -12795,22 +12795,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1__Impl"
-    // InternalEssentialOCL.g:3974:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:3976:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3978:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:3979:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:3980:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:3981:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:3979:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:3980:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalEssentialOCL.g:3981:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:3982:1: ( rule__TupleTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:3981:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalEssentialOCL.g:3983:1: ( rule__TupleTypeCS__Group_1__0 )?
             int alt35=2;
             int LA35_0 = input.LA(1);
 
@@ -12819,7 +12819,7 @@
             }
             switch (alt35) {
                 case 1 :
-                    // InternalEssentialOCL.g:3981:2: rule__TupleTypeCS__Group_1__0
+                    // InternalEssentialOCL.g:3983:2: rule__TupleTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1__0();
@@ -12857,14 +12857,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0"
-    // InternalEssentialOCL.g:3995:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
+    // InternalEssentialOCL.g:3997:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
     public final void rule__TupleTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:3999:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
-            // InternalEssentialOCL.g:4000:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
+            // InternalEssentialOCL.g:4001:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
+            // InternalEssentialOCL.g:4002:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__TupleTypeCS__Group_1__0__Impl();
@@ -12895,17 +12895,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:4007:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalEssentialOCL.g:4009:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TupleTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4011:1: ( ( '(' ) )
-            // InternalEssentialOCL.g:4012:1: ( '(' )
+            // InternalEssentialOCL.g:4013:1: ( ( '(' ) )
+            // InternalEssentialOCL.g:4014:1: ( '(' )
             {
-            // InternalEssentialOCL.g:4012:1: ( '(' )
-            // InternalEssentialOCL.g:4013:1: '('
+            // InternalEssentialOCL.g:4014:1: ( '(' )
+            // InternalEssentialOCL.g:4015:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -12936,14 +12936,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1"
-    // InternalEssentialOCL.g:4026:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
+    // InternalEssentialOCL.g:4028:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
     public final void rule__TupleTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4030:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
-            // InternalEssentialOCL.g:4031:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
+            // InternalEssentialOCL.g:4032:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
+            // InternalEssentialOCL.g:4033:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__TupleTypeCS__Group_1__1__Impl();
@@ -12974,22 +12974,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:4038:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
+    // InternalEssentialOCL.g:4040:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4042:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
-            // InternalEssentialOCL.g:4043:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalEssentialOCL.g:4044:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
+            // InternalEssentialOCL.g:4045:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
             {
-            // InternalEssentialOCL.g:4043:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
-            // InternalEssentialOCL.g:4044:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalEssentialOCL.g:4045:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalEssentialOCL.g:4046:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
             }
-            // InternalEssentialOCL.g:4045:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalEssentialOCL.g:4047:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             int alt36=2;
             int LA36_0 = input.LA(1);
 
@@ -12998,7 +12998,7 @@
             }
             switch (alt36) {
                 case 1 :
-                    // InternalEssentialOCL.g:4045:2: rule__TupleTypeCS__Group_1_1__0
+                    // InternalEssentialOCL.g:4047:2: rule__TupleTypeCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1_1__0();
@@ -13036,14 +13036,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2"
-    // InternalEssentialOCL.g:4055:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
+    // InternalEssentialOCL.g:4057:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
     public final void rule__TupleTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4059:1: ( rule__TupleTypeCS__Group_1__2__Impl )
-            // InternalEssentialOCL.g:4060:2: rule__TupleTypeCS__Group_1__2__Impl
+            // InternalEssentialOCL.g:4061:1: ( rule__TupleTypeCS__Group_1__2__Impl )
+            // InternalEssentialOCL.g:4062:2: rule__TupleTypeCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1__2__Impl();
@@ -13069,17 +13069,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2__Impl"
-    // InternalEssentialOCL.g:4066:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalEssentialOCL.g:4068:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TupleTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4070:1: ( ( ')' ) )
-            // InternalEssentialOCL.g:4071:1: ( ')' )
+            // InternalEssentialOCL.g:4072:1: ( ( ')' ) )
+            // InternalEssentialOCL.g:4073:1: ( ')' )
             {
-            // InternalEssentialOCL.g:4071:1: ( ')' )
-            // InternalEssentialOCL.g:4072:1: ')'
+            // InternalEssentialOCL.g:4073:1: ( ')' )
+            // InternalEssentialOCL.g:4074:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
@@ -13110,14 +13110,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0"
-    // InternalEssentialOCL.g:4091:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
+    // InternalEssentialOCL.g:4093:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4095:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
-            // InternalEssentialOCL.g:4096:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
+            // InternalEssentialOCL.g:4097:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
+            // InternalEssentialOCL.g:4098:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__TupleTypeCS__Group_1_1__0__Impl();
@@ -13148,23 +13148,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0__Impl"
-    // InternalEssentialOCL.g:4103:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
+    // InternalEssentialOCL.g:4105:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4107:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
-            // InternalEssentialOCL.g:4108:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalEssentialOCL.g:4109:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
+            // InternalEssentialOCL.g:4110:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
             {
-            // InternalEssentialOCL.g:4108:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
-            // InternalEssentialOCL.g:4109:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalEssentialOCL.g:4110:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalEssentialOCL.g:4111:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
             }
-            // InternalEssentialOCL.g:4110:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
-            // InternalEssentialOCL.g:4110:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
+            // InternalEssentialOCL.g:4112:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalEssentialOCL.g:4112:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_0();
@@ -13199,14 +13199,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1"
-    // InternalEssentialOCL.g:4120:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
+    // InternalEssentialOCL.g:4122:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4124:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
-            // InternalEssentialOCL.g:4125:2: rule__TupleTypeCS__Group_1_1__1__Impl
+            // InternalEssentialOCL.g:4126:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
+            // InternalEssentialOCL.g:4127:2: rule__TupleTypeCS__Group_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1__1__Impl();
@@ -13232,22 +13232,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1__Impl"
-    // InternalEssentialOCL.g:4131:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
+    // InternalEssentialOCL.g:4133:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
     public final void rule__TupleTypeCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4135:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
-            // InternalEssentialOCL.g:4136:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalEssentialOCL.g:4137:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
+            // InternalEssentialOCL.g:4138:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
             {
-            // InternalEssentialOCL.g:4136:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
-            // InternalEssentialOCL.g:4137:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalEssentialOCL.g:4138:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalEssentialOCL.g:4139:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
             }
-            // InternalEssentialOCL.g:4138:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalEssentialOCL.g:4140:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             loop37:
             do {
                 int alt37=2;
@@ -13260,7 +13260,7 @@
 
                 switch (alt37) {
             	case 1 :
-            	    // InternalEssentialOCL.g:4138:2: rule__TupleTypeCS__Group_1_1_1__0
+            	    // InternalEssentialOCL.g:4140:2: rule__TupleTypeCS__Group_1_1_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__TupleTypeCS__Group_1_1_1__0();
@@ -13301,14 +13301,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0"
-    // InternalEssentialOCL.g:4152:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
+    // InternalEssentialOCL.g:4154:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4156:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
-            // InternalEssentialOCL.g:4157:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
+            // InternalEssentialOCL.g:4158:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
+            // InternalEssentialOCL.g:4159:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TupleTypeCS__Group_1_1_1__0__Impl();
@@ -13339,17 +13339,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0__Impl"
-    // InternalEssentialOCL.g:4164:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:4166:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4168:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:4169:1: ( ',' )
+            // InternalEssentialOCL.g:4170:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:4171:1: ( ',' )
             {
-            // InternalEssentialOCL.g:4169:1: ( ',' )
-            // InternalEssentialOCL.g:4170:1: ','
+            // InternalEssentialOCL.g:4171:1: ( ',' )
+            // InternalEssentialOCL.g:4172:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
@@ -13380,14 +13380,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1"
-    // InternalEssentialOCL.g:4183:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
+    // InternalEssentialOCL.g:4185:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4187:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
-            // InternalEssentialOCL.g:4188:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
+            // InternalEssentialOCL.g:4189:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
+            // InternalEssentialOCL.g:4190:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1_1__1__Impl();
@@ -13413,23 +13413,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1__Impl"
-    // InternalEssentialOCL.g:4194:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
+    // InternalEssentialOCL.g:4196:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4198:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
-            // InternalEssentialOCL.g:4199:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalEssentialOCL.g:4200:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
+            // InternalEssentialOCL.g:4201:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
             {
-            // InternalEssentialOCL.g:4199:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
-            // InternalEssentialOCL.g:4200:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalEssentialOCL.g:4201:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalEssentialOCL.g:4202:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
             }
-            // InternalEssentialOCL.g:4201:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
-            // InternalEssentialOCL.g:4201:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
+            // InternalEssentialOCL.g:4203:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalEssentialOCL.g:4203:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1();
@@ -13464,14 +13464,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0"
-    // InternalEssentialOCL.g:4215:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
+    // InternalEssentialOCL.g:4217:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
     public final void rule__TuplePartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4219:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
-            // InternalEssentialOCL.g:4220:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
+            // InternalEssentialOCL.g:4221:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
+            // InternalEssentialOCL.g:4222:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__TuplePartCS__Group__0__Impl();
@@ -13502,23 +13502,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0__Impl"
-    // InternalEssentialOCL.g:4227:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:4229:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
     public final void rule__TuplePartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4231:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:4232:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:4233:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:4234:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:4232:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:4233:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:4234:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:4235:1: ( rule__TuplePartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:4234:1: ( rule__TuplePartCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:4234:2: rule__TuplePartCS__NameAssignment_0
+            // InternalEssentialOCL.g:4236:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:4236:2: rule__TuplePartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__NameAssignment_0();
@@ -13553,14 +13553,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1"
-    // InternalEssentialOCL.g:4244:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
+    // InternalEssentialOCL.g:4246:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
     public final void rule__TuplePartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4248:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
-            // InternalEssentialOCL.g:4249:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
+            // InternalEssentialOCL.g:4250:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
+            // InternalEssentialOCL.g:4251:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__TuplePartCS__Group__1__Impl();
@@ -13591,17 +13591,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1__Impl"
-    // InternalEssentialOCL.g:4256:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:4258:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
     public final void rule__TuplePartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4260:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:4261:1: ( ':' )
+            // InternalEssentialOCL.g:4262:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:4263:1: ( ':' )
             {
-            // InternalEssentialOCL.g:4261:1: ( ':' )
-            // InternalEssentialOCL.g:4262:1: ':'
+            // InternalEssentialOCL.g:4263:1: ( ':' )
+            // InternalEssentialOCL.g:4264:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
@@ -13632,14 +13632,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2"
-    // InternalEssentialOCL.g:4275:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:4277:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
     public final void rule__TuplePartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4279:1: ( rule__TuplePartCS__Group__2__Impl )
-            // InternalEssentialOCL.g:4280:2: rule__TuplePartCS__Group__2__Impl
+            // InternalEssentialOCL.g:4281:1: ( rule__TuplePartCS__Group__2__Impl )
+            // InternalEssentialOCL.g:4282:2: rule__TuplePartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__Group__2__Impl();
@@ -13665,23 +13665,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2__Impl"
-    // InternalEssentialOCL.g:4286:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalEssentialOCL.g:4288:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__TuplePartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4290:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
-            // InternalEssentialOCL.g:4291:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalEssentialOCL.g:4292:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
+            // InternalEssentialOCL.g:4293:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalEssentialOCL.g:4291:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
-            // InternalEssentialOCL.g:4292:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalEssentialOCL.g:4293:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalEssentialOCL.g:4294:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalEssentialOCL.g:4293:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
-            // InternalEssentialOCL.g:4293:2: rule__TuplePartCS__OwnedTypeAssignment_2
+            // InternalEssentialOCL.g:4295:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalEssentialOCL.g:4295:2: rule__TuplePartCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__OwnedTypeAssignment_2();
@@ -13716,14 +13716,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:4309:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:4311:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
     public final void rule__CollectionLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4313:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:4314:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:4315:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:4316:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__CollectionLiteralExpCS__Group__0__Impl();
@@ -13754,23 +13754,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:4321:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:4323:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4325:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalEssentialOCL.g:4326:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalEssentialOCL.g:4327:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalEssentialOCL.g:4328:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:4326:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalEssentialOCL.g:4327:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalEssentialOCL.g:4328:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalEssentialOCL.g:4329:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalEssentialOCL.g:4328:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalEssentialOCL.g:4328:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
+            // InternalEssentialOCL.g:4330:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalEssentialOCL.g:4330:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedTypeAssignment_0();
@@ -13805,14 +13805,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:4338:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
+    // InternalEssentialOCL.g:4340:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
     public final void rule__CollectionLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4342:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
-            // InternalEssentialOCL.g:4343:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
+            // InternalEssentialOCL.g:4344:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
+            // InternalEssentialOCL.g:4345:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__CollectionLiteralExpCS__Group__1__Impl();
@@ -13843,17 +13843,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:4350:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:4352:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4354:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:4355:1: ( '{' )
+            // InternalEssentialOCL.g:4356:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:4357:1: ( '{' )
             {
-            // InternalEssentialOCL.g:4355:1: ( '{' )
-            // InternalEssentialOCL.g:4356:1: '{'
+            // InternalEssentialOCL.g:4357:1: ( '{' )
+            // InternalEssentialOCL.g:4358:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -13884,14 +13884,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2"
-    // InternalEssentialOCL.g:4369:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
+    // InternalEssentialOCL.g:4371:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
     public final void rule__CollectionLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4373:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
-            // InternalEssentialOCL.g:4374:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
+            // InternalEssentialOCL.g:4375:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
+            // InternalEssentialOCL.g:4376:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__CollectionLiteralExpCS__Group__2__Impl();
@@ -13922,22 +13922,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:4381:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:4383:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__CollectionLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4385:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:4386:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:4387:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:4388:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:4386:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:4387:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalEssentialOCL.g:4388:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:4389:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:4388:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalEssentialOCL.g:4390:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             int alt38=2;
             int LA38_0 = input.LA(1);
 
@@ -13946,7 +13946,7 @@
             }
             switch (alt38) {
                 case 1 :
-                    // InternalEssentialOCL.g:4388:2: rule__CollectionLiteralExpCS__Group_2__0
+                    // InternalEssentialOCL.g:4390:2: rule__CollectionLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralExpCS__Group_2__0();
@@ -13984,14 +13984,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3"
-    // InternalEssentialOCL.g:4398:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:4400:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
     public final void rule__CollectionLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4402:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
-            // InternalEssentialOCL.g:4403:2: rule__CollectionLiteralExpCS__Group__3__Impl
+            // InternalEssentialOCL.g:4404:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
+            // InternalEssentialOCL.g:4405:2: rule__CollectionLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group__3__Impl();
@@ -14017,17 +14017,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:4409:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:4411:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4413:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:4414:1: ( '}' )
+            // InternalEssentialOCL.g:4415:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:4416:1: ( '}' )
             {
-            // InternalEssentialOCL.g:4414:1: ( '}' )
-            // InternalEssentialOCL.g:4415:1: '}'
+            // InternalEssentialOCL.g:4416:1: ( '}' )
+            // InternalEssentialOCL.g:4417:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -14058,14 +14058,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0"
-    // InternalEssentialOCL.g:4436:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
+    // InternalEssentialOCL.g:4438:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4440:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
-            // InternalEssentialOCL.g:4441:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
+            // InternalEssentialOCL.g:4442:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
+            // InternalEssentialOCL.g:4443:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__CollectionLiteralExpCS__Group_2__0__Impl();
@@ -14096,23 +14096,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:4448:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalEssentialOCL.g:4450:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4452:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalEssentialOCL.g:4453:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:4454:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalEssentialOCL.g:4455:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalEssentialOCL.g:4453:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalEssentialOCL.g:4454:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:4455:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:4456:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalEssentialOCL.g:4455:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalEssentialOCL.g:4455:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalEssentialOCL.g:4457:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:4457:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -14147,14 +14147,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1"
-    // InternalEssentialOCL.g:4465:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:4467:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4469:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:4470:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:4471:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:4472:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2__1__Impl();
@@ -14180,22 +14180,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:4476:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalEssentialOCL.g:4478:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4480:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalEssentialOCL.g:4481:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:4482:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalEssentialOCL.g:4483:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalEssentialOCL.g:4481:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
-            // InternalEssentialOCL.g:4482:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:4483:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:4484:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalEssentialOCL.g:4483:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:4485:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             loop39:
             do {
                 int alt39=2;
@@ -14208,7 +14208,7 @@
 
                 switch (alt39) {
             	case 1 :
-            	    // InternalEssentialOCL.g:4483:2: rule__CollectionLiteralExpCS__Group_2_1__0
+            	    // InternalEssentialOCL.g:4485:2: rule__CollectionLiteralExpCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__CollectionLiteralExpCS__Group_2_1__0();
@@ -14249,14 +14249,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0"
-    // InternalEssentialOCL.g:4497:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
+    // InternalEssentialOCL.g:4499:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4501:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
-            // InternalEssentialOCL.g:4502:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
+            // InternalEssentialOCL.g:4503:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
+            // InternalEssentialOCL.g:4504:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__CollectionLiteralExpCS__Group_2_1__0__Impl();
@@ -14287,17 +14287,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0__Impl"
-    // InternalEssentialOCL.g:4509:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:4511:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4513:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:4514:1: ( ',' )
+            // InternalEssentialOCL.g:4515:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:4516:1: ( ',' )
             {
-            // InternalEssentialOCL.g:4514:1: ( ',' )
-            // InternalEssentialOCL.g:4515:1: ','
+            // InternalEssentialOCL.g:4516:1: ( ',' )
+            // InternalEssentialOCL.g:4517:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -14328,14 +14328,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1"
-    // InternalEssentialOCL.g:4528:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalEssentialOCL.g:4530:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4532:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
-            // InternalEssentialOCL.g:4533:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
+            // InternalEssentialOCL.g:4534:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
+            // InternalEssentialOCL.g:4535:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2_1__1__Impl();
@@ -14361,23 +14361,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1__Impl"
-    // InternalEssentialOCL.g:4539:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:4541:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4543:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalEssentialOCL.g:4544:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:4545:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalEssentialOCL.g:4546:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:4544:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalEssentialOCL.g:4545:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:4546:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:4547:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalEssentialOCL.g:4546:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalEssentialOCL.g:4546:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalEssentialOCL.g:4548:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:4548:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -14412,14 +14412,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0"
-    // InternalEssentialOCL.g:4560:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
+    // InternalEssentialOCL.g:4562:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4564:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
-            // InternalEssentialOCL.g:4565:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
+            // InternalEssentialOCL.g:4566:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
+            // InternalEssentialOCL.g:4567:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_17);
             rule__CollectionLiteralPartCS__Group_0__0__Impl();
@@ -14450,23 +14450,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0__Impl"
-    // InternalEssentialOCL.g:4572:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
+    // InternalEssentialOCL.g:4574:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4576:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
-            // InternalEssentialOCL.g:4577:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalEssentialOCL.g:4578:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
+            // InternalEssentialOCL.g:4579:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
             {
-            // InternalEssentialOCL.g:4577:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
-            // InternalEssentialOCL.g:4578:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalEssentialOCL.g:4579:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalEssentialOCL.g:4580:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
             }
-            // InternalEssentialOCL.g:4579:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
-            // InternalEssentialOCL.g:4579:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
+            // InternalEssentialOCL.g:4581:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalEssentialOCL.g:4581:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0();
@@ -14501,14 +14501,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1"
-    // InternalEssentialOCL.g:4589:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
+    // InternalEssentialOCL.g:4591:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4593:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
-            // InternalEssentialOCL.g:4594:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
+            // InternalEssentialOCL.g:4595:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
+            // InternalEssentialOCL.g:4596:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0__1__Impl();
@@ -14534,22 +14534,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1__Impl"
-    // InternalEssentialOCL.g:4600:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
+    // InternalEssentialOCL.g:4602:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4604:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
-            // InternalEssentialOCL.g:4605:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalEssentialOCL.g:4606:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
+            // InternalEssentialOCL.g:4607:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
             {
-            // InternalEssentialOCL.g:4605:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
-            // InternalEssentialOCL.g:4606:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalEssentialOCL.g:4607:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalEssentialOCL.g:4608:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
             }
-            // InternalEssentialOCL.g:4607:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalEssentialOCL.g:4609:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             int alt40=2;
             int LA40_0 = input.LA(1);
 
@@ -14558,7 +14558,7 @@
             }
             switch (alt40) {
                 case 1 :
-                    // InternalEssentialOCL.g:4607:2: rule__CollectionLiteralPartCS__Group_0_1__0
+                    // InternalEssentialOCL.g:4609:2: rule__CollectionLiteralPartCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0_1__0();
@@ -14596,14 +14596,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0"
-    // InternalEssentialOCL.g:4621:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
+    // InternalEssentialOCL.g:4623:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4625:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
-            // InternalEssentialOCL.g:4626:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
+            // InternalEssentialOCL.g:4627:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
+            // InternalEssentialOCL.g:4628:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__CollectionLiteralPartCS__Group_0_1__0__Impl();
@@ -14634,17 +14634,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0__Impl"
-    // InternalEssentialOCL.g:4633:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
+    // InternalEssentialOCL.g:4635:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4637:1: ( ( '..' ) )
-            // InternalEssentialOCL.g:4638:1: ( '..' )
+            // InternalEssentialOCL.g:4639:1: ( ( '..' ) )
+            // InternalEssentialOCL.g:4640:1: ( '..' )
             {
-            // InternalEssentialOCL.g:4638:1: ( '..' )
-            // InternalEssentialOCL.g:4639:1: '..'
+            // InternalEssentialOCL.g:4640:1: ( '..' )
+            // InternalEssentialOCL.g:4641:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
@@ -14675,14 +14675,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1"
-    // InternalEssentialOCL.g:4652:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
+    // InternalEssentialOCL.g:4654:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4656:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
-            // InternalEssentialOCL.g:4657:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
+            // InternalEssentialOCL.g:4658:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
+            // InternalEssentialOCL.g:4659:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0_1__1__Impl();
@@ -14708,23 +14708,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1__Impl"
-    // InternalEssentialOCL.g:4663:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
+    // InternalEssentialOCL.g:4665:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4667:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
-            // InternalEssentialOCL.g:4668:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalEssentialOCL.g:4669:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
+            // InternalEssentialOCL.g:4670:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
             {
-            // InternalEssentialOCL.g:4668:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
-            // InternalEssentialOCL.g:4669:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalEssentialOCL.g:4670:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalEssentialOCL.g:4671:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
             }
-            // InternalEssentialOCL.g:4670:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
-            // InternalEssentialOCL.g:4670:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
+            // InternalEssentialOCL.g:4672:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalEssentialOCL.g:4672:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1();
@@ -14759,14 +14759,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0"
-    // InternalEssentialOCL.g:4684:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
+    // InternalEssentialOCL.g:4686:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
     public final void rule__CollectionPatternCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4688:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
-            // InternalEssentialOCL.g:4689:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
+            // InternalEssentialOCL.g:4690:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
+            // InternalEssentialOCL.g:4691:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__CollectionPatternCS__Group__0__Impl();
@@ -14797,23 +14797,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0__Impl"
-    // InternalEssentialOCL.g:4696:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:4698:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionPatternCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4700:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
-            // InternalEssentialOCL.g:4701:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalEssentialOCL.g:4702:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
+            // InternalEssentialOCL.g:4703:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:4701:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
-            // InternalEssentialOCL.g:4702:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalEssentialOCL.g:4703:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalEssentialOCL.g:4704:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalEssentialOCL.g:4703:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
-            // InternalEssentialOCL.g:4703:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
+            // InternalEssentialOCL.g:4705:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalEssentialOCL.g:4705:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedTypeAssignment_0();
@@ -14848,14 +14848,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1"
-    // InternalEssentialOCL.g:4713:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
+    // InternalEssentialOCL.g:4715:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
     public final void rule__CollectionPatternCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4717:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
-            // InternalEssentialOCL.g:4718:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
+            // InternalEssentialOCL.g:4719:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
+            // InternalEssentialOCL.g:4720:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__CollectionPatternCS__Group__1__Impl();
@@ -14886,17 +14886,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1__Impl"
-    // InternalEssentialOCL.g:4725:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:4727:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionPatternCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4729:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:4730:1: ( '{' )
+            // InternalEssentialOCL.g:4731:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:4732:1: ( '{' )
             {
-            // InternalEssentialOCL.g:4730:1: ( '{' )
-            // InternalEssentialOCL.g:4731:1: '{'
+            // InternalEssentialOCL.g:4732:1: ( '{' )
+            // InternalEssentialOCL.g:4733:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
@@ -14927,14 +14927,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2"
-    // InternalEssentialOCL.g:4744:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
+    // InternalEssentialOCL.g:4746:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
     public final void rule__CollectionPatternCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4748:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
-            // InternalEssentialOCL.g:4749:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
+            // InternalEssentialOCL.g:4750:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
+            // InternalEssentialOCL.g:4751:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__CollectionPatternCS__Group__2__Impl();
@@ -14965,22 +14965,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2__Impl"
-    // InternalEssentialOCL.g:4756:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:4758:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
     public final void rule__CollectionPatternCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4760:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:4761:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:4762:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:4763:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:4761:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:4762:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalEssentialOCL.g:4763:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:4764:1: ( rule__CollectionPatternCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:4763:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalEssentialOCL.g:4765:1: ( rule__CollectionPatternCS__Group_2__0 )?
             int alt41=2;
             int LA41_0 = input.LA(1);
 
@@ -14989,7 +14989,7 @@
             }
             switch (alt41) {
                 case 1 :
-                    // InternalEssentialOCL.g:4763:2: rule__CollectionPatternCS__Group_2__0
+                    // InternalEssentialOCL.g:4765:2: rule__CollectionPatternCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionPatternCS__Group_2__0();
@@ -15027,14 +15027,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3"
-    // InternalEssentialOCL.g:4773:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:4775:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
     public final void rule__CollectionPatternCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4777:1: ( rule__CollectionPatternCS__Group__3__Impl )
-            // InternalEssentialOCL.g:4778:2: rule__CollectionPatternCS__Group__3__Impl
+            // InternalEssentialOCL.g:4779:1: ( rule__CollectionPatternCS__Group__3__Impl )
+            // InternalEssentialOCL.g:4780:2: rule__CollectionPatternCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group__3__Impl();
@@ -15060,17 +15060,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3__Impl"
-    // InternalEssentialOCL.g:4784:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:4786:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionPatternCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4788:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:4789:1: ( '}' )
+            // InternalEssentialOCL.g:4790:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:4791:1: ( '}' )
             {
-            // InternalEssentialOCL.g:4789:1: ( '}' )
-            // InternalEssentialOCL.g:4790:1: '}'
+            // InternalEssentialOCL.g:4791:1: ( '}' )
+            // InternalEssentialOCL.g:4792:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
@@ -15101,14 +15101,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0"
-    // InternalEssentialOCL.g:4811:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
+    // InternalEssentialOCL.g:4813:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
     public final void rule__CollectionPatternCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4815:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
-            // InternalEssentialOCL.g:4816:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
+            // InternalEssentialOCL.g:4817:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
+            // InternalEssentialOCL.g:4818:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__CollectionPatternCS__Group_2__0__Impl();
@@ -15139,23 +15139,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:4823:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalEssentialOCL.g:4825:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4827:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalEssentialOCL.g:4828:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:4829:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalEssentialOCL.g:4830:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalEssentialOCL.g:4828:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
-            // InternalEssentialOCL.g:4829:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:4830:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:4831:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalEssentialOCL.g:4830:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
-            // InternalEssentialOCL.g:4830:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
+            // InternalEssentialOCL.g:4832:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:4832:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_0();
@@ -15190,14 +15190,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1"
-    // InternalEssentialOCL.g:4840:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
+    // InternalEssentialOCL.g:4842:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
     public final void rule__CollectionPatternCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4844:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
-            // InternalEssentialOCL.g:4845:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
+            // InternalEssentialOCL.g:4846:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
+            // InternalEssentialOCL.g:4847:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__CollectionPatternCS__Group_2__1__Impl();
@@ -15228,22 +15228,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:4852:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
+    // InternalEssentialOCL.g:4854:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionPatternCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4856:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
-            // InternalEssentialOCL.g:4857:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:4858:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
+            // InternalEssentialOCL.g:4859:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
             {
-            // InternalEssentialOCL.g:4857:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
-            // InternalEssentialOCL.g:4858:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:4859:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:4860:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
             }
-            // InternalEssentialOCL.g:4859:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:4861:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             loop42:
             do {
                 int alt42=2;
@@ -15256,7 +15256,7 @@
 
                 switch (alt42) {
             	case 1 :
-            	    // InternalEssentialOCL.g:4859:2: rule__CollectionPatternCS__Group_2_1__0
+            	    // InternalEssentialOCL.g:4861:2: rule__CollectionPatternCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__CollectionPatternCS__Group_2_1__0();
@@ -15297,14 +15297,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2"
-    // InternalEssentialOCL.g:4869:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
+    // InternalEssentialOCL.g:4871:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
     public final void rule__CollectionPatternCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4873:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
-            // InternalEssentialOCL.g:4874:2: rule__CollectionPatternCS__Group_2__2__Impl
+            // InternalEssentialOCL.g:4875:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
+            // InternalEssentialOCL.g:4876:2: rule__CollectionPatternCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2__2__Impl();
@@ -15330,23 +15330,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2__Impl"
-    // InternalEssentialOCL.g:4880:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
+    // InternalEssentialOCL.g:4882:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4884:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
-            // InternalEssentialOCL.g:4885:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalEssentialOCL.g:4886:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
+            // InternalEssentialOCL.g:4887:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
             {
-            // InternalEssentialOCL.g:4885:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
-            // InternalEssentialOCL.g:4886:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalEssentialOCL.g:4887:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalEssentialOCL.g:4888:1: ( rule__CollectionPatternCS__Group_2_2__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
             }
-            // InternalEssentialOCL.g:4887:1: ( rule__CollectionPatternCS__Group_2_2__0 )
-            // InternalEssentialOCL.g:4887:2: rule__CollectionPatternCS__Group_2_2__0
+            // InternalEssentialOCL.g:4889:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalEssentialOCL.g:4889:2: rule__CollectionPatternCS__Group_2_2__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__0();
@@ -15381,14 +15381,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0"
-    // InternalEssentialOCL.g:4903:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
+    // InternalEssentialOCL.g:4905:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
     public final void rule__CollectionPatternCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4907:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
-            // InternalEssentialOCL.g:4908:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
+            // InternalEssentialOCL.g:4909:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
+            // InternalEssentialOCL.g:4910:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__CollectionPatternCS__Group_2_1__0__Impl();
@@ -15419,17 +15419,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0__Impl"
-    // InternalEssentialOCL.g:4915:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:4917:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionPatternCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4919:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:4920:1: ( ',' )
+            // InternalEssentialOCL.g:4921:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:4922:1: ( ',' )
             {
-            // InternalEssentialOCL.g:4920:1: ( ',' )
-            // InternalEssentialOCL.g:4921:1: ','
+            // InternalEssentialOCL.g:4922:1: ( ',' )
+            // InternalEssentialOCL.g:4923:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
@@ -15460,14 +15460,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1"
-    // InternalEssentialOCL.g:4934:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
+    // InternalEssentialOCL.g:4936:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4938:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
-            // InternalEssentialOCL.g:4939:2: rule__CollectionPatternCS__Group_2_1__1__Impl
+            // InternalEssentialOCL.g:4940:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
+            // InternalEssentialOCL.g:4941:2: rule__CollectionPatternCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_1__1__Impl();
@@ -15493,23 +15493,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1__Impl"
-    // InternalEssentialOCL.g:4945:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:4947:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4949:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalEssentialOCL.g:4950:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:4951:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalEssentialOCL.g:4952:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:4950:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalEssentialOCL.g:4951:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:4952:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:4953:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalEssentialOCL.g:4952:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
-            // InternalEssentialOCL.g:4952:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
+            // InternalEssentialOCL.g:4954:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:4954:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1();
@@ -15544,14 +15544,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0"
-    // InternalEssentialOCL.g:4966:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
+    // InternalEssentialOCL.g:4968:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
     public final void rule__CollectionPatternCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4970:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
-            // InternalEssentialOCL.g:4971:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
+            // InternalEssentialOCL.g:4972:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
+            // InternalEssentialOCL.g:4973:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__CollectionPatternCS__Group_2_2__0__Impl();
@@ -15582,17 +15582,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0__Impl"
-    // InternalEssentialOCL.g:4978:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
+    // InternalEssentialOCL.g:4980:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
     public final void rule__CollectionPatternCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:4982:1: ( ( '++' ) )
-            // InternalEssentialOCL.g:4983:1: ( '++' )
+            // InternalEssentialOCL.g:4984:1: ( ( '++' ) )
+            // InternalEssentialOCL.g:4985:1: ( '++' )
             {
-            // InternalEssentialOCL.g:4983:1: ( '++' )
-            // InternalEssentialOCL.g:4984:1: '++'
+            // InternalEssentialOCL.g:4985:1: ( '++' )
+            // InternalEssentialOCL.g:4986:1: '++'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
@@ -15623,14 +15623,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1"
-    // InternalEssentialOCL.g:4997:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
+    // InternalEssentialOCL.g:4999:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5001:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
-            // InternalEssentialOCL.g:5002:2: rule__CollectionPatternCS__Group_2_2__1__Impl
+            // InternalEssentialOCL.g:5003:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
+            // InternalEssentialOCL.g:5004:2: rule__CollectionPatternCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__1__Impl();
@@ -15656,23 +15656,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1__Impl"
-    // InternalEssentialOCL.g:5008:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
+    // InternalEssentialOCL.g:5010:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5012:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
-            // InternalEssentialOCL.g:5013:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalEssentialOCL.g:5014:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
+            // InternalEssentialOCL.g:5015:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
             {
-            // InternalEssentialOCL.g:5013:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
-            // InternalEssentialOCL.g:5014:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalEssentialOCL.g:5015:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalEssentialOCL.g:5016:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
             }
-            // InternalEssentialOCL.g:5015:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
-            // InternalEssentialOCL.g:5015:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
+            // InternalEssentialOCL.g:5017:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalEssentialOCL.g:5017:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1();
@@ -15707,14 +15707,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0"
-    // InternalEssentialOCL.g:5029:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
+    // InternalEssentialOCL.g:5031:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
     public final void rule__ShadowPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5033:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
-            // InternalEssentialOCL.g:5034:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
+            // InternalEssentialOCL.g:5035:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
+            // InternalEssentialOCL.g:5036:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_20);
             rule__ShadowPartCS__Group_0__0__Impl();
@@ -15745,23 +15745,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0__Impl"
-    // InternalEssentialOCL.g:5041:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
+    // InternalEssentialOCL.g:5043:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
     public final void rule__ShadowPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5045:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
-            // InternalEssentialOCL.g:5046:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalEssentialOCL.g:5047:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
+            // InternalEssentialOCL.g:5048:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
             {
-            // InternalEssentialOCL.g:5046:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
-            // InternalEssentialOCL.g:5047:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalEssentialOCL.g:5048:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalEssentialOCL.g:5049:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0_0());
             }
-            // InternalEssentialOCL.g:5048:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
-            // InternalEssentialOCL.g:5048:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
+            // InternalEssentialOCL.g:5050:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalEssentialOCL.g:5050:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__ReferredPropertyAssignment_0_0();
@@ -15796,14 +15796,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1"
-    // InternalEssentialOCL.g:5058:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
+    // InternalEssentialOCL.g:5060:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
     public final void rule__ShadowPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5062:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
-            // InternalEssentialOCL.g:5063:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
+            // InternalEssentialOCL.g:5064:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
+            // InternalEssentialOCL.g:5065:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__ShadowPartCS__Group_0__1__Impl();
@@ -15834,17 +15834,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1__Impl"
-    // InternalEssentialOCL.g:5070:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:5072:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
     public final void rule__ShadowPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5074:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:5075:1: ( '=' )
+            // InternalEssentialOCL.g:5076:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:5077:1: ( '=' )
             {
-            // InternalEssentialOCL.g:5075:1: ( '=' )
-            // InternalEssentialOCL.g:5076:1: '='
+            // InternalEssentialOCL.g:5077:1: ( '=' )
+            // InternalEssentialOCL.g:5078:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());
@@ -15875,14 +15875,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2"
-    // InternalEssentialOCL.g:5089:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
+    // InternalEssentialOCL.g:5091:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
     public final void rule__ShadowPartCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5093:1: ( rule__ShadowPartCS__Group_0__2__Impl )
-            // InternalEssentialOCL.g:5094:2: rule__ShadowPartCS__Group_0__2__Impl
+            // InternalEssentialOCL.g:5095:1: ( rule__ShadowPartCS__Group_0__2__Impl )
+            // InternalEssentialOCL.g:5096:2: rule__ShadowPartCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__Group_0__2__Impl();
@@ -15908,23 +15908,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2__Impl"
-    // InternalEssentialOCL.g:5100:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
+    // InternalEssentialOCL.g:5102:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
     public final void rule__ShadowPartCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5104:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
-            // InternalEssentialOCL.g:5105:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalEssentialOCL.g:5106:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
+            // InternalEssentialOCL.g:5107:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
             {
-            // InternalEssentialOCL.g:5105:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
-            // InternalEssentialOCL.g:5106:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalEssentialOCL.g:5107:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalEssentialOCL.g:5108:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_0_2());
             }
-            // InternalEssentialOCL.g:5107:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
-            // InternalEssentialOCL.g:5107:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
+            // InternalEssentialOCL.g:5109:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalEssentialOCL.g:5109:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2();
@@ -15959,14 +15959,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0"
-    // InternalEssentialOCL.g:5123:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
+    // InternalEssentialOCL.g:5125:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
     public final void rule__PatternExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5127:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
-            // InternalEssentialOCL.g:5128:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
+            // InternalEssentialOCL.g:5129:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
+            // InternalEssentialOCL.g:5130:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__PatternExpCS__Group__0__Impl();
@@ -15997,22 +15997,22 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:5135:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
+    // InternalEssentialOCL.g:5137:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
     public final void rule__PatternExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5139:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
-            // InternalEssentialOCL.g:5140:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalEssentialOCL.g:5141:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
+            // InternalEssentialOCL.g:5142:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
             {
-            // InternalEssentialOCL.g:5140:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
-            // InternalEssentialOCL.g:5141:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalEssentialOCL.g:5142:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalEssentialOCL.g:5143:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
             }
-            // InternalEssentialOCL.g:5142:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalEssentialOCL.g:5144:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             int alt43=2;
             int LA43_0 = input.LA(1);
 
@@ -16021,7 +16021,7 @@
             }
             switch (alt43) {
                 case 1 :
-                    // InternalEssentialOCL.g:5142:2: rule__PatternExpCS__PatternVariableNameAssignment_0
+                    // InternalEssentialOCL.g:5144:2: rule__PatternExpCS__PatternVariableNameAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PatternExpCS__PatternVariableNameAssignment_0();
@@ -16059,14 +16059,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1"
-    // InternalEssentialOCL.g:5152:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
+    // InternalEssentialOCL.g:5154:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
     public final void rule__PatternExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5156:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
-            // InternalEssentialOCL.g:5157:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
+            // InternalEssentialOCL.g:5158:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
+            // InternalEssentialOCL.g:5159:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__PatternExpCS__Group__1__Impl();
@@ -16097,17 +16097,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:5164:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:5166:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
     public final void rule__PatternExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5168:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:5169:1: ( ':' )
+            // InternalEssentialOCL.g:5170:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:5171:1: ( ':' )
             {
-            // InternalEssentialOCL.g:5169:1: ( ':' )
-            // InternalEssentialOCL.g:5170:1: ':'
+            // InternalEssentialOCL.g:5171:1: ( ':' )
+            // InternalEssentialOCL.g:5172:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
@@ -16138,14 +16138,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2"
-    // InternalEssentialOCL.g:5183:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:5185:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
     public final void rule__PatternExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5187:1: ( rule__PatternExpCS__Group__2__Impl )
-            // InternalEssentialOCL.g:5188:2: rule__PatternExpCS__Group__2__Impl
+            // InternalEssentialOCL.g:5189:1: ( rule__PatternExpCS__Group__2__Impl )
+            // InternalEssentialOCL.g:5190:2: rule__PatternExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__Group__2__Impl();
@@ -16171,23 +16171,23 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:5194:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
+    // InternalEssentialOCL.g:5196:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
     public final void rule__PatternExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5198:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
-            // InternalEssentialOCL.g:5199:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalEssentialOCL.g:5200:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
+            // InternalEssentialOCL.g:5201:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
             {
-            // InternalEssentialOCL.g:5199:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
-            // InternalEssentialOCL.g:5200:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalEssentialOCL.g:5201:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalEssentialOCL.g:5202:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
             }
-            // InternalEssentialOCL.g:5201:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
-            // InternalEssentialOCL.g:5201:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
+            // InternalEssentialOCL.g:5203:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalEssentialOCL.g:5203:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__OwnedPatternTypeAssignment_2();
@@ -16222,14 +16222,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:5217:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:5219:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
     public final void rule__LambdaLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5221:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:5222:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:5223:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:5224:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__LambdaLiteralExpCS__Group__0__Impl();
@@ -16260,17 +16260,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:5229:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
+    // InternalEssentialOCL.g:5231:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
     public final void rule__LambdaLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5233:1: ( ( 'Lambda' ) )
-            // InternalEssentialOCL.g:5234:1: ( 'Lambda' )
+            // InternalEssentialOCL.g:5235:1: ( ( 'Lambda' ) )
+            // InternalEssentialOCL.g:5236:1: ( 'Lambda' )
             {
-            // InternalEssentialOCL.g:5234:1: ( 'Lambda' )
-            // InternalEssentialOCL.g:5235:1: 'Lambda'
+            // InternalEssentialOCL.g:5236:1: ( 'Lambda' )
+            // InternalEssentialOCL.g:5237:1: 'Lambda'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
@@ -16301,14 +16301,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:5248:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
+    // InternalEssentialOCL.g:5250:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
     public final void rule__LambdaLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5252:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
-            // InternalEssentialOCL.g:5253:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
+            // InternalEssentialOCL.g:5254:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
+            // InternalEssentialOCL.g:5255:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__LambdaLiteralExpCS__Group__1__Impl();
@@ -16339,17 +16339,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:5260:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:5262:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__LambdaLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5264:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:5265:1: ( '{' )
+            // InternalEssentialOCL.g:5266:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:5267:1: ( '{' )
             {
-            // InternalEssentialOCL.g:5265:1: ( '{' )
-            // InternalEssentialOCL.g:5266:1: '{'
+            // InternalEssentialOCL.g:5267:1: ( '{' )
+            // InternalEssentialOCL.g:5268:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -16380,14 +16380,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2"
-    // InternalEssentialOCL.g:5279:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
+    // InternalEssentialOCL.g:5281:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
     public final void rule__LambdaLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5283:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
-            // InternalEssentialOCL.g:5284:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
+            // InternalEssentialOCL.g:5285:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
+            // InternalEssentialOCL.g:5286:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_21);
             rule__LambdaLiteralExpCS__Group__2__Impl();
@@ -16418,23 +16418,23 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:5291:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
+    // InternalEssentialOCL.g:5293:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
     public final void rule__LambdaLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5295:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
-            // InternalEssentialOCL.g:5296:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalEssentialOCL.g:5297:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
+            // InternalEssentialOCL.g:5298:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
             {
-            // InternalEssentialOCL.g:5296:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
-            // InternalEssentialOCL.g:5297:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalEssentialOCL.g:5298:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalEssentialOCL.g:5299:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
             }
-            // InternalEssentialOCL.g:5298:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
-            // InternalEssentialOCL.g:5298:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
+            // InternalEssentialOCL.g:5300:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalEssentialOCL.g:5300:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2();
@@ -16469,14 +16469,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3"
-    // InternalEssentialOCL.g:5308:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:5310:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
     public final void rule__LambdaLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5312:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
-            // InternalEssentialOCL.g:5313:2: rule__LambdaLiteralExpCS__Group__3__Impl
+            // InternalEssentialOCL.g:5314:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
+            // InternalEssentialOCL.g:5315:2: rule__LambdaLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__Group__3__Impl();
@@ -16502,17 +16502,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:5319:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:5321:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__LambdaLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5323:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:5324:1: ( '}' )
+            // InternalEssentialOCL.g:5325:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:5326:1: ( '}' )
             {
-            // InternalEssentialOCL.g:5324:1: ( '}' )
-            // InternalEssentialOCL.g:5325:1: '}'
+            // InternalEssentialOCL.g:5326:1: ( '}' )
+            // InternalEssentialOCL.g:5327:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -16543,14 +16543,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:5346:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:5348:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
     public final void rule__MapLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5350:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:5351:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:5352:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:5353:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__MapLiteralExpCS__Group__0__Impl();
@@ -16581,23 +16581,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:5358:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:5360:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5362:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalEssentialOCL.g:5363:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalEssentialOCL.g:5364:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalEssentialOCL.g:5365:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:5363:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalEssentialOCL.g:5364:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalEssentialOCL.g:5365:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalEssentialOCL.g:5366:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalEssentialOCL.g:5365:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalEssentialOCL.g:5365:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
+            // InternalEssentialOCL.g:5367:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalEssentialOCL.g:5367:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedTypeAssignment_0();
@@ -16632,14 +16632,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:5375:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
+    // InternalEssentialOCL.g:5377:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
     public final void rule__MapLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5379:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
-            // InternalEssentialOCL.g:5380:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
+            // InternalEssentialOCL.g:5381:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
+            // InternalEssentialOCL.g:5382:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__MapLiteralExpCS__Group__1__Impl();
@@ -16670,17 +16670,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:5387:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:5389:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__MapLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5391:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:5392:1: ( '{' )
+            // InternalEssentialOCL.g:5393:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:5394:1: ( '{' )
             {
-            // InternalEssentialOCL.g:5392:1: ( '{' )
-            // InternalEssentialOCL.g:5393:1: '{'
+            // InternalEssentialOCL.g:5394:1: ( '{' )
+            // InternalEssentialOCL.g:5395:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -16711,14 +16711,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2"
-    // InternalEssentialOCL.g:5406:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
+    // InternalEssentialOCL.g:5408:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
     public final void rule__MapLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5410:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
-            // InternalEssentialOCL.g:5411:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
+            // InternalEssentialOCL.g:5412:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
+            // InternalEssentialOCL.g:5413:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__MapLiteralExpCS__Group__2__Impl();
@@ -16749,22 +16749,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:5418:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:5420:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__MapLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5422:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:5423:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:5424:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:5425:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:5423:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:5424:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalEssentialOCL.g:5425:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:5426:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:5425:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalEssentialOCL.g:5427:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             int alt44=2;
             int LA44_0 = input.LA(1);
 
@@ -16773,7 +16773,7 @@
             }
             switch (alt44) {
                 case 1 :
-                    // InternalEssentialOCL.g:5425:2: rule__MapLiteralExpCS__Group_2__0
+                    // InternalEssentialOCL.g:5427:2: rule__MapLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapLiteralExpCS__Group_2__0();
@@ -16811,14 +16811,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3"
-    // InternalEssentialOCL.g:5435:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:5437:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
     public final void rule__MapLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5439:1: ( rule__MapLiteralExpCS__Group__3__Impl )
-            // InternalEssentialOCL.g:5440:2: rule__MapLiteralExpCS__Group__3__Impl
+            // InternalEssentialOCL.g:5441:1: ( rule__MapLiteralExpCS__Group__3__Impl )
+            // InternalEssentialOCL.g:5442:2: rule__MapLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group__3__Impl();
@@ -16844,17 +16844,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:5446:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:5448:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__MapLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5450:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:5451:1: ( '}' )
+            // InternalEssentialOCL.g:5452:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:5453:1: ( '}' )
             {
-            // InternalEssentialOCL.g:5451:1: ( '}' )
-            // InternalEssentialOCL.g:5452:1: '}'
+            // InternalEssentialOCL.g:5453:1: ( '}' )
+            // InternalEssentialOCL.g:5454:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -16885,14 +16885,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0"
-    // InternalEssentialOCL.g:5473:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
+    // InternalEssentialOCL.g:5475:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
     public final void rule__MapLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5477:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
-            // InternalEssentialOCL.g:5478:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
+            // InternalEssentialOCL.g:5479:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
+            // InternalEssentialOCL.g:5480:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__MapLiteralExpCS__Group_2__0__Impl();
@@ -16923,23 +16923,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:5485:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalEssentialOCL.g:5487:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5489:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalEssentialOCL.g:5490:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:5491:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalEssentialOCL.g:5492:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalEssentialOCL.g:5490:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalEssentialOCL.g:5491:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:5492:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:5493:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalEssentialOCL.g:5492:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalEssentialOCL.g:5492:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalEssentialOCL.g:5494:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:5494:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -16974,14 +16974,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1"
-    // InternalEssentialOCL.g:5502:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:5504:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5506:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:5507:2: rule__MapLiteralExpCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:5508:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:5509:2: rule__MapLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2__1__Impl();
@@ -17007,22 +17007,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:5513:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalEssentialOCL.g:5515:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__MapLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5517:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalEssentialOCL.g:5518:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:5519:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalEssentialOCL.g:5520:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalEssentialOCL.g:5518:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
-            // InternalEssentialOCL.g:5519:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:5520:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:5521:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalEssentialOCL.g:5520:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:5522:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             loop45:
             do {
                 int alt45=2;
@@ -17035,7 +17035,7 @@
 
                 switch (alt45) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5520:2: rule__MapLiteralExpCS__Group_2_1__0
+            	    // InternalEssentialOCL.g:5522:2: rule__MapLiteralExpCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__MapLiteralExpCS__Group_2_1__0();
@@ -17076,14 +17076,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0"
-    // InternalEssentialOCL.g:5534:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
+    // InternalEssentialOCL.g:5536:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
     public final void rule__MapLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5538:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
-            // InternalEssentialOCL.g:5539:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
+            // InternalEssentialOCL.g:5540:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
+            // InternalEssentialOCL.g:5541:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__MapLiteralExpCS__Group_2_1__0__Impl();
@@ -17114,17 +17114,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0__Impl"
-    // InternalEssentialOCL.g:5546:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:5548:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5550:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:5551:1: ( ',' )
+            // InternalEssentialOCL.g:5552:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:5553:1: ( ',' )
             {
-            // InternalEssentialOCL.g:5551:1: ( ',' )
-            // InternalEssentialOCL.g:5552:1: ','
+            // InternalEssentialOCL.g:5553:1: ( ',' )
+            // InternalEssentialOCL.g:5554:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -17155,14 +17155,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1"
-    // InternalEssentialOCL.g:5565:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalEssentialOCL.g:5567:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5569:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
-            // InternalEssentialOCL.g:5570:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
+            // InternalEssentialOCL.g:5571:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
+            // InternalEssentialOCL.g:5572:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2_1__1__Impl();
@@ -17188,23 +17188,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1__Impl"
-    // InternalEssentialOCL.g:5576:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:5578:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5580:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalEssentialOCL.g:5581:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:5582:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalEssentialOCL.g:5583:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:5581:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalEssentialOCL.g:5582:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:5583:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:5584:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalEssentialOCL.g:5583:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalEssentialOCL.g:5583:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalEssentialOCL.g:5585:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:5585:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -17239,14 +17239,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0"
-    // InternalEssentialOCL.g:5597:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
+    // InternalEssentialOCL.g:5599:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
     public final void rule__MapLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5601:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
-            // InternalEssentialOCL.g:5602:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
+            // InternalEssentialOCL.g:5603:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
+            // InternalEssentialOCL.g:5604:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_23);
             rule__MapLiteralPartCS__Group__0__Impl();
@@ -17277,23 +17277,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0__Impl"
-    // InternalEssentialOCL.g:5609:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:5611:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
     public final void rule__MapLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5613:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
-            // InternalEssentialOCL.g:5614:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalEssentialOCL.g:5615:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
+            // InternalEssentialOCL.g:5616:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:5614:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
-            // InternalEssentialOCL.g:5615:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalEssentialOCL.g:5616:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalEssentialOCL.g:5617:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
             }
-            // InternalEssentialOCL.g:5616:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
-            // InternalEssentialOCL.g:5616:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
+            // InternalEssentialOCL.g:5618:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalEssentialOCL.g:5618:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedKeyAssignment_0();
@@ -17328,14 +17328,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1"
-    // InternalEssentialOCL.g:5626:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
+    // InternalEssentialOCL.g:5628:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
     public final void rule__MapLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5630:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
-            // InternalEssentialOCL.g:5631:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
+            // InternalEssentialOCL.g:5632:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
+            // InternalEssentialOCL.g:5633:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__MapLiteralPartCS__Group__1__Impl();
@@ -17366,17 +17366,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1__Impl"
-    // InternalEssentialOCL.g:5638:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:5640:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
     public final void rule__MapLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5642:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:5643:1: ( '<-' )
+            // InternalEssentialOCL.g:5644:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:5645:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:5643:1: ( '<-' )
-            // InternalEssentialOCL.g:5644:1: '<-'
+            // InternalEssentialOCL.g:5645:1: ( '<-' )
+            // InternalEssentialOCL.g:5646:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
@@ -17407,14 +17407,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2"
-    // InternalEssentialOCL.g:5657:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:5659:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
     public final void rule__MapLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5661:1: ( rule__MapLiteralPartCS__Group__2__Impl )
-            // InternalEssentialOCL.g:5662:2: rule__MapLiteralPartCS__Group__2__Impl
+            // InternalEssentialOCL.g:5663:1: ( rule__MapLiteralPartCS__Group__2__Impl )
+            // InternalEssentialOCL.g:5664:2: rule__MapLiteralPartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__Group__2__Impl();
@@ -17440,23 +17440,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2__Impl"
-    // InternalEssentialOCL.g:5668:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
+    // InternalEssentialOCL.g:5670:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
     public final void rule__MapLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5672:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
-            // InternalEssentialOCL.g:5673:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalEssentialOCL.g:5674:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
+            // InternalEssentialOCL.g:5675:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
             {
-            // InternalEssentialOCL.g:5673:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
-            // InternalEssentialOCL.g:5674:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalEssentialOCL.g:5675:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalEssentialOCL.g:5676:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
             }
-            // InternalEssentialOCL.g:5675:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
-            // InternalEssentialOCL.g:5675:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
+            // InternalEssentialOCL.g:5677:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalEssentialOCL.g:5677:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedValueAssignment_2();
@@ -17491,14 +17491,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:5691:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:5693:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
     public final void rule__TupleLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5695:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:5696:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:5697:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:5698:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__TupleLiteralExpCS__Group__0__Impl();
@@ -17529,17 +17529,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:5703:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
+    // InternalEssentialOCL.g:5705:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
     public final void rule__TupleLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5707:1: ( ( 'Tuple' ) )
-            // InternalEssentialOCL.g:5708:1: ( 'Tuple' )
+            // InternalEssentialOCL.g:5709:1: ( ( 'Tuple' ) )
+            // InternalEssentialOCL.g:5710:1: ( 'Tuple' )
             {
-            // InternalEssentialOCL.g:5708:1: ( 'Tuple' )
-            // InternalEssentialOCL.g:5709:1: 'Tuple'
+            // InternalEssentialOCL.g:5710:1: ( 'Tuple' )
+            // InternalEssentialOCL.g:5711:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
@@ -17570,14 +17570,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:5722:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
+    // InternalEssentialOCL.g:5724:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
     public final void rule__TupleLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5726:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
-            // InternalEssentialOCL.g:5727:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
+            // InternalEssentialOCL.g:5728:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
+            // InternalEssentialOCL.g:5729:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TupleLiteralExpCS__Group__1__Impl();
@@ -17608,17 +17608,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:5734:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:5736:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__TupleLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5738:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:5739:1: ( '{' )
+            // InternalEssentialOCL.g:5740:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:5741:1: ( '{' )
             {
-            // InternalEssentialOCL.g:5739:1: ( '{' )
-            // InternalEssentialOCL.g:5740:1: '{'
+            // InternalEssentialOCL.g:5741:1: ( '{' )
+            // InternalEssentialOCL.g:5742:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -17649,14 +17649,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2"
-    // InternalEssentialOCL.g:5753:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
+    // InternalEssentialOCL.g:5755:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
     public final void rule__TupleLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5757:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
-            // InternalEssentialOCL.g:5758:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
+            // InternalEssentialOCL.g:5759:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
+            // InternalEssentialOCL.g:5760:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_24);
             rule__TupleLiteralExpCS__Group__2__Impl();
@@ -17687,23 +17687,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:5765:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
+    // InternalEssentialOCL.g:5767:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
     public final void rule__TupleLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5769:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
-            // InternalEssentialOCL.g:5770:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalEssentialOCL.g:5771:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
+            // InternalEssentialOCL.g:5772:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
             {
-            // InternalEssentialOCL.g:5770:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
-            // InternalEssentialOCL.g:5771:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalEssentialOCL.g:5772:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalEssentialOCL.g:5773:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
             }
-            // InternalEssentialOCL.g:5772:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
-            // InternalEssentialOCL.g:5772:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
+            // InternalEssentialOCL.g:5774:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalEssentialOCL.g:5774:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_2();
@@ -17738,14 +17738,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3"
-    // InternalEssentialOCL.g:5782:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
+    // InternalEssentialOCL.g:5784:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
     public final void rule__TupleLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5786:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
-            // InternalEssentialOCL.g:5787:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
+            // InternalEssentialOCL.g:5788:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
+            // InternalEssentialOCL.g:5789:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_24);
             rule__TupleLiteralExpCS__Group__3__Impl();
@@ -17776,22 +17776,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:5794:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
+    // InternalEssentialOCL.g:5796:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
     public final void rule__TupleLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5798:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
-            // InternalEssentialOCL.g:5799:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalEssentialOCL.g:5800:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
+            // InternalEssentialOCL.g:5801:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
             {
-            // InternalEssentialOCL.g:5799:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
-            // InternalEssentialOCL.g:5800:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalEssentialOCL.g:5801:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalEssentialOCL.g:5802:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
             }
-            // InternalEssentialOCL.g:5801:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalEssentialOCL.g:5803:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             loop46:
             do {
                 int alt46=2;
@@ -17804,7 +17804,7 @@
 
                 switch (alt46) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5801:2: rule__TupleLiteralExpCS__Group_3__0
+            	    // InternalEssentialOCL.g:5803:2: rule__TupleLiteralExpCS__Group_3__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__TupleLiteralExpCS__Group_3__0();
@@ -17845,14 +17845,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4"
-    // InternalEssentialOCL.g:5811:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
+    // InternalEssentialOCL.g:5813:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
     public final void rule__TupleLiteralExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5815:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
-            // InternalEssentialOCL.g:5816:2: rule__TupleLiteralExpCS__Group__4__Impl
+            // InternalEssentialOCL.g:5817:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
+            // InternalEssentialOCL.g:5818:2: rule__TupleLiteralExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group__4__Impl();
@@ -17878,17 +17878,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4__Impl"
-    // InternalEssentialOCL.g:5822:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:5824:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
     public final void rule__TupleLiteralExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5826:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:5827:1: ( '}' )
+            // InternalEssentialOCL.g:5828:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:5829:1: ( '}' )
             {
-            // InternalEssentialOCL.g:5827:1: ( '}' )
-            // InternalEssentialOCL.g:5828:1: '}'
+            // InternalEssentialOCL.g:5829:1: ( '}' )
+            // InternalEssentialOCL.g:5830:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
@@ -17919,14 +17919,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0"
-    // InternalEssentialOCL.g:5851:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
+    // InternalEssentialOCL.g:5853:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
     public final void rule__TupleLiteralExpCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5855:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
-            // InternalEssentialOCL.g:5856:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
+            // InternalEssentialOCL.g:5857:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
+            // InternalEssentialOCL.g:5858:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TupleLiteralExpCS__Group_3__0__Impl();
@@ -17957,17 +17957,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0__Impl"
-    // InternalEssentialOCL.g:5863:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:5865:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
     public final void rule__TupleLiteralExpCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5867:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:5868:1: ( ',' )
+            // InternalEssentialOCL.g:5869:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:5870:1: ( ',' )
             {
-            // InternalEssentialOCL.g:5868:1: ( ',' )
-            // InternalEssentialOCL.g:5869:1: ','
+            // InternalEssentialOCL.g:5870:1: ( ',' )
+            // InternalEssentialOCL.g:5871:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
@@ -17998,14 +17998,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1"
-    // InternalEssentialOCL.g:5882:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
+    // InternalEssentialOCL.g:5884:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
     public final void rule__TupleLiteralExpCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5886:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
-            // InternalEssentialOCL.g:5887:2: rule__TupleLiteralExpCS__Group_3__1__Impl
+            // InternalEssentialOCL.g:5888:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
+            // InternalEssentialOCL.g:5889:2: rule__TupleLiteralExpCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group_3__1__Impl();
@@ -18031,23 +18031,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1__Impl"
-    // InternalEssentialOCL.g:5893:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
+    // InternalEssentialOCL.g:5895:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
     public final void rule__TupleLiteralExpCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5897:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
-            // InternalEssentialOCL.g:5898:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalEssentialOCL.g:5899:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
+            // InternalEssentialOCL.g:5900:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
             {
-            // InternalEssentialOCL.g:5898:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
-            // InternalEssentialOCL.g:5899:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalEssentialOCL.g:5900:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalEssentialOCL.g:5901:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
             }
-            // InternalEssentialOCL.g:5900:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
-            // InternalEssentialOCL.g:5900:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
+            // InternalEssentialOCL.g:5902:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalEssentialOCL.g:5902:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1();
@@ -18082,14 +18082,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0"
-    // InternalEssentialOCL.g:5914:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
+    // InternalEssentialOCL.g:5916:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
     public final void rule__TupleLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5918:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
-            // InternalEssentialOCL.g:5919:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
+            // InternalEssentialOCL.g:5920:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
+            // InternalEssentialOCL.g:5921:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__TupleLiteralPartCS__Group__0__Impl();
@@ -18120,23 +18120,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0__Impl"
-    // InternalEssentialOCL.g:5926:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:5928:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5930:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:5931:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:5932:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:5933:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:5931:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:5932:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:5933:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:5934:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:5933:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:5933:2: rule__TupleLiteralPartCS__NameAssignment_0
+            // InternalEssentialOCL.g:5935:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:5935:2: rule__TupleLiteralPartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__NameAssignment_0();
@@ -18171,14 +18171,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1"
-    // InternalEssentialOCL.g:5943:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
+    // InternalEssentialOCL.g:5945:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
     public final void rule__TupleLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5947:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
-            // InternalEssentialOCL.g:5948:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
+            // InternalEssentialOCL.g:5949:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
+            // InternalEssentialOCL.g:5950:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__TupleLiteralPartCS__Group__1__Impl();
@@ -18209,22 +18209,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1__Impl"
-    // InternalEssentialOCL.g:5955:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:5957:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
     public final void rule__TupleLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5959:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:5960:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:5961:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:5962:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:5960:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:5961:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalEssentialOCL.g:5962:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:5963:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:5962:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalEssentialOCL.g:5964:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             int alt47=2;
             int LA47_0 = input.LA(1);
 
@@ -18233,7 +18233,7 @@
             }
             switch (alt47) {
                 case 1 :
-                    // InternalEssentialOCL.g:5962:2: rule__TupleLiteralPartCS__Group_1__0
+                    // InternalEssentialOCL.g:5964:2: rule__TupleLiteralPartCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleLiteralPartCS__Group_1__0();
@@ -18271,14 +18271,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2"
-    // InternalEssentialOCL.g:5972:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
+    // InternalEssentialOCL.g:5974:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
     public final void rule__TupleLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5976:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
-            // InternalEssentialOCL.g:5977:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
+            // InternalEssentialOCL.g:5978:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
+            // InternalEssentialOCL.g:5979:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__TupleLiteralPartCS__Group__2__Impl();
@@ -18309,17 +18309,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2__Impl"
-    // InternalEssentialOCL.g:5984:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:5986:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
     public final void rule__TupleLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:5988:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:5989:1: ( '=' )
+            // InternalEssentialOCL.g:5990:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:5991:1: ( '=' )
             {
-            // InternalEssentialOCL.g:5989:1: ( '=' )
-            // InternalEssentialOCL.g:5990:1: '='
+            // InternalEssentialOCL.g:5991:1: ( '=' )
+            // InternalEssentialOCL.g:5992:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
@@ -18350,14 +18350,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3"
-    // InternalEssentialOCL.g:6003:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:6005:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
     public final void rule__TupleLiteralPartCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6007:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
-            // InternalEssentialOCL.g:6008:2: rule__TupleLiteralPartCS__Group__3__Impl
+            // InternalEssentialOCL.g:6009:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
+            // InternalEssentialOCL.g:6010:2: rule__TupleLiteralPartCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group__3__Impl();
@@ -18383,23 +18383,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3__Impl"
-    // InternalEssentialOCL.g:6014:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
+    // InternalEssentialOCL.g:6016:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6018:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
-            // InternalEssentialOCL.g:6019:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalEssentialOCL.g:6020:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
+            // InternalEssentialOCL.g:6021:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
             {
-            // InternalEssentialOCL.g:6019:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
-            // InternalEssentialOCL.g:6020:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalEssentialOCL.g:6021:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalEssentialOCL.g:6022:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
             }
-            // InternalEssentialOCL.g:6021:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
-            // InternalEssentialOCL.g:6021:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
+            // InternalEssentialOCL.g:6023:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalEssentialOCL.g:6023:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3();
@@ -18434,14 +18434,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0"
-    // InternalEssentialOCL.g:6039:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
+    // InternalEssentialOCL.g:6041:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
     public final void rule__TupleLiteralPartCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6043:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
-            // InternalEssentialOCL.g:6044:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
+            // InternalEssentialOCL.g:6045:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
+            // InternalEssentialOCL.g:6046:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__TupleLiteralPartCS__Group_1__0__Impl();
@@ -18472,17 +18472,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:6051:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:6053:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__TupleLiteralPartCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6055:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:6056:1: ( ':' )
+            // InternalEssentialOCL.g:6057:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:6058:1: ( ':' )
             {
-            // InternalEssentialOCL.g:6056:1: ( ':' )
-            // InternalEssentialOCL.g:6057:1: ':'
+            // InternalEssentialOCL.g:6058:1: ( ':' )
+            // InternalEssentialOCL.g:6059:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
@@ -18513,14 +18513,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1"
-    // InternalEssentialOCL.g:6070:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:6072:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
     public final void rule__TupleLiteralPartCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6074:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:6075:2: rule__TupleLiteralPartCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:6076:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:6077:2: rule__TupleLiteralPartCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group_1__1__Impl();
@@ -18546,23 +18546,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:6081:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:6083:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__TupleLiteralPartCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6085:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:6086:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:6087:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:6088:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:6086:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
-            // InternalEssentialOCL.g:6087:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:6088:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:6089:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalEssentialOCL.g:6088:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
-            // InternalEssentialOCL.g:6088:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
+            // InternalEssentialOCL.g:6090:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:6090:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1();
@@ -18597,14 +18597,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:6102:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:6104:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6106:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:6107:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:6108:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:6109:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl();
@@ -18635,23 +18635,23 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6114:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:6116:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6118:1: ( ( () ) )
-            // InternalEssentialOCL.g:6119:1: ( () )
+            // InternalEssentialOCL.g:6120:1: ( ( () ) )
+            // InternalEssentialOCL.g:6121:1: ( () )
             {
-            // InternalEssentialOCL.g:6119:1: ( () )
-            // InternalEssentialOCL.g:6120:1: ()
+            // InternalEssentialOCL.g:6121:1: ( () )
+            // InternalEssentialOCL.g:6122:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
             }
-            // InternalEssentialOCL.g:6121:1: ()
-            // InternalEssentialOCL.g:6123:1:
+            // InternalEssentialOCL.g:6123:1: ()
+            // InternalEssentialOCL.g:6125:1:
             {
             }
 
@@ -18676,14 +18676,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:6133:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:6135:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6137:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
-            // InternalEssentialOCL.g:6138:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
+            // InternalEssentialOCL.g:6139:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
+            // InternalEssentialOCL.g:6140:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl();
@@ -18709,17 +18709,17 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:6144:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
+    // InternalEssentialOCL.g:6146:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6148:1: ( ( '*' ) )
-            // InternalEssentialOCL.g:6149:1: ( '*' )
+            // InternalEssentialOCL.g:6150:1: ( ( '*' ) )
+            // InternalEssentialOCL.g:6151:1: ( '*' )
             {
-            // InternalEssentialOCL.g:6149:1: ( '*' )
-            // InternalEssentialOCL.g:6150:1: '*'
+            // InternalEssentialOCL.g:6151:1: ( '*' )
+            // InternalEssentialOCL.g:6152:1: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
@@ -18750,14 +18750,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:6167:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:6169:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
     public final void rule__InvalidLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6171:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:6172:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:6173:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:6174:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_27);
             rule__InvalidLiteralExpCS__Group__0__Impl();
@@ -18788,23 +18788,23 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6179:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:6181:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__InvalidLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6183:1: ( ( () ) )
-            // InternalEssentialOCL.g:6184:1: ( () )
+            // InternalEssentialOCL.g:6185:1: ( ( () ) )
+            // InternalEssentialOCL.g:6186:1: ( () )
             {
-            // InternalEssentialOCL.g:6184:1: ( () )
-            // InternalEssentialOCL.g:6185:1: ()
+            // InternalEssentialOCL.g:6186:1: ( () )
+            // InternalEssentialOCL.g:6187:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
             }
-            // InternalEssentialOCL.g:6186:1: ()
-            // InternalEssentialOCL.g:6188:1:
+            // InternalEssentialOCL.g:6188:1: ()
+            // InternalEssentialOCL.g:6190:1:
             {
             }
 
@@ -18829,14 +18829,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:6198:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:6200:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
     public final void rule__InvalidLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6202:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
-            // InternalEssentialOCL.g:6203:2: rule__InvalidLiteralExpCS__Group__1__Impl
+            // InternalEssentialOCL.g:6204:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
+            // InternalEssentialOCL.g:6205:2: rule__InvalidLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvalidLiteralExpCS__Group__1__Impl();
@@ -18862,17 +18862,17 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:6209:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
+    // InternalEssentialOCL.g:6211:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
     public final void rule__InvalidLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6213:1: ( ( 'invalid' ) )
-            // InternalEssentialOCL.g:6214:1: ( 'invalid' )
+            // InternalEssentialOCL.g:6215:1: ( ( 'invalid' ) )
+            // InternalEssentialOCL.g:6216:1: ( 'invalid' )
             {
-            // InternalEssentialOCL.g:6214:1: ( 'invalid' )
-            // InternalEssentialOCL.g:6215:1: 'invalid'
+            // InternalEssentialOCL.g:6216:1: ( 'invalid' )
+            // InternalEssentialOCL.g:6217:1: 'invalid'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
@@ -18903,14 +18903,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0"
-    // InternalEssentialOCL.g:6232:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
+    // InternalEssentialOCL.g:6234:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
     public final void rule__NullLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6236:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
-            // InternalEssentialOCL.g:6237:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
+            // InternalEssentialOCL.g:6238:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
+            // InternalEssentialOCL.g:6239:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NullLiteralExpCS__Group__0__Impl();
@@ -18941,23 +18941,23 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6244:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:6246:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__NullLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6248:1: ( ( () ) )
-            // InternalEssentialOCL.g:6249:1: ( () )
+            // InternalEssentialOCL.g:6250:1: ( ( () ) )
+            // InternalEssentialOCL.g:6251:1: ( () )
             {
-            // InternalEssentialOCL.g:6249:1: ( () )
-            // InternalEssentialOCL.g:6250:1: ()
+            // InternalEssentialOCL.g:6251:1: ( () )
+            // InternalEssentialOCL.g:6252:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
             }
-            // InternalEssentialOCL.g:6251:1: ()
-            // InternalEssentialOCL.g:6253:1:
+            // InternalEssentialOCL.g:6253:1: ()
+            // InternalEssentialOCL.g:6255:1:
             {
             }
 
@@ -18982,14 +18982,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1"
-    // InternalEssentialOCL.g:6263:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:6265:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
     public final void rule__NullLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6267:1: ( rule__NullLiteralExpCS__Group__1__Impl )
-            // InternalEssentialOCL.g:6268:2: rule__NullLiteralExpCS__Group__1__Impl
+            // InternalEssentialOCL.g:6269:1: ( rule__NullLiteralExpCS__Group__1__Impl )
+            // InternalEssentialOCL.g:6270:2: rule__NullLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NullLiteralExpCS__Group__1__Impl();
@@ -19015,17 +19015,17 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:6274:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
+    // InternalEssentialOCL.g:6276:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
     public final void rule__NullLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6278:1: ( ( 'null' ) )
-            // InternalEssentialOCL.g:6279:1: ( 'null' )
+            // InternalEssentialOCL.g:6280:1: ( ( 'null' ) )
+            // InternalEssentialOCL.g:6281:1: ( 'null' )
             {
-            // InternalEssentialOCL.g:6279:1: ( 'null' )
-            // InternalEssentialOCL.g:6280:1: 'null'
+            // InternalEssentialOCL.g:6281:1: ( 'null' )
+            // InternalEssentialOCL.g:6282:1: 'null'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
@@ -19056,14 +19056,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0"
-    // InternalEssentialOCL.g:6297:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
+    // InternalEssentialOCL.g:6299:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6301:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
-            // InternalEssentialOCL.g:6302:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
+            // InternalEssentialOCL.g:6303:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
+            // InternalEssentialOCL.g:6304:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__TypeLiteralWithMultiplicityCS__Group__0__Impl();
@@ -19094,17 +19094,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6309:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
+    // InternalEssentialOCL.g:6311:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6313:1: ( ( ruleTypeLiteralCS ) )
-            // InternalEssentialOCL.g:6314:1: ( ruleTypeLiteralCS )
+            // InternalEssentialOCL.g:6315:1: ( ( ruleTypeLiteralCS ) )
+            // InternalEssentialOCL.g:6316:1: ( ruleTypeLiteralCS )
             {
-            // InternalEssentialOCL.g:6314:1: ( ruleTypeLiteralCS )
-            // InternalEssentialOCL.g:6315:1: ruleTypeLiteralCS
+            // InternalEssentialOCL.g:6316:1: ( ruleTypeLiteralCS )
+            // InternalEssentialOCL.g:6317:1: ruleTypeLiteralCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());
@@ -19139,14 +19139,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1"
-    // InternalEssentialOCL.g:6326:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:6328:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6330:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
-            // InternalEssentialOCL.g:6331:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
+            // InternalEssentialOCL.g:6332:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
+            // InternalEssentialOCL.g:6333:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeLiteralWithMultiplicityCS__Group__1__Impl();
@@ -19172,22 +19172,22 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1__Impl"
-    // InternalEssentialOCL.g:6337:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalEssentialOCL.g:6339:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6341:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalEssentialOCL.g:6342:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalEssentialOCL.g:6343:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalEssentialOCL.g:6344:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalEssentialOCL.g:6342:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalEssentialOCL.g:6343:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalEssentialOCL.g:6344:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalEssentialOCL.g:6345:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalEssentialOCL.g:6344:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalEssentialOCL.g:6346:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             int alt48=2;
             int LA48_0 = input.LA(1);
 
@@ -19196,7 +19196,7 @@
             }
             switch (alt48) {
                 case 1 :
-                    // InternalEssentialOCL.g:6344:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
+                    // InternalEssentialOCL.g:6346:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1();
@@ -19234,14 +19234,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0"
-    // InternalEssentialOCL.g:6358:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
+    // InternalEssentialOCL.g:6360:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
     public final void rule__TypeNameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6362:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
-            // InternalEssentialOCL.g:6363:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
+            // InternalEssentialOCL.g:6364:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
+            // InternalEssentialOCL.g:6365:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__TypeNameExpCS__Group__0__Impl();
@@ -19272,23 +19272,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6370:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:6372:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypeNameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6374:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:6375:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalEssentialOCL.g:6376:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:6377:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:6375:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalEssentialOCL.g:6376:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalEssentialOCL.g:6377:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalEssentialOCL.g:6378:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalEssentialOCL.g:6377:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
-            // InternalEssentialOCL.g:6377:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
+            // InternalEssentialOCL.g:6379:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalEssentialOCL.g:6379:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPathNameAssignment_0();
@@ -19323,14 +19323,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1"
-    // InternalEssentialOCL.g:6387:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:6389:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
     public final void rule__TypeNameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6391:1: ( rule__TypeNameExpCS__Group__1__Impl )
-            // InternalEssentialOCL.g:6392:2: rule__TypeNameExpCS__Group__1__Impl
+            // InternalEssentialOCL.g:6393:1: ( rule__TypeNameExpCS__Group__1__Impl )
+            // InternalEssentialOCL.g:6394:2: rule__TypeNameExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group__1__Impl();
@@ -19356,22 +19356,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:6398:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:6400:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6402:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:6403:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:6404:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:6405:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:6403:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:6404:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalEssentialOCL.g:6405:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:6406:1: ( rule__TypeNameExpCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:6405:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalEssentialOCL.g:6407:1: ( rule__TypeNameExpCS__Group_1__0 )?
             int alt49=2;
             int LA49_0 = input.LA(1);
 
@@ -19380,7 +19380,7 @@
             }
             switch (alt49) {
                 case 1 :
-                    // InternalEssentialOCL.g:6405:2: rule__TypeNameExpCS__Group_1__0
+                    // InternalEssentialOCL.g:6407:2: rule__TypeNameExpCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1__0();
@@ -19418,14 +19418,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0"
-    // InternalEssentialOCL.g:6419:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
+    // InternalEssentialOCL.g:6421:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
     public final void rule__TypeNameExpCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6423:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
-            // InternalEssentialOCL.g:6424:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
+            // InternalEssentialOCL.g:6425:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
+            // InternalEssentialOCL.g:6426:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__TypeNameExpCS__Group_1__0__Impl();
@@ -19456,23 +19456,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:6431:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
+    // InternalEssentialOCL.g:6433:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
     public final void rule__TypeNameExpCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6435:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
-            // InternalEssentialOCL.g:6436:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalEssentialOCL.g:6437:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
+            // InternalEssentialOCL.g:6438:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
             {
-            // InternalEssentialOCL.g:6436:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
-            // InternalEssentialOCL.g:6437:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalEssentialOCL.g:6438:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalEssentialOCL.g:6439:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
             }
-            // InternalEssentialOCL.g:6438:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
-            // InternalEssentialOCL.g:6438:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
+            // InternalEssentialOCL.g:6440:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalEssentialOCL.g:6440:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0();
@@ -19507,14 +19507,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1"
-    // InternalEssentialOCL.g:6448:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:6450:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
     public final void rule__TypeNameExpCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6452:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:6453:2: rule__TypeNameExpCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:6454:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:6455:2: rule__TypeNameExpCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1__1__Impl();
@@ -19540,22 +19540,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:6459:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
+    // InternalEssentialOCL.g:6461:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6463:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
-            // InternalEssentialOCL.g:6464:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalEssentialOCL.g:6465:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
+            // InternalEssentialOCL.g:6466:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
             {
-            // InternalEssentialOCL.g:6464:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
-            // InternalEssentialOCL.g:6465:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalEssentialOCL.g:6466:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalEssentialOCL.g:6467:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
             }
-            // InternalEssentialOCL.g:6466:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalEssentialOCL.g:6468:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             int alt50=2;
             int LA50_0 = input.LA(1);
 
@@ -19564,7 +19564,7 @@
             }
             switch (alt50) {
                 case 1 :
-                    // InternalEssentialOCL.g:6466:2: rule__TypeNameExpCS__Group_1_1__0
+                    // InternalEssentialOCL.g:6468:2: rule__TypeNameExpCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1_1__0();
@@ -19602,14 +19602,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0"
-    // InternalEssentialOCL.g:6480:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
+    // InternalEssentialOCL.g:6482:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
     public final void rule__TypeNameExpCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6484:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
-            // InternalEssentialOCL.g:6485:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
+            // InternalEssentialOCL.g:6486:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
+            // InternalEssentialOCL.g:6487:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__TypeNameExpCS__Group_1_1__0__Impl();
@@ -19640,17 +19640,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0__Impl"
-    // InternalEssentialOCL.g:6492:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:6494:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6496:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:6497:1: ( '{' )
+            // InternalEssentialOCL.g:6498:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:6499:1: ( '{' )
             {
-            // InternalEssentialOCL.g:6497:1: ( '{' )
-            // InternalEssentialOCL.g:6498:1: '{'
+            // InternalEssentialOCL.g:6499:1: ( '{' )
+            // InternalEssentialOCL.g:6500:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
@@ -19681,14 +19681,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1"
-    // InternalEssentialOCL.g:6511:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
+    // InternalEssentialOCL.g:6513:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
     public final void rule__TypeNameExpCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6515:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
-            // InternalEssentialOCL.g:6516:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
+            // InternalEssentialOCL.g:6517:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
+            // InternalEssentialOCL.g:6518:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_21);
             rule__TypeNameExpCS__Group_1_1__1__Impl();
@@ -19719,23 +19719,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1__Impl"
-    // InternalEssentialOCL.g:6523:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
+    // InternalEssentialOCL.g:6525:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
     public final void rule__TypeNameExpCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6527:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
-            // InternalEssentialOCL.g:6528:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalEssentialOCL.g:6529:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
+            // InternalEssentialOCL.g:6530:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
             {
-            // InternalEssentialOCL.g:6528:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
-            // InternalEssentialOCL.g:6529:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalEssentialOCL.g:6530:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalEssentialOCL.g:6531:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
             }
-            // InternalEssentialOCL.g:6530:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
-            // InternalEssentialOCL.g:6530:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
+            // InternalEssentialOCL.g:6532:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalEssentialOCL.g:6532:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1();
@@ -19770,14 +19770,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2"
-    // InternalEssentialOCL.g:6540:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
+    // InternalEssentialOCL.g:6542:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
     public final void rule__TypeNameExpCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6544:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
-            // InternalEssentialOCL.g:6545:2: rule__TypeNameExpCS__Group_1_1__2__Impl
+            // InternalEssentialOCL.g:6546:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
+            // InternalEssentialOCL.g:6547:2: rule__TypeNameExpCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1_1__2__Impl();
@@ -19803,17 +19803,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2__Impl"
-    // InternalEssentialOCL.g:6551:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:6553:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6555:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:6556:1: ( '}' )
+            // InternalEssentialOCL.g:6557:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:6558:1: ( '}' )
             {
-            // InternalEssentialOCL.g:6556:1: ( '}' )
-            // InternalEssentialOCL.g:6557:1: '}'
+            // InternalEssentialOCL.g:6558:1: ( '}' )
+            // InternalEssentialOCL.g:6559:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
@@ -19844,14 +19844,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0"
-    // InternalEssentialOCL.g:6576:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
+    // InternalEssentialOCL.g:6578:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
     public final void rule__TypeExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6580:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
-            // InternalEssentialOCL.g:6581:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
+            // InternalEssentialOCL.g:6582:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
+            // InternalEssentialOCL.g:6583:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__TypeExpCS__Group__0__Impl();
@@ -19882,17 +19882,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6588:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalEssentialOCL.g:6590:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__TypeExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6592:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalEssentialOCL.g:6593:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalEssentialOCL.g:6594:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalEssentialOCL.g:6595:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalEssentialOCL.g:6593:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalEssentialOCL.g:6594:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalEssentialOCL.g:6595:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalEssentialOCL.g:6596:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());
@@ -19927,14 +19927,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1"
-    // InternalEssentialOCL.g:6605:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:6607:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
     public final void rule__TypeExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6609:1: ( rule__TypeExpCS__Group__1__Impl )
-            // InternalEssentialOCL.g:6610:2: rule__TypeExpCS__Group__1__Impl
+            // InternalEssentialOCL.g:6611:1: ( rule__TypeExpCS__Group__1__Impl )
+            // InternalEssentialOCL.g:6612:2: rule__TypeExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeExpCS__Group__1__Impl();
@@ -19960,22 +19960,22 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:6616:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalEssentialOCL.g:6618:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6620:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalEssentialOCL.g:6621:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalEssentialOCL.g:6622:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalEssentialOCL.g:6623:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalEssentialOCL.g:6621:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalEssentialOCL.g:6622:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalEssentialOCL.g:6623:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalEssentialOCL.g:6624:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalEssentialOCL.g:6623:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalEssentialOCL.g:6625:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -19984,7 +19984,7 @@
             }
             switch (alt51) {
                 case 1 :
-                    // InternalEssentialOCL.g:6623:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
+                    // InternalEssentialOCL.g:6625:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeExpCS__OwnedMultiplicityAssignment_1();
@@ -20022,14 +20022,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0"
-    // InternalEssentialOCL.g:6637:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
+    // InternalEssentialOCL.g:6639:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
     public final void rule__ExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6641:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
-            // InternalEssentialOCL.g:6642:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
+            // InternalEssentialOCL.g:6643:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
+            // InternalEssentialOCL.g:6644:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_30);
             rule__ExpCS__Group_0__0__Impl();
@@ -20060,17 +20060,17 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0__Impl"
-    // InternalEssentialOCL.g:6649:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalEssentialOCL.g:6651:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__ExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6653:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalEssentialOCL.g:6654:1: ( rulePrefixedPrimaryExpCS )
+            // InternalEssentialOCL.g:6655:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalEssentialOCL.g:6656:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalEssentialOCL.g:6654:1: ( rulePrefixedPrimaryExpCS )
-            // InternalEssentialOCL.g:6655:1: rulePrefixedPrimaryExpCS
+            // InternalEssentialOCL.g:6656:1: ( rulePrefixedPrimaryExpCS )
+            // InternalEssentialOCL.g:6657:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());
@@ -20105,14 +20105,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1"
-    // InternalEssentialOCL.g:6666:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
+    // InternalEssentialOCL.g:6668:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
     public final void rule__ExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6670:1: ( rule__ExpCS__Group_0__1__Impl )
-            // InternalEssentialOCL.g:6671:2: rule__ExpCS__Group_0__1__Impl
+            // InternalEssentialOCL.g:6672:1: ( rule__ExpCS__Group_0__1__Impl )
+            // InternalEssentialOCL.g:6673:2: rule__ExpCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0__1__Impl();
@@ -20138,22 +20138,22 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1__Impl"
-    // InternalEssentialOCL.g:6677:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
+    // InternalEssentialOCL.g:6679:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
     public final void rule__ExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6681:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
-            // InternalEssentialOCL.g:6682:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalEssentialOCL.g:6683:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
+            // InternalEssentialOCL.g:6684:1: ( ( rule__ExpCS__Group_0_1__0 )? )
             {
-            // InternalEssentialOCL.g:6682:1: ( ( rule__ExpCS__Group_0_1__0 )? )
-            // InternalEssentialOCL.g:6683:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalEssentialOCL.g:6684:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalEssentialOCL.g:6685:1: ( rule__ExpCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getGroup_0_1());
             }
-            // InternalEssentialOCL.g:6684:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalEssentialOCL.g:6686:1: ( rule__ExpCS__Group_0_1__0 )?
             int alt52=2;
             int LA52_0 = input.LA(1);
 
@@ -20162,7 +20162,7 @@
             }
             switch (alt52) {
                 case 1 :
-                    // InternalEssentialOCL.g:6684:2: rule__ExpCS__Group_0_1__0
+                    // InternalEssentialOCL.g:6686:2: rule__ExpCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0_1__0();
@@ -20200,14 +20200,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0"
-    // InternalEssentialOCL.g:6698:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
+    // InternalEssentialOCL.g:6700:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
     public final void rule__ExpCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6702:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
-            // InternalEssentialOCL.g:6703:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
+            // InternalEssentialOCL.g:6704:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
+            // InternalEssentialOCL.g:6705:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_30);
             rule__ExpCS__Group_0_1__0__Impl();
@@ -20238,23 +20238,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0__Impl"
-    // InternalEssentialOCL.g:6710:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:6712:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
     public final void rule__ExpCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6714:1: ( ( () ) )
-            // InternalEssentialOCL.g:6715:1: ( () )
+            // InternalEssentialOCL.g:6716:1: ( ( () ) )
+            // InternalEssentialOCL.g:6717:1: ( () )
             {
-            // InternalEssentialOCL.g:6715:1: ( () )
-            // InternalEssentialOCL.g:6716:1: ()
+            // InternalEssentialOCL.g:6717:1: ( () )
+            // InternalEssentialOCL.g:6718:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
             }
-            // InternalEssentialOCL.g:6717:1: ()
-            // InternalEssentialOCL.g:6719:1:
+            // InternalEssentialOCL.g:6719:1: ()
+            // InternalEssentialOCL.g:6721:1:
             {
             }
 
@@ -20279,14 +20279,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1"
-    // InternalEssentialOCL.g:6729:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
+    // InternalEssentialOCL.g:6731:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
     public final void rule__ExpCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6733:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
-            // InternalEssentialOCL.g:6734:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
+            // InternalEssentialOCL.g:6735:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
+            // InternalEssentialOCL.g:6736:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__ExpCS__Group_0_1__1__Impl();
@@ -20317,23 +20317,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1__Impl"
-    // InternalEssentialOCL.g:6741:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
+    // InternalEssentialOCL.g:6743:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
     public final void rule__ExpCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6745:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
-            // InternalEssentialOCL.g:6746:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalEssentialOCL.g:6747:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
+            // InternalEssentialOCL.g:6748:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
             {
-            // InternalEssentialOCL.g:6746:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
-            // InternalEssentialOCL.g:6747:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalEssentialOCL.g:6748:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalEssentialOCL.g:6749:1: ( rule__ExpCS__NameAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
             }
-            // InternalEssentialOCL.g:6748:1: ( rule__ExpCS__NameAssignment_0_1_1 )
-            // InternalEssentialOCL.g:6748:2: rule__ExpCS__NameAssignment_0_1_1
+            // InternalEssentialOCL.g:6750:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalEssentialOCL.g:6750:2: rule__ExpCS__NameAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__NameAssignment_0_1_1();
@@ -20368,14 +20368,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2"
-    // InternalEssentialOCL.g:6758:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
+    // InternalEssentialOCL.g:6760:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
     public final void rule__ExpCS__Group_0_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6762:1: ( rule__ExpCS__Group_0_1__2__Impl )
-            // InternalEssentialOCL.g:6763:2: rule__ExpCS__Group_0_1__2__Impl
+            // InternalEssentialOCL.g:6764:1: ( rule__ExpCS__Group_0_1__2__Impl )
+            // InternalEssentialOCL.g:6765:2: rule__ExpCS__Group_0_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0_1__2__Impl();
@@ -20401,23 +20401,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2__Impl"
-    // InternalEssentialOCL.g:6769:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
+    // InternalEssentialOCL.g:6771:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
     public final void rule__ExpCS__Group_0_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6773:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
-            // InternalEssentialOCL.g:6774:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalEssentialOCL.g:6775:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
+            // InternalEssentialOCL.g:6776:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
             {
-            // InternalEssentialOCL.g:6774:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
-            // InternalEssentialOCL.g:6775:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalEssentialOCL.g:6776:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalEssentialOCL.g:6777:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
             }
-            // InternalEssentialOCL.g:6776:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
-            // InternalEssentialOCL.g:6776:2: rule__ExpCS__OwnedRightAssignment_0_1_2
+            // InternalEssentialOCL.g:6778:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalEssentialOCL.g:6778:2: rule__ExpCS__OwnedRightAssignment_0_1_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__OwnedRightAssignment_0_1_2();
@@ -20452,14 +20452,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0"
-    // InternalEssentialOCL.g:6792:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
+    // InternalEssentialOCL.g:6794:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
     public final void rule__PrefixedLetExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6796:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
-            // InternalEssentialOCL.g:6797:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
+            // InternalEssentialOCL.g:6798:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
+            // InternalEssentialOCL.g:6799:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__PrefixedLetExpCS__Group_0__0__Impl();
@@ -20490,23 +20490,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0__Impl"
-    // InternalEssentialOCL.g:6804:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:6806:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedLetExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6808:1: ( ( () ) )
-            // InternalEssentialOCL.g:6809:1: ( () )
+            // InternalEssentialOCL.g:6810:1: ( ( () ) )
+            // InternalEssentialOCL.g:6811:1: ( () )
             {
-            // InternalEssentialOCL.g:6809:1: ( () )
-            // InternalEssentialOCL.g:6810:1: ()
+            // InternalEssentialOCL.g:6811:1: ( () )
+            // InternalEssentialOCL.g:6812:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalEssentialOCL.g:6811:1: ()
-            // InternalEssentialOCL.g:6813:1:
+            // InternalEssentialOCL.g:6813:1: ()
+            // InternalEssentialOCL.g:6815:1:
             {
             }
 
@@ -20531,14 +20531,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1"
-    // InternalEssentialOCL.g:6823:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
+    // InternalEssentialOCL.g:6825:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
     public final void rule__PrefixedLetExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6827:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
-            // InternalEssentialOCL.g:6828:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
+            // InternalEssentialOCL.g:6829:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
+            // InternalEssentialOCL.g:6830:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__PrefixedLetExpCS__Group_0__1__Impl();
@@ -20569,23 +20569,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1__Impl"
-    // InternalEssentialOCL.g:6835:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
+    // InternalEssentialOCL.g:6837:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6839:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
-            // InternalEssentialOCL.g:6840:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalEssentialOCL.g:6841:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
+            // InternalEssentialOCL.g:6842:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
             {
-            // InternalEssentialOCL.g:6840:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
-            // InternalEssentialOCL.g:6841:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalEssentialOCL.g:6842:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalEssentialOCL.g:6843:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalEssentialOCL.g:6842:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
-            // InternalEssentialOCL.g:6842:2: rule__PrefixedLetExpCS__NameAssignment_0_1
+            // InternalEssentialOCL.g:6844:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalEssentialOCL.g:6844:2: rule__PrefixedLetExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__NameAssignment_0_1();
@@ -20620,14 +20620,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2"
-    // InternalEssentialOCL.g:6852:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
+    // InternalEssentialOCL.g:6854:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedLetExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6856:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
-            // InternalEssentialOCL.g:6857:2: rule__PrefixedLetExpCS__Group_0__2__Impl
+            // InternalEssentialOCL.g:6858:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
+            // InternalEssentialOCL.g:6859:2: rule__PrefixedLetExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__Group_0__2__Impl();
@@ -20653,23 +20653,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2__Impl"
-    // InternalEssentialOCL.g:6863:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalEssentialOCL.g:6865:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6867:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalEssentialOCL.g:6868:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalEssentialOCL.g:6869:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalEssentialOCL.g:6870:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalEssentialOCL.g:6868:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalEssentialOCL.g:6869:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalEssentialOCL.g:6870:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalEssentialOCL.g:6871:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalEssentialOCL.g:6870:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
-            // InternalEssentialOCL.g:6870:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
+            // InternalEssentialOCL.g:6872:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalEssentialOCL.g:6872:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__OwnedRightAssignment_0_2();
@@ -20704,14 +20704,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0"
-    // InternalEssentialOCL.g:6886:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
+    // InternalEssentialOCL.g:6888:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6890:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
-            // InternalEssentialOCL.g:6891:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
+            // InternalEssentialOCL.g:6892:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
+            // InternalEssentialOCL.g:6893:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__PrefixedPrimaryExpCS__Group_0__0__Impl();
@@ -20742,23 +20742,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0__Impl"
-    // InternalEssentialOCL.g:6898:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:6900:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6902:1: ( ( () ) )
-            // InternalEssentialOCL.g:6903:1: ( () )
+            // InternalEssentialOCL.g:6904:1: ( ( () ) )
+            // InternalEssentialOCL.g:6905:1: ( () )
             {
-            // InternalEssentialOCL.g:6903:1: ( () )
-            // InternalEssentialOCL.g:6904:1: ()
+            // InternalEssentialOCL.g:6905:1: ( () )
+            // InternalEssentialOCL.g:6906:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalEssentialOCL.g:6905:1: ()
-            // InternalEssentialOCL.g:6907:1:
+            // InternalEssentialOCL.g:6907:1: ()
+            // InternalEssentialOCL.g:6909:1:
             {
             }
 
@@ -20783,14 +20783,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1"
-    // InternalEssentialOCL.g:6917:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
+    // InternalEssentialOCL.g:6919:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6921:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
-            // InternalEssentialOCL.g:6922:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
+            // InternalEssentialOCL.g:6923:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
+            // InternalEssentialOCL.g:6924:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PrefixedPrimaryExpCS__Group_0__1__Impl();
@@ -20821,23 +20821,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1__Impl"
-    // InternalEssentialOCL.g:6929:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
+    // InternalEssentialOCL.g:6931:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6933:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
-            // InternalEssentialOCL.g:6934:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalEssentialOCL.g:6935:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
+            // InternalEssentialOCL.g:6936:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
             {
-            // InternalEssentialOCL.g:6934:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
-            // InternalEssentialOCL.g:6935:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalEssentialOCL.g:6936:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalEssentialOCL.g:6937:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalEssentialOCL.g:6936:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
-            // InternalEssentialOCL.g:6936:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
+            // InternalEssentialOCL.g:6938:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalEssentialOCL.g:6938:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__NameAssignment_0_1();
@@ -20872,14 +20872,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2"
-    // InternalEssentialOCL.g:6946:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
+    // InternalEssentialOCL.g:6948:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6950:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
-            // InternalEssentialOCL.g:6951:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
+            // InternalEssentialOCL.g:6952:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
+            // InternalEssentialOCL.g:6953:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__Group_0__2__Impl();
@@ -20905,23 +20905,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2__Impl"
-    // InternalEssentialOCL.g:6957:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalEssentialOCL.g:6959:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6961:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalEssentialOCL.g:6962:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalEssentialOCL.g:6963:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalEssentialOCL.g:6964:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalEssentialOCL.g:6962:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalEssentialOCL.g:6963:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalEssentialOCL.g:6964:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalEssentialOCL.g:6965:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalEssentialOCL.g:6964:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
-            // InternalEssentialOCL.g:6964:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
+            // InternalEssentialOCL.g:6966:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalEssentialOCL.g:6966:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2();
@@ -20956,14 +20956,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0"
-    // InternalEssentialOCL.g:6980:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
+    // InternalEssentialOCL.g:6982:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
     public final void rule__NameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6984:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
-            // InternalEssentialOCL.g:6985:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
+            // InternalEssentialOCL.g:6986:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
+            // InternalEssentialOCL.g:6987:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__NameExpCS__Group__0__Impl();
@@ -20994,23 +20994,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:6992:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:6994:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__NameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:6996:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:6997:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalEssentialOCL.g:6998:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:6999:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:6997:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalEssentialOCL.g:6998:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalEssentialOCL.g:6999:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalEssentialOCL.g:7000:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalEssentialOCL.g:6999:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
-            // InternalEssentialOCL.g:6999:2: rule__NameExpCS__OwnedPathNameAssignment_0
+            // InternalEssentialOCL.g:7001:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalEssentialOCL.g:7001:2: rule__NameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__OwnedPathNameAssignment_0();
@@ -21045,14 +21045,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1"
-    // InternalEssentialOCL.g:7009:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
+    // InternalEssentialOCL.g:7011:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
     public final void rule__NameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7013:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
-            // InternalEssentialOCL.g:7014:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
+            // InternalEssentialOCL.g:7015:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
+            // InternalEssentialOCL.g:7016:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__NameExpCS__Group__1__Impl();
@@ -21083,22 +21083,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:7021:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
+    // InternalEssentialOCL.g:7023:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
     public final void rule__NameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7025:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
-            // InternalEssentialOCL.g:7026:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalEssentialOCL.g:7027:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
+            // InternalEssentialOCL.g:7028:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
             {
-            // InternalEssentialOCL.g:7026:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
-            // InternalEssentialOCL.g:7027:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalEssentialOCL.g:7028:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalEssentialOCL.g:7029:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
             }
-            // InternalEssentialOCL.g:7028:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalEssentialOCL.g:7030:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             loop53:
             do {
                 int alt53=2;
@@ -21111,7 +21111,7 @@
 
                 switch (alt53) {
             	case 1 :
-            	    // InternalEssentialOCL.g:7028:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
+            	    // InternalEssentialOCL.g:7030:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_34);
             	    rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1();
@@ -21152,14 +21152,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2"
-    // InternalEssentialOCL.g:7038:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
+    // InternalEssentialOCL.g:7040:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
     public final void rule__NameExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7042:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
-            // InternalEssentialOCL.g:7043:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
+            // InternalEssentialOCL.g:7044:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
+            // InternalEssentialOCL.g:7045:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__NameExpCS__Group__2__Impl();
@@ -21190,22 +21190,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:7050:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
+    // InternalEssentialOCL.g:7052:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
     public final void rule__NameExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7054:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
-            // InternalEssentialOCL.g:7055:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalEssentialOCL.g:7056:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
+            // InternalEssentialOCL.g:7057:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
             {
-            // InternalEssentialOCL.g:7055:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
-            // InternalEssentialOCL.g:7056:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalEssentialOCL.g:7057:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalEssentialOCL.g:7058:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
             }
-            // InternalEssentialOCL.g:7057:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalEssentialOCL.g:7059:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             int alt54=2;
             int LA54_0 = input.LA(1);
 
@@ -21214,7 +21214,7 @@
             }
             switch (alt54) {
                 case 1 :
-                    // InternalEssentialOCL.g:7057:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
+                    // InternalEssentialOCL.g:7059:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2();
@@ -21252,14 +21252,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3"
-    // InternalEssentialOCL.g:7067:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
+    // InternalEssentialOCL.g:7069:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
     public final void rule__NameExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7071:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
-            // InternalEssentialOCL.g:7072:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
+            // InternalEssentialOCL.g:7073:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
+            // InternalEssentialOCL.g:7074:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__NameExpCS__Group__3__Impl();
@@ -21290,22 +21290,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:7079:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
+    // InternalEssentialOCL.g:7081:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
     public final void rule__NameExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7083:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
-            // InternalEssentialOCL.g:7084:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalEssentialOCL.g:7085:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
+            // InternalEssentialOCL.g:7086:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
             {
-            // InternalEssentialOCL.g:7084:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
-            // InternalEssentialOCL.g:7085:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalEssentialOCL.g:7086:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalEssentialOCL.g:7087:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
             }
-            // InternalEssentialOCL.g:7086:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalEssentialOCL.g:7088:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             int alt55=2;
             int LA55_0 = input.LA(1);
 
@@ -21314,7 +21314,7 @@
             }
             switch (alt55) {
                 case 1 :
-                    // InternalEssentialOCL.g:7086:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
+                    // InternalEssentialOCL.g:7088:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3();
@@ -21352,14 +21352,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4"
-    // InternalEssentialOCL.g:7096:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
+    // InternalEssentialOCL.g:7098:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
     public final void rule__NameExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7100:1: ( rule__NameExpCS__Group__4__Impl )
-            // InternalEssentialOCL.g:7101:2: rule__NameExpCS__Group__4__Impl
+            // InternalEssentialOCL.g:7102:1: ( rule__NameExpCS__Group__4__Impl )
+            // InternalEssentialOCL.g:7103:2: rule__NameExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group__4__Impl();
@@ -21385,22 +21385,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4__Impl"
-    // InternalEssentialOCL.g:7107:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
+    // InternalEssentialOCL.g:7109:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
     public final void rule__NameExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7111:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
-            // InternalEssentialOCL.g:7112:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalEssentialOCL.g:7113:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
+            // InternalEssentialOCL.g:7114:1: ( ( rule__NameExpCS__Group_4__0 )? )
             {
-            // InternalEssentialOCL.g:7112:1: ( ( rule__NameExpCS__Group_4__0 )? )
-            // InternalEssentialOCL.g:7113:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalEssentialOCL.g:7114:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalEssentialOCL.g:7115:1: ( rule__NameExpCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getGroup_4());
             }
-            // InternalEssentialOCL.g:7114:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalEssentialOCL.g:7116:1: ( rule__NameExpCS__Group_4__0 )?
             int alt56=2;
             int LA56_0 = input.LA(1);
 
@@ -21409,7 +21409,7 @@
             }
             switch (alt56) {
                 case 1 :
-                    // InternalEssentialOCL.g:7114:2: rule__NameExpCS__Group_4__0
+                    // InternalEssentialOCL.g:7116:2: rule__NameExpCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__Group_4__0();
@@ -21447,14 +21447,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0"
-    // InternalEssentialOCL.g:7134:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
+    // InternalEssentialOCL.g:7136:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
     public final void rule__NameExpCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7138:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
-            // InternalEssentialOCL.g:7139:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
+            // InternalEssentialOCL.g:7140:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
+            // InternalEssentialOCL.g:7141:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_35);
             rule__NameExpCS__Group_4__0__Impl();
@@ -21485,23 +21485,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0__Impl"
-    // InternalEssentialOCL.g:7146:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
+    // InternalEssentialOCL.g:7148:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
     public final void rule__NameExpCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7150:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
-            // InternalEssentialOCL.g:7151:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalEssentialOCL.g:7152:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
+            // InternalEssentialOCL.g:7153:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
             {
-            // InternalEssentialOCL.g:7151:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
-            // InternalEssentialOCL.g:7152:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalEssentialOCL.g:7153:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalEssentialOCL.g:7154:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
             }
-            // InternalEssentialOCL.g:7153:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
-            // InternalEssentialOCL.g:7153:2: rule__NameExpCS__IsPreAssignment_4_0
+            // InternalEssentialOCL.g:7155:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalEssentialOCL.g:7155:2: rule__NameExpCS__IsPreAssignment_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__IsPreAssignment_4_0();
@@ -21536,14 +21536,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1"
-    // InternalEssentialOCL.g:7163:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
+    // InternalEssentialOCL.g:7165:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
     public final void rule__NameExpCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7167:1: ( rule__NameExpCS__Group_4__1__Impl )
-            // InternalEssentialOCL.g:7168:2: rule__NameExpCS__Group_4__1__Impl
+            // InternalEssentialOCL.g:7169:1: ( rule__NameExpCS__Group_4__1__Impl )
+            // InternalEssentialOCL.g:7170:2: rule__NameExpCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group_4__1__Impl();
@@ -21569,17 +21569,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1__Impl"
-    // InternalEssentialOCL.g:7174:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
+    // InternalEssentialOCL.g:7176:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
     public final void rule__NameExpCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7178:1: ( ( 'pre' ) )
-            // InternalEssentialOCL.g:7179:1: ( 'pre' )
+            // InternalEssentialOCL.g:7180:1: ( ( 'pre' ) )
+            // InternalEssentialOCL.g:7181:1: ( 'pre' )
             {
-            // InternalEssentialOCL.g:7179:1: ( 'pre' )
-            // InternalEssentialOCL.g:7180:1: 'pre'
+            // InternalEssentialOCL.g:7181:1: ( 'pre' )
+            // InternalEssentialOCL.g:7182:1: 'pre'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
@@ -21610,14 +21610,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0"
-    // InternalEssentialOCL.g:7197:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
+    // InternalEssentialOCL.g:7199:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
     public final void rule__CurlyBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7201:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
-            // InternalEssentialOCL.g:7202:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
+            // InternalEssentialOCL.g:7203:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
+            // InternalEssentialOCL.g:7204:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__CurlyBracketedClauseCS__Group__0__Impl();
@@ -21648,23 +21648,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0__Impl"
-    // InternalEssentialOCL.g:7209:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:7211:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__CurlyBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7213:1: ( ( () ) )
-            // InternalEssentialOCL.g:7214:1: ( () )
+            // InternalEssentialOCL.g:7215:1: ( ( () ) )
+            // InternalEssentialOCL.g:7216:1: ( () )
             {
-            // InternalEssentialOCL.g:7214:1: ( () )
-            // InternalEssentialOCL.g:7215:1: ()
+            // InternalEssentialOCL.g:7216:1: ( () )
+            // InternalEssentialOCL.g:7217:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
             }
-            // InternalEssentialOCL.g:7216:1: ()
-            // InternalEssentialOCL.g:7218:1:
+            // InternalEssentialOCL.g:7218:1: ()
+            // InternalEssentialOCL.g:7220:1:
             {
             }
 
@@ -21689,14 +21689,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1"
-    // InternalEssentialOCL.g:7228:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
+    // InternalEssentialOCL.g:7230:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
     public final void rule__CurlyBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7232:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
-            // InternalEssentialOCL.g:7233:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
+            // InternalEssentialOCL.g:7234:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
+            // InternalEssentialOCL.g:7235:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__CurlyBracketedClauseCS__Group__1__Impl();
@@ -21727,17 +21727,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1__Impl"
-    // InternalEssentialOCL.g:7240:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
+    // InternalEssentialOCL.g:7242:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7244:1: ( ( '{' ) )
-            // InternalEssentialOCL.g:7245:1: ( '{' )
+            // InternalEssentialOCL.g:7246:1: ( ( '{' ) )
+            // InternalEssentialOCL.g:7247:1: ( '{' )
             {
-            // InternalEssentialOCL.g:7245:1: ( '{' )
-            // InternalEssentialOCL.g:7246:1: '{'
+            // InternalEssentialOCL.g:7247:1: ( '{' )
+            // InternalEssentialOCL.g:7248:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
@@ -21768,14 +21768,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2"
-    // InternalEssentialOCL.g:7259:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
+    // InternalEssentialOCL.g:7261:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
     public final void rule__CurlyBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7263:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
-            // InternalEssentialOCL.g:7264:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
+            // InternalEssentialOCL.g:7265:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
+            // InternalEssentialOCL.g:7266:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__CurlyBracketedClauseCS__Group__2__Impl();
@@ -21806,22 +21806,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2__Impl"
-    // InternalEssentialOCL.g:7271:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:7273:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__CurlyBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7275:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:7276:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:7277:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:7278:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:7276:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:7277:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalEssentialOCL.g:7278:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:7279:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:7278:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalEssentialOCL.g:7280:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             int alt57=2;
             int LA57_0 = input.LA(1);
 
@@ -21830,7 +21830,7 @@
             }
             switch (alt57) {
                 case 1 :
-                    // InternalEssentialOCL.g:7278:2: rule__CurlyBracketedClauseCS__Group_2__0
+                    // InternalEssentialOCL.g:7280:2: rule__CurlyBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CurlyBracketedClauseCS__Group_2__0();
@@ -21868,14 +21868,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3"
-    // InternalEssentialOCL.g:7288:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:7290:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7292:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
-            // InternalEssentialOCL.g:7293:2: rule__CurlyBracketedClauseCS__Group__3__Impl
+            // InternalEssentialOCL.g:7294:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
+            // InternalEssentialOCL.g:7295:2: rule__CurlyBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group__3__Impl();
@@ -21901,17 +21901,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3__Impl"
-    // InternalEssentialOCL.g:7299:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
+    // InternalEssentialOCL.g:7301:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7303:1: ( ( '}' ) )
-            // InternalEssentialOCL.g:7304:1: ( '}' )
+            // InternalEssentialOCL.g:7305:1: ( ( '}' ) )
+            // InternalEssentialOCL.g:7306:1: ( '}' )
             {
-            // InternalEssentialOCL.g:7304:1: ( '}' )
-            // InternalEssentialOCL.g:7305:1: '}'
+            // InternalEssentialOCL.g:7306:1: ( '}' )
+            // InternalEssentialOCL.g:7307:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
@@ -21942,14 +21942,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0"
-    // InternalEssentialOCL.g:7326:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
+    // InternalEssentialOCL.g:7328:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7330:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
-            // InternalEssentialOCL.g:7331:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
+            // InternalEssentialOCL.g:7332:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
+            // InternalEssentialOCL.g:7333:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__CurlyBracketedClauseCS__Group_2__0__Impl();
@@ -21980,23 +21980,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:7338:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalEssentialOCL.g:7340:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7342:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalEssentialOCL.g:7343:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:7344:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalEssentialOCL.g:7345:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalEssentialOCL.g:7343:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
-            // InternalEssentialOCL.g:7344:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:7345:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:7346:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalEssentialOCL.g:7345:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
-            // InternalEssentialOCL.g:7345:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
+            // InternalEssentialOCL.g:7347:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalEssentialOCL.g:7347:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0();
@@ -22031,14 +22031,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1"
-    // InternalEssentialOCL.g:7355:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:7357:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7359:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:7360:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:7361:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:7362:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2__1__Impl();
@@ -22064,22 +22064,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:7366:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
+    // InternalEssentialOCL.g:7368:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7370:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
-            // InternalEssentialOCL.g:7371:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:7372:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
+            // InternalEssentialOCL.g:7373:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
             {
-            // InternalEssentialOCL.g:7371:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
-            // InternalEssentialOCL.g:7372:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:7373:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalEssentialOCL.g:7374:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_1());
             }
-            // InternalEssentialOCL.g:7373:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalEssentialOCL.g:7375:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             loop58:
             do {
                 int alt58=2;
@@ -22092,7 +22092,7 @@
 
                 switch (alt58) {
             	case 1 :
-            	    // InternalEssentialOCL.g:7373:2: rule__CurlyBracketedClauseCS__Group_2_1__0
+            	    // InternalEssentialOCL.g:7375:2: rule__CurlyBracketedClauseCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__CurlyBracketedClauseCS__Group_2_1__0();
@@ -22133,14 +22133,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0"
-    // InternalEssentialOCL.g:7387:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
+    // InternalEssentialOCL.g:7389:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7391:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
-            // InternalEssentialOCL.g:7392:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
+            // InternalEssentialOCL.g:7393:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
+            // InternalEssentialOCL.g:7394:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__CurlyBracketedClauseCS__Group_2_1__0__Impl();
@@ -22171,17 +22171,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0__Impl"
-    // InternalEssentialOCL.g:7399:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:7401:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7403:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:7404:1: ( ',' )
+            // InternalEssentialOCL.g:7405:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:7406:1: ( ',' )
             {
-            // InternalEssentialOCL.g:7404:1: ( ',' )
-            // InternalEssentialOCL.g:7405:1: ','
+            // InternalEssentialOCL.g:7406:1: ( ',' )
+            // InternalEssentialOCL.g:7407:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
@@ -22212,14 +22212,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1"
-    // InternalEssentialOCL.g:7418:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
+    // InternalEssentialOCL.g:7420:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7422:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
-            // InternalEssentialOCL.g:7423:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
+            // InternalEssentialOCL.g:7424:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
+            // InternalEssentialOCL.g:7425:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2_1__1__Impl();
@@ -22245,23 +22245,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1__Impl"
-    // InternalEssentialOCL.g:7429:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:7431:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7433:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalEssentialOCL.g:7434:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:7435:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalEssentialOCL.g:7436:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:7434:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalEssentialOCL.g:7435:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:7436:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:7437:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalEssentialOCL.g:7436:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
-            // InternalEssentialOCL.g:7436:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
+            // InternalEssentialOCL.g:7438:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalEssentialOCL.g:7438:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1();
@@ -22296,14 +22296,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0"
-    // InternalEssentialOCL.g:7450:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
+    // InternalEssentialOCL.g:7452:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
     public final void rule__RoundBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7454:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
-            // InternalEssentialOCL.g:7455:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
+            // InternalEssentialOCL.g:7456:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
+            // InternalEssentialOCL.g:7457:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_5);
             rule__RoundBracketedClauseCS__Group__0__Impl();
@@ -22334,23 +22334,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0__Impl"
-    // InternalEssentialOCL.g:7462:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:7464:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__RoundBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7466:1: ( ( () ) )
-            // InternalEssentialOCL.g:7467:1: ( () )
+            // InternalEssentialOCL.g:7468:1: ( ( () ) )
+            // InternalEssentialOCL.g:7469:1: ( () )
             {
-            // InternalEssentialOCL.g:7467:1: ( () )
-            // InternalEssentialOCL.g:7468:1: ()
+            // InternalEssentialOCL.g:7469:1: ( () )
+            // InternalEssentialOCL.g:7470:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
             }
-            // InternalEssentialOCL.g:7469:1: ()
-            // InternalEssentialOCL.g:7471:1:
+            // InternalEssentialOCL.g:7471:1: ()
+            // InternalEssentialOCL.g:7473:1:
             {
             }
 
@@ -22375,14 +22375,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1"
-    // InternalEssentialOCL.g:7481:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
+    // InternalEssentialOCL.g:7483:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
     public final void rule__RoundBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7485:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
-            // InternalEssentialOCL.g:7486:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
+            // InternalEssentialOCL.g:7487:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
+            // InternalEssentialOCL.g:7488:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_38);
             rule__RoundBracketedClauseCS__Group__1__Impl();
@@ -22413,17 +22413,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1__Impl"
-    // InternalEssentialOCL.g:7493:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
+    // InternalEssentialOCL.g:7495:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
     public final void rule__RoundBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7497:1: ( ( '(' ) )
-            // InternalEssentialOCL.g:7498:1: ( '(' )
+            // InternalEssentialOCL.g:7499:1: ( ( '(' ) )
+            // InternalEssentialOCL.g:7500:1: ( '(' )
             {
-            // InternalEssentialOCL.g:7498:1: ( '(' )
-            // InternalEssentialOCL.g:7499:1: '('
+            // InternalEssentialOCL.g:7500:1: ( '(' )
+            // InternalEssentialOCL.g:7501:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
@@ -22454,14 +22454,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2"
-    // InternalEssentialOCL.g:7512:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
+    // InternalEssentialOCL.g:7514:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
     public final void rule__RoundBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7516:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
-            // InternalEssentialOCL.g:7517:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
+            // InternalEssentialOCL.g:7518:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
+            // InternalEssentialOCL.g:7519:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_38);
             rule__RoundBracketedClauseCS__Group__2__Impl();
@@ -22492,22 +22492,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2__Impl"
-    // InternalEssentialOCL.g:7524:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:7526:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__RoundBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7528:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:7529:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:7530:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:7531:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:7529:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:7530:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalEssentialOCL.g:7531:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:7532:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:7531:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalEssentialOCL.g:7533:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             int alt59=2;
             int LA59_0 = input.LA(1);
 
@@ -22516,7 +22516,7 @@
             }
             switch (alt59) {
                 case 1 :
-                    // InternalEssentialOCL.g:7531:2: rule__RoundBracketedClauseCS__Group_2__0
+                    // InternalEssentialOCL.g:7533:2: rule__RoundBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__RoundBracketedClauseCS__Group_2__0();
@@ -22554,14 +22554,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3"
-    // InternalEssentialOCL.g:7541:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:7543:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
     public final void rule__RoundBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7545:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
-            // InternalEssentialOCL.g:7546:2: rule__RoundBracketedClauseCS__Group__3__Impl
+            // InternalEssentialOCL.g:7547:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
+            // InternalEssentialOCL.g:7548:2: rule__RoundBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group__3__Impl();
@@ -22587,17 +22587,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3__Impl"
-    // InternalEssentialOCL.g:7552:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
+    // InternalEssentialOCL.g:7554:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
     public final void rule__RoundBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7556:1: ( ( ')' ) )
-            // InternalEssentialOCL.g:7557:1: ( ')' )
+            // InternalEssentialOCL.g:7558:1: ( ( ')' ) )
+            // InternalEssentialOCL.g:7559:1: ( ')' )
             {
-            // InternalEssentialOCL.g:7557:1: ( ')' )
-            // InternalEssentialOCL.g:7558:1: ')'
+            // InternalEssentialOCL.g:7559:1: ( ')' )
+            // InternalEssentialOCL.g:7560:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
@@ -22628,14 +22628,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0"
-    // InternalEssentialOCL.g:7579:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
+    // InternalEssentialOCL.g:7581:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
     public final void rule__RoundBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7583:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
-            // InternalEssentialOCL.g:7584:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
+            // InternalEssentialOCL.g:7585:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
+            // InternalEssentialOCL.g:7586:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__RoundBracketedClauseCS__Group_2__0__Impl();
@@ -22666,23 +22666,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:7591:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
+    // InternalEssentialOCL.g:7593:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7595:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
-            // InternalEssentialOCL.g:7596:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:7597:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
+            // InternalEssentialOCL.g:7598:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
             {
-            // InternalEssentialOCL.g:7596:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
-            // InternalEssentialOCL.g:7597:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalEssentialOCL.g:7598:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalEssentialOCL.g:7599:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
             }
-            // InternalEssentialOCL.g:7598:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
-            // InternalEssentialOCL.g:7598:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
+            // InternalEssentialOCL.g:7600:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalEssentialOCL.g:7600:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0();
@@ -22717,14 +22717,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1"
-    // InternalEssentialOCL.g:7608:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:7610:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__RoundBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7612:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:7613:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:7614:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:7615:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group_2__1__Impl();
@@ -22750,22 +22750,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:7619:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
+    // InternalEssentialOCL.g:7621:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7623:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
-            // InternalEssentialOCL.g:7624:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalEssentialOCL.g:7625:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
+            // InternalEssentialOCL.g:7626:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
             {
-            // InternalEssentialOCL.g:7624:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
-            // InternalEssentialOCL.g:7625:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalEssentialOCL.g:7626:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalEssentialOCL.g:7627:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
             }
-            // InternalEssentialOCL.g:7626:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalEssentialOCL.g:7628:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             loop60:
             do {
                 int alt60=2;
@@ -22778,7 +22778,7 @@
 
                 switch (alt60) {
             	case 1 :
-            	    // InternalEssentialOCL.g:7626:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
+            	    // InternalEssentialOCL.g:7628:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_40);
             	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1();
@@ -22819,14 +22819,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0"
-    // InternalEssentialOCL.g:7640:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
+    // InternalEssentialOCL.g:7642:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
     public final void rule__SquareBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7644:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
-            // InternalEssentialOCL.g:7645:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
+            // InternalEssentialOCL.g:7646:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
+            // InternalEssentialOCL.g:7647:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__SquareBracketedClauseCS__Group__0__Impl();
@@ -22857,17 +22857,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0__Impl"
-    // InternalEssentialOCL.g:7652:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
+    // InternalEssentialOCL.g:7654:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
     public final void rule__SquareBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7656:1: ( ( '[' ) )
-            // InternalEssentialOCL.g:7657:1: ( '[' )
+            // InternalEssentialOCL.g:7658:1: ( ( '[' ) )
+            // InternalEssentialOCL.g:7659:1: ( '[' )
             {
-            // InternalEssentialOCL.g:7657:1: ( '[' )
-            // InternalEssentialOCL.g:7658:1: '['
+            // InternalEssentialOCL.g:7659:1: ( '[' )
+            // InternalEssentialOCL.g:7660:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
@@ -22898,14 +22898,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1"
-    // InternalEssentialOCL.g:7671:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
+    // InternalEssentialOCL.g:7673:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
     public final void rule__SquareBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7675:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
-            // InternalEssentialOCL.g:7676:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
+            // InternalEssentialOCL.g:7677:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
+            // InternalEssentialOCL.g:7678:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__SquareBracketedClauseCS__Group__1__Impl();
@@ -22936,23 +22936,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1__Impl"
-    // InternalEssentialOCL.g:7683:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:7685:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7687:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
-            // InternalEssentialOCL.g:7688:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalEssentialOCL.g:7689:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
+            // InternalEssentialOCL.g:7690:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:7688:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
-            // InternalEssentialOCL.g:7689:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalEssentialOCL.g:7690:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalEssentialOCL.g:7691:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
             }
-            // InternalEssentialOCL.g:7690:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
-            // InternalEssentialOCL.g:7690:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
+            // InternalEssentialOCL.g:7692:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalEssentialOCL.g:7692:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_1();
@@ -22987,14 +22987,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2"
-    // InternalEssentialOCL.g:7700:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
+    // InternalEssentialOCL.g:7702:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
     public final void rule__SquareBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7704:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
-            // InternalEssentialOCL.g:7705:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
+            // InternalEssentialOCL.g:7706:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
+            // InternalEssentialOCL.g:7707:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__SquareBracketedClauseCS__Group__2__Impl();
@@ -23025,22 +23025,22 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2__Impl"
-    // InternalEssentialOCL.g:7712:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
+    // InternalEssentialOCL.g:7714:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
     public final void rule__SquareBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7716:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
-            // InternalEssentialOCL.g:7717:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalEssentialOCL.g:7718:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
+            // InternalEssentialOCL.g:7719:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
             {
-            // InternalEssentialOCL.g:7717:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
-            // InternalEssentialOCL.g:7718:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalEssentialOCL.g:7719:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalEssentialOCL.g:7720:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:7719:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalEssentialOCL.g:7721:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             loop61:
             do {
                 int alt61=2;
@@ -23053,7 +23053,7 @@
 
                 switch (alt61) {
             	case 1 :
-            	    // InternalEssentialOCL.g:7719:2: rule__SquareBracketedClauseCS__Group_2__0
+            	    // InternalEssentialOCL.g:7721:2: rule__SquareBracketedClauseCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__SquareBracketedClauseCS__Group_2__0();
@@ -23094,14 +23094,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3"
-    // InternalEssentialOCL.g:7729:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:7731:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
     public final void rule__SquareBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7733:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
-            // InternalEssentialOCL.g:7734:2: rule__SquareBracketedClauseCS__Group__3__Impl
+            // InternalEssentialOCL.g:7735:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
+            // InternalEssentialOCL.g:7736:2: rule__SquareBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group__3__Impl();
@@ -23127,17 +23127,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3__Impl"
-    // InternalEssentialOCL.g:7740:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
+    // InternalEssentialOCL.g:7742:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
     public final void rule__SquareBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7744:1: ( ( ']' ) )
-            // InternalEssentialOCL.g:7745:1: ( ']' )
+            // InternalEssentialOCL.g:7746:1: ( ( ']' ) )
+            // InternalEssentialOCL.g:7747:1: ( ']' )
             {
-            // InternalEssentialOCL.g:7745:1: ( ']' )
-            // InternalEssentialOCL.g:7746:1: ']'
+            // InternalEssentialOCL.g:7747:1: ( ']' )
+            // InternalEssentialOCL.g:7748:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
@@ -23168,14 +23168,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0"
-    // InternalEssentialOCL.g:7767:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
+    // InternalEssentialOCL.g:7769:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
     public final void rule__SquareBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7771:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
-            // InternalEssentialOCL.g:7772:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
+            // InternalEssentialOCL.g:7773:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
+            // InternalEssentialOCL.g:7774:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__SquareBracketedClauseCS__Group_2__0__Impl();
@@ -23206,17 +23206,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:7779:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:7781:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7783:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:7784:1: ( ',' )
+            // InternalEssentialOCL.g:7785:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:7786:1: ( ',' )
             {
-            // InternalEssentialOCL.g:7784:1: ( ',' )
-            // InternalEssentialOCL.g:7785:1: ','
+            // InternalEssentialOCL.g:7786:1: ( ',' )
+            // InternalEssentialOCL.g:7787:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
@@ -23247,14 +23247,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1"
-    // InternalEssentialOCL.g:7798:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:7800:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__SquareBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7802:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:7803:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:7804:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:7805:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group_2__1__Impl();
@@ -23280,23 +23280,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:7809:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
+    // InternalEssentialOCL.g:7811:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7813:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
-            // InternalEssentialOCL.g:7814:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalEssentialOCL.g:7815:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:7816:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
             {
-            // InternalEssentialOCL.g:7814:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
-            // InternalEssentialOCL.g:7815:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalEssentialOCL.g:7816:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalEssentialOCL.g:7817:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
             }
-            // InternalEssentialOCL.g:7816:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
-            // InternalEssentialOCL.g:7816:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
+            // InternalEssentialOCL.g:7818:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalEssentialOCL.g:7818:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1();
@@ -23331,14 +23331,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0"
-    // InternalEssentialOCL.g:7830:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
+    // InternalEssentialOCL.g:7832:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
     public final void rule__NavigatingArgCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7834:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
-            // InternalEssentialOCL.g:7835:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
+            // InternalEssentialOCL.g:7836:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
+            // InternalEssentialOCL.g:7837:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__NavigatingArgCS__Group_0__0__Impl();
@@ -23369,23 +23369,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0__Impl"
-    // InternalEssentialOCL.g:7842:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
+    // InternalEssentialOCL.g:7844:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
     public final void rule__NavigatingArgCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7846:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
-            // InternalEssentialOCL.g:7847:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalEssentialOCL.g:7848:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
+            // InternalEssentialOCL.g:7849:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
             {
-            // InternalEssentialOCL.g:7847:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
-            // InternalEssentialOCL.g:7848:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalEssentialOCL.g:7849:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalEssentialOCL.g:7850:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
             }
-            // InternalEssentialOCL.g:7849:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
-            // InternalEssentialOCL.g:7849:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
+            // InternalEssentialOCL.g:7851:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalEssentialOCL.g:7851:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0();
@@ -23420,14 +23420,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1"
-    // InternalEssentialOCL.g:7859:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
+    // InternalEssentialOCL.g:7861:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7863:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
-            // InternalEssentialOCL.g:7864:2: rule__NavigatingArgCS__Group_0__1__Impl
+            // InternalEssentialOCL.g:7865:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
+            // InternalEssentialOCL.g:7866:2: rule__NavigatingArgCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0__1__Impl();
@@ -23453,22 +23453,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1__Impl"
-    // InternalEssentialOCL.g:7870:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
+    // InternalEssentialOCL.g:7872:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
     public final void rule__NavigatingArgCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7874:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
-            // InternalEssentialOCL.g:7875:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalEssentialOCL.g:7876:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
+            // InternalEssentialOCL.g:7877:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
             {
-            // InternalEssentialOCL.g:7875:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
-            // InternalEssentialOCL.g:7876:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalEssentialOCL.g:7877:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalEssentialOCL.g:7878:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
             }
-            // InternalEssentialOCL.g:7877:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalEssentialOCL.g:7879:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             int alt62=2;
             int LA62_0 = input.LA(1);
 
@@ -23477,7 +23477,7 @@
             }
             switch (alt62) {
                 case 1 :
-                    // InternalEssentialOCL.g:7877:2: rule__NavigatingArgCS__Alternatives_0_1
+                    // InternalEssentialOCL.g:7879:2: rule__NavigatingArgCS__Alternatives_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Alternatives_0_1();
@@ -23515,14 +23515,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0"
-    // InternalEssentialOCL.g:7891:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
+    // InternalEssentialOCL.g:7893:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7895:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
-            // InternalEssentialOCL.g:7896:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
+            // InternalEssentialOCL.g:7897:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
+            // InternalEssentialOCL.g:7898:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__NavigatingArgCS__Group_0_1_0__0__Impl();
@@ -23553,17 +23553,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0__Impl"
-    // InternalEssentialOCL.g:7903:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:7905:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7907:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:7908:1: ( '<-' )
+            // InternalEssentialOCL.g:7909:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:7910:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:7908:1: ( '<-' )
-            // InternalEssentialOCL.g:7909:1: '<-'
+            // InternalEssentialOCL.g:7910:1: ( '<-' )
+            // InternalEssentialOCL.g:7911:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
@@ -23594,14 +23594,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1"
-    // InternalEssentialOCL.g:7922:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
+    // InternalEssentialOCL.g:7924:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7926:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
-            // InternalEssentialOCL.g:7927:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
+            // InternalEssentialOCL.g:7928:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
+            // InternalEssentialOCL.g:7929:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
             {
             pushFollow(FollowSets000.FOLLOW_20);
             rule__NavigatingArgCS__Group_0_1_0__1__Impl();
@@ -23632,23 +23632,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1__Impl"
-    // InternalEssentialOCL.g:7934:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
+    // InternalEssentialOCL.g:7936:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7938:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
-            // InternalEssentialOCL.g:7939:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalEssentialOCL.g:7940:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
+            // InternalEssentialOCL.g:7941:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
             {
-            // InternalEssentialOCL.g:7939:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
-            // InternalEssentialOCL.g:7940:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalEssentialOCL.g:7941:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalEssentialOCL.g:7942:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_0_1());
             }
-            // InternalEssentialOCL.g:7941:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
-            // InternalEssentialOCL.g:7941:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
+            // InternalEssentialOCL.g:7943:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalEssentialOCL.g:7943:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1();
@@ -23683,14 +23683,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2"
-    // InternalEssentialOCL.g:7951:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
+    // InternalEssentialOCL.g:7953:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7955:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
-            // InternalEssentialOCL.g:7956:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
+            // InternalEssentialOCL.g:7957:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
+            // InternalEssentialOCL.g:7958:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0__2__Impl();
@@ -23716,22 +23716,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2__Impl"
-    // InternalEssentialOCL.g:7962:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
+    // InternalEssentialOCL.g:7964:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7966:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
-            // InternalEssentialOCL.g:7967:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalEssentialOCL.g:7968:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
+            // InternalEssentialOCL.g:7969:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
             {
-            // InternalEssentialOCL.g:7967:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
-            // InternalEssentialOCL.g:7968:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalEssentialOCL.g:7969:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalEssentialOCL.g:7970:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
             }
-            // InternalEssentialOCL.g:7969:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalEssentialOCL.g:7971:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             int alt63=2;
             int LA63_0 = input.LA(1);
 
@@ -23740,7 +23740,7 @@
             }
             switch (alt63) {
                 case 1 :
-                    // InternalEssentialOCL.g:7969:2: rule__NavigatingArgCS__Group_0_1_0_2__0
+                    // InternalEssentialOCL.g:7971:2: rule__NavigatingArgCS__Group_0_1_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0_2__0();
@@ -23778,14 +23778,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0"
-    // InternalEssentialOCL.g:7985:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
+    // InternalEssentialOCL.g:7987:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:7989:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
-            // InternalEssentialOCL.g:7990:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
+            // InternalEssentialOCL.g:7991:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
+            // InternalEssentialOCL.g:7992:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingArgCS__Group_0_1_0_2__0__Impl();
@@ -23816,17 +23816,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0__Impl"
-    // InternalEssentialOCL.g:7997:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:7999:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8001:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:8002:1: ( '=' )
+            // InternalEssentialOCL.g:8003:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:8004:1: ( '=' )
             {
-            // InternalEssentialOCL.g:8002:1: ( '=' )
-            // InternalEssentialOCL.g:8003:1: '='
+            // InternalEssentialOCL.g:8004:1: ( '=' )
+            // InternalEssentialOCL.g:8005:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
@@ -23857,14 +23857,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1"
-    // InternalEssentialOCL.g:8016:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
+    // InternalEssentialOCL.g:8018:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8020:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
-            // InternalEssentialOCL.g:8021:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
+            // InternalEssentialOCL.g:8022:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
+            // InternalEssentialOCL.g:8023:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0_2__1__Impl();
@@ -23890,23 +23890,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1__Impl"
-    // InternalEssentialOCL.g:8027:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
+    // InternalEssentialOCL.g:8029:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8031:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
-            // InternalEssentialOCL.g:8032:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalEssentialOCL.g:8033:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
+            // InternalEssentialOCL.g:8034:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
             {
-            // InternalEssentialOCL.g:8032:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
-            // InternalEssentialOCL.g:8033:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalEssentialOCL.g:8034:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalEssentialOCL.g:8035:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
             }
-            // InternalEssentialOCL.g:8034:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
-            // InternalEssentialOCL.g:8034:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
+            // InternalEssentialOCL.g:8036:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalEssentialOCL.g:8036:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1();
@@ -23941,14 +23941,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0"
-    // InternalEssentialOCL.g:8048:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
+    // InternalEssentialOCL.g:8050:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8052:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
-            // InternalEssentialOCL.g:8053:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
+            // InternalEssentialOCL.g:8054:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
+            // InternalEssentialOCL.g:8055:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingArgCS__Group_0_1_1__0__Impl();
@@ -23979,17 +23979,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0__Impl"
-    // InternalEssentialOCL.g:8060:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:8062:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8064:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:8065:1: ( ':' )
+            // InternalEssentialOCL.g:8066:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:8067:1: ( ':' )
             {
-            // InternalEssentialOCL.g:8065:1: ( ':' )
-            // InternalEssentialOCL.g:8066:1: ':'
+            // InternalEssentialOCL.g:8067:1: ( ':' )
+            // InternalEssentialOCL.g:8068:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
@@ -24020,14 +24020,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1"
-    // InternalEssentialOCL.g:8079:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
+    // InternalEssentialOCL.g:8081:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8083:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
-            // InternalEssentialOCL.g:8084:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
+            // InternalEssentialOCL.g:8085:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
+            // InternalEssentialOCL.g:8086:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingArgCS__Group_0_1_1__1__Impl();
@@ -24058,23 +24058,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1__Impl"
-    // InternalEssentialOCL.g:8091:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
+    // InternalEssentialOCL.g:8093:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8095:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
-            // InternalEssentialOCL.g:8096:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalEssentialOCL.g:8097:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
+            // InternalEssentialOCL.g:8098:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
             {
-            // InternalEssentialOCL.g:8096:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
-            // InternalEssentialOCL.g:8097:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalEssentialOCL.g:8098:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalEssentialOCL.g:8099:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_1_1());
             }
-            // InternalEssentialOCL.g:8098:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
-            // InternalEssentialOCL.g:8098:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
+            // InternalEssentialOCL.g:8100:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalEssentialOCL.g:8100:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1();
@@ -24109,14 +24109,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2"
-    // InternalEssentialOCL.g:8108:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
+    // InternalEssentialOCL.g:8110:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8112:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
-            // InternalEssentialOCL.g:8113:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
+            // InternalEssentialOCL.g:8114:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
+            // InternalEssentialOCL.g:8115:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingArgCS__Group_0_1_1__2__Impl();
@@ -24147,22 +24147,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2__Impl"
-    // InternalEssentialOCL.g:8120:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
+    // InternalEssentialOCL.g:8122:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8124:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
-            // InternalEssentialOCL.g:8125:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalEssentialOCL.g:8126:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
+            // InternalEssentialOCL.g:8127:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
             {
-            // InternalEssentialOCL.g:8125:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
-            // InternalEssentialOCL.g:8126:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalEssentialOCL.g:8127:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalEssentialOCL.g:8128:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_2());
             }
-            // InternalEssentialOCL.g:8127:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalEssentialOCL.g:8129:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             int alt64=2;
             int LA64_0 = input.LA(1);
 
@@ -24171,7 +24171,7 @@
             }
             switch (alt64) {
                 case 1 :
-                    // InternalEssentialOCL.g:8127:2: rule__NavigatingArgCS__Group_0_1_1_2__0
+                    // InternalEssentialOCL.g:8129:2: rule__NavigatingArgCS__Group_0_1_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_2__0();
@@ -24209,14 +24209,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3"
-    // InternalEssentialOCL.g:8137:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
+    // InternalEssentialOCL.g:8139:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8141:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
-            // InternalEssentialOCL.g:8142:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
+            // InternalEssentialOCL.g:8143:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
+            // InternalEssentialOCL.g:8144:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1__3__Impl();
@@ -24242,22 +24242,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3__Impl"
-    // InternalEssentialOCL.g:8148:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
+    // InternalEssentialOCL.g:8150:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8152:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
-            // InternalEssentialOCL.g:8153:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalEssentialOCL.g:8154:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
+            // InternalEssentialOCL.g:8155:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
             {
-            // InternalEssentialOCL.g:8153:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
-            // InternalEssentialOCL.g:8154:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalEssentialOCL.g:8155:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalEssentialOCL.g:8156:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_3());
             }
-            // InternalEssentialOCL.g:8155:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalEssentialOCL.g:8157:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             int alt65=2;
             int LA65_0 = input.LA(1);
 
@@ -24266,7 +24266,7 @@
             }
             switch (alt65) {
                 case 1 :
-                    // InternalEssentialOCL.g:8155:2: rule__NavigatingArgCS__Group_0_1_1_3__0
+                    // InternalEssentialOCL.g:8157:2: rule__NavigatingArgCS__Group_0_1_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_3__0();
@@ -24304,14 +24304,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0"
-    // InternalEssentialOCL.g:8173:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
+    // InternalEssentialOCL.g:8175:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8177:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
-            // InternalEssentialOCL.g:8178:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
+            // InternalEssentialOCL.g:8179:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
+            // InternalEssentialOCL.g:8180:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__NavigatingArgCS__Group_0_1_1_2__0__Impl();
@@ -24342,17 +24342,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0__Impl"
-    // InternalEssentialOCL.g:8185:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:8187:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8189:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:8190:1: ( '<-' )
+            // InternalEssentialOCL.g:8191:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:8192:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:8190:1: ( '<-' )
-            // InternalEssentialOCL.g:8191:1: '<-'
+            // InternalEssentialOCL.g:8192:1: ( '<-' )
+            // InternalEssentialOCL.g:8193:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
@@ -24383,14 +24383,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1"
-    // InternalEssentialOCL.g:8204:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
+    // InternalEssentialOCL.g:8206:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8208:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
-            // InternalEssentialOCL.g:8209:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
+            // InternalEssentialOCL.g:8210:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
+            // InternalEssentialOCL.g:8211:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_2__1__Impl();
@@ -24416,23 +24416,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1__Impl"
-    // InternalEssentialOCL.g:8215:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
+    // InternalEssentialOCL.g:8217:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8219:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
-            // InternalEssentialOCL.g:8220:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalEssentialOCL.g:8221:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
+            // InternalEssentialOCL.g:8222:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
             {
-            // InternalEssentialOCL.g:8220:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
-            // InternalEssentialOCL.g:8221:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalEssentialOCL.g:8222:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalEssentialOCL.g:8223:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_1_2_1());
             }
-            // InternalEssentialOCL.g:8222:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
-            // InternalEssentialOCL.g:8222:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
+            // InternalEssentialOCL.g:8224:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalEssentialOCL.g:8224:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1();
@@ -24467,14 +24467,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0"
-    // InternalEssentialOCL.g:8236:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
+    // InternalEssentialOCL.g:8238:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8240:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
-            // InternalEssentialOCL.g:8241:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
+            // InternalEssentialOCL.g:8242:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
+            // InternalEssentialOCL.g:8243:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingArgCS__Group_0_1_1_3__0__Impl();
@@ -24505,17 +24505,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0__Impl"
-    // InternalEssentialOCL.g:8248:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:8250:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8252:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:8253:1: ( '=' )
+            // InternalEssentialOCL.g:8254:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:8255:1: ( '=' )
             {
-            // InternalEssentialOCL.g:8253:1: ( '=' )
-            // InternalEssentialOCL.g:8254:1: '='
+            // InternalEssentialOCL.g:8255:1: ( '=' )
+            // InternalEssentialOCL.g:8256:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());
@@ -24546,14 +24546,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1"
-    // InternalEssentialOCL.g:8267:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
+    // InternalEssentialOCL.g:8269:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8271:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
-            // InternalEssentialOCL.g:8272:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
+            // InternalEssentialOCL.g:8273:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
+            // InternalEssentialOCL.g:8274:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_3__1__Impl();
@@ -24579,23 +24579,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1__Impl"
-    // InternalEssentialOCL.g:8278:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
+    // InternalEssentialOCL.g:8280:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8282:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
-            // InternalEssentialOCL.g:8283:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalEssentialOCL.g:8284:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
+            // InternalEssentialOCL.g:8285:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
             {
-            // InternalEssentialOCL.g:8283:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
-            // InternalEssentialOCL.g:8284:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalEssentialOCL.g:8285:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalEssentialOCL.g:8286:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_3_1());
             }
-            // InternalEssentialOCL.g:8285:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
-            // InternalEssentialOCL.g:8285:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
+            // InternalEssentialOCL.g:8287:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalEssentialOCL.g:8287:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1();
@@ -24630,14 +24630,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0"
-    // InternalEssentialOCL.g:8299:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
+    // InternalEssentialOCL.g:8301:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8303:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
-            // InternalEssentialOCL.g:8304:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
+            // InternalEssentialOCL.g:8305:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
+            // InternalEssentialOCL.g:8306:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__NavigatingArgCS__Group_0_1_2__0__Impl();
@@ -24668,22 +24668,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0__Impl"
-    // InternalEssentialOCL.g:8311:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
+    // InternalEssentialOCL.g:8313:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8315:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
-            // InternalEssentialOCL.g:8316:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalEssentialOCL.g:8317:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
+            // InternalEssentialOCL.g:8318:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
             {
-            // InternalEssentialOCL.g:8316:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
-            // InternalEssentialOCL.g:8317:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalEssentialOCL.g:8318:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalEssentialOCL.g:8319:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_0());
             }
-            // InternalEssentialOCL.g:8318:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalEssentialOCL.g:8320:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             int alt66=2;
             int LA66_0 = input.LA(1);
 
@@ -24692,7 +24692,7 @@
             }
             switch (alt66) {
                 case 1 :
-                    // InternalEssentialOCL.g:8318:2: rule__NavigatingArgCS__Group_0_1_2_0__0
+                    // InternalEssentialOCL.g:8320:2: rule__NavigatingArgCS__Group_0_1_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_0__0();
@@ -24730,14 +24730,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1"
-    // InternalEssentialOCL.g:8328:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
+    // InternalEssentialOCL.g:8330:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8332:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
-            // InternalEssentialOCL.g:8333:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
+            // InternalEssentialOCL.g:8334:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
+            // InternalEssentialOCL.g:8335:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__NavigatingArgCS__Group_0_1_2__1__Impl();
@@ -24768,22 +24768,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1__Impl"
-    // InternalEssentialOCL.g:8340:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
+    // InternalEssentialOCL.g:8342:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8344:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
-            // InternalEssentialOCL.g:8345:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalEssentialOCL.g:8346:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
+            // InternalEssentialOCL.g:8347:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
             {
-            // InternalEssentialOCL.g:8345:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
-            // InternalEssentialOCL.g:8346:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalEssentialOCL.g:8347:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalEssentialOCL.g:8348:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_1());
             }
-            // InternalEssentialOCL.g:8347:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalEssentialOCL.g:8349:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             int alt67=2;
             int LA67_0 = input.LA(1);
 
@@ -24792,7 +24792,7 @@
             }
             switch (alt67) {
                 case 1 :
-                    // InternalEssentialOCL.g:8347:2: rule__NavigatingArgCS__Group_0_1_2_1__0
+                    // InternalEssentialOCL.g:8349:2: rule__NavigatingArgCS__Group_0_1_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_1__0();
@@ -24830,14 +24830,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2"
-    // InternalEssentialOCL.g:8357:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
+    // InternalEssentialOCL.g:8359:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8361:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
-            // InternalEssentialOCL.g:8362:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
+            // InternalEssentialOCL.g:8363:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
+            // InternalEssentialOCL.g:8364:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingArgCS__Group_0_1_2__2__Impl();
@@ -24868,17 +24868,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2__Impl"
-    // InternalEssentialOCL.g:8369:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
+    // InternalEssentialOCL.g:8371:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8373:1: ( ( 'in' ) )
-            // InternalEssentialOCL.g:8374:1: ( 'in' )
+            // InternalEssentialOCL.g:8375:1: ( ( 'in' ) )
+            // InternalEssentialOCL.g:8376:1: ( 'in' )
             {
-            // InternalEssentialOCL.g:8374:1: ( 'in' )
-            // InternalEssentialOCL.g:8375:1: 'in'
+            // InternalEssentialOCL.g:8376:1: ( 'in' )
+            // InternalEssentialOCL.g:8377:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());
@@ -24909,14 +24909,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3"
-    // InternalEssentialOCL.g:8388:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
+    // InternalEssentialOCL.g:8390:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8392:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
-            // InternalEssentialOCL.g:8393:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
+            // InternalEssentialOCL.g:8394:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
+            // InternalEssentialOCL.g:8395:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2__3__Impl();
@@ -24942,23 +24942,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3__Impl"
-    // InternalEssentialOCL.g:8399:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
+    // InternalEssentialOCL.g:8401:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8403:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
-            // InternalEssentialOCL.g:8404:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalEssentialOCL.g:8405:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
+            // InternalEssentialOCL.g:8406:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
             {
-            // InternalEssentialOCL.g:8404:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
-            // InternalEssentialOCL.g:8405:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalEssentialOCL.g:8406:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalEssentialOCL.g:8407:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_2_3());
             }
-            // InternalEssentialOCL.g:8406:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
-            // InternalEssentialOCL.g:8406:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
+            // InternalEssentialOCL.g:8408:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalEssentialOCL.g:8408:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3();
@@ -24993,14 +24993,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0"
-    // InternalEssentialOCL.g:8424:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
+    // InternalEssentialOCL.g:8426:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8428:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
-            // InternalEssentialOCL.g:8429:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
+            // InternalEssentialOCL.g:8430:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
+            // InternalEssentialOCL.g:8431:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingArgCS__Group_0_1_2_0__0__Impl();
@@ -25031,17 +25031,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0__Impl"
-    // InternalEssentialOCL.g:8436:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:8438:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8440:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:8441:1: ( ':' )
+            // InternalEssentialOCL.g:8442:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:8443:1: ( ':' )
             {
-            // InternalEssentialOCL.g:8441:1: ( ':' )
-            // InternalEssentialOCL.g:8442:1: ':'
+            // InternalEssentialOCL.g:8443:1: ( ':' )
+            // InternalEssentialOCL.g:8444:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
@@ -25072,14 +25072,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1"
-    // InternalEssentialOCL.g:8455:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
+    // InternalEssentialOCL.g:8457:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8459:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
-            // InternalEssentialOCL.g:8460:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
+            // InternalEssentialOCL.g:8461:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
+            // InternalEssentialOCL.g:8462:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_0__1__Impl();
@@ -25105,23 +25105,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1__Impl"
-    // InternalEssentialOCL.g:8466:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
+    // InternalEssentialOCL.g:8468:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8470:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
-            // InternalEssentialOCL.g:8471:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalEssentialOCL.g:8472:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
+            // InternalEssentialOCL.g:8473:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
             {
-            // InternalEssentialOCL.g:8471:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
-            // InternalEssentialOCL.g:8472:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalEssentialOCL.g:8473:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalEssentialOCL.g:8474:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_2_0_1());
             }
-            // InternalEssentialOCL.g:8473:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
-            // InternalEssentialOCL.g:8473:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
+            // InternalEssentialOCL.g:8475:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalEssentialOCL.g:8475:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1();
@@ -25156,14 +25156,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0"
-    // InternalEssentialOCL.g:8487:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
+    // InternalEssentialOCL.g:8489:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8491:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
-            // InternalEssentialOCL.g:8492:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
+            // InternalEssentialOCL.g:8493:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
+            // InternalEssentialOCL.g:8494:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__NavigatingArgCS__Group_0_1_2_1__0__Impl();
@@ -25194,17 +25194,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0__Impl"
-    // InternalEssentialOCL.g:8499:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:8501:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8503:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:8504:1: ( '<-' )
+            // InternalEssentialOCL.g:8505:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:8506:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:8504:1: ( '<-' )
-            // InternalEssentialOCL.g:8505:1: '<-'
+            // InternalEssentialOCL.g:8506:1: ( '<-' )
+            // InternalEssentialOCL.g:8507:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
@@ -25235,14 +25235,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1"
-    // InternalEssentialOCL.g:8518:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
+    // InternalEssentialOCL.g:8520:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8522:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
-            // InternalEssentialOCL.g:8523:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
+            // InternalEssentialOCL.g:8524:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
+            // InternalEssentialOCL.g:8525:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_1__1__Impl();
@@ -25268,23 +25268,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1__Impl"
-    // InternalEssentialOCL.g:8529:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:8531:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8533:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
-            // InternalEssentialOCL.g:8534:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalEssentialOCL.g:8535:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
+            // InternalEssentialOCL.g:8536:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:8534:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
-            // InternalEssentialOCL.g:8535:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalEssentialOCL.g:8536:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalEssentialOCL.g:8537:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_2_1_1());
             }
-            // InternalEssentialOCL.g:8536:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
-            // InternalEssentialOCL.g:8536:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
+            // InternalEssentialOCL.g:8538:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalEssentialOCL.g:8538:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1();
@@ -25319,14 +25319,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0"
-    // InternalEssentialOCL.g:8550:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
+    // InternalEssentialOCL.g:8552:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
     public final void rule__NavigatingArgCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8554:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
-            // InternalEssentialOCL.g:8555:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
+            // InternalEssentialOCL.g:8556:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
+            // InternalEssentialOCL.g:8557:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingArgCS__Group_1__0__Impl();
@@ -25357,17 +25357,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:8562:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:8564:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8566:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:8567:1: ( ':' )
+            // InternalEssentialOCL.g:8568:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:8569:1: ( ':' )
             {
-            // InternalEssentialOCL.g:8567:1: ( ':' )
-            // InternalEssentialOCL.g:8568:1: ':'
+            // InternalEssentialOCL.g:8569:1: ( ':' )
+            // InternalEssentialOCL.g:8570:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
@@ -25398,14 +25398,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1"
-    // InternalEssentialOCL.g:8581:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:8583:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8585:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:8586:2: rule__NavigatingArgCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:8587:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:8588:2: rule__NavigatingArgCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_1__1__Impl();
@@ -25431,23 +25431,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:8592:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:8594:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8596:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:8597:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:8598:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:8599:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:8597:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
-            // InternalEssentialOCL.g:8598:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:8599:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:8600:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalEssentialOCL.g:8599:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
-            // InternalEssentialOCL.g:8599:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
+            // InternalEssentialOCL.g:8601:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:8601:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_1_1();
@@ -25482,14 +25482,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0"
-    // InternalEssentialOCL.g:8613:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
+    // InternalEssentialOCL.g:8615:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
     public final void rule__NavigatingBarArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8617:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
-            // InternalEssentialOCL.g:8618:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
+            // InternalEssentialOCL.g:8619:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
+            // InternalEssentialOCL.g:8620:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingBarArgCS__Group__0__Impl();
@@ -25520,23 +25520,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0__Impl"
-    // InternalEssentialOCL.g:8625:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:8627:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8629:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
-            // InternalEssentialOCL.g:8630:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalEssentialOCL.g:8631:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
+            // InternalEssentialOCL.g:8632:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:8630:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
-            // InternalEssentialOCL.g:8631:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalEssentialOCL.g:8632:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalEssentialOCL.g:8633:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalEssentialOCL.g:8632:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
-            // InternalEssentialOCL.g:8632:2: rule__NavigatingBarArgCS__PrefixAssignment_0
+            // InternalEssentialOCL.g:8634:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalEssentialOCL.g:8634:2: rule__NavigatingBarArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__PrefixAssignment_0();
@@ -25571,14 +25571,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1"
-    // InternalEssentialOCL.g:8642:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
+    // InternalEssentialOCL.g:8644:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
     public final void rule__NavigatingBarArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8646:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
-            // InternalEssentialOCL.g:8647:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
+            // InternalEssentialOCL.g:8648:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
+            // InternalEssentialOCL.g:8649:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__NavigatingBarArgCS__Group__1__Impl();
@@ -25609,23 +25609,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1__Impl"
-    // InternalEssentialOCL.g:8654:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:8656:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8658:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalEssentialOCL.g:8659:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:8660:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:8661:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:8659:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalEssentialOCL.g:8660:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalEssentialOCL.g:8661:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:8662:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalEssentialOCL.g:8661:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalEssentialOCL.g:8661:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
+            // InternalEssentialOCL.g:8663:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalEssentialOCL.g:8663:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1();
@@ -25660,14 +25660,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2"
-    // InternalEssentialOCL.g:8671:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:8673:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8675:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
-            // InternalEssentialOCL.g:8676:2: rule__NavigatingBarArgCS__Group__2__Impl
+            // InternalEssentialOCL.g:8677:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
+            // InternalEssentialOCL.g:8678:2: rule__NavigatingBarArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group__2__Impl();
@@ -25693,22 +25693,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2__Impl"
-    // InternalEssentialOCL.g:8682:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:8684:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8686:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:8687:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:8688:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:8689:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:8687:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:8688:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalEssentialOCL.g:8689:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:8690:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:8689:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalEssentialOCL.g:8691:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             int alt68=2;
             int LA68_0 = input.LA(1);
 
@@ -25717,7 +25717,7 @@
             }
             switch (alt68) {
                 case 1 :
-                    // InternalEssentialOCL.g:8689:2: rule__NavigatingBarArgCS__Group_2__0
+                    // InternalEssentialOCL.g:8691:2: rule__NavigatingBarArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2__0();
@@ -25755,14 +25755,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0"
-    // InternalEssentialOCL.g:8705:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
+    // InternalEssentialOCL.g:8707:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8709:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
-            // InternalEssentialOCL.g:8710:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
+            // InternalEssentialOCL.g:8711:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
+            // InternalEssentialOCL.g:8712:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingBarArgCS__Group_2__0__Impl();
@@ -25793,17 +25793,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:8717:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:8719:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingBarArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8721:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:8722:1: ( ':' )
+            // InternalEssentialOCL.g:8723:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:8724:1: ( ':' )
             {
-            // InternalEssentialOCL.g:8722:1: ( ':' )
-            // InternalEssentialOCL.g:8723:1: ':'
+            // InternalEssentialOCL.g:8724:1: ( ':' )
+            // InternalEssentialOCL.g:8725:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
@@ -25834,14 +25834,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1"
-    // InternalEssentialOCL.g:8736:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
+    // InternalEssentialOCL.g:8738:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
     public final void rule__NavigatingBarArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8740:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
-            // InternalEssentialOCL.g:8741:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
+            // InternalEssentialOCL.g:8742:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
+            // InternalEssentialOCL.g:8743:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_20);
             rule__NavigatingBarArgCS__Group_2__1__Impl();
@@ -25872,23 +25872,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:8748:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalEssentialOCL.g:8750:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8752:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalEssentialOCL.g:8753:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalEssentialOCL.g:8754:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:8755:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalEssentialOCL.g:8753:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalEssentialOCL.g:8754:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalEssentialOCL.g:8755:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalEssentialOCL.g:8756:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalEssentialOCL.g:8755:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
-            // InternalEssentialOCL.g:8755:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
+            // InternalEssentialOCL.g:8757:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalEssentialOCL.g:8757:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1();
@@ -25923,14 +25923,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2"
-    // InternalEssentialOCL.g:8765:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
+    // InternalEssentialOCL.g:8767:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8769:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
-            // InternalEssentialOCL.g:8770:2: rule__NavigatingBarArgCS__Group_2__2__Impl
+            // InternalEssentialOCL.g:8771:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
+            // InternalEssentialOCL.g:8772:2: rule__NavigatingBarArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2__2__Impl();
@@ -25956,22 +25956,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2__Impl"
-    // InternalEssentialOCL.g:8776:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
+    // InternalEssentialOCL.g:8778:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8780:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
-            // InternalEssentialOCL.g:8781:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalEssentialOCL.g:8782:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
+            // InternalEssentialOCL.g:8783:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
             {
-            // InternalEssentialOCL.g:8781:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
-            // InternalEssentialOCL.g:8782:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalEssentialOCL.g:8783:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalEssentialOCL.g:8784:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
             }
-            // InternalEssentialOCL.g:8783:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalEssentialOCL.g:8785:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             int alt69=2;
             int LA69_0 = input.LA(1);
 
@@ -25980,7 +25980,7 @@
             }
             switch (alt69) {
                 case 1 :
-                    // InternalEssentialOCL.g:8783:2: rule__NavigatingBarArgCS__Group_2_2__0
+                    // InternalEssentialOCL.g:8785:2: rule__NavigatingBarArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2_2__0();
@@ -26018,14 +26018,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0"
-    // InternalEssentialOCL.g:8799:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
+    // InternalEssentialOCL.g:8801:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8803:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
-            // InternalEssentialOCL.g:8804:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
+            // InternalEssentialOCL.g:8805:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
+            // InternalEssentialOCL.g:8806:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingBarArgCS__Group_2_2__0__Impl();
@@ -26056,17 +26056,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0__Impl"
-    // InternalEssentialOCL.g:8811:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:8813:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8815:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:8816:1: ( '=' )
+            // InternalEssentialOCL.g:8817:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:8818:1: ( '=' )
             {
-            // InternalEssentialOCL.g:8816:1: ( '=' )
-            // InternalEssentialOCL.g:8817:1: '='
+            // InternalEssentialOCL.g:8818:1: ( '=' )
+            // InternalEssentialOCL.g:8819:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -26097,14 +26097,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1"
-    // InternalEssentialOCL.g:8830:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
+    // InternalEssentialOCL.g:8832:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8834:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
-            // InternalEssentialOCL.g:8835:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
+            // InternalEssentialOCL.g:8836:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
+            // InternalEssentialOCL.g:8837:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2_2__1__Impl();
@@ -26130,23 +26130,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1__Impl"
-    // InternalEssentialOCL.g:8841:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalEssentialOCL.g:8843:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8845:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalEssentialOCL.g:8846:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalEssentialOCL.g:8847:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalEssentialOCL.g:8848:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalEssentialOCL.g:8846:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalEssentialOCL.g:8847:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalEssentialOCL.g:8848:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalEssentialOCL.g:8849:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalEssentialOCL.g:8848:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalEssentialOCL.g:8848:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalEssentialOCL.g:8850:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalEssentialOCL.g:8850:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -26181,14 +26181,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0"
-    // InternalEssentialOCL.g:8862:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
+    // InternalEssentialOCL.g:8864:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
     public final void rule__NavigatingCommaArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8866:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
-            // InternalEssentialOCL.g:8867:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
+            // InternalEssentialOCL.g:8868:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
+            // InternalEssentialOCL.g:8869:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingCommaArgCS__Group__0__Impl();
@@ -26219,23 +26219,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0__Impl"
-    // InternalEssentialOCL.g:8874:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:8876:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8878:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
-            // InternalEssentialOCL.g:8879:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalEssentialOCL.g:8880:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
+            // InternalEssentialOCL.g:8881:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:8879:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
-            // InternalEssentialOCL.g:8880:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalEssentialOCL.g:8881:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalEssentialOCL.g:8882:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalEssentialOCL.g:8881:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
-            // InternalEssentialOCL.g:8881:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
+            // InternalEssentialOCL.g:8883:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalEssentialOCL.g:8883:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__PrefixAssignment_0();
@@ -26270,14 +26270,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1"
-    // InternalEssentialOCL.g:8891:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
+    // InternalEssentialOCL.g:8893:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
     public final void rule__NavigatingCommaArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8895:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
-            // InternalEssentialOCL.g:8896:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
+            // InternalEssentialOCL.g:8897:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
+            // InternalEssentialOCL.g:8898:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__NavigatingCommaArgCS__Group__1__Impl();
@@ -26308,23 +26308,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1__Impl"
-    // InternalEssentialOCL.g:8903:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:8905:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8907:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalEssentialOCL.g:8908:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:8909:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:8910:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:8908:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalEssentialOCL.g:8909:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalEssentialOCL.g:8910:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:8911:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalEssentialOCL.g:8910:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalEssentialOCL.g:8910:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
+            // InternalEssentialOCL.g:8912:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalEssentialOCL.g:8912:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1();
@@ -26359,14 +26359,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2"
-    // InternalEssentialOCL.g:8920:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:8922:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8924:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
-            // InternalEssentialOCL.g:8925:2: rule__NavigatingCommaArgCS__Group__2__Impl
+            // InternalEssentialOCL.g:8926:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
+            // InternalEssentialOCL.g:8927:2: rule__NavigatingCommaArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group__2__Impl();
@@ -26392,22 +26392,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2__Impl"
-    // InternalEssentialOCL.g:8931:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
+    // InternalEssentialOCL.g:8933:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8935:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
-            // InternalEssentialOCL.g:8936:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalEssentialOCL.g:8937:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
+            // InternalEssentialOCL.g:8938:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
             {
-            // InternalEssentialOCL.g:8936:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
-            // InternalEssentialOCL.g:8937:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalEssentialOCL.g:8938:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalEssentialOCL.g:8939:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
             }
-            // InternalEssentialOCL.g:8938:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalEssentialOCL.g:8940:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             int alt70=2;
             int LA70_0 = input.LA(1);
 
@@ -26416,7 +26416,7 @@
             }
             switch (alt70) {
                 case 1 :
-                    // InternalEssentialOCL.g:8938:2: rule__NavigatingCommaArgCS__Alternatives_2
+                    // InternalEssentialOCL.g:8940:2: rule__NavigatingCommaArgCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Alternatives_2();
@@ -26454,14 +26454,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0"
-    // InternalEssentialOCL.g:8954:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
+    // InternalEssentialOCL.g:8956:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8958:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
-            // InternalEssentialOCL.g:8959:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
+            // InternalEssentialOCL.g:8960:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
+            // InternalEssentialOCL.g:8961:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__NavigatingCommaArgCS__Group_2_0__0__Impl();
@@ -26492,17 +26492,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0__Impl"
-    // InternalEssentialOCL.g:8966:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:8968:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8970:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:8971:1: ( '<-' )
+            // InternalEssentialOCL.g:8972:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:8973:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:8971:1: ( '<-' )
-            // InternalEssentialOCL.g:8972:1: '<-'
+            // InternalEssentialOCL.g:8973:1: ( '<-' )
+            // InternalEssentialOCL.g:8974:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
@@ -26533,14 +26533,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1"
-    // InternalEssentialOCL.g:8985:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
+    // InternalEssentialOCL.g:8987:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:8989:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
-            // InternalEssentialOCL.g:8990:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
+            // InternalEssentialOCL.g:8991:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
+            // InternalEssentialOCL.g:8992:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
             {
             pushFollow(FollowSets000.FOLLOW_20);
             rule__NavigatingCommaArgCS__Group_2_0__1__Impl();
@@ -26571,23 +26571,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1__Impl"
-    // InternalEssentialOCL.g:8997:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
+    // InternalEssentialOCL.g:8999:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9001:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
-            // InternalEssentialOCL.g:9002:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalEssentialOCL.g:9003:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
+            // InternalEssentialOCL.g:9004:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
             {
-            // InternalEssentialOCL.g:9002:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
-            // InternalEssentialOCL.g:9003:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalEssentialOCL.g:9004:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalEssentialOCL.g:9005:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_0_1());
             }
-            // InternalEssentialOCL.g:9004:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
-            // InternalEssentialOCL.g:9004:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
+            // InternalEssentialOCL.g:9006:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalEssentialOCL.g:9006:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1();
@@ -26622,14 +26622,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2"
-    // InternalEssentialOCL.g:9014:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
+    // InternalEssentialOCL.g:9016:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9018:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
-            // InternalEssentialOCL.g:9019:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
+            // InternalEssentialOCL.g:9020:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
+            // InternalEssentialOCL.g:9021:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0__2__Impl();
@@ -26655,22 +26655,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2__Impl"
-    // InternalEssentialOCL.g:9025:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
+    // InternalEssentialOCL.g:9027:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9029:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
-            // InternalEssentialOCL.g:9030:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalEssentialOCL.g:9031:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
+            // InternalEssentialOCL.g:9032:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
             {
-            // InternalEssentialOCL.g:9030:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
-            // InternalEssentialOCL.g:9031:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalEssentialOCL.g:9032:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalEssentialOCL.g:9033:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
             }
-            // InternalEssentialOCL.g:9032:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalEssentialOCL.g:9034:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             int alt71=2;
             int LA71_0 = input.LA(1);
 
@@ -26679,7 +26679,7 @@
             }
             switch (alt71) {
                 case 1 :
-                    // InternalEssentialOCL.g:9032:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
+                    // InternalEssentialOCL.g:9034:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0_2__0();
@@ -26717,14 +26717,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0"
-    // InternalEssentialOCL.g:9048:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
+    // InternalEssentialOCL.g:9050:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9052:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
-            // InternalEssentialOCL.g:9053:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
+            // InternalEssentialOCL.g:9054:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
+            // InternalEssentialOCL.g:9055:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl();
@@ -26755,17 +26755,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl"
-    // InternalEssentialOCL.g:9060:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:9062:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9064:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:9065:1: ( '=' )
+            // InternalEssentialOCL.g:9066:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:9067:1: ( '=' )
             {
-            // InternalEssentialOCL.g:9065:1: ( '=' )
-            // InternalEssentialOCL.g:9066:1: '='
+            // InternalEssentialOCL.g:9067:1: ( '=' )
+            // InternalEssentialOCL.g:9068:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
@@ -26796,14 +26796,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1"
-    // InternalEssentialOCL.g:9079:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
+    // InternalEssentialOCL.g:9081:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9083:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
-            // InternalEssentialOCL.g:9084:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
+            // InternalEssentialOCL.g:9085:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
+            // InternalEssentialOCL.g:9086:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl();
@@ -26829,23 +26829,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl"
-    // InternalEssentialOCL.g:9090:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
+    // InternalEssentialOCL.g:9092:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9094:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
-            // InternalEssentialOCL.g:9095:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalEssentialOCL.g:9096:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
+            // InternalEssentialOCL.g:9097:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
             {
-            // InternalEssentialOCL.g:9095:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
-            // InternalEssentialOCL.g:9096:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalEssentialOCL.g:9097:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalEssentialOCL.g:9098:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
             }
-            // InternalEssentialOCL.g:9097:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
-            // InternalEssentialOCL.g:9097:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
+            // InternalEssentialOCL.g:9099:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalEssentialOCL.g:9099:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1();
@@ -26880,14 +26880,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0"
-    // InternalEssentialOCL.g:9111:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
+    // InternalEssentialOCL.g:9113:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9115:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
-            // InternalEssentialOCL.g:9116:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
+            // InternalEssentialOCL.g:9117:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
+            // InternalEssentialOCL.g:9118:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingCommaArgCS__Group_2_1__0__Impl();
@@ -26918,17 +26918,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0__Impl"
-    // InternalEssentialOCL.g:9123:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:9125:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9127:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:9128:1: ( ':' )
+            // InternalEssentialOCL.g:9129:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:9130:1: ( ':' )
             {
-            // InternalEssentialOCL.g:9128:1: ( ':' )
-            // InternalEssentialOCL.g:9129:1: ':'
+            // InternalEssentialOCL.g:9130:1: ( ':' )
+            // InternalEssentialOCL.g:9131:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
@@ -26959,14 +26959,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1"
-    // InternalEssentialOCL.g:9142:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
+    // InternalEssentialOCL.g:9144:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9146:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
-            // InternalEssentialOCL.g:9147:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
+            // InternalEssentialOCL.g:9148:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
+            // InternalEssentialOCL.g:9149:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingCommaArgCS__Group_2_1__1__Impl();
@@ -26997,23 +26997,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"
-    // InternalEssentialOCL.g:9154:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:9156:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9158:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
-            // InternalEssentialOCL.g:9159:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:9160:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
+            // InternalEssentialOCL.g:9161:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:9159:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
-            // InternalEssentialOCL.g:9160:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalEssentialOCL.g:9161:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalEssentialOCL.g:9162:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_1_1());
             }
-            // InternalEssentialOCL.g:9161:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
-            // InternalEssentialOCL.g:9161:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
+            // InternalEssentialOCL.g:9163:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalEssentialOCL.g:9163:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1();
@@ -27048,14 +27048,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2"
-    // InternalEssentialOCL.g:9171:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
+    // InternalEssentialOCL.g:9173:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9175:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
-            // InternalEssentialOCL.g:9176:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
+            // InternalEssentialOCL.g:9177:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
+            // InternalEssentialOCL.g:9178:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__NavigatingCommaArgCS__Group_2_1__2__Impl();
@@ -27086,22 +27086,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2__Impl"
-    // InternalEssentialOCL.g:9183:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
+    // InternalEssentialOCL.g:9185:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9187:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
-            // InternalEssentialOCL.g:9188:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalEssentialOCL.g:9189:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
+            // InternalEssentialOCL.g:9190:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
             {
-            // InternalEssentialOCL.g:9188:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
-            // InternalEssentialOCL.g:9189:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalEssentialOCL.g:9190:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalEssentialOCL.g:9191:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_2());
             }
-            // InternalEssentialOCL.g:9190:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalEssentialOCL.g:9192:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             int alt72=2;
             int LA72_0 = input.LA(1);
 
@@ -27110,7 +27110,7 @@
             }
             switch (alt72) {
                 case 1 :
-                    // InternalEssentialOCL.g:9190:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
+                    // InternalEssentialOCL.g:9192:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_2__0();
@@ -27148,14 +27148,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3"
-    // InternalEssentialOCL.g:9200:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
+    // InternalEssentialOCL.g:9202:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9204:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
-            // InternalEssentialOCL.g:9205:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
+            // InternalEssentialOCL.g:9206:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
+            // InternalEssentialOCL.g:9207:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1__3__Impl();
@@ -27181,22 +27181,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3__Impl"
-    // InternalEssentialOCL.g:9211:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
+    // InternalEssentialOCL.g:9213:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9215:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
-            // InternalEssentialOCL.g:9216:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalEssentialOCL.g:9217:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
+            // InternalEssentialOCL.g:9218:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
             {
-            // InternalEssentialOCL.g:9216:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
-            // InternalEssentialOCL.g:9217:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalEssentialOCL.g:9218:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalEssentialOCL.g:9219:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_3());
             }
-            // InternalEssentialOCL.g:9218:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalEssentialOCL.g:9220:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             int alt73=2;
             int LA73_0 = input.LA(1);
 
@@ -27205,7 +27205,7 @@
             }
             switch (alt73) {
                 case 1 :
-                    // InternalEssentialOCL.g:9218:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
+                    // InternalEssentialOCL.g:9220:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_3__0();
@@ -27243,14 +27243,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0"
-    // InternalEssentialOCL.g:9236:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
+    // InternalEssentialOCL.g:9238:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9240:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
-            // InternalEssentialOCL.g:9241:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
+            // InternalEssentialOCL.g:9242:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
+            // InternalEssentialOCL.g:9243:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl();
@@ -27281,17 +27281,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl"
-    // InternalEssentialOCL.g:9248:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:9250:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9252:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:9253:1: ( '<-' )
+            // InternalEssentialOCL.g:9254:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:9255:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:9253:1: ( '<-' )
-            // InternalEssentialOCL.g:9254:1: '<-'
+            // InternalEssentialOCL.g:9255:1: ( '<-' )
+            // InternalEssentialOCL.g:9256:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
@@ -27322,14 +27322,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1"
-    // InternalEssentialOCL.g:9267:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
+    // InternalEssentialOCL.g:9269:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9271:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
-            // InternalEssentialOCL.g:9272:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
+            // InternalEssentialOCL.g:9273:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
+            // InternalEssentialOCL.g:9274:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl();
@@ -27355,23 +27355,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl"
-    // InternalEssentialOCL.g:9278:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
+    // InternalEssentialOCL.g:9280:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9282:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
-            // InternalEssentialOCL.g:9283:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalEssentialOCL.g:9284:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
+            // InternalEssentialOCL.g:9285:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
             {
-            // InternalEssentialOCL.g:9283:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
-            // InternalEssentialOCL.g:9284:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalEssentialOCL.g:9285:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalEssentialOCL.g:9286:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_1_2_1());
             }
-            // InternalEssentialOCL.g:9285:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
-            // InternalEssentialOCL.g:9285:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
+            // InternalEssentialOCL.g:9287:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalEssentialOCL.g:9287:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1();
@@ -27406,14 +27406,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0"
-    // InternalEssentialOCL.g:9299:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
+    // InternalEssentialOCL.g:9301:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9303:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
-            // InternalEssentialOCL.g:9304:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
+            // InternalEssentialOCL.g:9305:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
+            // InternalEssentialOCL.g:9306:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl();
@@ -27444,17 +27444,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl"
-    // InternalEssentialOCL.g:9311:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:9313:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9315:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:9316:1: ( '=' )
+            // InternalEssentialOCL.g:9317:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:9318:1: ( '=' )
             {
-            // InternalEssentialOCL.g:9316:1: ( '=' )
-            // InternalEssentialOCL.g:9317:1: '='
+            // InternalEssentialOCL.g:9318:1: ( '=' )
+            // InternalEssentialOCL.g:9319:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());
@@ -27485,14 +27485,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1"
-    // InternalEssentialOCL.g:9330:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
+    // InternalEssentialOCL.g:9332:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9334:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
-            // InternalEssentialOCL.g:9335:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
+            // InternalEssentialOCL.g:9336:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
+            // InternalEssentialOCL.g:9337:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl();
@@ -27518,23 +27518,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl"
-    // InternalEssentialOCL.g:9341:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
+    // InternalEssentialOCL.g:9343:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9345:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
-            // InternalEssentialOCL.g:9346:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalEssentialOCL.g:9347:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
+            // InternalEssentialOCL.g:9348:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
             {
-            // InternalEssentialOCL.g:9346:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
-            // InternalEssentialOCL.g:9347:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalEssentialOCL.g:9348:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalEssentialOCL.g:9349:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_3_1());
             }
-            // InternalEssentialOCL.g:9348:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
-            // InternalEssentialOCL.g:9348:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
+            // InternalEssentialOCL.g:9350:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalEssentialOCL.g:9350:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1();
@@ -27569,14 +27569,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0"
-    // InternalEssentialOCL.g:9362:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
+    // InternalEssentialOCL.g:9364:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9366:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
-            // InternalEssentialOCL.g:9367:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
+            // InternalEssentialOCL.g:9368:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
+            // InternalEssentialOCL.g:9369:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__NavigatingCommaArgCS__Group_2_2__0__Impl();
@@ -27607,22 +27607,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0__Impl"
-    // InternalEssentialOCL.g:9374:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
+    // InternalEssentialOCL.g:9376:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9378:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
-            // InternalEssentialOCL.g:9379:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalEssentialOCL.g:9380:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
+            // InternalEssentialOCL.g:9381:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
             {
-            // InternalEssentialOCL.g:9379:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
-            // InternalEssentialOCL.g:9380:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalEssentialOCL.g:9381:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalEssentialOCL.g:9382:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_0());
             }
-            // InternalEssentialOCL.g:9381:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalEssentialOCL.g:9383:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             int alt74=2;
             int LA74_0 = input.LA(1);
 
@@ -27631,7 +27631,7 @@
             }
             switch (alt74) {
                 case 1 :
-                    // InternalEssentialOCL.g:9381:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
+                    // InternalEssentialOCL.g:9383:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_0__0();
@@ -27669,14 +27669,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1"
-    // InternalEssentialOCL.g:9391:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
+    // InternalEssentialOCL.g:9393:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9395:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
-            // InternalEssentialOCL.g:9396:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
+            // InternalEssentialOCL.g:9397:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
+            // InternalEssentialOCL.g:9398:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__NavigatingCommaArgCS__Group_2_2__1__Impl();
@@ -27707,22 +27707,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1__Impl"
-    // InternalEssentialOCL.g:9403:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
+    // InternalEssentialOCL.g:9405:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9407:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
-            // InternalEssentialOCL.g:9408:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalEssentialOCL.g:9409:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
+            // InternalEssentialOCL.g:9410:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
             {
-            // InternalEssentialOCL.g:9408:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
-            // InternalEssentialOCL.g:9409:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalEssentialOCL.g:9410:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalEssentialOCL.g:9411:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_1());
             }
-            // InternalEssentialOCL.g:9410:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalEssentialOCL.g:9412:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             int alt75=2;
             int LA75_0 = input.LA(1);
 
@@ -27731,7 +27731,7 @@
             }
             switch (alt75) {
                 case 1 :
-                    // InternalEssentialOCL.g:9410:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
+                    // InternalEssentialOCL.g:9412:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_1__0();
@@ -27769,14 +27769,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2"
-    // InternalEssentialOCL.g:9420:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
+    // InternalEssentialOCL.g:9422:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9424:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
-            // InternalEssentialOCL.g:9425:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
+            // InternalEssentialOCL.g:9426:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
+            // InternalEssentialOCL.g:9427:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingCommaArgCS__Group_2_2__2__Impl();
@@ -27807,17 +27807,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2__Impl"
-    // InternalEssentialOCL.g:9432:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
+    // InternalEssentialOCL.g:9434:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9436:1: ( ( 'in' ) )
-            // InternalEssentialOCL.g:9437:1: ( 'in' )
+            // InternalEssentialOCL.g:9438:1: ( ( 'in' ) )
+            // InternalEssentialOCL.g:9439:1: ( 'in' )
             {
-            // InternalEssentialOCL.g:9437:1: ( 'in' )
-            // InternalEssentialOCL.g:9438:1: 'in'
+            // InternalEssentialOCL.g:9439:1: ( 'in' )
+            // InternalEssentialOCL.g:9440:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());
@@ -27848,14 +27848,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3"
-    // InternalEssentialOCL.g:9451:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
+    // InternalEssentialOCL.g:9453:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9455:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
-            // InternalEssentialOCL.g:9456:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
+            // InternalEssentialOCL.g:9457:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
+            // InternalEssentialOCL.g:9458:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2__3__Impl();
@@ -27881,23 +27881,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3__Impl"
-    // InternalEssentialOCL.g:9462:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
+    // InternalEssentialOCL.g:9464:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9466:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
-            // InternalEssentialOCL.g:9467:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalEssentialOCL.g:9468:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
+            // InternalEssentialOCL.g:9469:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
             {
-            // InternalEssentialOCL.g:9467:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
-            // InternalEssentialOCL.g:9468:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalEssentialOCL.g:9469:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalEssentialOCL.g:9470:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_2_3());
             }
-            // InternalEssentialOCL.g:9469:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
-            // InternalEssentialOCL.g:9469:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
+            // InternalEssentialOCL.g:9471:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalEssentialOCL.g:9471:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3();
@@ -27932,14 +27932,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0"
-    // InternalEssentialOCL.g:9487:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
+    // InternalEssentialOCL.g:9489:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9491:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
-            // InternalEssentialOCL.g:9492:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
+            // InternalEssentialOCL.g:9493:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
+            // InternalEssentialOCL.g:9494:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl();
@@ -27970,17 +27970,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl"
-    // InternalEssentialOCL.g:9499:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:9501:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9503:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:9504:1: ( ':' )
+            // InternalEssentialOCL.g:9505:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:9506:1: ( ':' )
             {
-            // InternalEssentialOCL.g:9504:1: ( ':' )
-            // InternalEssentialOCL.g:9505:1: ':'
+            // InternalEssentialOCL.g:9506:1: ( ':' )
+            // InternalEssentialOCL.g:9507:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
@@ -28011,14 +28011,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1"
-    // InternalEssentialOCL.g:9518:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
+    // InternalEssentialOCL.g:9520:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9522:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
-            // InternalEssentialOCL.g:9523:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
+            // InternalEssentialOCL.g:9524:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
+            // InternalEssentialOCL.g:9525:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl();
@@ -28044,23 +28044,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl"
-    // InternalEssentialOCL.g:9529:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
+    // InternalEssentialOCL.g:9531:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9533:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
-            // InternalEssentialOCL.g:9534:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalEssentialOCL.g:9535:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
+            // InternalEssentialOCL.g:9536:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
             {
-            // InternalEssentialOCL.g:9534:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
-            // InternalEssentialOCL.g:9535:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalEssentialOCL.g:9536:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalEssentialOCL.g:9537:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_2_0_1());
             }
-            // InternalEssentialOCL.g:9536:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
-            // InternalEssentialOCL.g:9536:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
+            // InternalEssentialOCL.g:9538:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalEssentialOCL.g:9538:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1();
@@ -28095,14 +28095,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0"
-    // InternalEssentialOCL.g:9550:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
+    // InternalEssentialOCL.g:9552:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9554:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
-            // InternalEssentialOCL.g:9555:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
+            // InternalEssentialOCL.g:9556:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
+            // InternalEssentialOCL.g:9557:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl();
@@ -28133,17 +28133,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl"
-    // InternalEssentialOCL.g:9562:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
+    // InternalEssentialOCL.g:9564:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9566:1: ( ( '<-' ) )
-            // InternalEssentialOCL.g:9567:1: ( '<-' )
+            // InternalEssentialOCL.g:9568:1: ( ( '<-' ) )
+            // InternalEssentialOCL.g:9569:1: ( '<-' )
             {
-            // InternalEssentialOCL.g:9567:1: ( '<-' )
-            // InternalEssentialOCL.g:9568:1: '<-'
+            // InternalEssentialOCL.g:9569:1: ( '<-' )
+            // InternalEssentialOCL.g:9570:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
@@ -28174,14 +28174,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1"
-    // InternalEssentialOCL.g:9581:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
+    // InternalEssentialOCL.g:9583:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9585:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
-            // InternalEssentialOCL.g:9586:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
+            // InternalEssentialOCL.g:9587:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
+            // InternalEssentialOCL.g:9588:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl();
@@ -28207,23 +28207,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl"
-    // InternalEssentialOCL.g:9592:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
+    // InternalEssentialOCL.g:9594:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9596:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
-            // InternalEssentialOCL.g:9597:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalEssentialOCL.g:9598:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
+            // InternalEssentialOCL.g:9599:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
             {
-            // InternalEssentialOCL.g:9597:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
-            // InternalEssentialOCL.g:9598:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalEssentialOCL.g:9599:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalEssentialOCL.g:9600:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_2_1_1());
             }
-            // InternalEssentialOCL.g:9599:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
-            // InternalEssentialOCL.g:9599:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
+            // InternalEssentialOCL.g:9601:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalEssentialOCL.g:9601:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1();
@@ -28258,14 +28258,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0"
-    // InternalEssentialOCL.g:9613:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
+    // InternalEssentialOCL.g:9615:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
     public final void rule__NavigatingSemiArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9617:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
-            // InternalEssentialOCL.g:9618:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
+            // InternalEssentialOCL.g:9619:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
+            // InternalEssentialOCL.g:9620:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingSemiArgCS__Group__0__Impl();
@@ -28296,23 +28296,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0__Impl"
-    // InternalEssentialOCL.g:9625:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:9627:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9629:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
-            // InternalEssentialOCL.g:9630:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalEssentialOCL.g:9631:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
+            // InternalEssentialOCL.g:9632:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:9630:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
-            // InternalEssentialOCL.g:9631:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalEssentialOCL.g:9632:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalEssentialOCL.g:9633:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalEssentialOCL.g:9632:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
-            // InternalEssentialOCL.g:9632:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
+            // InternalEssentialOCL.g:9634:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalEssentialOCL.g:9634:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__PrefixAssignment_0();
@@ -28347,14 +28347,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1"
-    // InternalEssentialOCL.g:9642:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
+    // InternalEssentialOCL.g:9644:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
     public final void rule__NavigatingSemiArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9646:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
-            // InternalEssentialOCL.g:9647:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
+            // InternalEssentialOCL.g:9648:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
+            // InternalEssentialOCL.g:9649:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__NavigatingSemiArgCS__Group__1__Impl();
@@ -28385,23 +28385,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1__Impl"
-    // InternalEssentialOCL.g:9654:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:9656:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9658:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalEssentialOCL.g:9659:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:9660:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:9661:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:9659:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalEssentialOCL.g:9660:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalEssentialOCL.g:9661:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:9662:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalEssentialOCL.g:9661:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalEssentialOCL.g:9661:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
+            // InternalEssentialOCL.g:9663:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalEssentialOCL.g:9663:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1();
@@ -28436,14 +28436,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2"
-    // InternalEssentialOCL.g:9671:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:9673:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9675:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
-            // InternalEssentialOCL.g:9676:2: rule__NavigatingSemiArgCS__Group__2__Impl
+            // InternalEssentialOCL.g:9677:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
+            // InternalEssentialOCL.g:9678:2: rule__NavigatingSemiArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group__2__Impl();
@@ -28469,22 +28469,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2__Impl"
-    // InternalEssentialOCL.g:9682:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:9684:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9686:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:9687:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:9688:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:9689:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:9687:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:9688:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalEssentialOCL.g:9689:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:9690:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:9689:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalEssentialOCL.g:9691:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             int alt76=2;
             int LA76_0 = input.LA(1);
 
@@ -28493,7 +28493,7 @@
             }
             switch (alt76) {
                 case 1 :
-                    // InternalEssentialOCL.g:9689:2: rule__NavigatingSemiArgCS__Group_2__0
+                    // InternalEssentialOCL.g:9691:2: rule__NavigatingSemiArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2__0();
@@ -28531,14 +28531,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0"
-    // InternalEssentialOCL.g:9705:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
+    // InternalEssentialOCL.g:9707:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9709:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
-            // InternalEssentialOCL.g:9710:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
+            // InternalEssentialOCL.g:9711:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
+            // InternalEssentialOCL.g:9712:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__NavigatingSemiArgCS__Group_2__0__Impl();
@@ -28569,17 +28569,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:9717:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:9719:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9721:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:9722:1: ( ':' )
+            // InternalEssentialOCL.g:9723:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:9724:1: ( ':' )
             {
-            // InternalEssentialOCL.g:9722:1: ( ':' )
-            // InternalEssentialOCL.g:9723:1: ':'
+            // InternalEssentialOCL.g:9724:1: ( ':' )
+            // InternalEssentialOCL.g:9725:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
@@ -28610,14 +28610,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1"
-    // InternalEssentialOCL.g:9736:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
+    // InternalEssentialOCL.g:9738:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
     public final void rule__NavigatingSemiArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9740:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
-            // InternalEssentialOCL.g:9741:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
+            // InternalEssentialOCL.g:9742:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
+            // InternalEssentialOCL.g:9743:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_20);
             rule__NavigatingSemiArgCS__Group_2__1__Impl();
@@ -28648,23 +28648,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:9748:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalEssentialOCL.g:9750:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9752:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalEssentialOCL.g:9753:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalEssentialOCL.g:9754:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:9755:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalEssentialOCL.g:9753:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalEssentialOCL.g:9754:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalEssentialOCL.g:9755:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalEssentialOCL.g:9756:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalEssentialOCL.g:9755:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
-            // InternalEssentialOCL.g:9755:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
+            // InternalEssentialOCL.g:9757:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalEssentialOCL.g:9757:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1();
@@ -28699,14 +28699,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2"
-    // InternalEssentialOCL.g:9765:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
+    // InternalEssentialOCL.g:9767:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9769:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
-            // InternalEssentialOCL.g:9770:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
+            // InternalEssentialOCL.g:9771:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
+            // InternalEssentialOCL.g:9772:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2__2__Impl();
@@ -28732,22 +28732,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2__Impl"
-    // InternalEssentialOCL.g:9776:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
+    // InternalEssentialOCL.g:9778:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9780:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
-            // InternalEssentialOCL.g:9781:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalEssentialOCL.g:9782:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
+            // InternalEssentialOCL.g:9783:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
             {
-            // InternalEssentialOCL.g:9781:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
-            // InternalEssentialOCL.g:9782:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalEssentialOCL.g:9783:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalEssentialOCL.g:9784:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
             }
-            // InternalEssentialOCL.g:9783:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalEssentialOCL.g:9785:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             int alt77=2;
             int LA77_0 = input.LA(1);
 
@@ -28756,7 +28756,7 @@
             }
             switch (alt77) {
                 case 1 :
-                    // InternalEssentialOCL.g:9783:2: rule__NavigatingSemiArgCS__Group_2_2__0
+                    // InternalEssentialOCL.g:9785:2: rule__NavigatingSemiArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2_2__0();
@@ -28794,14 +28794,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0"
-    // InternalEssentialOCL.g:9799:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
+    // InternalEssentialOCL.g:9801:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9803:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
-            // InternalEssentialOCL.g:9804:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
+            // InternalEssentialOCL.g:9805:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
+            // InternalEssentialOCL.g:9806:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NavigatingSemiArgCS__Group_2_2__0__Impl();
@@ -28832,17 +28832,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0__Impl"
-    // InternalEssentialOCL.g:9811:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:9813:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9815:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:9816:1: ( '=' )
+            // InternalEssentialOCL.g:9817:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:9818:1: ( '=' )
             {
-            // InternalEssentialOCL.g:9816:1: ( '=' )
-            // InternalEssentialOCL.g:9817:1: '='
+            // InternalEssentialOCL.g:9818:1: ( '=' )
+            // InternalEssentialOCL.g:9819:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -28873,14 +28873,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1"
-    // InternalEssentialOCL.g:9830:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
+    // InternalEssentialOCL.g:9832:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9834:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
-            // InternalEssentialOCL.g:9835:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
+            // InternalEssentialOCL.g:9836:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
+            // InternalEssentialOCL.g:9837:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2_2__1__Impl();
@@ -28906,23 +28906,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1__Impl"
-    // InternalEssentialOCL.g:9841:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalEssentialOCL.g:9843:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9845:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalEssentialOCL.g:9846:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalEssentialOCL.g:9847:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalEssentialOCL.g:9848:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalEssentialOCL.g:9846:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalEssentialOCL.g:9847:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalEssentialOCL.g:9848:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalEssentialOCL.g:9849:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalEssentialOCL.g:9848:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalEssentialOCL.g:9848:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalEssentialOCL.g:9850:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalEssentialOCL.g:9850:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -28957,14 +28957,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0"
-    // InternalEssentialOCL.g:9862:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
+    // InternalEssentialOCL.g:9864:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
     public final void rule__CoIteratorVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9866:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
-            // InternalEssentialOCL.g:9867:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
+            // InternalEssentialOCL.g:9868:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
+            // InternalEssentialOCL.g:9869:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__CoIteratorVariableCS__Group__0__Impl();
@@ -28995,23 +28995,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0__Impl"
-    // InternalEssentialOCL.g:9874:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:9876:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
     public final void rule__CoIteratorVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9878:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:9879:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:9880:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:9881:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:9879:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:9880:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:9881:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:9882:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:9881:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:9881:2: rule__CoIteratorVariableCS__NameAssignment_0
+            // InternalEssentialOCL.g:9883:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:9883:2: rule__CoIteratorVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__NameAssignment_0();
@@ -29046,14 +29046,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1"
-    // InternalEssentialOCL.g:9891:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:9893:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9895:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
-            // InternalEssentialOCL.g:9896:2: rule__CoIteratorVariableCS__Group__1__Impl
+            // InternalEssentialOCL.g:9897:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
+            // InternalEssentialOCL.g:9898:2: rule__CoIteratorVariableCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group__1__Impl();
@@ -29079,22 +29079,22 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1__Impl"
-    // InternalEssentialOCL.g:9902:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:9904:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
     public final void rule__CoIteratorVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9906:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:9907:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:9908:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:9909:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:9907:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:9908:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalEssentialOCL.g:9909:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:9910:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:9909:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalEssentialOCL.g:9911:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             int alt78=2;
             int LA78_0 = input.LA(1);
 
@@ -29103,7 +29103,7 @@
             }
             switch (alt78) {
                 case 1 :
-                    // InternalEssentialOCL.g:9909:2: rule__CoIteratorVariableCS__Group_1__0
+                    // InternalEssentialOCL.g:9911:2: rule__CoIteratorVariableCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CoIteratorVariableCS__Group_1__0();
@@ -29141,14 +29141,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0"
-    // InternalEssentialOCL.g:9923:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
+    // InternalEssentialOCL.g:9925:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
     public final void rule__CoIteratorVariableCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9927:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
-            // InternalEssentialOCL.g:9928:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
+            // InternalEssentialOCL.g:9929:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
+            // InternalEssentialOCL.g:9930:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__CoIteratorVariableCS__Group_1__0__Impl();
@@ -29179,17 +29179,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:9935:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:9937:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__CoIteratorVariableCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9939:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:9940:1: ( ':' )
+            // InternalEssentialOCL.g:9941:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:9942:1: ( ':' )
             {
-            // InternalEssentialOCL.g:9940:1: ( ':' )
-            // InternalEssentialOCL.g:9941:1: ':'
+            // InternalEssentialOCL.g:9942:1: ( ':' )
+            // InternalEssentialOCL.g:9943:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
@@ -29220,14 +29220,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1"
-    // InternalEssentialOCL.g:9954:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:9956:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9958:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:9959:2: rule__CoIteratorVariableCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:9960:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:9961:2: rule__CoIteratorVariableCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group_1__1__Impl();
@@ -29253,23 +29253,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:9965:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:9967:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CoIteratorVariableCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9969:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:9970:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:9971:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:9972:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:9970:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
-            // InternalEssentialOCL.g:9971:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:9972:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalEssentialOCL.g:9973:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalEssentialOCL.g:9972:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
-            // InternalEssentialOCL.g:9972:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
+            // InternalEssentialOCL.g:9974:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalEssentialOCL.g:9974:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1();
@@ -29304,14 +29304,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0"
-    // InternalEssentialOCL.g:9986:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
+    // InternalEssentialOCL.g:9988:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
     public final void rule__IfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:9990:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
-            // InternalEssentialOCL.g:9991:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
+            // InternalEssentialOCL.g:9992:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
+            // InternalEssentialOCL.g:9993:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__IfExpCS__Group__0__Impl();
@@ -29342,17 +29342,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:9998:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
+    // InternalEssentialOCL.g:10000:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
     public final void rule__IfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10002:1: ( ( 'if' ) )
-            // InternalEssentialOCL.g:10003:1: ( 'if' )
+            // InternalEssentialOCL.g:10004:1: ( ( 'if' ) )
+            // InternalEssentialOCL.g:10005:1: ( 'if' )
             {
-            // InternalEssentialOCL.g:10003:1: ( 'if' )
-            // InternalEssentialOCL.g:10004:1: 'if'
+            // InternalEssentialOCL.g:10005:1: ( 'if' )
+            // InternalEssentialOCL.g:10006:1: 'if'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
@@ -29383,14 +29383,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1"
-    // InternalEssentialOCL.g:10017:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
+    // InternalEssentialOCL.g:10019:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
     public final void rule__IfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10021:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
-            // InternalEssentialOCL.g:10022:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
+            // InternalEssentialOCL.g:10023:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
+            // InternalEssentialOCL.g:10024:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__IfExpCS__Group__1__Impl();
@@ -29421,23 +29421,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:10029:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:10031:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__IfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10033:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalEssentialOCL.g:10034:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalEssentialOCL.g:10035:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:10036:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:10034:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
-            // InternalEssentialOCL.g:10035:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalEssentialOCL.g:10036:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalEssentialOCL.g:10037:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalEssentialOCL.g:10036:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
-            // InternalEssentialOCL.g:10036:2: rule__IfExpCS__OwnedConditionAssignment_1
+            // InternalEssentialOCL.g:10038:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalEssentialOCL.g:10038:2: rule__IfExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAssignment_1();
@@ -29472,14 +29472,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2"
-    // InternalEssentialOCL.g:10046:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
+    // InternalEssentialOCL.g:10048:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
     public final void rule__IfExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10050:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
-            // InternalEssentialOCL.g:10051:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
+            // InternalEssentialOCL.g:10052:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
+            // InternalEssentialOCL.g:10053:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__IfExpCS__Group__2__Impl();
@@ -29510,17 +29510,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:10058:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalEssentialOCL.g:10060:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__IfExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10062:1: ( ( 'then' ) )
-            // InternalEssentialOCL.g:10063:1: ( 'then' )
+            // InternalEssentialOCL.g:10064:1: ( ( 'then' ) )
+            // InternalEssentialOCL.g:10065:1: ( 'then' )
             {
-            // InternalEssentialOCL.g:10063:1: ( 'then' )
-            // InternalEssentialOCL.g:10064:1: 'then'
+            // InternalEssentialOCL.g:10065:1: ( 'then' )
+            // InternalEssentialOCL.g:10066:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
@@ -29551,14 +29551,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3"
-    // InternalEssentialOCL.g:10077:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
+    // InternalEssentialOCL.g:10079:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
     public final void rule__IfExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10081:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
-            // InternalEssentialOCL.g:10082:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
+            // InternalEssentialOCL.g:10083:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
+            // InternalEssentialOCL.g:10084:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__IfExpCS__Group__3__Impl();
@@ -29589,23 +29589,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:10089:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalEssentialOCL.g:10091:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__IfExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10093:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalEssentialOCL.g:10094:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalEssentialOCL.g:10095:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalEssentialOCL.g:10096:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalEssentialOCL.g:10094:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalEssentialOCL.g:10095:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalEssentialOCL.g:10096:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalEssentialOCL.g:10097:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalEssentialOCL.g:10096:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalEssentialOCL.g:10096:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
+            // InternalEssentialOCL.g:10098:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalEssentialOCL.g:10098:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedThenExpressionAssignment_3();
@@ -29640,14 +29640,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4"
-    // InternalEssentialOCL.g:10106:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
+    // InternalEssentialOCL.g:10108:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
     public final void rule__IfExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10110:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
-            // InternalEssentialOCL.g:10111:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
+            // InternalEssentialOCL.g:10112:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
+            // InternalEssentialOCL.g:10113:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__IfExpCS__Group__4__Impl();
@@ -29678,22 +29678,22 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4__Impl"
-    // InternalEssentialOCL.g:10118:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
+    // InternalEssentialOCL.g:10120:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
     public final void rule__IfExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10122:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
-            // InternalEssentialOCL.g:10123:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalEssentialOCL.g:10124:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
+            // InternalEssentialOCL.g:10125:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
             {
-            // InternalEssentialOCL.g:10123:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
-            // InternalEssentialOCL.g:10124:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalEssentialOCL.g:10125:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalEssentialOCL.g:10126:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
             }
-            // InternalEssentialOCL.g:10125:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalEssentialOCL.g:10127:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             loop79:
             do {
                 int alt79=2;
@@ -29706,7 +29706,7 @@
 
                 switch (alt79) {
             	case 1 :
-            	    // InternalEssentialOCL.g:10125:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
+            	    // InternalEssentialOCL.g:10127:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
             	    {
             	    pushFollow(FollowSets000.FOLLOW_46);
             	    rule__IfExpCS__OwnedIfThenExpressionsAssignment_4();
@@ -29747,14 +29747,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5"
-    // InternalEssentialOCL.g:10135:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
+    // InternalEssentialOCL.g:10137:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
     public final void rule__IfExpCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10139:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
-            // InternalEssentialOCL.g:10140:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
+            // InternalEssentialOCL.g:10141:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
+            // InternalEssentialOCL.g:10142:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__IfExpCS__Group__5__Impl();
@@ -29785,17 +29785,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5__Impl"
-    // InternalEssentialOCL.g:10147:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
+    // InternalEssentialOCL.g:10149:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
     public final void rule__IfExpCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10151:1: ( ( 'else' ) )
-            // InternalEssentialOCL.g:10152:1: ( 'else' )
+            // InternalEssentialOCL.g:10153:1: ( ( 'else' ) )
+            // InternalEssentialOCL.g:10154:1: ( 'else' )
             {
-            // InternalEssentialOCL.g:10152:1: ( 'else' )
-            // InternalEssentialOCL.g:10153:1: 'else'
+            // InternalEssentialOCL.g:10154:1: ( 'else' )
+            // InternalEssentialOCL.g:10155:1: 'else'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
@@ -29826,14 +29826,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6"
-    // InternalEssentialOCL.g:10166:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
+    // InternalEssentialOCL.g:10168:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
     public final void rule__IfExpCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10170:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
-            // InternalEssentialOCL.g:10171:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
+            // InternalEssentialOCL.g:10172:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
+            // InternalEssentialOCL.g:10173:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_47);
             rule__IfExpCS__Group__6__Impl();
@@ -29864,23 +29864,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6__Impl"
-    // InternalEssentialOCL.g:10178:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
+    // InternalEssentialOCL.g:10180:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
     public final void rule__IfExpCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10182:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
-            // InternalEssentialOCL.g:10183:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalEssentialOCL.g:10184:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
+            // InternalEssentialOCL.g:10185:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
             {
-            // InternalEssentialOCL.g:10183:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
-            // InternalEssentialOCL.g:10184:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalEssentialOCL.g:10185:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalEssentialOCL.g:10186:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
             }
-            // InternalEssentialOCL.g:10185:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
-            // InternalEssentialOCL.g:10185:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
+            // InternalEssentialOCL.g:10187:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalEssentialOCL.g:10187:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedElseExpressionAssignment_6();
@@ -29915,14 +29915,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7"
-    // InternalEssentialOCL.g:10195:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
+    // InternalEssentialOCL.g:10197:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
     public final void rule__IfExpCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10199:1: ( rule__IfExpCS__Group__7__Impl )
-            // InternalEssentialOCL.g:10200:2: rule__IfExpCS__Group__7__Impl
+            // InternalEssentialOCL.g:10201:1: ( rule__IfExpCS__Group__7__Impl )
+            // InternalEssentialOCL.g:10202:2: rule__IfExpCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__Group__7__Impl();
@@ -29948,17 +29948,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7__Impl"
-    // InternalEssentialOCL.g:10206:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
+    // InternalEssentialOCL.g:10208:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
     public final void rule__IfExpCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10210:1: ( ( 'endif' ) )
-            // InternalEssentialOCL.g:10211:1: ( 'endif' )
+            // InternalEssentialOCL.g:10212:1: ( ( 'endif' ) )
+            // InternalEssentialOCL.g:10213:1: ( 'endif' )
             {
-            // InternalEssentialOCL.g:10211:1: ( 'endif' )
-            // InternalEssentialOCL.g:10212:1: 'endif'
+            // InternalEssentialOCL.g:10213:1: ( 'endif' )
+            // InternalEssentialOCL.g:10214:1: 'endif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
@@ -29989,14 +29989,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0"
-    // InternalEssentialOCL.g:10241:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
+    // InternalEssentialOCL.g:10243:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
     public final void rule__ElseIfThenExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10245:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
-            // InternalEssentialOCL.g:10246:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
+            // InternalEssentialOCL.g:10247:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
+            // InternalEssentialOCL.g:10248:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__ElseIfThenExpCS__Group__0__Impl();
@@ -30027,17 +30027,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:10253:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
+    // InternalEssentialOCL.g:10255:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
     public final void rule__ElseIfThenExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10257:1: ( ( 'elseif' ) )
-            // InternalEssentialOCL.g:10258:1: ( 'elseif' )
+            // InternalEssentialOCL.g:10259:1: ( ( 'elseif' ) )
+            // InternalEssentialOCL.g:10260:1: ( 'elseif' )
             {
-            // InternalEssentialOCL.g:10258:1: ( 'elseif' )
-            // InternalEssentialOCL.g:10259:1: 'elseif'
+            // InternalEssentialOCL.g:10260:1: ( 'elseif' )
+            // InternalEssentialOCL.g:10261:1: 'elseif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
@@ -30068,14 +30068,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1"
-    // InternalEssentialOCL.g:10272:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
+    // InternalEssentialOCL.g:10274:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
     public final void rule__ElseIfThenExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10276:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
-            // InternalEssentialOCL.g:10277:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
+            // InternalEssentialOCL.g:10278:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
+            // InternalEssentialOCL.g:10279:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__ElseIfThenExpCS__Group__1__Impl();
@@ -30106,23 +30106,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:10284:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:10286:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10288:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalEssentialOCL.g:10289:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalEssentialOCL.g:10290:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:10291:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:10289:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
-            // InternalEssentialOCL.g:10290:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalEssentialOCL.g:10291:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalEssentialOCL.g:10292:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalEssentialOCL.g:10291:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
-            // InternalEssentialOCL.g:10291:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
+            // InternalEssentialOCL.g:10293:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalEssentialOCL.g:10293:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedConditionAssignment_1();
@@ -30157,14 +30157,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2"
-    // InternalEssentialOCL.g:10301:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
+    // InternalEssentialOCL.g:10303:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
     public final void rule__ElseIfThenExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10305:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
-            // InternalEssentialOCL.g:10306:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
+            // InternalEssentialOCL.g:10307:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
+            // InternalEssentialOCL.g:10308:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__ElseIfThenExpCS__Group__2__Impl();
@@ -30195,17 +30195,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:10313:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalEssentialOCL.g:10315:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__ElseIfThenExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10317:1: ( ( 'then' ) )
-            // InternalEssentialOCL.g:10318:1: ( 'then' )
+            // InternalEssentialOCL.g:10319:1: ( ( 'then' ) )
+            // InternalEssentialOCL.g:10320:1: ( 'then' )
             {
-            // InternalEssentialOCL.g:10318:1: ( 'then' )
-            // InternalEssentialOCL.g:10319:1: 'then'
+            // InternalEssentialOCL.g:10320:1: ( 'then' )
+            // InternalEssentialOCL.g:10321:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
@@ -30236,14 +30236,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3"
-    // InternalEssentialOCL.g:10332:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:10334:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
     public final void rule__ElseIfThenExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10336:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
-            // InternalEssentialOCL.g:10337:2: rule__ElseIfThenExpCS__Group__3__Impl
+            // InternalEssentialOCL.g:10338:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
+            // InternalEssentialOCL.g:10339:2: rule__ElseIfThenExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__Group__3__Impl();
@@ -30269,23 +30269,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:10343:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalEssentialOCL.g:10345:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10347:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalEssentialOCL.g:10348:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalEssentialOCL.g:10349:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalEssentialOCL.g:10350:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalEssentialOCL.g:10348:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalEssentialOCL.g:10349:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalEssentialOCL.g:10350:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalEssentialOCL.g:10351:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalEssentialOCL.g:10350:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalEssentialOCL.g:10350:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
+            // InternalEssentialOCL.g:10352:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalEssentialOCL.g:10352:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3();
@@ -30320,14 +30320,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0"
-    // InternalEssentialOCL.g:10368:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
+    // InternalEssentialOCL.g:10370:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
     public final void rule__LetExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10372:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
-            // InternalEssentialOCL.g:10373:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
+            // InternalEssentialOCL.g:10374:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
+            // InternalEssentialOCL.g:10375:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LetExpCS__Group__0__Impl();
@@ -30358,17 +30358,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:10380:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
+    // InternalEssentialOCL.g:10382:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
     public final void rule__LetExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10384:1: ( ( 'let' ) )
-            // InternalEssentialOCL.g:10385:1: ( 'let' )
+            // InternalEssentialOCL.g:10386:1: ( ( 'let' ) )
+            // InternalEssentialOCL.g:10387:1: ( 'let' )
             {
-            // InternalEssentialOCL.g:10385:1: ( 'let' )
-            // InternalEssentialOCL.g:10386:1: 'let'
+            // InternalEssentialOCL.g:10387:1: ( 'let' )
+            // InternalEssentialOCL.g:10388:1: 'let'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
@@ -30399,14 +30399,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1"
-    // InternalEssentialOCL.g:10399:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
+    // InternalEssentialOCL.g:10401:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
     public final void rule__LetExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10403:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
-            // InternalEssentialOCL.g:10404:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
+            // InternalEssentialOCL.g:10405:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
+            // InternalEssentialOCL.g:10406:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__LetExpCS__Group__1__Impl();
@@ -30437,23 +30437,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:10411:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:10413:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
     public final void rule__LetExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10415:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
-            // InternalEssentialOCL.g:10416:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalEssentialOCL.g:10417:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
+            // InternalEssentialOCL.g:10418:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:10416:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
-            // InternalEssentialOCL.g:10417:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalEssentialOCL.g:10418:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalEssentialOCL.g:10419:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
             }
-            // InternalEssentialOCL.g:10418:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
-            // InternalEssentialOCL.g:10418:2: rule__LetExpCS__OwnedVariablesAssignment_1
+            // InternalEssentialOCL.g:10420:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalEssentialOCL.g:10420:2: rule__LetExpCS__OwnedVariablesAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_1();
@@ -30488,14 +30488,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2"
-    // InternalEssentialOCL.g:10428:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
+    // InternalEssentialOCL.g:10430:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
     public final void rule__LetExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10432:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
-            // InternalEssentialOCL.g:10433:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
+            // InternalEssentialOCL.g:10434:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
+            // InternalEssentialOCL.g:10435:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__LetExpCS__Group__2__Impl();
@@ -30526,22 +30526,22 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:10440:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
+    // InternalEssentialOCL.g:10442:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
     public final void rule__LetExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10444:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
-            // InternalEssentialOCL.g:10445:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalEssentialOCL.g:10446:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
+            // InternalEssentialOCL.g:10447:1: ( ( rule__LetExpCS__Group_2__0 )* )
             {
-            // InternalEssentialOCL.g:10445:1: ( ( rule__LetExpCS__Group_2__0 )* )
-            // InternalEssentialOCL.g:10446:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalEssentialOCL.g:10447:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalEssentialOCL.g:10448:1: ( rule__LetExpCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:10447:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalEssentialOCL.g:10449:1: ( rule__LetExpCS__Group_2__0 )*
             loop80:
             do {
                 int alt80=2;
@@ -30554,7 +30554,7 @@
 
                 switch (alt80) {
             	case 1 :
-            	    // InternalEssentialOCL.g:10447:2: rule__LetExpCS__Group_2__0
+            	    // InternalEssentialOCL.g:10449:2: rule__LetExpCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__LetExpCS__Group_2__0();
@@ -30595,14 +30595,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3"
-    // InternalEssentialOCL.g:10457:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
+    // InternalEssentialOCL.g:10459:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
     public final void rule__LetExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10461:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
-            // InternalEssentialOCL.g:10462:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
+            // InternalEssentialOCL.g:10463:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
+            // InternalEssentialOCL.g:10464:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__LetExpCS__Group__3__Impl();
@@ -30633,17 +30633,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3__Impl"
-    // InternalEssentialOCL.g:10469:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
+    // InternalEssentialOCL.g:10471:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
     public final void rule__LetExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10473:1: ( ( 'in' ) )
-            // InternalEssentialOCL.g:10474:1: ( 'in' )
+            // InternalEssentialOCL.g:10475:1: ( ( 'in' ) )
+            // InternalEssentialOCL.g:10476:1: ( 'in' )
             {
-            // InternalEssentialOCL.g:10474:1: ( 'in' )
-            // InternalEssentialOCL.g:10475:1: 'in'
+            // InternalEssentialOCL.g:10476:1: ( 'in' )
+            // InternalEssentialOCL.g:10477:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getInKeyword_3());
@@ -30674,14 +30674,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4"
-    // InternalEssentialOCL.g:10488:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
+    // InternalEssentialOCL.g:10490:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
     public final void rule__LetExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10492:1: ( rule__LetExpCS__Group__4__Impl )
-            // InternalEssentialOCL.g:10493:2: rule__LetExpCS__Group__4__Impl
+            // InternalEssentialOCL.g:10494:1: ( rule__LetExpCS__Group__4__Impl )
+            // InternalEssentialOCL.g:10495:2: rule__LetExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group__4__Impl();
@@ -30707,23 +30707,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4__Impl"
-    // InternalEssentialOCL.g:10499:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
+    // InternalEssentialOCL.g:10501:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
     public final void rule__LetExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10503:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
-            // InternalEssentialOCL.g:10504:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalEssentialOCL.g:10505:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
+            // InternalEssentialOCL.g:10506:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
             {
-            // InternalEssentialOCL.g:10504:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
-            // InternalEssentialOCL.g:10505:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalEssentialOCL.g:10506:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalEssentialOCL.g:10507:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
             }
-            // InternalEssentialOCL.g:10506:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
-            // InternalEssentialOCL.g:10506:2: rule__LetExpCS__OwnedInExpressionAssignment_4
+            // InternalEssentialOCL.g:10508:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalEssentialOCL.g:10508:2: rule__LetExpCS__OwnedInExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedInExpressionAssignment_4();
@@ -30758,14 +30758,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0"
-    // InternalEssentialOCL.g:10526:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
+    // InternalEssentialOCL.g:10528:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
     public final void rule__LetExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10530:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
-            // InternalEssentialOCL.g:10531:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
+            // InternalEssentialOCL.g:10532:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
+            // InternalEssentialOCL.g:10533:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LetExpCS__Group_2__0__Impl();
@@ -30796,17 +30796,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:10538:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:10540:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__LetExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10542:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:10543:1: ( ',' )
+            // InternalEssentialOCL.g:10544:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:10545:1: ( ',' )
             {
-            // InternalEssentialOCL.g:10543:1: ( ',' )
-            // InternalEssentialOCL.g:10544:1: ','
+            // InternalEssentialOCL.g:10545:1: ( ',' )
+            // InternalEssentialOCL.g:10546:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
@@ -30837,14 +30837,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1"
-    // InternalEssentialOCL.g:10557:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:10559:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
     public final void rule__LetExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10561:1: ( rule__LetExpCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:10562:2: rule__LetExpCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:10563:1: ( rule__LetExpCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:10564:2: rule__LetExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group_2__1__Impl();
@@ -30870,23 +30870,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:10568:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
+    // InternalEssentialOCL.g:10570:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
     public final void rule__LetExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10572:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
-            // InternalEssentialOCL.g:10573:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalEssentialOCL.g:10574:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:10575:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
             {
-            // InternalEssentialOCL.g:10573:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
-            // InternalEssentialOCL.g:10574:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalEssentialOCL.g:10575:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalEssentialOCL.g:10576:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
             }
-            // InternalEssentialOCL.g:10575:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
-            // InternalEssentialOCL.g:10575:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
+            // InternalEssentialOCL.g:10577:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalEssentialOCL.g:10577:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_2_1();
@@ -30921,14 +30921,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0"
-    // InternalEssentialOCL.g:10589:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
+    // InternalEssentialOCL.g:10591:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
     public final void rule__LetVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10593:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
-            // InternalEssentialOCL.g:10594:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
+            // InternalEssentialOCL.g:10595:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
+            // InternalEssentialOCL.g:10596:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__LetVariableCS__Group__0__Impl();
@@ -30959,23 +30959,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0__Impl"
-    // InternalEssentialOCL.g:10601:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:10603:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
     public final void rule__LetVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10605:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:10606:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:10607:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:10608:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:10606:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:10607:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:10608:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:10609:1: ( rule__LetVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:10608:1: ( rule__LetVariableCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:10608:2: rule__LetVariableCS__NameAssignment_0
+            // InternalEssentialOCL.g:10610:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:10610:2: rule__LetVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__NameAssignment_0();
@@ -31010,14 +31010,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1"
-    // InternalEssentialOCL.g:10618:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
+    // InternalEssentialOCL.g:10620:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
     public final void rule__LetVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10622:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
-            // InternalEssentialOCL.g:10623:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
+            // InternalEssentialOCL.g:10624:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
+            // InternalEssentialOCL.g:10625:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__LetVariableCS__Group__1__Impl();
@@ -31048,22 +31048,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1__Impl"
-    // InternalEssentialOCL.g:10630:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
+    // InternalEssentialOCL.g:10632:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
     public final void rule__LetVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10634:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
-            // InternalEssentialOCL.g:10635:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalEssentialOCL.g:10636:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
+            // InternalEssentialOCL.g:10637:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
             {
-            // InternalEssentialOCL.g:10635:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
-            // InternalEssentialOCL.g:10636:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalEssentialOCL.g:10637:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalEssentialOCL.g:10638:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
             }
-            // InternalEssentialOCL.g:10637:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalEssentialOCL.g:10639:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             int alt81=2;
             int LA81_0 = input.LA(1);
 
@@ -31072,7 +31072,7 @@
             }
             switch (alt81) {
                 case 1 :
-                    // InternalEssentialOCL.g:10637:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
+                    // InternalEssentialOCL.g:10639:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1();
@@ -31110,14 +31110,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2"
-    // InternalEssentialOCL.g:10647:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
+    // InternalEssentialOCL.g:10649:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
     public final void rule__LetVariableCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10651:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
-            // InternalEssentialOCL.g:10652:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
+            // InternalEssentialOCL.g:10653:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
+            // InternalEssentialOCL.g:10654:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__LetVariableCS__Group__2__Impl();
@@ -31148,22 +31148,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2__Impl"
-    // InternalEssentialOCL.g:10659:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:10661:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
     public final void rule__LetVariableCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10663:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:10664:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:10665:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:10666:1: ( ( rule__LetVariableCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:10664:1: ( ( rule__LetVariableCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:10665:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalEssentialOCL.g:10666:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:10667:1: ( rule__LetVariableCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:10666:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalEssentialOCL.g:10668:1: ( rule__LetVariableCS__Group_2__0 )?
             int alt82=2;
             int LA82_0 = input.LA(1);
 
@@ -31172,7 +31172,7 @@
             }
             switch (alt82) {
                 case 1 :
-                    // InternalEssentialOCL.g:10666:2: rule__LetVariableCS__Group_2__0
+                    // InternalEssentialOCL.g:10668:2: rule__LetVariableCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__Group_2__0();
@@ -31210,14 +31210,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3"
-    // InternalEssentialOCL.g:10676:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
+    // InternalEssentialOCL.g:10678:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
     public final void rule__LetVariableCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10680:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
-            // InternalEssentialOCL.g:10681:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
+            // InternalEssentialOCL.g:10682:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
+            // InternalEssentialOCL.g:10683:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__LetVariableCS__Group__3__Impl();
@@ -31248,17 +31248,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3__Impl"
-    // InternalEssentialOCL.g:10688:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
+    // InternalEssentialOCL.g:10690:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
     public final void rule__LetVariableCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10692:1: ( ( '=' ) )
-            // InternalEssentialOCL.g:10693:1: ( '=' )
+            // InternalEssentialOCL.g:10694:1: ( ( '=' ) )
+            // InternalEssentialOCL.g:10695:1: ( '=' )
             {
-            // InternalEssentialOCL.g:10693:1: ( '=' )
-            // InternalEssentialOCL.g:10694:1: '='
+            // InternalEssentialOCL.g:10695:1: ( '=' )
+            // InternalEssentialOCL.g:10696:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
@@ -31289,14 +31289,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4"
-    // InternalEssentialOCL.g:10707:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
+    // InternalEssentialOCL.g:10709:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
     public final void rule__LetVariableCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10711:1: ( rule__LetVariableCS__Group__4__Impl )
-            // InternalEssentialOCL.g:10712:2: rule__LetVariableCS__Group__4__Impl
+            // InternalEssentialOCL.g:10713:1: ( rule__LetVariableCS__Group__4__Impl )
+            // InternalEssentialOCL.g:10714:2: rule__LetVariableCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group__4__Impl();
@@ -31322,23 +31322,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4__Impl"
-    // InternalEssentialOCL.g:10718:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
+    // InternalEssentialOCL.g:10720:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
     public final void rule__LetVariableCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10722:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
-            // InternalEssentialOCL.g:10723:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalEssentialOCL.g:10724:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
+            // InternalEssentialOCL.g:10725:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
             {
-            // InternalEssentialOCL.g:10723:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
-            // InternalEssentialOCL.g:10724:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalEssentialOCL.g:10725:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalEssentialOCL.g:10726:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
             }
-            // InternalEssentialOCL.g:10725:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
-            // InternalEssentialOCL.g:10725:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
+            // InternalEssentialOCL.g:10727:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalEssentialOCL.g:10727:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedInitExpressionAssignment_4();
@@ -31373,14 +31373,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0"
-    // InternalEssentialOCL.g:10745:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
+    // InternalEssentialOCL.g:10747:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
     public final void rule__LetVariableCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10749:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
-            // InternalEssentialOCL.g:10750:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
+            // InternalEssentialOCL.g:10751:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
+            // InternalEssentialOCL.g:10752:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__LetVariableCS__Group_2__0__Impl();
@@ -31411,17 +31411,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:10757:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalEssentialOCL.g:10759:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__LetVariableCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10761:1: ( ( ':' ) )
-            // InternalEssentialOCL.g:10762:1: ( ':' )
+            // InternalEssentialOCL.g:10763:1: ( ( ':' ) )
+            // InternalEssentialOCL.g:10764:1: ( ':' )
             {
-            // InternalEssentialOCL.g:10762:1: ( ':' )
-            // InternalEssentialOCL.g:10763:1: ':'
+            // InternalEssentialOCL.g:10764:1: ( ':' )
+            // InternalEssentialOCL.g:10765:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
@@ -31452,14 +31452,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1"
-    // InternalEssentialOCL.g:10776:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:10778:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
     public final void rule__LetVariableCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10780:1: ( rule__LetVariableCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:10781:2: rule__LetVariableCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:10782:1: ( rule__LetVariableCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:10783:2: rule__LetVariableCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group_2__1__Impl();
@@ -31485,23 +31485,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:10787:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalEssentialOCL.g:10789:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__LetVariableCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10791:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalEssentialOCL.g:10792:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalEssentialOCL.g:10793:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:10794:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalEssentialOCL.g:10792:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
-            // InternalEssentialOCL.g:10793:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalEssentialOCL.g:10794:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalEssentialOCL.g:10795:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalEssentialOCL.g:10794:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
-            // InternalEssentialOCL.g:10794:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
+            // InternalEssentialOCL.g:10796:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalEssentialOCL.g:10796:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedTypeAssignment_2_1();
@@ -31536,14 +31536,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0"
-    // InternalEssentialOCL.g:10808:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
+    // InternalEssentialOCL.g:10810:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
     public final void rule__NestedExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10812:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
-            // InternalEssentialOCL.g:10813:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
+            // InternalEssentialOCL.g:10814:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
+            // InternalEssentialOCL.g:10815:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__NestedExpCS__Group__0__Impl();
@@ -31574,17 +31574,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:10820:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
+    // InternalEssentialOCL.g:10822:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
     public final void rule__NestedExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10824:1: ( ( '(' ) )
-            // InternalEssentialOCL.g:10825:1: ( '(' )
+            // InternalEssentialOCL.g:10826:1: ( ( '(' ) )
+            // InternalEssentialOCL.g:10827:1: ( '(' )
             {
-            // InternalEssentialOCL.g:10825:1: ( '(' )
-            // InternalEssentialOCL.g:10826:1: '('
+            // InternalEssentialOCL.g:10827:1: ( '(' )
+            // InternalEssentialOCL.g:10828:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
@@ -31615,14 +31615,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1"
-    // InternalEssentialOCL.g:10839:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
+    // InternalEssentialOCL.g:10841:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
     public final void rule__NestedExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10843:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
-            // InternalEssentialOCL.g:10844:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
+            // InternalEssentialOCL.g:10845:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
+            // InternalEssentialOCL.g:10846:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__NestedExpCS__Group__1__Impl();
@@ -31653,23 +31653,23 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:10851:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
+    // InternalEssentialOCL.g:10853:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
     public final void rule__NestedExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10855:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
-            // InternalEssentialOCL.g:10856:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:10857:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalEssentialOCL.g:10858:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
             {
-            // InternalEssentialOCL.g:10856:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
-            // InternalEssentialOCL.g:10857:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalEssentialOCL.g:10858:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalEssentialOCL.g:10859:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
             }
-            // InternalEssentialOCL.g:10858:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
-            // InternalEssentialOCL.g:10858:2: rule__NestedExpCS__OwnedExpressionAssignment_1
+            // InternalEssentialOCL.g:10860:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalEssentialOCL.g:10860:2: rule__NestedExpCS__OwnedExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__OwnedExpressionAssignment_1();
@@ -31704,14 +31704,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2"
-    // InternalEssentialOCL.g:10868:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:10870:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
     public final void rule__NestedExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10872:1: ( rule__NestedExpCS__Group__2__Impl )
-            // InternalEssentialOCL.g:10873:2: rule__NestedExpCS__Group__2__Impl
+            // InternalEssentialOCL.g:10874:1: ( rule__NestedExpCS__Group__2__Impl )
+            // InternalEssentialOCL.g:10875:2: rule__NestedExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__Group__2__Impl();
@@ -31737,17 +31737,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2__Impl"
-    // InternalEssentialOCL.g:10879:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
+    // InternalEssentialOCL.g:10881:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
     public final void rule__NestedExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10883:1: ( ( ')' ) )
-            // InternalEssentialOCL.g:10884:1: ( ')' )
+            // InternalEssentialOCL.g:10885:1: ( ( ')' ) )
+            // InternalEssentialOCL.g:10886:1: ( ')' )
             {
-            // InternalEssentialOCL.g:10884:1: ( ')' )
-            // InternalEssentialOCL.g:10885:1: ')'
+            // InternalEssentialOCL.g:10886:1: ( ')' )
+            // InternalEssentialOCL.g:10887:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
@@ -31778,14 +31778,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0"
-    // InternalEssentialOCL.g:10904:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
+    // InternalEssentialOCL.g:10906:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
     public final void rule__SelfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10908:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
-            // InternalEssentialOCL.g:10909:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
+            // InternalEssentialOCL.g:10910:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
+            // InternalEssentialOCL.g:10911:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__SelfExpCS__Group__0__Impl();
@@ -31816,23 +31816,23 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0__Impl"
-    // InternalEssentialOCL.g:10916:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:10918:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
     public final void rule__SelfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10920:1: ( ( () ) )
-            // InternalEssentialOCL.g:10921:1: ( () )
+            // InternalEssentialOCL.g:10922:1: ( ( () ) )
+            // InternalEssentialOCL.g:10923:1: ( () )
             {
-            // InternalEssentialOCL.g:10921:1: ( () )
-            // InternalEssentialOCL.g:10922:1: ()
+            // InternalEssentialOCL.g:10923:1: ( () )
+            // InternalEssentialOCL.g:10924:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
             }
-            // InternalEssentialOCL.g:10923:1: ()
-            // InternalEssentialOCL.g:10925:1:
+            // InternalEssentialOCL.g:10925:1: ()
+            // InternalEssentialOCL.g:10927:1:
             {
             }
 
@@ -31857,14 +31857,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1"
-    // InternalEssentialOCL.g:10935:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:10937:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
     public final void rule__SelfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10939:1: ( rule__SelfExpCS__Group__1__Impl )
-            // InternalEssentialOCL.g:10940:2: rule__SelfExpCS__Group__1__Impl
+            // InternalEssentialOCL.g:10941:1: ( rule__SelfExpCS__Group__1__Impl )
+            // InternalEssentialOCL.g:10942:2: rule__SelfExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SelfExpCS__Group__1__Impl();
@@ -31890,17 +31890,17 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1__Impl"
-    // InternalEssentialOCL.g:10946:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
+    // InternalEssentialOCL.g:10948:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
     public final void rule__SelfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10950:1: ( ( 'self' ) )
-            // InternalEssentialOCL.g:10951:1: ( 'self' )
+            // InternalEssentialOCL.g:10952:1: ( ( 'self' ) )
+            // InternalEssentialOCL.g:10953:1: ( 'self' )
             {
-            // InternalEssentialOCL.g:10951:1: ( 'self' )
-            // InternalEssentialOCL.g:10952:1: 'self'
+            // InternalEssentialOCL.g:10953:1: ( 'self' )
+            // InternalEssentialOCL.g:10954:1: 'self'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
@@ -31931,14 +31931,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0"
-    // InternalEssentialOCL.g:10969:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
+    // InternalEssentialOCL.g:10971:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
     public final void rule__MultiplicityBoundsCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10973:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
-            // InternalEssentialOCL.g:10974:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
+            // InternalEssentialOCL.g:10975:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
+            // InternalEssentialOCL.g:10976:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_17);
             rule__MultiplicityBoundsCS__Group__0__Impl();
@@ -31969,23 +31969,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0__Impl"
-    // InternalEssentialOCL.g:10981:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:10983:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:10985:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
-            // InternalEssentialOCL.g:10986:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalEssentialOCL.g:10987:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
+            // InternalEssentialOCL.g:10988:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:10986:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
-            // InternalEssentialOCL.g:10987:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalEssentialOCL.g:10988:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalEssentialOCL.g:10989:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
             }
-            // InternalEssentialOCL.g:10988:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
-            // InternalEssentialOCL.g:10988:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
+            // InternalEssentialOCL.g:10990:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalEssentialOCL.g:10990:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__LowerBoundAssignment_0();
@@ -32020,14 +32020,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1"
-    // InternalEssentialOCL.g:10998:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:11000:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11002:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
-            // InternalEssentialOCL.g:11003:2: rule__MultiplicityBoundsCS__Group__1__Impl
+            // InternalEssentialOCL.g:11004:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
+            // InternalEssentialOCL.g:11005:2: rule__MultiplicityBoundsCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group__1__Impl();
@@ -32053,22 +32053,22 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11009:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:11011:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
     public final void rule__MultiplicityBoundsCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11013:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:11014:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:11015:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:11016:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:11014:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:11015:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalEssentialOCL.g:11016:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:11017:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:11016:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalEssentialOCL.g:11018:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             int alt83=2;
             int LA83_0 = input.LA(1);
 
@@ -32077,7 +32077,7 @@
             }
             switch (alt83) {
                 case 1 :
-                    // InternalEssentialOCL.g:11016:2: rule__MultiplicityBoundsCS__Group_1__0
+                    // InternalEssentialOCL.g:11018:2: rule__MultiplicityBoundsCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityBoundsCS__Group_1__0();
@@ -32115,14 +32115,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0"
-    // InternalEssentialOCL.g:11030:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
+    // InternalEssentialOCL.g:11032:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
     public final void rule__MultiplicityBoundsCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11034:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
-            // InternalEssentialOCL.g:11035:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
+            // InternalEssentialOCL.g:11036:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
+            // InternalEssentialOCL.g:11037:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__MultiplicityBoundsCS__Group_1__0__Impl();
@@ -32153,17 +32153,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:11042:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
+    // InternalEssentialOCL.g:11044:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11046:1: ( ( '..' ) )
-            // InternalEssentialOCL.g:11047:1: ( '..' )
+            // InternalEssentialOCL.g:11048:1: ( ( '..' ) )
+            // InternalEssentialOCL.g:11049:1: ( '..' )
             {
-            // InternalEssentialOCL.g:11047:1: ( '..' )
-            // InternalEssentialOCL.g:11048:1: '..'
+            // InternalEssentialOCL.g:11049:1: ( '..' )
+            // InternalEssentialOCL.g:11050:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
@@ -32194,14 +32194,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1"
-    // InternalEssentialOCL.g:11061:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:11063:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11065:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:11066:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:11067:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:11068:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group_1__1__Impl();
@@ -32227,23 +32227,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:11072:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:11074:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11076:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:11077:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11078:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:11079:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:11077:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
-            // InternalEssentialOCL.g:11078:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalEssentialOCL.g:11079:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11080:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
             }
-            // InternalEssentialOCL.g:11079:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
-            // InternalEssentialOCL.g:11079:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
+            // InternalEssentialOCL.g:11081:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalEssentialOCL.g:11081:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1();
@@ -32278,14 +32278,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0"
-    // InternalEssentialOCL.g:11093:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
+    // InternalEssentialOCL.g:11095:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
     public final void rule__MultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11097:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
-            // InternalEssentialOCL.g:11098:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
+            // InternalEssentialOCL.g:11099:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
+            // InternalEssentialOCL.g:11100:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__MultiplicityCS__Group__0__Impl();
@@ -32316,17 +32316,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0__Impl"
-    // InternalEssentialOCL.g:11105:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
+    // InternalEssentialOCL.g:11107:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
     public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11109:1: ( ( '[' ) )
-            // InternalEssentialOCL.g:11110:1: ( '[' )
+            // InternalEssentialOCL.g:11111:1: ( ( '[' ) )
+            // InternalEssentialOCL.g:11112:1: ( '[' )
             {
-            // InternalEssentialOCL.g:11110:1: ( '[' )
-            // InternalEssentialOCL.g:11111:1: '['
+            // InternalEssentialOCL.g:11112:1: ( '[' )
+            // InternalEssentialOCL.g:11113:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
@@ -32357,14 +32357,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1"
-    // InternalEssentialOCL.g:11124:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
+    // InternalEssentialOCL.g:11126:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
     public final void rule__MultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11128:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
-            // InternalEssentialOCL.g:11129:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
+            // InternalEssentialOCL.g:11130:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
+            // InternalEssentialOCL.g:11131:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_53);
             rule__MultiplicityCS__Group__1__Impl();
@@ -32395,23 +32395,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11136:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
+    // InternalEssentialOCL.g:11138:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
     public final void rule__MultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11140:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
-            // InternalEssentialOCL.g:11141:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalEssentialOCL.g:11142:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
+            // InternalEssentialOCL.g:11143:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
             {
-            // InternalEssentialOCL.g:11141:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
-            // InternalEssentialOCL.g:11142:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalEssentialOCL.g:11143:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalEssentialOCL.g:11144:1: ( rule__MultiplicityCS__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
             }
-            // InternalEssentialOCL.g:11143:1: ( rule__MultiplicityCS__Alternatives_1 )
-            // InternalEssentialOCL.g:11143:2: rule__MultiplicityCS__Alternatives_1
+            // InternalEssentialOCL.g:11145:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalEssentialOCL.g:11145:2: rule__MultiplicityCS__Alternatives_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Alternatives_1();
@@ -32446,14 +32446,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2"
-    // InternalEssentialOCL.g:11153:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
+    // InternalEssentialOCL.g:11155:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
     public final void rule__MultiplicityCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11157:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
-            // InternalEssentialOCL.g:11158:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
+            // InternalEssentialOCL.g:11159:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
+            // InternalEssentialOCL.g:11160:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_53);
             rule__MultiplicityCS__Group__2__Impl();
@@ -32484,22 +32484,22 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2__Impl"
-    // InternalEssentialOCL.g:11165:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
+    // InternalEssentialOCL.g:11167:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
     public final void rule__MultiplicityCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11169:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
-            // InternalEssentialOCL.g:11170:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalEssentialOCL.g:11171:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
+            // InternalEssentialOCL.g:11172:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
             {
-            // InternalEssentialOCL.g:11170:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
-            // InternalEssentialOCL.g:11171:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalEssentialOCL.g:11172:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalEssentialOCL.g:11173:1: ( rule__MultiplicityCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
             }
-            // InternalEssentialOCL.g:11172:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalEssentialOCL.g:11174:1: ( rule__MultiplicityCS__Alternatives_2 )?
             int alt84=2;
             int LA84_0 = input.LA(1);
 
@@ -32508,7 +32508,7 @@
             }
             switch (alt84) {
                 case 1 :
-                    // InternalEssentialOCL.g:11172:2: rule__MultiplicityCS__Alternatives_2
+                    // InternalEssentialOCL.g:11174:2: rule__MultiplicityCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__Alternatives_2();
@@ -32546,14 +32546,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3"
-    // InternalEssentialOCL.g:11182:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
+    // InternalEssentialOCL.g:11184:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
     public final void rule__MultiplicityCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11186:1: ( rule__MultiplicityCS__Group__3__Impl )
-            // InternalEssentialOCL.g:11187:2: rule__MultiplicityCS__Group__3__Impl
+            // InternalEssentialOCL.g:11188:1: ( rule__MultiplicityCS__Group__3__Impl )
+            // InternalEssentialOCL.g:11189:2: rule__MultiplicityCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Group__3__Impl();
@@ -32579,17 +32579,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3__Impl"
-    // InternalEssentialOCL.g:11193:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
+    // InternalEssentialOCL.g:11195:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
     public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11197:1: ( ( ']' ) )
-            // InternalEssentialOCL.g:11198:1: ( ']' )
+            // InternalEssentialOCL.g:11199:1: ( ( ']' ) )
+            // InternalEssentialOCL.g:11200:1: ( ']' )
             {
-            // InternalEssentialOCL.g:11198:1: ( ']' )
-            // InternalEssentialOCL.g:11199:1: ']'
+            // InternalEssentialOCL.g:11200:1: ( ']' )
+            // InternalEssentialOCL.g:11201:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
@@ -32620,14 +32620,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0"
-    // InternalEssentialOCL.g:11220:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
+    // InternalEssentialOCL.g:11222:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
     public final void rule__PathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11224:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
-            // InternalEssentialOCL.g:11225:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
+            // InternalEssentialOCL.g:11226:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
+            // InternalEssentialOCL.g:11227:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__PathNameCS__Group__0__Impl();
@@ -32658,23 +32658,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0__Impl"
-    // InternalEssentialOCL.g:11232:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:11234:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__PathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11236:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalEssentialOCL.g:11237:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalEssentialOCL.g:11238:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalEssentialOCL.g:11239:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:11237:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalEssentialOCL.g:11238:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalEssentialOCL.g:11239:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalEssentialOCL.g:11240:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalEssentialOCL.g:11239:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalEssentialOCL.g:11239:2: rule__PathNameCS__OwnedPathElementsAssignment_0
+            // InternalEssentialOCL.g:11241:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalEssentialOCL.g:11241:2: rule__PathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_0();
@@ -32709,14 +32709,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1"
-    // InternalEssentialOCL.g:11249:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:11251:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
     public final void rule__PathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11253:1: ( rule__PathNameCS__Group__1__Impl )
-            // InternalEssentialOCL.g:11254:2: rule__PathNameCS__Group__1__Impl
+            // InternalEssentialOCL.g:11255:1: ( rule__PathNameCS__Group__1__Impl )
+            // InternalEssentialOCL.g:11256:2: rule__PathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group__1__Impl();
@@ -32742,22 +32742,22 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11260:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
+    // InternalEssentialOCL.g:11262:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
     public final void rule__PathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11264:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
-            // InternalEssentialOCL.g:11265:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalEssentialOCL.g:11266:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
+            // InternalEssentialOCL.g:11267:1: ( ( rule__PathNameCS__Group_1__0 )* )
             {
-            // InternalEssentialOCL.g:11265:1: ( ( rule__PathNameCS__Group_1__0 )* )
-            // InternalEssentialOCL.g:11266:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalEssentialOCL.g:11267:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalEssentialOCL.g:11268:1: ( rule__PathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:11267:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalEssentialOCL.g:11269:1: ( rule__PathNameCS__Group_1__0 )*
             loop85:
             do {
                 int alt85=2;
@@ -32770,7 +32770,7 @@
 
                 switch (alt85) {
             	case 1 :
-            	    // InternalEssentialOCL.g:11267:2: rule__PathNameCS__Group_1__0
+            	    // InternalEssentialOCL.g:11269:2: rule__PathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_55);
             	    rule__PathNameCS__Group_1__0();
@@ -32811,14 +32811,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0"
-    // InternalEssentialOCL.g:11281:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
+    // InternalEssentialOCL.g:11283:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
     public final void rule__PathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11285:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
-            // InternalEssentialOCL.g:11286:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
+            // InternalEssentialOCL.g:11287:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
+            // InternalEssentialOCL.g:11288:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_6);
             rule__PathNameCS__Group_1__0__Impl();
@@ -32849,17 +32849,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:11293:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalEssentialOCL.g:11295:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11297:1: ( ( '::' ) )
-            // InternalEssentialOCL.g:11298:1: ( '::' )
+            // InternalEssentialOCL.g:11299:1: ( ( '::' ) )
+            // InternalEssentialOCL.g:11300:1: ( '::' )
             {
-            // InternalEssentialOCL.g:11298:1: ( '::' )
-            // InternalEssentialOCL.g:11299:1: '::'
+            // InternalEssentialOCL.g:11300:1: ( '::' )
+            // InternalEssentialOCL.g:11301:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
@@ -32890,14 +32890,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1"
-    // InternalEssentialOCL.g:11312:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:11314:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
     public final void rule__PathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11316:1: ( rule__PathNameCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:11317:2: rule__PathNameCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:11318:1: ( rule__PathNameCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:11319:2: rule__PathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group_1__1__Impl();
@@ -32923,23 +32923,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:11323:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:11325:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__PathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11327:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:11328:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11329:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:11330:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:11328:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalEssentialOCL.g:11329:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalEssentialOCL.g:11330:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11331:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalEssentialOCL.g:11330:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalEssentialOCL.g:11330:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalEssentialOCL.g:11332:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalEssentialOCL.g:11332:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_1_1();
@@ -32974,14 +32974,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0"
-    // InternalEssentialOCL.g:11344:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
+    // InternalEssentialOCL.g:11348:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
     public final void rule__TemplateBindingCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11348:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
-            // InternalEssentialOCL.g:11349:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
+            // InternalEssentialOCL.g:11352:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
+            // InternalEssentialOCL.g:11353:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__TemplateBindingCS__Group__0__Impl();
@@ -33012,23 +33012,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0__Impl"
-    // InternalEssentialOCL.g:11356:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:11360:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
     public final void rule__TemplateBindingCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11360:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
-            // InternalEssentialOCL.g:11361:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalEssentialOCL.g:11364:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
+            // InternalEssentialOCL.g:11365:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:11361:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
-            // InternalEssentialOCL.g:11362:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalEssentialOCL.g:11365:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalEssentialOCL.g:11366:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
             }
-            // InternalEssentialOCL.g:11363:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
-            // InternalEssentialOCL.g:11363:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
+            // InternalEssentialOCL.g:11367:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalEssentialOCL.g:11367:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0();
@@ -33063,14 +33063,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1"
-    // InternalEssentialOCL.g:11373:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
+    // InternalEssentialOCL.g:11377:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
     public final void rule__TemplateBindingCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11377:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
-            // InternalEssentialOCL.g:11378:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
+            // InternalEssentialOCL.g:11381:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
+            // InternalEssentialOCL.g:11382:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__TemplateBindingCS__Group__1__Impl();
@@ -33101,22 +33101,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11385:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
+    // InternalEssentialOCL.g:11389:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
     public final void rule__TemplateBindingCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11389:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
-            // InternalEssentialOCL.g:11390:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalEssentialOCL.g:11393:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
+            // InternalEssentialOCL.g:11394:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
             {
-            // InternalEssentialOCL.g:11390:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
-            // InternalEssentialOCL.g:11391:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalEssentialOCL.g:11394:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalEssentialOCL.g:11395:1: ( rule__TemplateBindingCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:11392:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalEssentialOCL.g:11396:1: ( rule__TemplateBindingCS__Group_1__0 )*
             loop86:
             do {
                 int alt86=2;
@@ -33129,7 +33129,7 @@
 
                 switch (alt86) {
             	case 1 :
-            	    // InternalEssentialOCL.g:11392:2: rule__TemplateBindingCS__Group_1__0
+            	    // InternalEssentialOCL.g:11396:2: rule__TemplateBindingCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_11);
             	    rule__TemplateBindingCS__Group_1__0();
@@ -33170,14 +33170,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2"
-    // InternalEssentialOCL.g:11402:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:11406:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
     public final void rule__TemplateBindingCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11406:1: ( rule__TemplateBindingCS__Group__2__Impl )
-            // InternalEssentialOCL.g:11407:2: rule__TemplateBindingCS__Group__2__Impl
+            // InternalEssentialOCL.g:11410:1: ( rule__TemplateBindingCS__Group__2__Impl )
+            // InternalEssentialOCL.g:11411:2: rule__TemplateBindingCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__2__Impl();
@@ -33203,22 +33203,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2__Impl"
-    // InternalEssentialOCL.g:11413:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
+    // InternalEssentialOCL.g:11417:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
     public final void rule__TemplateBindingCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11417:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
-            // InternalEssentialOCL.g:11418:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalEssentialOCL.g:11421:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
+            // InternalEssentialOCL.g:11422:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
             {
-            // InternalEssentialOCL.g:11418:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
-            // InternalEssentialOCL.g:11419:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalEssentialOCL.g:11422:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalEssentialOCL.g:11423:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
             }
-            // InternalEssentialOCL.g:11420:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalEssentialOCL.g:11424:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             int alt87=2;
             int LA87_0 = input.LA(1);
 
@@ -33227,7 +33227,7 @@
             }
             switch (alt87) {
                 case 1 :
-                    // InternalEssentialOCL.g:11420:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
+                    // InternalEssentialOCL.g:11424:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateBindingCS__OwnedMultiplicityAssignment_2();
@@ -33265,14 +33265,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0"
-    // InternalEssentialOCL.g:11436:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
+    // InternalEssentialOCL.g:11440:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
     public final void rule__TemplateBindingCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11440:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
-            // InternalEssentialOCL.g:11441:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
+            // InternalEssentialOCL.g:11444:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
+            // InternalEssentialOCL.g:11445:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__TemplateBindingCS__Group_1__0__Impl();
@@ -33303,17 +33303,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:11448:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
+    // InternalEssentialOCL.g:11452:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
     public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11452:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:11453:1: ( ',' )
+            // InternalEssentialOCL.g:11456:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:11457:1: ( ',' )
             {
-            // InternalEssentialOCL.g:11453:1: ( ',' )
-            // InternalEssentialOCL.g:11454:1: ','
+            // InternalEssentialOCL.g:11457:1: ( ',' )
+            // InternalEssentialOCL.g:11458:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
@@ -33344,14 +33344,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1"
-    // InternalEssentialOCL.g:11467:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
+    // InternalEssentialOCL.g:11471:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
     public final void rule__TemplateBindingCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11471:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
-            // InternalEssentialOCL.g:11472:2: rule__TemplateBindingCS__Group_1__1__Impl
+            // InternalEssentialOCL.g:11475:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
+            // InternalEssentialOCL.g:11476:2: rule__TemplateBindingCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group_1__1__Impl();
@@ -33377,23 +33377,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:11478:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:11482:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
     public final void rule__TemplateBindingCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11482:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:11483:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11486:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:11487:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:11483:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
-            // InternalEssentialOCL.g:11484:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalEssentialOCL.g:11487:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11488:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
             }
-            // InternalEssentialOCL.g:11485:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
-            // InternalEssentialOCL.g:11485:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
+            // InternalEssentialOCL.g:11489:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalEssentialOCL.g:11489:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1();
@@ -33428,14 +33428,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0"
-    // InternalEssentialOCL.g:11501:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
+    // InternalEssentialOCL.g:11505:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
     public final void rule__TypeParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11505:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
-            // InternalEssentialOCL.g:11506:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
+            // InternalEssentialOCL.g:11509:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
+            // InternalEssentialOCL.g:11510:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_58);
             rule__TypeParameterCS__Group__0__Impl();
@@ -33466,23 +33466,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0__Impl"
-    // InternalEssentialOCL.g:11513:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:11517:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
     public final void rule__TypeParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11517:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:11518:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:11521:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:11522:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:11518:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
-            // InternalEssentialOCL.g:11519:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:11522:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalEssentialOCL.g:11523:1: ( rule__TypeParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
             }
-            // InternalEssentialOCL.g:11520:1: ( rule__TypeParameterCS__NameAssignment_0 )
-            // InternalEssentialOCL.g:11520:2: rule__TypeParameterCS__NameAssignment_0
+            // InternalEssentialOCL.g:11524:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalEssentialOCL.g:11524:2: rule__TypeParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__NameAssignment_0();
@@ -33517,14 +33517,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1"
-    // InternalEssentialOCL.g:11530:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:11534:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
     public final void rule__TypeParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11534:1: ( rule__TypeParameterCS__Group__1__Impl )
-            // InternalEssentialOCL.g:11535:2: rule__TypeParameterCS__Group__1__Impl
+            // InternalEssentialOCL.g:11538:1: ( rule__TypeParameterCS__Group__1__Impl )
+            // InternalEssentialOCL.g:11539:2: rule__TypeParameterCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__1__Impl();
@@ -33550,22 +33550,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11541:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:11545:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
     public final void rule__TypeParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11545:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:11546:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:11549:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:11550:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:11546:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:11547:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalEssentialOCL.g:11550:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:11551:1: ( rule__TypeParameterCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:11548:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalEssentialOCL.g:11552:1: ( rule__TypeParameterCS__Group_1__0 )?
             int alt88=2;
             int LA88_0 = input.LA(1);
 
@@ -33574,7 +33574,7 @@
             }
             switch (alt88) {
                 case 1 :
-                    // InternalEssentialOCL.g:11548:2: rule__TypeParameterCS__Group_1__0
+                    // InternalEssentialOCL.g:11552:2: rule__TypeParameterCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeParameterCS__Group_1__0();
@@ -33612,14 +33612,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0"
-    // InternalEssentialOCL.g:11562:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
+    // InternalEssentialOCL.g:11566:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
     public final void rule__TypeParameterCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11566:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
-            // InternalEssentialOCL.g:11567:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
+            // InternalEssentialOCL.g:11570:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
+            // InternalEssentialOCL.g:11571:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TypeParameterCS__Group_1__0__Impl();
@@ -33650,17 +33650,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:11574:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
+    // InternalEssentialOCL.g:11578:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
     public final void rule__TypeParameterCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11578:1: ( ( 'extends' ) )
-            // InternalEssentialOCL.g:11579:1: ( 'extends' )
+            // InternalEssentialOCL.g:11582:1: ( ( 'extends' ) )
+            // InternalEssentialOCL.g:11583:1: ( 'extends' )
             {
-            // InternalEssentialOCL.g:11579:1: ( 'extends' )
-            // InternalEssentialOCL.g:11580:1: 'extends'
+            // InternalEssentialOCL.g:11583:1: ( 'extends' )
+            // InternalEssentialOCL.g:11584:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
@@ -33691,14 +33691,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1"
-    // InternalEssentialOCL.g:11593:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
+    // InternalEssentialOCL.g:11597:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
     public final void rule__TypeParameterCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11597:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
-            // InternalEssentialOCL.g:11598:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
+            // InternalEssentialOCL.g:11601:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
+            // InternalEssentialOCL.g:11602:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_59);
             rule__TypeParameterCS__Group_1__1__Impl();
@@ -33729,23 +33729,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:11605:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:11609:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11609:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:11610:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11613:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:11614:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:11610:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
-            // InternalEssentialOCL.g:11611:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalEssentialOCL.g:11614:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11615:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
             }
-            // InternalEssentialOCL.g:11612:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
-            // InternalEssentialOCL.g:11612:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
+            // InternalEssentialOCL.g:11616:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalEssentialOCL.g:11616:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_1();
@@ -33780,14 +33780,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2"
-    // InternalEssentialOCL.g:11622:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
+    // InternalEssentialOCL.g:11626:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
     public final void rule__TypeParameterCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11626:1: ( rule__TypeParameterCS__Group_1__2__Impl )
-            // InternalEssentialOCL.g:11627:2: rule__TypeParameterCS__Group_1__2__Impl
+            // InternalEssentialOCL.g:11630:1: ( rule__TypeParameterCS__Group_1__2__Impl )
+            // InternalEssentialOCL.g:11631:2: rule__TypeParameterCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1__2__Impl();
@@ -33813,22 +33813,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2__Impl"
-    // InternalEssentialOCL.g:11633:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
+    // InternalEssentialOCL.g:11637:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
     public final void rule__TypeParameterCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11637:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
-            // InternalEssentialOCL.g:11638:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalEssentialOCL.g:11641:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
+            // InternalEssentialOCL.g:11642:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
             {
-            // InternalEssentialOCL.g:11638:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
-            // InternalEssentialOCL.g:11639:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalEssentialOCL.g:11642:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalEssentialOCL.g:11643:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
             }
-            // InternalEssentialOCL.g:11640:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalEssentialOCL.g:11644:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             loop89:
             do {
                 int alt89=2;
@@ -33841,7 +33841,7 @@
 
                 switch (alt89) {
             	case 1 :
-            	    // InternalEssentialOCL.g:11640:2: rule__TypeParameterCS__Group_1_2__0
+            	    // InternalEssentialOCL.g:11644:2: rule__TypeParameterCS__Group_1_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_60);
             	    rule__TypeParameterCS__Group_1_2__0();
@@ -33882,14 +33882,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0"
-    // InternalEssentialOCL.g:11656:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
+    // InternalEssentialOCL.g:11660:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
     public final void rule__TypeParameterCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11660:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
-            // InternalEssentialOCL.g:11661:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
+            // InternalEssentialOCL.g:11664:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
+            // InternalEssentialOCL.g:11665:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TypeParameterCS__Group_1_2__0__Impl();
@@ -33920,17 +33920,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0__Impl"
-    // InternalEssentialOCL.g:11668:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
+    // InternalEssentialOCL.g:11672:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
     public final void rule__TypeParameterCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11672:1: ( ( '&&' ) )
-            // InternalEssentialOCL.g:11673:1: ( '&&' )
+            // InternalEssentialOCL.g:11676:1: ( ( '&&' ) )
+            // InternalEssentialOCL.g:11677:1: ( '&&' )
             {
-            // InternalEssentialOCL.g:11673:1: ( '&&' )
-            // InternalEssentialOCL.g:11674:1: '&&'
+            // InternalEssentialOCL.g:11677:1: ( '&&' )
+            // InternalEssentialOCL.g:11678:1: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
@@ -33961,14 +33961,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1"
-    // InternalEssentialOCL.g:11687:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
+    // InternalEssentialOCL.g:11691:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
     public final void rule__TypeParameterCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11691:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
-            // InternalEssentialOCL.g:11692:2: rule__TypeParameterCS__Group_1_2__1__Impl
+            // InternalEssentialOCL.g:11695:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
+            // InternalEssentialOCL.g:11696:2: rule__TypeParameterCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1_2__1__Impl();
@@ -33994,23 +33994,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1__Impl"
-    // InternalEssentialOCL.g:11698:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
+    // InternalEssentialOCL.g:11702:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11702:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
-            // InternalEssentialOCL.g:11703:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalEssentialOCL.g:11706:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
+            // InternalEssentialOCL.g:11707:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
             {
-            // InternalEssentialOCL.g:11703:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
-            // InternalEssentialOCL.g:11704:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalEssentialOCL.g:11707:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalEssentialOCL.g:11708:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
             }
-            // InternalEssentialOCL.g:11705:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
-            // InternalEssentialOCL.g:11705:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
+            // InternalEssentialOCL.g:11709:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalEssentialOCL.g:11709:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1();
@@ -34045,14 +34045,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0"
-    // InternalEssentialOCL.g:11719:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
+    // InternalEssentialOCL.g:11723:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
     public final void rule__TypedTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11723:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
-            // InternalEssentialOCL.g:11724:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
+            // InternalEssentialOCL.g:11727:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
+            // InternalEssentialOCL.g:11728:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_5);
             rule__TypedTypeRefCS__Group__0__Impl();
@@ -34083,23 +34083,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0__Impl"
-    // InternalEssentialOCL.g:11731:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalEssentialOCL.g:11735:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypedTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11735:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalEssentialOCL.g:11736:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalEssentialOCL.g:11739:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalEssentialOCL.g:11740:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalEssentialOCL.g:11736:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
-            // InternalEssentialOCL.g:11737:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalEssentialOCL.g:11740:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalEssentialOCL.g:11741:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalEssentialOCL.g:11738:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
-            // InternalEssentialOCL.g:11738:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
+            // InternalEssentialOCL.g:11742:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalEssentialOCL.g:11742:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedPathNameAssignment_0();
@@ -34134,14 +34134,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1"
-    // InternalEssentialOCL.g:11748:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
+    // InternalEssentialOCL.g:11752:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
     public final void rule__TypedTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11752:1: ( rule__TypedTypeRefCS__Group__1__Impl )
-            // InternalEssentialOCL.g:11753:2: rule__TypedTypeRefCS__Group__1__Impl
+            // InternalEssentialOCL.g:11756:1: ( rule__TypedTypeRefCS__Group__1__Impl )
+            // InternalEssentialOCL.g:11757:2: rule__TypedTypeRefCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__1__Impl();
@@ -34167,22 +34167,22 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11759:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Group_1__0 )? ) ;
+    // InternalEssentialOCL.g:11763:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Group_1__0 )? ) ;
     public final void rule__TypedTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11763:1: ( ( ( rule__TypedTypeRefCS__Group_1__0 )? ) )
-            // InternalEssentialOCL.g:11764:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:11767:1: ( ( ( rule__TypedTypeRefCS__Group_1__0 )? ) )
+            // InternalEssentialOCL.g:11768:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
             {
-            // InternalEssentialOCL.g:11764:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
-            // InternalEssentialOCL.g:11765:1: ( rule__TypedTypeRefCS__Group_1__0 )?
+            // InternalEssentialOCL.g:11768:1: ( ( rule__TypedTypeRefCS__Group_1__0 )? )
+            // InternalEssentialOCL.g:11769:1: ( rule__TypedTypeRefCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1());
             }
-            // InternalEssentialOCL.g:11766:1: ( rule__TypedTypeRefCS__Group_1__0 )?
+            // InternalEssentialOCL.g:11770:1: ( rule__TypedTypeRefCS__Group_1__0 )?
             int alt90=2;
             int LA90_0 = input.LA(1);
 
@@ -34191,7 +34191,7 @@
             }
             switch (alt90) {
                 case 1 :
-                    // InternalEssentialOCL.g:11766:2: rule__TypedTypeRefCS__Group_1__0
+                    // InternalEssentialOCL.g:11770:2: rule__TypedTypeRefCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1__0();
@@ -34229,14 +34229,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0"
-    // InternalEssentialOCL.g:11780:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
+    // InternalEssentialOCL.g:11784:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
     public final void rule__TypedTypeRefCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11784:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
-            // InternalEssentialOCL.g:11785:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
+            // InternalEssentialOCL.g:11788:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
+            // InternalEssentialOCL.g:11789:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__TypedTypeRefCS__Group_1__0__Impl();
@@ -34267,17 +34267,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0__Impl"
-    // InternalEssentialOCL.g:11792:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalEssentialOCL.g:11796:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TypedTypeRefCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11796:1: ( ( '(' ) )
-            // InternalEssentialOCL.g:11797:1: ( '(' )
+            // InternalEssentialOCL.g:11800:1: ( ( '(' ) )
+            // InternalEssentialOCL.g:11801:1: ( '(' )
             {
-            // InternalEssentialOCL.g:11797:1: ( '(' )
-            // InternalEssentialOCL.g:11798:1: '('
+            // InternalEssentialOCL.g:11801:1: ( '(' )
+            // InternalEssentialOCL.g:11802:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());
@@ -34308,14 +34308,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1"
-    // InternalEssentialOCL.g:11811:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 ;
+    // InternalEssentialOCL.g:11815:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 ;
     public final void rule__TypedTypeRefCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11815:1: ( rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 )
-            // InternalEssentialOCL.g:11816:2: rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2
+            // InternalEssentialOCL.g:11819:1: ( rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2 )
+            // InternalEssentialOCL.g:11820:2: rule__TypedTypeRefCS__Group_1__1__Impl rule__TypedTypeRefCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__TypedTypeRefCS__Group_1__1__Impl();
@@ -34346,23 +34346,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1__Impl"
-    // InternalEssentialOCL.g:11823:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) ;
+    // InternalEssentialOCL.g:11827:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11827:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) )
-            // InternalEssentialOCL.g:11828:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11831:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) ) )
+            // InternalEssentialOCL.g:11832:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
             {
-            // InternalEssentialOCL.g:11828:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
-            // InternalEssentialOCL.g:11829:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
+            // InternalEssentialOCL.g:11832:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 ) )
+            // InternalEssentialOCL.g:11833:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1());
             }
-            // InternalEssentialOCL.g:11830:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
-            // InternalEssentialOCL.g:11830:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1
+            // InternalEssentialOCL.g:11834:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 )
+            // InternalEssentialOCL.g:11834:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedBindingAssignment_1_1();
@@ -34397,14 +34397,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__2"
-    // InternalEssentialOCL.g:11840:1: rule__TypedTypeRefCS__Group_1__2 : rule__TypedTypeRefCS__Group_1__2__Impl ;
+    // InternalEssentialOCL.g:11844:1: rule__TypedTypeRefCS__Group_1__2 : rule__TypedTypeRefCS__Group_1__2__Impl ;
     public final void rule__TypedTypeRefCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11844:1: ( rule__TypedTypeRefCS__Group_1__2__Impl )
-            // InternalEssentialOCL.g:11845:2: rule__TypedTypeRefCS__Group_1__2__Impl
+            // InternalEssentialOCL.g:11848:1: ( rule__TypedTypeRefCS__Group_1__2__Impl )
+            // InternalEssentialOCL.g:11849:2: rule__TypedTypeRefCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1__2__Impl();
@@ -34430,17 +34430,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__2__Impl"
-    // InternalEssentialOCL.g:11851:1: rule__TypedTypeRefCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalEssentialOCL.g:11855:1: rule__TypedTypeRefCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TypedTypeRefCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11855:1: ( ( ')' ) )
-            // InternalEssentialOCL.g:11856:1: ( ')' )
+            // InternalEssentialOCL.g:11859:1: ( ( ')' ) )
+            // InternalEssentialOCL.g:11860:1: ( ')' )
             {
-            // InternalEssentialOCL.g:11856:1: ( ')' )
-            // InternalEssentialOCL.g:11857:1: ')'
+            // InternalEssentialOCL.g:11860:1: ( ')' )
+            // InternalEssentialOCL.g:11861:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_2());
@@ -34471,14 +34471,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0"
-    // InternalEssentialOCL.g:11876:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
+    // InternalEssentialOCL.g:11880:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
     public final void rule__WildcardTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11880:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
-            // InternalEssentialOCL.g:11881:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
+            // InternalEssentialOCL.g:11884:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
+            // InternalEssentialOCL.g:11885:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__WildcardTypeRefCS__Group__0__Impl();
@@ -34509,23 +34509,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0__Impl"
-    // InternalEssentialOCL.g:11888:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
+    // InternalEssentialOCL.g:11892:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
     public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11892:1: ( ( () ) )
-            // InternalEssentialOCL.g:11893:1: ( () )
+            // InternalEssentialOCL.g:11896:1: ( ( () ) )
+            // InternalEssentialOCL.g:11897:1: ( () )
             {
-            // InternalEssentialOCL.g:11893:1: ( () )
-            // InternalEssentialOCL.g:11894:1: ()
+            // InternalEssentialOCL.g:11897:1: ( () )
+            // InternalEssentialOCL.g:11898:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
             }
-            // InternalEssentialOCL.g:11895:1: ()
-            // InternalEssentialOCL.g:11897:1:
+            // InternalEssentialOCL.g:11899:1: ()
+            // InternalEssentialOCL.g:11901:1:
             {
             }
 
@@ -34550,14 +34550,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1"
-    // InternalEssentialOCL.g:11907:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
+    // InternalEssentialOCL.g:11911:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
     public final void rule__WildcardTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11911:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
-            // InternalEssentialOCL.g:11912:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
+            // InternalEssentialOCL.g:11915:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
+            // InternalEssentialOCL.g:11916:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_58);
             rule__WildcardTypeRefCS__Group__1__Impl();
@@ -34588,17 +34588,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1__Impl"
-    // InternalEssentialOCL.g:11919:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
+    // InternalEssentialOCL.g:11923:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
     public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11923:1: ( ( '?' ) )
-            // InternalEssentialOCL.g:11924:1: ( '?' )
+            // InternalEssentialOCL.g:11927:1: ( ( '?' ) )
+            // InternalEssentialOCL.g:11928:1: ( '?' )
             {
-            // InternalEssentialOCL.g:11924:1: ( '?' )
-            // InternalEssentialOCL.g:11925:1: '?'
+            // InternalEssentialOCL.g:11928:1: ( '?' )
+            // InternalEssentialOCL.g:11929:1: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
@@ -34629,14 +34629,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2"
-    // InternalEssentialOCL.g:11938:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
+    // InternalEssentialOCL.g:11942:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
     public final void rule__WildcardTypeRefCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11942:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
-            // InternalEssentialOCL.g:11943:2: rule__WildcardTypeRefCS__Group__2__Impl
+            // InternalEssentialOCL.g:11946:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
+            // InternalEssentialOCL.g:11947:2: rule__WildcardTypeRefCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__2__Impl();
@@ -34662,22 +34662,22 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2__Impl"
-    // InternalEssentialOCL.g:11949:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
+    // InternalEssentialOCL.g:11953:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
     public final void rule__WildcardTypeRefCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11953:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
-            // InternalEssentialOCL.g:11954:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:11957:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
+            // InternalEssentialOCL.g:11958:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
             {
-            // InternalEssentialOCL.g:11954:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
-            // InternalEssentialOCL.g:11955:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalEssentialOCL.g:11958:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalEssentialOCL.g:11959:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
             }
-            // InternalEssentialOCL.g:11956:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalEssentialOCL.g:11960:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             int alt91=2;
             int LA91_0 = input.LA(1);
 
@@ -34686,7 +34686,7 @@
             }
             switch (alt91) {
                 case 1 :
-                    // InternalEssentialOCL.g:11956:2: rule__WildcardTypeRefCS__Group_2__0
+                    // InternalEssentialOCL.g:11960:2: rule__WildcardTypeRefCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__WildcardTypeRefCS__Group_2__0();
@@ -34724,14 +34724,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0"
-    // InternalEssentialOCL.g:11972:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
+    // InternalEssentialOCL.g:11976:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
     public final void rule__WildcardTypeRefCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11976:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
-            // InternalEssentialOCL.g:11977:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
+            // InternalEssentialOCL.g:11980:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
+            // InternalEssentialOCL.g:11981:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__WildcardTypeRefCS__Group_2__0__Impl();
@@ -34762,17 +34762,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0__Impl"
-    // InternalEssentialOCL.g:11984:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
+    // InternalEssentialOCL.g:11988:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
     public final void rule__WildcardTypeRefCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:11988:1: ( ( 'extends' ) )
-            // InternalEssentialOCL.g:11989:1: ( 'extends' )
+            // InternalEssentialOCL.g:11992:1: ( ( 'extends' ) )
+            // InternalEssentialOCL.g:11993:1: ( 'extends' )
             {
-            // InternalEssentialOCL.g:11989:1: ( 'extends' )
-            // InternalEssentialOCL.g:11990:1: 'extends'
+            // InternalEssentialOCL.g:11993:1: ( 'extends' )
+            // InternalEssentialOCL.g:11994:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
@@ -34803,14 +34803,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1"
-    // InternalEssentialOCL.g:12003:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
+    // InternalEssentialOCL.g:12007:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
     public final void rule__WildcardTypeRefCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12007:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
-            // InternalEssentialOCL.g:12008:2: rule__WildcardTypeRefCS__Group_2__1__Impl
+            // InternalEssentialOCL.g:12011:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
+            // InternalEssentialOCL.g:12012:2: rule__WildcardTypeRefCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group_2__1__Impl();
@@ -34836,23 +34836,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1__Impl"
-    // InternalEssentialOCL.g:12014:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
+    // InternalEssentialOCL.g:12018:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
     public final void rule__WildcardTypeRefCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12018:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
-            // InternalEssentialOCL.g:12019:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalEssentialOCL.g:12022:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
+            // InternalEssentialOCL.g:12023:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
             {
-            // InternalEssentialOCL.g:12019:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
-            // InternalEssentialOCL.g:12020:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalEssentialOCL.g:12023:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalEssentialOCL.g:12024:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
             }
-            // InternalEssentialOCL.g:12021:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
-            // InternalEssentialOCL.g:12021:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
+            // InternalEssentialOCL.g:12025:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalEssentialOCL.g:12025:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1();
@@ -34887,17 +34887,17 @@
 
 
     // $ANTLR start "rule__Model__OwnedExpressionAssignment"
-    // InternalEssentialOCL.g:12036:1: rule__Model__OwnedExpressionAssignment : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12040:1: rule__Model__OwnedExpressionAssignment : ( ruleExpCS ) ;
     public final void rule__Model__OwnedExpressionAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12040:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12041:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12044:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12045:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12041:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12042:1: ruleExpCS
+            // InternalEssentialOCL.g:12045:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12046:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getModelAccess().getOwnedExpressionExpCSParserRuleCall_0());
@@ -34932,23 +34932,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_0"
-    // InternalEssentialOCL.g:12053:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalEssentialOCL.g:12057:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12057:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalEssentialOCL.g:12058:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12061:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalEssentialOCL.g:12062:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalEssentialOCL.g:12058:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:12059:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12062:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12063:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
             }
-            // InternalEssentialOCL.g:12060:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:12061:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:12064:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12065:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_0_1());
@@ -34989,23 +34989,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_1_1"
-    // InternalEssentialOCL.g:12072:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
+    // InternalEssentialOCL.g:12076:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12076:1: ( ( ( ruleURI ) ) )
-            // InternalEssentialOCL.g:12077:1: ( ( ruleURI ) )
+            // InternalEssentialOCL.g:12080:1: ( ( ( ruleURI ) ) )
+            // InternalEssentialOCL.g:12081:1: ( ( ruleURI ) )
             {
-            // InternalEssentialOCL.g:12077:1: ( ( ruleURI ) )
-            // InternalEssentialOCL.g:12078:1: ( ruleURI )
+            // InternalEssentialOCL.g:12081:1: ( ( ruleURI ) )
+            // InternalEssentialOCL.g:12082:1: ( ruleURI )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
             }
-            // InternalEssentialOCL.g:12079:1: ( ruleURI )
-            // InternalEssentialOCL.g:12080:1: ruleURI
+            // InternalEssentialOCL.g:12083:1: ( ruleURI )
+            // InternalEssentialOCL.g:12084:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceURIParserRuleCall_1_1_0_1());
@@ -35046,17 +35046,17 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeCS__NameAssignment"
-    // InternalEssentialOCL.g:12092:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
+    // InternalEssentialOCL.g:12096:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
     public final void rule__PrimitiveTypeCS__NameAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12096:1: ( ( rulePrimitiveTypeIdentifier ) )
-            // InternalEssentialOCL.g:12097:1: ( rulePrimitiveTypeIdentifier )
+            // InternalEssentialOCL.g:12100:1: ( ( rulePrimitiveTypeIdentifier ) )
+            // InternalEssentialOCL.g:12101:1: ( rulePrimitiveTypeIdentifier )
             {
-            // InternalEssentialOCL.g:12097:1: ( rulePrimitiveTypeIdentifier )
-            // InternalEssentialOCL.g:12098:1: rulePrimitiveTypeIdentifier
+            // InternalEssentialOCL.g:12101:1: ( rulePrimitiveTypeIdentifier )
+            // InternalEssentialOCL.g:12102:1: rulePrimitiveTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());
@@ -35091,17 +35091,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__NameAssignment_0"
-    // InternalEssentialOCL.g:12107:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
+    // InternalEssentialOCL.g:12111:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
     public final void rule__CollectionTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12111:1: ( ( ruleCollectionTypeIdentifier ) )
-            // InternalEssentialOCL.g:12112:1: ( ruleCollectionTypeIdentifier )
+            // InternalEssentialOCL.g:12115:1: ( ( ruleCollectionTypeIdentifier ) )
+            // InternalEssentialOCL.g:12116:1: ( ruleCollectionTypeIdentifier )
             {
-            // InternalEssentialOCL.g:12112:1: ( ruleCollectionTypeIdentifier )
-            // InternalEssentialOCL.g:12113:1: ruleCollectionTypeIdentifier
+            // InternalEssentialOCL.g:12116:1: ( ruleCollectionTypeIdentifier )
+            // InternalEssentialOCL.g:12117:1: ruleCollectionTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());
@@ -35136,17 +35136,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedTypeAssignment_1_1"
-    // InternalEssentialOCL.g:12122:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalEssentialOCL.g:12126:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12126:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalEssentialOCL.g:12127:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalEssentialOCL.g:12130:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalEssentialOCL.g:12131:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalEssentialOCL.g:12127:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalEssentialOCL.g:12128:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalEssentialOCL.g:12131:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalEssentialOCL.g:12132:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());
@@ -35181,17 +35181,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2"
-    // InternalEssentialOCL.g:12137:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
+    // InternalEssentialOCL.g:12141:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12141:1: ( ( ruleMultiplicityCS ) )
-            // InternalEssentialOCL.g:12142:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:12145:1: ( ( ruleMultiplicityCS ) )
+            // InternalEssentialOCL.g:12146:1: ( ruleMultiplicityCS )
             {
-            // InternalEssentialOCL.g:12142:1: ( ruleMultiplicityCS )
-            // InternalEssentialOCL.g:12143:1: ruleMultiplicityCS
+            // InternalEssentialOCL.g:12146:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:12147:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());
@@ -35226,23 +35226,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__NameAssignment_0"
-    // InternalEssentialOCL.g:12152:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
+    // InternalEssentialOCL.g:12156:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
     public final void rule__MapTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12156:1: ( ( ( 'Map' ) ) )
-            // InternalEssentialOCL.g:12157:1: ( ( 'Map' ) )
+            // InternalEssentialOCL.g:12160:1: ( ( ( 'Map' ) ) )
+            // InternalEssentialOCL.g:12161:1: ( ( 'Map' ) )
             {
-            // InternalEssentialOCL.g:12157:1: ( ( 'Map' ) )
-            // InternalEssentialOCL.g:12158:1: ( 'Map' )
+            // InternalEssentialOCL.g:12161:1: ( ( 'Map' ) )
+            // InternalEssentialOCL.g:12162:1: ( 'Map' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
             }
-            // InternalEssentialOCL.g:12159:1: ( 'Map' )
-            // InternalEssentialOCL.g:12160:1: 'Map'
+            // InternalEssentialOCL.g:12163:1: ( 'Map' )
+            // InternalEssentialOCL.g:12164:1: 'Map'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
@@ -35279,17 +35279,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedKeyTypeAssignment_1_1"
-    // InternalEssentialOCL.g:12175:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:12179:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedKeyTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12179:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:12180:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12183:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:12184:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:12180:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:12181:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:12184:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12185:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());
@@ -35324,17 +35324,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedValueTypeAssignment_1_3"
-    // InternalEssentialOCL.g:12190:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:12194:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedValueTypeAssignment_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12194:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:12195:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12198:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:12199:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:12195:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:12196:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:12199:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12200:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());
@@ -35369,23 +35369,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__NameAssignment_0"
-    // InternalEssentialOCL.g:12205:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
+    // InternalEssentialOCL.g:12209:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
     public final void rule__TupleTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12209:1: ( ( ( 'Tuple' ) ) )
-            // InternalEssentialOCL.g:12210:1: ( ( 'Tuple' ) )
+            // InternalEssentialOCL.g:12213:1: ( ( ( 'Tuple' ) ) )
+            // InternalEssentialOCL.g:12214:1: ( ( 'Tuple' ) )
             {
-            // InternalEssentialOCL.g:12210:1: ( ( 'Tuple' ) )
-            // InternalEssentialOCL.g:12211:1: ( 'Tuple' )
+            // InternalEssentialOCL.g:12214:1: ( ( 'Tuple' ) )
+            // InternalEssentialOCL.g:12215:1: ( 'Tuple' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
             }
-            // InternalEssentialOCL.g:12212:1: ( 'Tuple' )
-            // InternalEssentialOCL.g:12213:1: 'Tuple'
+            // InternalEssentialOCL.g:12216:1: ( 'Tuple' )
+            // InternalEssentialOCL.g:12217:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
@@ -35422,17 +35422,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_0"
-    // InternalEssentialOCL.g:12228:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
+    // InternalEssentialOCL.g:12232:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12232:1: ( ( ruleTuplePartCS ) )
-            // InternalEssentialOCL.g:12233:1: ( ruleTuplePartCS )
+            // InternalEssentialOCL.g:12236:1: ( ( ruleTuplePartCS ) )
+            // InternalEssentialOCL.g:12237:1: ( ruleTuplePartCS )
             {
-            // InternalEssentialOCL.g:12233:1: ( ruleTuplePartCS )
-            // InternalEssentialOCL.g:12234:1: ruleTuplePartCS
+            // InternalEssentialOCL.g:12237:1: ( ruleTuplePartCS )
+            // InternalEssentialOCL.g:12238:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
@@ -35467,17 +35467,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1"
-    // InternalEssentialOCL.g:12243:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
+    // InternalEssentialOCL.g:12247:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12247:1: ( ( ruleTuplePartCS ) )
-            // InternalEssentialOCL.g:12248:1: ( ruleTuplePartCS )
+            // InternalEssentialOCL.g:12251:1: ( ( ruleTuplePartCS ) )
+            // InternalEssentialOCL.g:12252:1: ( ruleTuplePartCS )
             {
-            // InternalEssentialOCL.g:12248:1: ( ruleTuplePartCS )
-            // InternalEssentialOCL.g:12249:1: ruleTuplePartCS
+            // InternalEssentialOCL.g:12252:1: ( ruleTuplePartCS )
+            // InternalEssentialOCL.g:12253:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
@@ -35512,17 +35512,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__NameAssignment_0"
-    // InternalEssentialOCL.g:12258:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalEssentialOCL.g:12262:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TuplePartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12262:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:12263:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12266:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12267:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:12263:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:12264:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:12267:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12268:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -35557,17 +35557,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__OwnedTypeAssignment_2"
-    // InternalEssentialOCL.g:12273:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:12277:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__TuplePartCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12277:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:12278:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12281:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:12282:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:12278:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:12279:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:12282:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12283:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());
@@ -35602,17 +35602,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalEssentialOCL.g:12288:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalEssentialOCL.g:12292:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12292:1: ( ( ruleCollectionTypeCS ) )
-            // InternalEssentialOCL.g:12293:1: ( ruleCollectionTypeCS )
+            // InternalEssentialOCL.g:12296:1: ( ( ruleCollectionTypeCS ) )
+            // InternalEssentialOCL.g:12297:1: ( ruleCollectionTypeCS )
             {
-            // InternalEssentialOCL.g:12293:1: ( ruleCollectionTypeCS )
-            // InternalEssentialOCL.g:12294:1: ruleCollectionTypeCS
+            // InternalEssentialOCL.g:12297:1: ( ruleCollectionTypeCS )
+            // InternalEssentialOCL.g:12298:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -35647,17 +35647,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalEssentialOCL.g:12303:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalEssentialOCL.g:12307:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12307:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalEssentialOCL.g:12308:1: ( ruleCollectionLiteralPartCS )
+            // InternalEssentialOCL.g:12311:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalEssentialOCL.g:12312:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalEssentialOCL.g:12308:1: ( ruleCollectionLiteralPartCS )
-            // InternalEssentialOCL.g:12309:1: ruleCollectionLiteralPartCS
+            // InternalEssentialOCL.g:12312:1: ( ruleCollectionLiteralPartCS )
+            // InternalEssentialOCL.g:12313:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());
@@ -35692,17 +35692,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalEssentialOCL.g:12318:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalEssentialOCL.g:12322:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12322:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalEssentialOCL.g:12323:1: ( ruleCollectionLiteralPartCS )
+            // InternalEssentialOCL.g:12326:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalEssentialOCL.g:12327:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalEssentialOCL.g:12323:1: ( ruleCollectionLiteralPartCS )
-            // InternalEssentialOCL.g:12324:1: ruleCollectionLiteralPartCS
+            // InternalEssentialOCL.g:12327:1: ( ruleCollectionLiteralPartCS )
+            // InternalEssentialOCL.g:12328:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());
@@ -35737,17 +35737,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0"
-    // InternalEssentialOCL.g:12333:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12337:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12337:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12338:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12341:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12342:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12338:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12339:1: ruleExpCS
+            // InternalEssentialOCL.g:12342:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12343:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());
@@ -35782,17 +35782,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1"
-    // InternalEssentialOCL.g:12348:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12352:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12352:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12353:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12356:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12357:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12353:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12354:1: ruleExpCS
+            // InternalEssentialOCL.g:12357:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12358:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());
@@ -35827,17 +35827,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1"
-    // InternalEssentialOCL.g:12363:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
+    // InternalEssentialOCL.g:12367:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12367:1: ( ( rulePatternExpCS ) )
-            // InternalEssentialOCL.g:12368:1: ( rulePatternExpCS )
+            // InternalEssentialOCL.g:12371:1: ( ( rulePatternExpCS ) )
+            // InternalEssentialOCL.g:12372:1: ( rulePatternExpCS )
             {
-            // InternalEssentialOCL.g:12368:1: ( rulePatternExpCS )
-            // InternalEssentialOCL.g:12369:1: rulePatternExpCS
+            // InternalEssentialOCL.g:12372:1: ( rulePatternExpCS )
+            // InternalEssentialOCL.g:12373:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());
@@ -35872,17 +35872,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedTypeAssignment_0"
-    // InternalEssentialOCL.g:12378:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalEssentialOCL.g:12382:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionPatternCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12382:1: ( ( ruleCollectionTypeCS ) )
-            // InternalEssentialOCL.g:12383:1: ( ruleCollectionTypeCS )
+            // InternalEssentialOCL.g:12386:1: ( ( ruleCollectionTypeCS ) )
+            // InternalEssentialOCL.g:12387:1: ( ruleCollectionTypeCS )
             {
-            // InternalEssentialOCL.g:12383:1: ( ruleCollectionTypeCS )
-            // InternalEssentialOCL.g:12384:1: ruleCollectionTypeCS
+            // InternalEssentialOCL.g:12387:1: ( ruleCollectionTypeCS )
+            // InternalEssentialOCL.g:12388:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -35917,17 +35917,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_0"
-    // InternalEssentialOCL.g:12393:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
+    // InternalEssentialOCL.g:12397:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12397:1: ( ( rulePatternExpCS ) )
-            // InternalEssentialOCL.g:12398:1: ( rulePatternExpCS )
+            // InternalEssentialOCL.g:12401:1: ( ( rulePatternExpCS ) )
+            // InternalEssentialOCL.g:12402:1: ( rulePatternExpCS )
             {
-            // InternalEssentialOCL.g:12398:1: ( rulePatternExpCS )
-            // InternalEssentialOCL.g:12399:1: rulePatternExpCS
+            // InternalEssentialOCL.g:12402:1: ( rulePatternExpCS )
+            // InternalEssentialOCL.g:12403:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());
@@ -35962,17 +35962,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1"
-    // InternalEssentialOCL.g:12408:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
+    // InternalEssentialOCL.g:12412:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12412:1: ( ( rulePatternExpCS ) )
-            // InternalEssentialOCL.g:12413:1: ( rulePatternExpCS )
+            // InternalEssentialOCL.g:12416:1: ( ( rulePatternExpCS ) )
+            // InternalEssentialOCL.g:12417:1: ( rulePatternExpCS )
             {
-            // InternalEssentialOCL.g:12413:1: ( rulePatternExpCS )
-            // InternalEssentialOCL.g:12414:1: rulePatternExpCS
+            // InternalEssentialOCL.g:12417:1: ( rulePatternExpCS )
+            // InternalEssentialOCL.g:12418:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());
@@ -36007,17 +36007,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1"
-    // InternalEssentialOCL.g:12423:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
+    // InternalEssentialOCL.g:12427:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
     public final void rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12427:1: ( ( ruleIdentifier ) )
-            // InternalEssentialOCL.g:12428:1: ( ruleIdentifier )
+            // InternalEssentialOCL.g:12431:1: ( ( ruleIdentifier ) )
+            // InternalEssentialOCL.g:12432:1: ( ruleIdentifier )
             {
-            // InternalEssentialOCL.g:12428:1: ( ruleIdentifier )
-            // InternalEssentialOCL.g:12429:1: ruleIdentifier
+            // InternalEssentialOCL.g:12432:1: ( ruleIdentifier )
+            // InternalEssentialOCL.g:12433:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());
@@ -36052,23 +36052,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__ReferredPropertyAssignment_0_0"
-    // InternalEssentialOCL.g:12438:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalEssentialOCL.g:12442:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ShadowPartCS__ReferredPropertyAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12442:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalEssentialOCL.g:12443:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12446:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalEssentialOCL.g:12447:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalEssentialOCL.g:12443:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:12444:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12447:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12448:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
             }
-            // InternalEssentialOCL.g:12445:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:12446:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:12449:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12450:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_0_1());
@@ -36109,23 +36109,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2"
-    // InternalEssentialOCL.g:12457:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
+    // InternalEssentialOCL.g:12461:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12461:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
-            // InternalEssentialOCL.g:12462:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalEssentialOCL.g:12465:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
+            // InternalEssentialOCL.g:12466:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
             {
-            // InternalEssentialOCL.g:12462:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
-            // InternalEssentialOCL.g:12463:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalEssentialOCL.g:12466:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalEssentialOCL.g:12467:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_0_2_0());
             }
-            // InternalEssentialOCL.g:12464:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
-            // InternalEssentialOCL.g:12464:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
+            // InternalEssentialOCL.g:12468:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalEssentialOCL.g:12468:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0();
@@ -36160,17 +36160,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_1"
-    // InternalEssentialOCL.g:12473:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
+    // InternalEssentialOCL.g:12477:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12477:1: ( ( ruleStringLiteralExpCS ) )
-            // InternalEssentialOCL.g:12478:1: ( ruleStringLiteralExpCS )
+            // InternalEssentialOCL.g:12481:1: ( ( ruleStringLiteralExpCS ) )
+            // InternalEssentialOCL.g:12482:1: ( ruleStringLiteralExpCS )
             {
-            // InternalEssentialOCL.g:12478:1: ( ruleStringLiteralExpCS )
-            // InternalEssentialOCL.g:12479:1: ruleStringLiteralExpCS
+            // InternalEssentialOCL.g:12482:1: ( ruleStringLiteralExpCS )
+            // InternalEssentialOCL.g:12483:1: ruleStringLiteralExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());
@@ -36205,17 +36205,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__PatternVariableNameAssignment_0"
-    // InternalEssentialOCL.g:12488:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalEssentialOCL.g:12492:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PatternExpCS__PatternVariableNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12492:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:12493:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12496:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12497:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:12493:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:12494:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:12497:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12498:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());
@@ -36250,17 +36250,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__OwnedPatternTypeAssignment_2"
-    // InternalEssentialOCL.g:12503:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:12507:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__PatternExpCS__OwnedPatternTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12507:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:12508:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12511:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:12512:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:12508:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:12509:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:12512:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12513:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());
@@ -36295,17 +36295,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2"
-    // InternalEssentialOCL.g:12518:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12522:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
     public final void rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12522:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12523:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12526:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12527:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12523:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12524:1: ruleExpCS
+            // InternalEssentialOCL.g:12527:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12528:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());
@@ -36340,17 +36340,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalEssentialOCL.g:12533:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
+    // InternalEssentialOCL.g:12537:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
     public final void rule__MapLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12537:1: ( ( ruleMapTypeCS ) )
-            // InternalEssentialOCL.g:12538:1: ( ruleMapTypeCS )
+            // InternalEssentialOCL.g:12541:1: ( ( ruleMapTypeCS ) )
+            // InternalEssentialOCL.g:12542:1: ( ruleMapTypeCS )
             {
-            // InternalEssentialOCL.g:12538:1: ( ruleMapTypeCS )
-            // InternalEssentialOCL.g:12539:1: ruleMapTypeCS
+            // InternalEssentialOCL.g:12542:1: ( ruleMapTypeCS )
+            // InternalEssentialOCL.g:12543:1: ruleMapTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());
@@ -36385,17 +36385,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalEssentialOCL.g:12548:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
+    // InternalEssentialOCL.g:12552:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12552:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalEssentialOCL.g:12553:1: ( ruleMapLiteralPartCS )
+            // InternalEssentialOCL.g:12556:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalEssentialOCL.g:12557:1: ( ruleMapLiteralPartCS )
             {
-            // InternalEssentialOCL.g:12553:1: ( ruleMapLiteralPartCS )
-            // InternalEssentialOCL.g:12554:1: ruleMapLiteralPartCS
+            // InternalEssentialOCL.g:12557:1: ( ruleMapLiteralPartCS )
+            // InternalEssentialOCL.g:12558:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());
@@ -36430,17 +36430,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalEssentialOCL.g:12563:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
+    // InternalEssentialOCL.g:12567:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12567:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalEssentialOCL.g:12568:1: ( ruleMapLiteralPartCS )
+            // InternalEssentialOCL.g:12571:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalEssentialOCL.g:12572:1: ( ruleMapLiteralPartCS )
             {
-            // InternalEssentialOCL.g:12568:1: ( ruleMapLiteralPartCS )
-            // InternalEssentialOCL.g:12569:1: ruleMapLiteralPartCS
+            // InternalEssentialOCL.g:12572:1: ( ruleMapLiteralPartCS )
+            // InternalEssentialOCL.g:12573:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());
@@ -36475,17 +36475,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedKeyAssignment_0"
-    // InternalEssentialOCL.g:12578:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12582:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedKeyAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12582:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12583:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12586:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12587:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12583:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12584:1: ruleExpCS
+            // InternalEssentialOCL.g:12587:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12588:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());
@@ -36520,17 +36520,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedValueAssignment_2"
-    // InternalEssentialOCL.g:12593:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12597:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12597:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12598:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12601:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12602:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12598:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12599:1: ruleExpCS
+            // InternalEssentialOCL.g:12602:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12603:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());
@@ -36565,17 +36565,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_2"
-    // InternalEssentialOCL.g:12608:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
+    // InternalEssentialOCL.g:12612:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12612:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalEssentialOCL.g:12613:1: ( ruleTupleLiteralPartCS )
+            // InternalEssentialOCL.g:12616:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalEssentialOCL.g:12617:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalEssentialOCL.g:12613:1: ( ruleTupleLiteralPartCS )
-            // InternalEssentialOCL.g:12614:1: ruleTupleLiteralPartCS
+            // InternalEssentialOCL.g:12617:1: ( ruleTupleLiteralPartCS )
+            // InternalEssentialOCL.g:12618:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());
@@ -36610,17 +36610,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1"
-    // InternalEssentialOCL.g:12623:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
+    // InternalEssentialOCL.g:12627:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12627:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalEssentialOCL.g:12628:1: ( ruleTupleLiteralPartCS )
+            // InternalEssentialOCL.g:12631:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalEssentialOCL.g:12632:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalEssentialOCL.g:12628:1: ( ruleTupleLiteralPartCS )
-            // InternalEssentialOCL.g:12629:1: ruleTupleLiteralPartCS
+            // InternalEssentialOCL.g:12632:1: ( ruleTupleLiteralPartCS )
+            // InternalEssentialOCL.g:12633:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());
@@ -36655,17 +36655,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__NameAssignment_0"
-    // InternalEssentialOCL.g:12638:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalEssentialOCL.g:12642:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TupleLiteralPartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12642:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:12643:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12646:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:12647:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:12643:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:12644:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:12647:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:12648:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -36700,17 +36700,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1"
-    // InternalEssentialOCL.g:12653:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:12657:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12657:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:12658:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12661:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:12662:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:12658:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:12659:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:12662:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:12663:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -36745,17 +36745,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3"
-    // InternalEssentialOCL.g:12668:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12672:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12672:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12673:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12676:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12677:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12673:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12674:1: ruleExpCS
+            // InternalEssentialOCL.g:12677:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12678:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());
@@ -36790,17 +36790,17 @@
 
 
     // $ANTLR start "rule__NumberLiteralExpCS__SymbolAssignment"
-    // InternalEssentialOCL.g:12683:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
+    // InternalEssentialOCL.g:12687:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
     public final void rule__NumberLiteralExpCS__SymbolAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12687:1: ( ( ruleNUMBER_LITERAL ) )
-            // InternalEssentialOCL.g:12688:1: ( ruleNUMBER_LITERAL )
+            // InternalEssentialOCL.g:12691:1: ( ( ruleNUMBER_LITERAL ) )
+            // InternalEssentialOCL.g:12692:1: ( ruleNUMBER_LITERAL )
             {
-            // InternalEssentialOCL.g:12688:1: ( ruleNUMBER_LITERAL )
-            // InternalEssentialOCL.g:12689:1: ruleNUMBER_LITERAL
+            // InternalEssentialOCL.g:12692:1: ( ruleNUMBER_LITERAL )
+            // InternalEssentialOCL.g:12693:1: ruleNUMBER_LITERAL
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());
@@ -36835,17 +36835,17 @@
 
 
     // $ANTLR start "rule__StringLiteralExpCS__SegmentsAssignment"
-    // InternalEssentialOCL.g:12698:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
+    // InternalEssentialOCL.g:12702:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
     public final void rule__StringLiteralExpCS__SegmentsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12702:1: ( ( ruleStringLiteral ) )
-            // InternalEssentialOCL.g:12703:1: ( ruleStringLiteral )
+            // InternalEssentialOCL.g:12706:1: ( ( ruleStringLiteral ) )
+            // InternalEssentialOCL.g:12707:1: ( ruleStringLiteral )
             {
-            // InternalEssentialOCL.g:12703:1: ( ruleStringLiteral )
-            // InternalEssentialOCL.g:12704:1: ruleStringLiteral
+            // InternalEssentialOCL.g:12707:1: ( ruleStringLiteral )
+            // InternalEssentialOCL.g:12708:1: ruleStringLiteral
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());
@@ -36880,23 +36880,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_0"
-    // InternalEssentialOCL.g:12713:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
+    // InternalEssentialOCL.g:12717:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12717:1: ( ( ( 'true' ) ) )
-            // InternalEssentialOCL.g:12718:1: ( ( 'true' ) )
+            // InternalEssentialOCL.g:12721:1: ( ( ( 'true' ) ) )
+            // InternalEssentialOCL.g:12722:1: ( ( 'true' ) )
             {
-            // InternalEssentialOCL.g:12718:1: ( ( 'true' ) )
-            // InternalEssentialOCL.g:12719:1: ( 'true' )
+            // InternalEssentialOCL.g:12722:1: ( ( 'true' ) )
+            // InternalEssentialOCL.g:12723:1: ( 'true' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
             }
-            // InternalEssentialOCL.g:12720:1: ( 'true' )
-            // InternalEssentialOCL.g:12721:1: 'true'
+            // InternalEssentialOCL.g:12724:1: ( 'true' )
+            // InternalEssentialOCL.g:12725:1: 'true'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
@@ -36933,23 +36933,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_1"
-    // InternalEssentialOCL.g:12736:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
+    // InternalEssentialOCL.g:12740:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12740:1: ( ( ( 'false' ) ) )
-            // InternalEssentialOCL.g:12741:1: ( ( 'false' ) )
+            // InternalEssentialOCL.g:12744:1: ( ( ( 'false' ) ) )
+            // InternalEssentialOCL.g:12745:1: ( ( 'false' ) )
             {
-            // InternalEssentialOCL.g:12741:1: ( ( 'false' ) )
-            // InternalEssentialOCL.g:12742:1: ( 'false' )
+            // InternalEssentialOCL.g:12745:1: ( ( 'false' ) )
+            // InternalEssentialOCL.g:12746:1: ( 'false' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
             }
-            // InternalEssentialOCL.g:12743:1: ( 'false' )
-            // InternalEssentialOCL.g:12744:1: 'false'
+            // InternalEssentialOCL.g:12747:1: ( 'false' )
+            // InternalEssentialOCL.g:12748:1: 'false'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
@@ -36986,17 +36986,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1"
-    // InternalEssentialOCL.g:12759:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalEssentialOCL.g:12763:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12763:1: ( ( ruleMultiplicityCS ) )
-            // InternalEssentialOCL.g:12764:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:12767:1: ( ( ruleMultiplicityCS ) )
+            // InternalEssentialOCL.g:12768:1: ( ruleMultiplicityCS )
             {
-            // InternalEssentialOCL.g:12764:1: ( ruleMultiplicityCS )
-            // InternalEssentialOCL.g:12765:1: ruleMultiplicityCS
+            // InternalEssentialOCL.g:12768:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:12769:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -37031,17 +37031,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralExpCS__OwnedTypeAssignment"
-    // InternalEssentialOCL.g:12774:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
+    // InternalEssentialOCL.g:12778:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
     public final void rule__TypeLiteralExpCS__OwnedTypeAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12778:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
-            // InternalEssentialOCL.g:12779:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalEssentialOCL.g:12782:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
+            // InternalEssentialOCL.g:12783:1: ( ruleTypeLiteralWithMultiplicityCS )
             {
-            // InternalEssentialOCL.g:12779:1: ( ruleTypeLiteralWithMultiplicityCS )
-            // InternalEssentialOCL.g:12780:1: ruleTypeLiteralWithMultiplicityCS
+            // InternalEssentialOCL.g:12783:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalEssentialOCL.g:12784:1: ruleTypeLiteralWithMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());
@@ -37076,17 +37076,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPathNameAssignment_0"
-    // InternalEssentialOCL.g:12789:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalEssentialOCL.g:12793:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypeNameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12793:1: ( ( rulePathNameCS ) )
-            // InternalEssentialOCL.g:12794:1: ( rulePathNameCS )
+            // InternalEssentialOCL.g:12797:1: ( ( rulePathNameCS ) )
+            // InternalEssentialOCL.g:12798:1: ( rulePathNameCS )
             {
-            // InternalEssentialOCL.g:12794:1: ( rulePathNameCS )
-            // InternalEssentialOCL.g:12795:1: rulePathNameCS
+            // InternalEssentialOCL.g:12798:1: ( rulePathNameCS )
+            // InternalEssentialOCL.g:12799:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -37121,17 +37121,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0"
-    // InternalEssentialOCL.g:12804:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalEssentialOCL.g:12808:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12808:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalEssentialOCL.g:12809:1: ( ruleCurlyBracketedClauseCS )
+            // InternalEssentialOCL.g:12812:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalEssentialOCL.g:12813:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalEssentialOCL.g:12809:1: ( ruleCurlyBracketedClauseCS )
-            // InternalEssentialOCL.g:12810:1: ruleCurlyBracketedClauseCS
+            // InternalEssentialOCL.g:12813:1: ( ruleCurlyBracketedClauseCS )
+            // InternalEssentialOCL.g:12814:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());
@@ -37166,17 +37166,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1"
-    // InternalEssentialOCL.g:12819:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12823:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
     public final void rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12823:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12824:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12827:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12828:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12824:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12825:1: ruleExpCS
+            // InternalEssentialOCL.g:12828:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12829:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());
@@ -37211,17 +37211,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__OwnedMultiplicityAssignment_1"
-    // InternalEssentialOCL.g:12834:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalEssentialOCL.g:12838:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeExpCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12838:1: ( ( ruleMultiplicityCS ) )
-            // InternalEssentialOCL.g:12839:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:12842:1: ( ( ruleMultiplicityCS ) )
+            // InternalEssentialOCL.g:12843:1: ( ruleMultiplicityCS )
             {
-            // InternalEssentialOCL.g:12839:1: ( ruleMultiplicityCS )
-            // InternalEssentialOCL.g:12840:1: ruleMultiplicityCS
+            // InternalEssentialOCL.g:12843:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:12844:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -37256,17 +37256,17 @@
 
 
     // $ANTLR start "rule__ExpCS__NameAssignment_0_1_1"
-    // InternalEssentialOCL.g:12849:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
+    // InternalEssentialOCL.g:12853:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
     public final void rule__ExpCS__NameAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12853:1: ( ( ruleBinaryOperatorName ) )
-            // InternalEssentialOCL.g:12854:1: ( ruleBinaryOperatorName )
+            // InternalEssentialOCL.g:12857:1: ( ( ruleBinaryOperatorName ) )
+            // InternalEssentialOCL.g:12858:1: ( ruleBinaryOperatorName )
             {
-            // InternalEssentialOCL.g:12854:1: ( ruleBinaryOperatorName )
-            // InternalEssentialOCL.g:12855:1: ruleBinaryOperatorName
+            // InternalEssentialOCL.g:12858:1: ( ruleBinaryOperatorName )
+            // InternalEssentialOCL.g:12859:1: ruleBinaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());
@@ -37301,17 +37301,17 @@
 
 
     // $ANTLR start "rule__ExpCS__OwnedRightAssignment_0_1_2"
-    // InternalEssentialOCL.g:12864:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:12868:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
     public final void rule__ExpCS__OwnedRightAssignment_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12868:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:12869:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12872:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:12873:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:12869:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:12870:1: ruleExpCS
+            // InternalEssentialOCL.g:12873:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:12874:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());
@@ -37346,17 +37346,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__NameAssignment_0_1"
-    // InternalEssentialOCL.g:12879:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalEssentialOCL.g:12883:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedLetExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12883:1: ( ( ruleUnaryOperatorName ) )
-            // InternalEssentialOCL.g:12884:1: ( ruleUnaryOperatorName )
+            // InternalEssentialOCL.g:12887:1: ( ( ruleUnaryOperatorName ) )
+            // InternalEssentialOCL.g:12888:1: ( ruleUnaryOperatorName )
             {
-            // InternalEssentialOCL.g:12884:1: ( ruleUnaryOperatorName )
-            // InternalEssentialOCL.g:12885:1: ruleUnaryOperatorName
+            // InternalEssentialOCL.g:12888:1: ( ruleUnaryOperatorName )
+            // InternalEssentialOCL.g:12889:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -37391,17 +37391,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__OwnedRightAssignment_0_2"
-    // InternalEssentialOCL.g:12894:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
+    // InternalEssentialOCL.g:12898:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
     public final void rule__PrefixedLetExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12898:1: ( ( rulePrefixedLetExpCS ) )
-            // InternalEssentialOCL.g:12899:1: ( rulePrefixedLetExpCS )
+            // InternalEssentialOCL.g:12902:1: ( ( rulePrefixedLetExpCS ) )
+            // InternalEssentialOCL.g:12903:1: ( rulePrefixedLetExpCS )
             {
-            // InternalEssentialOCL.g:12899:1: ( rulePrefixedLetExpCS )
-            // InternalEssentialOCL.g:12900:1: rulePrefixedLetExpCS
+            // InternalEssentialOCL.g:12903:1: ( rulePrefixedLetExpCS )
+            // InternalEssentialOCL.g:12904:1: rulePrefixedLetExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());
@@ -37436,17 +37436,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__NameAssignment_0_1"
-    // InternalEssentialOCL.g:12909:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalEssentialOCL.g:12913:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedPrimaryExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12913:1: ( ( ruleUnaryOperatorName ) )
-            // InternalEssentialOCL.g:12914:1: ( ruleUnaryOperatorName )
+            // InternalEssentialOCL.g:12917:1: ( ( ruleUnaryOperatorName ) )
+            // InternalEssentialOCL.g:12918:1: ( ruleUnaryOperatorName )
             {
-            // InternalEssentialOCL.g:12914:1: ( ruleUnaryOperatorName )
-            // InternalEssentialOCL.g:12915:1: ruleUnaryOperatorName
+            // InternalEssentialOCL.g:12918:1: ( ruleUnaryOperatorName )
+            // InternalEssentialOCL.g:12919:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -37481,17 +37481,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2"
-    // InternalEssentialOCL.g:12924:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalEssentialOCL.g:12928:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12928:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalEssentialOCL.g:12929:1: ( rulePrefixedPrimaryExpCS )
+            // InternalEssentialOCL.g:12932:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalEssentialOCL.g:12933:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalEssentialOCL.g:12929:1: ( rulePrefixedPrimaryExpCS )
-            // InternalEssentialOCL.g:12930:1: rulePrefixedPrimaryExpCS
+            // InternalEssentialOCL.g:12933:1: ( rulePrefixedPrimaryExpCS )
+            // InternalEssentialOCL.g:12934:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());
@@ -37526,17 +37526,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedPathNameAssignment_0"
-    // InternalEssentialOCL.g:12939:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalEssentialOCL.g:12943:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__NameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12943:1: ( ( rulePathNameCS ) )
-            // InternalEssentialOCL.g:12944:1: ( rulePathNameCS )
+            // InternalEssentialOCL.g:12947:1: ( ( rulePathNameCS ) )
+            // InternalEssentialOCL.g:12948:1: ( rulePathNameCS )
             {
-            // InternalEssentialOCL.g:12944:1: ( rulePathNameCS )
-            // InternalEssentialOCL.g:12945:1: rulePathNameCS
+            // InternalEssentialOCL.g:12948:1: ( rulePathNameCS )
+            // InternalEssentialOCL.g:12949:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -37571,17 +37571,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1"
-    // InternalEssentialOCL.g:12954:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
+    // InternalEssentialOCL.g:12958:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12958:1: ( ( ruleSquareBracketedClauseCS ) )
-            // InternalEssentialOCL.g:12959:1: ( ruleSquareBracketedClauseCS )
+            // InternalEssentialOCL.g:12962:1: ( ( ruleSquareBracketedClauseCS ) )
+            // InternalEssentialOCL.g:12963:1: ( ruleSquareBracketedClauseCS )
             {
-            // InternalEssentialOCL.g:12959:1: ( ruleSquareBracketedClauseCS )
-            // InternalEssentialOCL.g:12960:1: ruleSquareBracketedClauseCS
+            // InternalEssentialOCL.g:12963:1: ( ruleSquareBracketedClauseCS )
+            // InternalEssentialOCL.g:12964:1: ruleSquareBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
@@ -37616,17 +37616,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2"
-    // InternalEssentialOCL.g:12969:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalEssentialOCL.g:12973:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12973:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalEssentialOCL.g:12974:1: ( ruleRoundBracketedClauseCS )
+            // InternalEssentialOCL.g:12977:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalEssentialOCL.g:12978:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalEssentialOCL.g:12974:1: ( ruleRoundBracketedClauseCS )
-            // InternalEssentialOCL.g:12975:1: ruleRoundBracketedClauseCS
+            // InternalEssentialOCL.g:12978:1: ( ruleRoundBracketedClauseCS )
+            // InternalEssentialOCL.g:12979:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
@@ -37661,17 +37661,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3"
-    // InternalEssentialOCL.g:12984:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalEssentialOCL.g:12988:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:12988:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalEssentialOCL.g:12989:1: ( ruleCurlyBracketedClauseCS )
+            // InternalEssentialOCL.g:12992:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalEssentialOCL.g:12993:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalEssentialOCL.g:12989:1: ( ruleCurlyBracketedClauseCS )
-            // InternalEssentialOCL.g:12990:1: ruleCurlyBracketedClauseCS
+            // InternalEssentialOCL.g:12993:1: ( ruleCurlyBracketedClauseCS )
+            // InternalEssentialOCL.g:12994:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
@@ -37706,23 +37706,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__IsPreAssignment_4_0"
-    // InternalEssentialOCL.g:12999:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
+    // InternalEssentialOCL.g:13003:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
     public final void rule__NameExpCS__IsPreAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13003:1: ( ( ( '@' ) ) )
-            // InternalEssentialOCL.g:13004:1: ( ( '@' ) )
+            // InternalEssentialOCL.g:13007:1: ( ( ( '@' ) ) )
+            // InternalEssentialOCL.g:13008:1: ( ( '@' ) )
             {
-            // InternalEssentialOCL.g:13004:1: ( ( '@' ) )
-            // InternalEssentialOCL.g:13005:1: ( '@' )
+            // InternalEssentialOCL.g:13008:1: ( ( '@' ) )
+            // InternalEssentialOCL.g:13009:1: ( '@' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
             }
-            // InternalEssentialOCL.g:13006:1: ( '@' )
-            // InternalEssentialOCL.g:13007:1: '@'
+            // InternalEssentialOCL.g:13010:1: ( '@' )
+            // InternalEssentialOCL.g:13011:1: '@'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
@@ -37759,17 +37759,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0"
-    // InternalEssentialOCL.g:13022:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
+    // InternalEssentialOCL.g:13026:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13026:1: ( ( ruleShadowPartCS ) )
-            // InternalEssentialOCL.g:13027:1: ( ruleShadowPartCS )
+            // InternalEssentialOCL.g:13030:1: ( ( ruleShadowPartCS ) )
+            // InternalEssentialOCL.g:13031:1: ( ruleShadowPartCS )
             {
-            // InternalEssentialOCL.g:13027:1: ( ruleShadowPartCS )
-            // InternalEssentialOCL.g:13028:1: ruleShadowPartCS
+            // InternalEssentialOCL.g:13031:1: ( ruleShadowPartCS )
+            // InternalEssentialOCL.g:13032:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());
@@ -37804,17 +37804,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1"
-    // InternalEssentialOCL.g:13037:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
+    // InternalEssentialOCL.g:13041:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13041:1: ( ( ruleShadowPartCS ) )
-            // InternalEssentialOCL.g:13042:1: ( ruleShadowPartCS )
+            // InternalEssentialOCL.g:13045:1: ( ( ruleShadowPartCS ) )
+            // InternalEssentialOCL.g:13046:1: ( ruleShadowPartCS )
             {
-            // InternalEssentialOCL.g:13042:1: ( ruleShadowPartCS )
-            // InternalEssentialOCL.g:13043:1: ruleShadowPartCS
+            // InternalEssentialOCL.g:13046:1: ( ruleShadowPartCS )
+            // InternalEssentialOCL.g:13047:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());
@@ -37849,17 +37849,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0"
-    // InternalEssentialOCL.g:13052:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
+    // InternalEssentialOCL.g:13056:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13056:1: ( ( ruleNavigatingArgCS ) )
-            // InternalEssentialOCL.g:13057:1: ( ruleNavigatingArgCS )
+            // InternalEssentialOCL.g:13060:1: ( ( ruleNavigatingArgCS ) )
+            // InternalEssentialOCL.g:13061:1: ( ruleNavigatingArgCS )
             {
-            // InternalEssentialOCL.g:13057:1: ( ruleNavigatingArgCS )
-            // InternalEssentialOCL.g:13058:1: ruleNavigatingArgCS
+            // InternalEssentialOCL.g:13061:1: ( ruleNavigatingArgCS )
+            // InternalEssentialOCL.g:13062:1: ruleNavigatingArgCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
@@ -37894,23 +37894,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1"
-    // InternalEssentialOCL.g:13067:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
+    // InternalEssentialOCL.g:13071:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13071:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
-            // InternalEssentialOCL.g:13072:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalEssentialOCL.g:13075:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
+            // InternalEssentialOCL.g:13076:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
             {
-            // InternalEssentialOCL.g:13072:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
-            // InternalEssentialOCL.g:13073:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalEssentialOCL.g:13076:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalEssentialOCL.g:13077:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAlternatives_2_1_0());
             }
-            // InternalEssentialOCL.g:13074:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
-            // InternalEssentialOCL.g:13074:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
+            // InternalEssentialOCL.g:13078:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalEssentialOCL.g:13078:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0();
@@ -37945,17 +37945,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_1"
-    // InternalEssentialOCL.g:13083:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13087:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13087:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13088:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13091:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13092:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13088:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13089:1: ruleExpCS
+            // InternalEssentialOCL.g:13092:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13093:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
@@ -37990,17 +37990,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1"
-    // InternalEssentialOCL.g:13098:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13102:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13102:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13103:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13106:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13107:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13103:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13104:1: ruleExpCS
+            // InternalEssentialOCL.g:13107:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13108:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
@@ -38035,17 +38035,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0"
-    // InternalEssentialOCL.g:13113:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
+    // InternalEssentialOCL.g:13117:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13117:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalEssentialOCL.g:13118:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13121:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalEssentialOCL.g:13122:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalEssentialOCL.g:13118:1: ( ruleNavigatingArgExpCS )
-            // InternalEssentialOCL.g:13119:1: ruleNavigatingArgExpCS
+            // InternalEssentialOCL.g:13122:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13123:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
@@ -38080,17 +38080,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1"
-    // InternalEssentialOCL.g:13128:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalEssentialOCL.g:13132:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13132:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalEssentialOCL.g:13133:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13136:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalEssentialOCL.g:13137:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalEssentialOCL.g:13133:1: ( ruleCoIteratorVariableCS )
-            // InternalEssentialOCL.g:13134:1: ruleCoIteratorVariableCS
+            // InternalEssentialOCL.g:13137:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13138:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
@@ -38125,17 +38125,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"
-    // InternalEssentialOCL.g:13143:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13147:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13147:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13148:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13151:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13152:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13148:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13149:1: ruleExpCS
+            // InternalEssentialOCL.g:13152:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13153:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());
@@ -38170,17 +38170,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1"
-    // InternalEssentialOCL.g:13158:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13162:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13162:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13163:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13166:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13167:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13163:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13164:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13167:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13168:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
@@ -38215,17 +38215,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1"
-    // InternalEssentialOCL.g:13173:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalEssentialOCL.g:13177:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13177:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalEssentialOCL.g:13178:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13181:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalEssentialOCL.g:13182:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalEssentialOCL.g:13178:1: ( ruleCoIteratorVariableCS )
-            // InternalEssentialOCL.g:13179:1: ruleCoIteratorVariableCS
+            // InternalEssentialOCL.g:13182:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13183:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
@@ -38260,17 +38260,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1"
-    // InternalEssentialOCL.g:13188:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13192:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13192:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13193:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13196:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13197:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13193:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13194:1: ruleExpCS
+            // InternalEssentialOCL.g:13197:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13198:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());
@@ -38305,17 +38305,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1"
-    // InternalEssentialOCL.g:13203:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13207:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13207:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13208:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13211:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13212:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13208:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13209:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13212:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13213:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
@@ -38350,17 +38350,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1"
-    // InternalEssentialOCL.g:13218:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalEssentialOCL.g:13222:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13222:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalEssentialOCL.g:13223:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13226:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalEssentialOCL.g:13227:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalEssentialOCL.g:13223:1: ( ruleCoIteratorVariableCS )
-            // InternalEssentialOCL.g:13224:1: ruleCoIteratorVariableCS
+            // InternalEssentialOCL.g:13227:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13228:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
@@ -38395,17 +38395,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3"
-    // InternalEssentialOCL.g:13233:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13237:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13237:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13238:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13241:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13242:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13238:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13239:1: ruleExpCS
+            // InternalEssentialOCL.g:13242:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13243:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());
@@ -38440,17 +38440,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_1_1"
-    // InternalEssentialOCL.g:13248:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13252:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13252:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13253:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13256:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13257:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13253:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13254:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13257:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13258:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -38485,23 +38485,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__PrefixAssignment_0"
-    // InternalEssentialOCL.g:13263:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
+    // InternalEssentialOCL.g:13267:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
     public final void rule__NavigatingBarArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13267:1: ( ( ( '|' ) ) )
-            // InternalEssentialOCL.g:13268:1: ( ( '|' ) )
+            // InternalEssentialOCL.g:13271:1: ( ( ( '|' ) ) )
+            // InternalEssentialOCL.g:13272:1: ( ( '|' ) )
             {
-            // InternalEssentialOCL.g:13268:1: ( ( '|' ) )
-            // InternalEssentialOCL.g:13269:1: ( '|' )
+            // InternalEssentialOCL.g:13272:1: ( ( '|' ) )
+            // InternalEssentialOCL.g:13273:1: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
             }
-            // InternalEssentialOCL.g:13270:1: ( '|' )
-            // InternalEssentialOCL.g:13271:1: '|'
+            // InternalEssentialOCL.g:13274:1: ( '|' )
+            // InternalEssentialOCL.g:13275:1: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
@@ -38538,17 +38538,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1"
-    // InternalEssentialOCL.g:13286:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalEssentialOCL.g:13290:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13290:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalEssentialOCL.g:13291:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13294:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalEssentialOCL.g:13295:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalEssentialOCL.g:13291:1: ( ruleNavigatingArgExpCS )
-            // InternalEssentialOCL.g:13292:1: ruleNavigatingArgExpCS
+            // InternalEssentialOCL.g:13295:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13296:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -38583,17 +38583,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1"
-    // InternalEssentialOCL.g:13301:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13305:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13305:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13306:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13309:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13310:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13306:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13307:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13310:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13311:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -38628,17 +38628,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalEssentialOCL.g:13316:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13320:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13320:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13321:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13324:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13325:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13321:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13322:1: ruleExpCS
+            // InternalEssentialOCL.g:13325:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13326:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -38673,23 +38673,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__PrefixAssignment_0"
-    // InternalEssentialOCL.g:13331:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
+    // InternalEssentialOCL.g:13335:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
     public final void rule__NavigatingCommaArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13335:1: ( ( ( ',' ) ) )
-            // InternalEssentialOCL.g:13336:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:13339:1: ( ( ( ',' ) ) )
+            // InternalEssentialOCL.g:13340:1: ( ( ',' ) )
             {
-            // InternalEssentialOCL.g:13336:1: ( ( ',' ) )
-            // InternalEssentialOCL.g:13337:1: ( ',' )
+            // InternalEssentialOCL.g:13340:1: ( ( ',' ) )
+            // InternalEssentialOCL.g:13341:1: ( ',' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
             }
-            // InternalEssentialOCL.g:13338:1: ( ',' )
-            // InternalEssentialOCL.g:13339:1: ','
+            // InternalEssentialOCL.g:13342:1: ( ',' )
+            // InternalEssentialOCL.g:13343:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
@@ -38726,17 +38726,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1"
-    // InternalEssentialOCL.g:13354:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalEssentialOCL.g:13358:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13358:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalEssentialOCL.g:13359:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13362:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalEssentialOCL.g:13363:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalEssentialOCL.g:13359:1: ( ruleNavigatingArgExpCS )
-            // InternalEssentialOCL.g:13360:1: ruleNavigatingArgExpCS
+            // InternalEssentialOCL.g:13363:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13364:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -38771,17 +38771,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1"
-    // InternalEssentialOCL.g:13369:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalEssentialOCL.g:13373:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13373:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalEssentialOCL.g:13374:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13377:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalEssentialOCL.g:13378:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalEssentialOCL.g:13374:1: ( ruleCoIteratorVariableCS )
-            // InternalEssentialOCL.g:13375:1: ruleCoIteratorVariableCS
+            // InternalEssentialOCL.g:13378:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13379:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
@@ -38816,17 +38816,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"
-    // InternalEssentialOCL.g:13384:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13388:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13388:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13389:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13392:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13393:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13389:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13390:1: ruleExpCS
+            // InternalEssentialOCL.g:13393:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13394:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());
@@ -38861,17 +38861,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1"
-    // InternalEssentialOCL.g:13399:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13403:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13403:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13404:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13407:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13408:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13404:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13405:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13408:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13409:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
@@ -38906,17 +38906,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1"
-    // InternalEssentialOCL.g:13414:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalEssentialOCL.g:13418:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13418:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalEssentialOCL.g:13419:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13422:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalEssentialOCL.g:13423:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalEssentialOCL.g:13419:1: ( ruleCoIteratorVariableCS )
-            // InternalEssentialOCL.g:13420:1: ruleCoIteratorVariableCS
+            // InternalEssentialOCL.g:13423:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13424:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
@@ -38951,17 +38951,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1"
-    // InternalEssentialOCL.g:13429:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13433:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13433:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13434:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13437:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13438:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13434:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13435:1: ruleExpCS
+            // InternalEssentialOCL.g:13438:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13439:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());
@@ -38996,17 +38996,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1"
-    // InternalEssentialOCL.g:13444:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13448:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13448:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13449:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13452:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13453:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13449:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13450:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13453:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13454:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
@@ -39041,17 +39041,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1"
-    // InternalEssentialOCL.g:13459:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalEssentialOCL.g:13463:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13463:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalEssentialOCL.g:13464:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13467:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalEssentialOCL.g:13468:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalEssentialOCL.g:13464:1: ( ruleCoIteratorVariableCS )
-            // InternalEssentialOCL.g:13465:1: ruleCoIteratorVariableCS
+            // InternalEssentialOCL.g:13468:1: ( ruleCoIteratorVariableCS )
+            // InternalEssentialOCL.g:13469:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
@@ -39086,17 +39086,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3"
-    // InternalEssentialOCL.g:13474:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13478:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13478:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13479:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13482:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13483:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13479:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13480:1: ruleExpCS
+            // InternalEssentialOCL.g:13483:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13484:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());
@@ -39131,23 +39131,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__PrefixAssignment_0"
-    // InternalEssentialOCL.g:13489:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
+    // InternalEssentialOCL.g:13493:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
     public final void rule__NavigatingSemiArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13493:1: ( ( ( ';' ) ) )
-            // InternalEssentialOCL.g:13494:1: ( ( ';' ) )
+            // InternalEssentialOCL.g:13497:1: ( ( ( ';' ) ) )
+            // InternalEssentialOCL.g:13498:1: ( ( ';' ) )
             {
-            // InternalEssentialOCL.g:13494:1: ( ( ';' ) )
-            // InternalEssentialOCL.g:13495:1: ( ';' )
+            // InternalEssentialOCL.g:13498:1: ( ( ';' ) )
+            // InternalEssentialOCL.g:13499:1: ( ';' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
             }
-            // InternalEssentialOCL.g:13496:1: ( ';' )
-            // InternalEssentialOCL.g:13497:1: ';'
+            // InternalEssentialOCL.g:13500:1: ( ';' )
+            // InternalEssentialOCL.g:13501:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
@@ -39184,17 +39184,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1"
-    // InternalEssentialOCL.g:13512:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalEssentialOCL.g:13516:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13516:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalEssentialOCL.g:13517:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13520:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalEssentialOCL.g:13521:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalEssentialOCL.g:13517:1: ( ruleNavigatingArgExpCS )
-            // InternalEssentialOCL.g:13518:1: ruleNavigatingArgExpCS
+            // InternalEssentialOCL.g:13521:1: ( ruleNavigatingArgExpCS )
+            // InternalEssentialOCL.g:13522:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -39229,17 +39229,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1"
-    // InternalEssentialOCL.g:13527:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13531:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13531:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13532:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13535:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13536:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13532:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13533:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13536:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13537:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -39274,17 +39274,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalEssentialOCL.g:13542:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13546:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13546:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13547:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13550:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13551:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13547:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13548:1: ruleExpCS
+            // InternalEssentialOCL.g:13551:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13552:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -39319,17 +39319,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__NameAssignment_0"
-    // InternalEssentialOCL.g:13557:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalEssentialOCL.g:13561:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__CoIteratorVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13561:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:13562:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:13565:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:13566:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:13562:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:13563:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:13566:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:13567:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -39364,17 +39364,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1"
-    // InternalEssentialOCL.g:13572:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13576:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13576:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13577:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13580:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13581:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13577:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13578:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13581:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13582:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -39409,23 +39409,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAssignment_1"
-    // InternalEssentialOCL.g:13587:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
+    // InternalEssentialOCL.g:13591:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
     public final void rule__IfExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13591:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
-            // InternalEssentialOCL.g:13592:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalEssentialOCL.g:13595:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
+            // InternalEssentialOCL.g:13596:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
             {
-            // InternalEssentialOCL.g:13592:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
-            // InternalEssentialOCL.g:13593:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalEssentialOCL.g:13596:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalEssentialOCL.g:13597:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
             }
-            // InternalEssentialOCL.g:13594:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
-            // InternalEssentialOCL.g:13594:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
+            // InternalEssentialOCL.g:13598:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalEssentialOCL.g:13598:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAlternatives_1_0();
@@ -39460,17 +39460,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedThenExpressionAssignment_3"
-    // InternalEssentialOCL.g:13603:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13607:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13607:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13608:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13611:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13612:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13608:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13609:1: ruleExpCS
+            // InternalEssentialOCL.g:13612:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13613:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -39505,17 +39505,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedIfThenExpressionsAssignment_4"
-    // InternalEssentialOCL.g:13618:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
+    // InternalEssentialOCL.g:13622:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
     public final void rule__IfExpCS__OwnedIfThenExpressionsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13622:1: ( ( ruleElseIfThenExpCS ) )
-            // InternalEssentialOCL.g:13623:1: ( ruleElseIfThenExpCS )
+            // InternalEssentialOCL.g:13626:1: ( ( ruleElseIfThenExpCS ) )
+            // InternalEssentialOCL.g:13627:1: ( ruleElseIfThenExpCS )
             {
-            // InternalEssentialOCL.g:13623:1: ( ruleElseIfThenExpCS )
-            // InternalEssentialOCL.g:13624:1: ruleElseIfThenExpCS
+            // InternalEssentialOCL.g:13627:1: ( ruleElseIfThenExpCS )
+            // InternalEssentialOCL.g:13628:1: ruleElseIfThenExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
@@ -39550,17 +39550,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedElseExpressionAssignment_6"
-    // InternalEssentialOCL.g:13633:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13637:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedElseExpressionAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13637:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13638:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13641:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13642:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13638:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13639:1: ruleExpCS
+            // InternalEssentialOCL.g:13642:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13643:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
@@ -39595,17 +39595,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedConditionAssignment_1"
-    // InternalEssentialOCL.g:13648:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13652:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13652:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13653:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13656:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13657:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13653:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13654:1: ruleExpCS
+            // InternalEssentialOCL.g:13657:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13658:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
@@ -39640,17 +39640,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3"
-    // InternalEssentialOCL.g:13663:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13667:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13667:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13668:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13671:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13672:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13668:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13669:1: ruleExpCS
+            // InternalEssentialOCL.g:13672:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13673:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -39685,17 +39685,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_1"
-    // InternalEssentialOCL.g:13678:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
+    // InternalEssentialOCL.g:13682:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13682:1: ( ( ruleLetVariableCS ) )
-            // InternalEssentialOCL.g:13683:1: ( ruleLetVariableCS )
+            // InternalEssentialOCL.g:13686:1: ( ( ruleLetVariableCS ) )
+            // InternalEssentialOCL.g:13687:1: ( ruleLetVariableCS )
             {
-            // InternalEssentialOCL.g:13683:1: ( ruleLetVariableCS )
-            // InternalEssentialOCL.g:13684:1: ruleLetVariableCS
+            // InternalEssentialOCL.g:13687:1: ( ruleLetVariableCS )
+            // InternalEssentialOCL.g:13688:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
@@ -39730,17 +39730,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_2_1"
-    // InternalEssentialOCL.g:13693:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
+    // InternalEssentialOCL.g:13697:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13697:1: ( ( ruleLetVariableCS ) )
-            // InternalEssentialOCL.g:13698:1: ( ruleLetVariableCS )
+            // InternalEssentialOCL.g:13701:1: ( ( ruleLetVariableCS ) )
+            // InternalEssentialOCL.g:13702:1: ( ruleLetVariableCS )
             {
-            // InternalEssentialOCL.g:13698:1: ( ruleLetVariableCS )
-            // InternalEssentialOCL.g:13699:1: ruleLetVariableCS
+            // InternalEssentialOCL.g:13702:1: ( ruleLetVariableCS )
+            // InternalEssentialOCL.g:13703:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
@@ -39775,17 +39775,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedInExpressionAssignment_4"
-    // InternalEssentialOCL.g:13708:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13712:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetExpCS__OwnedInExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13712:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13713:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13716:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13717:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13713:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13714:1: ruleExpCS
+            // InternalEssentialOCL.g:13717:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13718:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());
@@ -39820,17 +39820,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__NameAssignment_0"
-    // InternalEssentialOCL.g:13723:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalEssentialOCL.g:13727:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__LetVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13727:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:13728:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:13731:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:13732:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:13728:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:13729:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:13732:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:13733:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -39865,17 +39865,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1"
-    // InternalEssentialOCL.g:13738:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalEssentialOCL.g:13742:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13742:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalEssentialOCL.g:13743:1: ( ruleRoundBracketedClauseCS )
+            // InternalEssentialOCL.g:13746:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalEssentialOCL.g:13747:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalEssentialOCL.g:13743:1: ( ruleRoundBracketedClauseCS )
-            // InternalEssentialOCL.g:13744:1: ruleRoundBracketedClauseCS
+            // InternalEssentialOCL.g:13747:1: ( ruleRoundBracketedClauseCS )
+            // InternalEssentialOCL.g:13748:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());
@@ -39910,17 +39910,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedTypeAssignment_2_1"
-    // InternalEssentialOCL.g:13753:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalEssentialOCL.g:13757:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__LetVariableCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13757:1: ( ( ruleTypeExpCS ) )
-            // InternalEssentialOCL.g:13758:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13761:1: ( ( ruleTypeExpCS ) )
+            // InternalEssentialOCL.g:13762:1: ( ruleTypeExpCS )
             {
-            // InternalEssentialOCL.g:13758:1: ( ruleTypeExpCS )
-            // InternalEssentialOCL.g:13759:1: ruleTypeExpCS
+            // InternalEssentialOCL.g:13762:1: ( ruleTypeExpCS )
+            // InternalEssentialOCL.g:13763:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -39955,17 +39955,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedInitExpressionAssignment_4"
-    // InternalEssentialOCL.g:13768:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13772:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetVariableCS__OwnedInitExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13772:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13773:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13776:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13777:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13773:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13774:1: ruleExpCS
+            // InternalEssentialOCL.g:13777:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13778:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());
@@ -40000,17 +40000,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__OwnedExpressionAssignment_1"
-    // InternalEssentialOCL.g:13783:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
+    // InternalEssentialOCL.g:13787:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__NestedExpCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13787:1: ( ( ruleExpCS ) )
-            // InternalEssentialOCL.g:13788:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13791:1: ( ( ruleExpCS ) )
+            // InternalEssentialOCL.g:13792:1: ( ruleExpCS )
             {
-            // InternalEssentialOCL.g:13788:1: ( ruleExpCS )
-            // InternalEssentialOCL.g:13789:1: ruleExpCS
+            // InternalEssentialOCL.g:13792:1: ( ruleExpCS )
+            // InternalEssentialOCL.g:13793:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());
@@ -40045,17 +40045,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"
-    // InternalEssentialOCL.g:13798:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
+    // InternalEssentialOCL.g:13802:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
     public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13802:1: ( ( ruleLOWER ) )
-            // InternalEssentialOCL.g:13803:1: ( ruleLOWER )
+            // InternalEssentialOCL.g:13806:1: ( ( ruleLOWER ) )
+            // InternalEssentialOCL.g:13807:1: ( ruleLOWER )
             {
-            // InternalEssentialOCL.g:13803:1: ( ruleLOWER )
-            // InternalEssentialOCL.g:13804:1: ruleLOWER
+            // InternalEssentialOCL.g:13807:1: ( ruleLOWER )
+            // InternalEssentialOCL.g:13808:1: ruleLOWER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
@@ -40090,17 +40090,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"
-    // InternalEssentialOCL.g:13813:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
+    // InternalEssentialOCL.g:13817:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
     public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13817:1: ( ( ruleUPPER ) )
-            // InternalEssentialOCL.g:13818:1: ( ruleUPPER )
+            // InternalEssentialOCL.g:13821:1: ( ( ruleUPPER ) )
+            // InternalEssentialOCL.g:13822:1: ( ruleUPPER )
             {
-            // InternalEssentialOCL.g:13818:1: ( ruleUPPER )
-            // InternalEssentialOCL.g:13819:1: ruleUPPER
+            // InternalEssentialOCL.g:13822:1: ( ruleUPPER )
+            // InternalEssentialOCL.g:13823:1: ruleUPPER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
@@ -40135,23 +40135,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__IsNullFreeAssignment_2_1"
-    // InternalEssentialOCL.g:13828:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
+    // InternalEssentialOCL.g:13832:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
     public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13832:1: ( ( ( '|1' ) ) )
-            // InternalEssentialOCL.g:13833:1: ( ( '|1' ) )
+            // InternalEssentialOCL.g:13836:1: ( ( ( '|1' ) ) )
+            // InternalEssentialOCL.g:13837:1: ( ( '|1' ) )
             {
-            // InternalEssentialOCL.g:13833:1: ( ( '|1' ) )
-            // InternalEssentialOCL.g:13834:1: ( '|1' )
+            // InternalEssentialOCL.g:13837:1: ( ( '|1' ) )
+            // InternalEssentialOCL.g:13838:1: ( '|1' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
             }
-            // InternalEssentialOCL.g:13835:1: ( '|1' )
-            // InternalEssentialOCL.g:13836:1: '|1'
+            // InternalEssentialOCL.g:13839:1: ( '|1' )
+            // InternalEssentialOCL.g:13840:1: '|1'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
@@ -40188,23 +40188,23 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAssignment"
-    // InternalEssentialOCL.g:13851:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
+    // InternalEssentialOCL.g:13855:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
     public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13855:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
-            // InternalEssentialOCL.g:13856:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalEssentialOCL.g:13859:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
+            // InternalEssentialOCL.g:13860:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
             {
-            // InternalEssentialOCL.g:13856:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
-            // InternalEssentialOCL.g:13857:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalEssentialOCL.g:13860:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalEssentialOCL.g:13861:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
             }
-            // InternalEssentialOCL.g:13858:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
-            // InternalEssentialOCL.g:13858:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
+            // InternalEssentialOCL.g:13862:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalEssentialOCL.g:13862:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityStringCS__StringBoundsAlternatives_0();
@@ -40239,17 +40239,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_0"
-    // InternalEssentialOCL.g:13867:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
+    // InternalEssentialOCL.g:13871:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13871:1: ( ( ruleFirstPathElementCS ) )
-            // InternalEssentialOCL.g:13872:1: ( ruleFirstPathElementCS )
+            // InternalEssentialOCL.g:13875:1: ( ( ruleFirstPathElementCS ) )
+            // InternalEssentialOCL.g:13876:1: ( ruleFirstPathElementCS )
             {
-            // InternalEssentialOCL.g:13872:1: ( ruleFirstPathElementCS )
-            // InternalEssentialOCL.g:13873:1: ruleFirstPathElementCS
+            // InternalEssentialOCL.g:13876:1: ( ruleFirstPathElementCS )
+            // InternalEssentialOCL.g:13877:1: ruleFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
@@ -40284,17 +40284,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalEssentialOCL.g:13882:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalEssentialOCL.g:13886:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13886:1: ( ( ruleNextPathElementCS ) )
-            // InternalEssentialOCL.g:13887:1: ( ruleNextPathElementCS )
+            // InternalEssentialOCL.g:13890:1: ( ( ruleNextPathElementCS ) )
+            // InternalEssentialOCL.g:13891:1: ( ruleNextPathElementCS )
             {
-            // InternalEssentialOCL.g:13887:1: ( ruleNextPathElementCS )
-            // InternalEssentialOCL.g:13888:1: ruleNextPathElementCS
+            // InternalEssentialOCL.g:13891:1: ( ruleNextPathElementCS )
+            // InternalEssentialOCL.g:13892:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -40329,23 +40329,23 @@
 
 
     // $ANTLR start "rule__FirstPathElementCS__ReferredElementAssignment"
-    // InternalEssentialOCL.g:13897:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
+    // InternalEssentialOCL.g:13903:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13901:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalEssentialOCL.g:13902:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:13907:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalEssentialOCL.g:13908:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalEssentialOCL.g:13902:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:13903:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:13908:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:13909:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalEssentialOCL.g:13904:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:13905:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:13910:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:13911:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
@@ -40386,23 +40386,23 @@
 
 
     // $ANTLR start "rule__NextPathElementCS__ReferredElementAssignment"
-    // InternalEssentialOCL.g:13916:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
+    // InternalEssentialOCL.g:13922:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
     public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13920:1: ( ( ( ruleUnreservedName ) ) )
-            // InternalEssentialOCL.g:13921:1: ( ( ruleUnreservedName ) )
+            // InternalEssentialOCL.g:13926:1: ( ( ( ruleUnreservedName ) ) )
+            // InternalEssentialOCL.g:13927:1: ( ( ruleUnreservedName ) )
             {
-            // InternalEssentialOCL.g:13921:1: ( ( ruleUnreservedName ) )
-            // InternalEssentialOCL.g:13922:1: ( ruleUnreservedName )
+            // InternalEssentialOCL.g:13927:1: ( ( ruleUnreservedName ) )
+            // InternalEssentialOCL.g:13928:1: ( ruleUnreservedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalEssentialOCL.g:13923:1: ( ruleUnreservedName )
-            // InternalEssentialOCL.g:13924:1: ruleUnreservedName
+            // InternalEssentialOCL.g:13929:1: ( ruleUnreservedName )
+            // InternalEssentialOCL.g:13930:1: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
@@ -40443,17 +40443,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"
-    // InternalEssentialOCL.g:13935:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalEssentialOCL.g:13941:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13939:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalEssentialOCL.g:13940:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalEssentialOCL.g:13945:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalEssentialOCL.g:13946:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalEssentialOCL.g:13940:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalEssentialOCL.g:13941:1: ruleTemplateParameterSubstitutionCS
+            // InternalEssentialOCL.g:13946:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalEssentialOCL.g:13947:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
@@ -40488,17 +40488,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"
-    // InternalEssentialOCL.g:13950:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalEssentialOCL.g:13956:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13954:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalEssentialOCL.g:13955:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalEssentialOCL.g:13960:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalEssentialOCL.g:13961:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalEssentialOCL.g:13955:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalEssentialOCL.g:13956:1: ruleTemplateParameterSubstitutionCS
+            // InternalEssentialOCL.g:13961:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalEssentialOCL.g:13962:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
@@ -40533,17 +40533,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"
-    // InternalEssentialOCL.g:13965:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
+    // InternalEssentialOCL.g:13971:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
     public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13969:1: ( ( ruleMultiplicityCS ) )
-            // InternalEssentialOCL.g:13970:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:13975:1: ( ( ruleMultiplicityCS ) )
+            // InternalEssentialOCL.g:13976:1: ( ruleMultiplicityCS )
             {
-            // InternalEssentialOCL.g:13970:1: ( ruleMultiplicityCS )
-            // InternalEssentialOCL.g:13971:1: ruleMultiplicityCS
+            // InternalEssentialOCL.g:13976:1: ( ruleMultiplicityCS )
+            // InternalEssentialOCL.g:13977:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
@@ -40578,17 +40578,17 @@
 
 
     // $ANTLR start "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"
-    // InternalEssentialOCL.g:13980:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
+    // InternalEssentialOCL.g:13986:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
     public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:13984:1: ( ( ruleTypeRefCS ) )
-            // InternalEssentialOCL.g:13985:1: ( ruleTypeRefCS )
+            // InternalEssentialOCL.g:13990:1: ( ( ruleTypeRefCS ) )
+            // InternalEssentialOCL.g:13991:1: ( ruleTypeRefCS )
             {
-            // InternalEssentialOCL.g:13985:1: ( ruleTypeRefCS )
-            // InternalEssentialOCL.g:13986:1: ruleTypeRefCS
+            // InternalEssentialOCL.g:13991:1: ( ruleTypeRefCS )
+            // InternalEssentialOCL.g:13992:1: ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
@@ -40623,17 +40623,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__NameAssignment_0"
-    // InternalEssentialOCL.g:13997:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalEssentialOCL.g:14003:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:14001:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:14002:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:14007:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:14008:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:14002:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:14003:1: ruleUnrestrictedName
+            // InternalEssentialOCL.g:14008:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:14009:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -40668,17 +40668,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"
-    // InternalEssentialOCL.g:14012:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
+    // InternalEssentialOCL.g:14018:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:14016:1: ( ( ruleTypedRefCS ) )
-            // InternalEssentialOCL.g:14017:1: ( ruleTypedRefCS )
+            // InternalEssentialOCL.g:14022:1: ( ( ruleTypedRefCS ) )
+            // InternalEssentialOCL.g:14023:1: ( ruleTypedRefCS )
             {
-            // InternalEssentialOCL.g:14017:1: ( ruleTypedRefCS )
-            // InternalEssentialOCL.g:14018:1: ruleTypedRefCS
+            // InternalEssentialOCL.g:14023:1: ( ruleTypedRefCS )
+            // InternalEssentialOCL.g:14024:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
@@ -40713,17 +40713,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"
-    // InternalEssentialOCL.g:14027:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
+    // InternalEssentialOCL.g:14033:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:14031:1: ( ( ruleTypedRefCS ) )
-            // InternalEssentialOCL.g:14032:1: ( ruleTypedRefCS )
+            // InternalEssentialOCL.g:14037:1: ( ( ruleTypedRefCS ) )
+            // InternalEssentialOCL.g:14038:1: ( ruleTypedRefCS )
             {
-            // InternalEssentialOCL.g:14032:1: ( ruleTypedRefCS )
-            // InternalEssentialOCL.g:14033:1: ruleTypedRefCS
+            // InternalEssentialOCL.g:14038:1: ( ruleTypedRefCS )
+            // InternalEssentialOCL.g:14039:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
@@ -40758,17 +40758,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_0"
-    // InternalEssentialOCL.g:14042:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalEssentialOCL.g:14048:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:14046:1: ( ( rulePathNameCS ) )
-            // InternalEssentialOCL.g:14047:1: ( rulePathNameCS )
+            // InternalEssentialOCL.g:14052:1: ( ( rulePathNameCS ) )
+            // InternalEssentialOCL.g:14053:1: ( rulePathNameCS )
             {
-            // InternalEssentialOCL.g:14047:1: ( rulePathNameCS )
-            // InternalEssentialOCL.g:14048:1: rulePathNameCS
+            // InternalEssentialOCL.g:14053:1: ( rulePathNameCS )
+            // InternalEssentialOCL.g:14054:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -40803,17 +40803,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1"
-    // InternalEssentialOCL.g:14057:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 : ( ruleTemplateBindingCS ) ;
+    // InternalEssentialOCL.g:14063:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1 : ( ruleTemplateBindingCS ) ;
     public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:14061:1: ( ( ruleTemplateBindingCS ) )
-            // InternalEssentialOCL.g:14062:1: ( ruleTemplateBindingCS )
+            // InternalEssentialOCL.g:14067:1: ( ( ruleTemplateBindingCS ) )
+            // InternalEssentialOCL.g:14068:1: ( ruleTemplateBindingCS )
             {
-            // InternalEssentialOCL.g:14062:1: ( ruleTemplateBindingCS )
-            // InternalEssentialOCL.g:14063:1: ruleTemplateBindingCS
+            // InternalEssentialOCL.g:14068:1: ( ruleTemplateBindingCS )
+            // InternalEssentialOCL.g:14069:1: ruleTemplateBindingCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_0());
@@ -40848,17 +40848,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"
-    // InternalEssentialOCL.g:14072:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
+    // InternalEssentialOCL.g:14078:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalEssentialOCL.g:14076:1: ( ( ruleTypedRefCS ) )
-            // InternalEssentialOCL.g:14077:1: ( ruleTypedRefCS )
+            // InternalEssentialOCL.g:14082:1: ( ( ruleTypedRefCS ) )
+            // InternalEssentialOCL.g:14083:1: ( ruleTypedRefCS )
             {
-            // InternalEssentialOCL.g:14077:1: ( ruleTypedRefCS )
-            // InternalEssentialOCL.g:14078:1: ruleTypedRefCS
+            // InternalEssentialOCL.g:14083:1: ( ruleTypedRefCS )
+            // InternalEssentialOCL.g:14084:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
@@ -40893,11 +40893,11 @@
 
     // $ANTLR start synpred54_InternalEssentialOCL
     public final void synpred54_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3029:6: ( ( ruleTypeLiteralCS ) )
-        // InternalEssentialOCL.g:3029:6: ( ruleTypeLiteralCS )
+        // InternalEssentialOCL.g:3031:6: ( ( ruleTypeLiteralCS ) )
+        // InternalEssentialOCL.g:3031:6: ( ruleTypeLiteralCS )
         {
-        // InternalEssentialOCL.g:3029:6: ( ruleTypeLiteralCS )
-        // InternalEssentialOCL.g:3030:1: ruleTypeLiteralCS
+        // InternalEssentialOCL.g:3031:6: ( ruleTypeLiteralCS )
+        // InternalEssentialOCL.g:3032:1: ruleTypeLiteralCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -40917,17 +40917,17 @@
 
     // $ANTLR start synpred55_InternalEssentialOCL
     public final void synpred55_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3051:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
-        // InternalEssentialOCL.g:3051:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalEssentialOCL.g:3053:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
+        // InternalEssentialOCL.g:3053:1: ( ( rule__ExpCS__Group_0__0 ) )
         {
-        // InternalEssentialOCL.g:3051:1: ( ( rule__ExpCS__Group_0__0 ) )
-        // InternalEssentialOCL.g:3052:1: ( rule__ExpCS__Group_0__0 )
+        // InternalEssentialOCL.g:3053:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalEssentialOCL.g:3054:1: ( rule__ExpCS__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getExpCSAccess().getGroup_0());
         }
-        // InternalEssentialOCL.g:3053:1: ( rule__ExpCS__Group_0__0 )
-        // InternalEssentialOCL.g:3053:2: rule__ExpCS__Group_0__0
+        // InternalEssentialOCL.g:3055:1: ( rule__ExpCS__Group_0__0 )
+        // InternalEssentialOCL.g:3055:2: rule__ExpCS__Group_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__ExpCS__Group_0__0();
@@ -40947,11 +40947,11 @@
 
     // $ANTLR start synpred62_InternalEssentialOCL
     public final void synpred62_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3141:6: ( ( ruleTupleLiteralExpCS ) )
-        // InternalEssentialOCL.g:3141:6: ( ruleTupleLiteralExpCS )
+        // InternalEssentialOCL.g:3143:6: ( ( ruleTupleLiteralExpCS ) )
+        // InternalEssentialOCL.g:3143:6: ( ruleTupleLiteralExpCS )
         {
-        // InternalEssentialOCL.g:3141:6: ( ruleTupleLiteralExpCS )
-        // InternalEssentialOCL.g:3142:1: ruleTupleLiteralExpCS
+        // InternalEssentialOCL.g:3143:6: ( ruleTupleLiteralExpCS )
+        // InternalEssentialOCL.g:3144:1: ruleTupleLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -40971,11 +40971,11 @@
 
     // $ANTLR start synpred63_InternalEssentialOCL
     public final void synpred63_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3147:6: ( ( ruleMapLiteralExpCS ) )
-        // InternalEssentialOCL.g:3147:6: ( ruleMapLiteralExpCS )
+        // InternalEssentialOCL.g:3149:6: ( ( ruleMapLiteralExpCS ) )
+        // InternalEssentialOCL.g:3149:6: ( ruleMapLiteralExpCS )
         {
-        // InternalEssentialOCL.g:3147:6: ( ruleMapLiteralExpCS )
-        // InternalEssentialOCL.g:3148:1: ruleMapLiteralExpCS
+        // InternalEssentialOCL.g:3149:6: ( ruleMapLiteralExpCS )
+        // InternalEssentialOCL.g:3150:1: ruleMapLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -40995,11 +40995,11 @@
 
     // $ANTLR start synpred64_InternalEssentialOCL
     public final void synpred64_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3153:6: ( ( ruleCollectionLiteralExpCS ) )
-        // InternalEssentialOCL.g:3153:6: ( ruleCollectionLiteralExpCS )
+        // InternalEssentialOCL.g:3155:6: ( ( ruleCollectionLiteralExpCS ) )
+        // InternalEssentialOCL.g:3155:6: ( ruleCollectionLiteralExpCS )
         {
-        // InternalEssentialOCL.g:3153:6: ( ruleCollectionLiteralExpCS )
-        // InternalEssentialOCL.g:3154:1: ruleCollectionLiteralExpCS
+        // InternalEssentialOCL.g:3155:6: ( ruleCollectionLiteralExpCS )
+        // InternalEssentialOCL.g:3156:1: ruleCollectionLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -41019,11 +41019,11 @@
 
     // $ANTLR start synpred66_InternalEssentialOCL
     public final void synpred66_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3165:6: ( ( ruleTypeLiteralExpCS ) )
-        // InternalEssentialOCL.g:3165:6: ( ruleTypeLiteralExpCS )
+        // InternalEssentialOCL.g:3167:6: ( ( ruleTypeLiteralExpCS ) )
+        // InternalEssentialOCL.g:3167:6: ( ruleTypeLiteralExpCS )
         {
-        // InternalEssentialOCL.g:3165:6: ( ruleTypeLiteralExpCS )
-        // InternalEssentialOCL.g:3166:1: ruleTypeLiteralExpCS
+        // InternalEssentialOCL.g:3167:6: ( ruleTypeLiteralExpCS )
+        // InternalEssentialOCL.g:3168:1: ruleTypeLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -41043,17 +41043,17 @@
 
     // $ANTLR start synpred70_InternalEssentialOCL
     public final void synpred70_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3237:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
-        // InternalEssentialOCL.g:3237:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalEssentialOCL.g:3239:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
+        // InternalEssentialOCL.g:3239:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
         {
-        // InternalEssentialOCL.g:3237:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-        // InternalEssentialOCL.g:3238:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalEssentialOCL.g:3239:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalEssentialOCL.g:3240:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
         }
-        // InternalEssentialOCL.g:3239:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-        // InternalEssentialOCL.g:3239:2: rule__NavigatingArgCS__Group_0_1_0__0
+        // InternalEssentialOCL.g:3241:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalEssentialOCL.g:3241:2: rule__NavigatingArgCS__Group_0_1_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_0__0();
@@ -41073,17 +41073,17 @@
 
     // $ANTLR start synpred71_InternalEssentialOCL
     public final void synpred71_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3243:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
-        // InternalEssentialOCL.g:3243:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalEssentialOCL.g:3245:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
+        // InternalEssentialOCL.g:3245:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
         {
-        // InternalEssentialOCL.g:3243:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-        // InternalEssentialOCL.g:3244:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalEssentialOCL.g:3245:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalEssentialOCL.g:3246:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
         }
-        // InternalEssentialOCL.g:3245:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-        // InternalEssentialOCL.g:3245:2: rule__NavigatingArgCS__Group_0_1_1__0
+        // InternalEssentialOCL.g:3247:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalEssentialOCL.g:3247:2: rule__NavigatingArgCS__Group_0_1_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_1__0();
@@ -41103,17 +41103,17 @@
 
     // $ANTLR start synpred72_InternalEssentialOCL
     public final void synpred72_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3265:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
-        // InternalEssentialOCL.g:3265:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalEssentialOCL.g:3267:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
+        // InternalEssentialOCL.g:3267:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
         {
-        // InternalEssentialOCL.g:3265:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-        // InternalEssentialOCL.g:3266:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalEssentialOCL.g:3267:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalEssentialOCL.g:3268:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
         }
-        // InternalEssentialOCL.g:3267:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-        // InternalEssentialOCL.g:3267:2: rule__NavigatingCommaArgCS__Group_2_0__0
+        // InternalEssentialOCL.g:3269:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalEssentialOCL.g:3269:2: rule__NavigatingCommaArgCS__Group_2_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -41133,17 +41133,17 @@
 
     // $ANTLR start synpred73_InternalEssentialOCL
     public final void synpred73_InternalEssentialOCL_fragment() throws RecognitionException {
-        // InternalEssentialOCL.g:3271:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
-        // InternalEssentialOCL.g:3271:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalEssentialOCL.g:3273:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
+        // InternalEssentialOCL.g:3273:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
         {
-        // InternalEssentialOCL.g:3271:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-        // InternalEssentialOCL.g:3272:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalEssentialOCL.g:3273:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalEssentialOCL.g:3274:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
         }
-        // InternalEssentialOCL.g:3273:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-        // InternalEssentialOCL.g:3273:2: rule__NavigatingCommaArgCS__Group_2_1__0
+        // InternalEssentialOCL.g:3275:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalEssentialOCL.g:3275:2: rule__NavigatingCommaArgCS__Group_2_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -41356,7 +41356,7 @@
             this.transition = dfa_6;
         }
         public String getDescription() {
-            return "3018:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
+            return "3020:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -41507,7 +41507,7 @@
             this.transition = dfa_12;
         }
         public String getDescription() {
-            return "3046:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
+            return "3048:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -41627,7 +41627,7 @@
             this.transition = dfa_18;
         }
         public String getDescription() {
-            return "3112:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
+            return "3114:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCL.xtextbin b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCL.xtextbin
index 963c92b..9535f81 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCL.xtextbin
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCL.xtextbin
Binary files differ
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCLGrammarResource.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCLGrammarResource.java
index 3a662d2..45df5cb 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCLGrammarResource.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/EssentialOCLGrammarResource.java
@@ -859,6 +859,7 @@
 		private static final @NonNull ParserRule PR_UPPER = createParserRule("UPPER", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.EINT));
 		private static final @NonNull ParserRule PR_URI = createParserRule("URI", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_UnreservedName = createParserRule("UnreservedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
+		private static final @NonNull ParserRule PR_UnreservedPathNameCS = createParserRule("UnreservedPathNameCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.PATH_NAME_CS));
 		private static final @NonNull ParserRule PR_UnrestrictedName = createParserRule("UnrestrictedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_WildcardTypeRefCS = createParserRule("WildcardTypeRefCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.WILDCARD_TYPE_REF_CS));
 
@@ -955,6 +956,12 @@
 				createRuleCall(TR_SINGLE_QUOTED_STRING));
 			PR_UnreservedName.setAlternatives(
 				createRuleCall(_EssentialOCL.PR_UnrestrictedName));
+			PR_UnreservedPathNameCS.setAlternatives(
+				createGroup(
+					createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS)),
+					setCardinality("*", createGroup(
+						createKeyword("::"),
+						createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS))))));
 			PR_UnrestrictedName.setAlternatives(
 				createRuleCall(PR_Identifier));
 			PR_WildcardTypeRefCS.setAlternatives(
@@ -983,6 +990,7 @@
 				rules.add(PR_MultiplicityCS);
 				rules.add(PR_MultiplicityStringCS);
 				rules.add(PR_PathNameCS);
+				rules.add(PR_UnreservedPathNameCS);
 				rules.add(PR_FirstPathElementCS);
 				rules.add(PR_NextPathElementCS);
 				rules.add(PR_TemplateBindingCS);
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCL.g b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCL.g
index 5609f04..73a7fac 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCL.g
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCL.g
@@ -4933,6 +4933,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS returns [EObject current=null]
 	:
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLLexer.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLLexer.java
index 0d1a954..cabb3c3 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLLexer.java
@@ -1638,8 +1638,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:5632:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalEssentialOCL.g:5632:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalEssentialOCL.g:5634:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalEssentialOCL.g:5634:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -1663,8 +1663,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalEssentialOCL.g:5634:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalEssentialOCL.g:5634:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalEssentialOCL.g:5636:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalEssentialOCL.g:5636:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -1689,11 +1689,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5636:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalEssentialOCL.g:5636:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalEssentialOCL.g:5638:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalEssentialOCL.g:5638:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalEssentialOCL.g:5636:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalEssentialOCL.g:5638:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -1709,14 +1709,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5636:34: RULE_ESCAPED_CHARACTER
+            	    // InternalEssentialOCL.g:5638:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalEssentialOCL.g:5636:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalEssentialOCL.g:5638:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -1753,11 +1753,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5638:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalEssentialOCL.g:5638:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalEssentialOCL.g:5640:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalEssentialOCL.g:5640:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalEssentialOCL.g:5638:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalEssentialOCL.g:5640:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -1773,14 +1773,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5638:35: RULE_ESCAPED_CHARACTER
+            	    // InternalEssentialOCL.g:5640:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalEssentialOCL.g:5638:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalEssentialOCL.g:5640:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -1817,12 +1817,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5640:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalEssentialOCL.g:5640:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalEssentialOCL.g:5642:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalEssentialOCL.g:5642:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalEssentialOCL.g:5640:38: ( options {greedy=false; } : . )*
+            // InternalEssentialOCL.g:5642:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -1847,7 +1847,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5640:66: .
+            	    // InternalEssentialOCL.g:5642:66: .
             	    {
             	    matchAny();
 
@@ -1877,11 +1877,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5642:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalEssentialOCL.g:5642:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalEssentialOCL.g:5644:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalEssentialOCL.g:5644:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalEssentialOCL.g:5642:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalEssentialOCL.g:5644:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -1930,8 +1930,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5644:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalEssentialOCL.g:5644:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalEssentialOCL.g:5646:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:5646:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -1951,10 +1951,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5646:10: ( ( '0' .. '9' )+ )
-            // InternalEssentialOCL.g:5646:12: ( '0' .. '9' )+
+            // InternalEssentialOCL.g:5648:10: ( ( '0' .. '9' )+ )
+            // InternalEssentialOCL.g:5648:12: ( '0' .. '9' )+
             {
-            // InternalEssentialOCL.g:5646:12: ( '0' .. '9' )+
+            // InternalEssentialOCL.g:5648:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -1968,7 +1968,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5646:13: '0' .. '9'
+            	    // InternalEssentialOCL.g:5648:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -2000,12 +2000,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5648:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalEssentialOCL.g:5648:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalEssentialOCL.g:5650:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalEssentialOCL.g:5650:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalEssentialOCL.g:5648:24: ( options {greedy=false; } : . )*
+            // InternalEssentialOCL.g:5650:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -2030,7 +2030,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5648:52: .
+            	    // InternalEssentialOCL.g:5650:52: .
             	    {
             	    matchAny();
 
@@ -2060,12 +2060,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5650:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalEssentialOCL.g:5650:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalEssentialOCL.g:5652:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalEssentialOCL.g:5652:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalEssentialOCL.g:5650:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalEssentialOCL.g:5652:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -2078,7 +2078,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5650:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalEssentialOCL.g:5652:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2098,7 +2098,7 @@
                 }
             } while (true);
 
-            // InternalEssentialOCL.g:5650:40: ( ( '\\r' )? '\\n' )?
+            // InternalEssentialOCL.g:5652:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2107,9 +2107,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalEssentialOCL.g:5650:41: ( '\\r' )? '\\n'
+                    // InternalEssentialOCL.g:5652:41: ( '\\r' )? '\\n'
                     {
-                    // InternalEssentialOCL.g:5650:41: ( '\\r' )?
+                    // InternalEssentialOCL.g:5652:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -2118,7 +2118,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalEssentialOCL.g:5650:41: '\\r'
+                            // InternalEssentialOCL.g:5652:41: '\\r'
                             {
                             match('\r');
 
@@ -2150,10 +2150,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5652:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalEssentialOCL.g:5652:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalEssentialOCL.g:5654:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalEssentialOCL.g:5654:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalEssentialOCL.g:5652:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalEssentialOCL.g:5654:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -2207,8 +2207,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalEssentialOCL.g:5654:16: ( . )
-            // InternalEssentialOCL.g:5654:18: .
+            // InternalEssentialOCL.g:5656:16: ( . )
+            // InternalEssentialOCL.g:5656:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLParser.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLParser.java
index 7cc4b25..02d0f53 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLParser.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/parser/antlr/internal/InternalEssentialOCLParser.java
@@ -14177,7 +14177,7 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalEssentialOCL.g:4937:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
+    // InternalEssentialOCL.g:4939:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
     public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -14185,8 +14185,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:4938:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
-            // InternalEssentialOCL.g:4939:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
+            // InternalEssentialOCL.g:4940:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
+            // InternalEssentialOCL.g:4941:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFirstPathElementCSRule());
@@ -14217,21 +14217,21 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalEssentialOCL.g:4946:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
+    // InternalEssentialOCL.g:4948:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
     public final EObject ruleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:4949:28: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalEssentialOCL.g:4950:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:4951:28: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalEssentialOCL.g:4952:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalEssentialOCL.g:4950:1: ( ( ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:4951:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:4952:1: ( ( ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:4953:1: ( ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:4951:1: ( ruleUnrestrictedName )
-            // InternalEssentialOCL.g:4952:3: ruleUnrestrictedName
+            // InternalEssentialOCL.g:4953:1: ( ruleUnrestrictedName )
+            // InternalEssentialOCL.g:4954:3: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -14286,7 +14286,7 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalEssentialOCL.g:4976:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
+    // InternalEssentialOCL.g:4978:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
     public final EObject entryRuleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -14294,8 +14294,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:4977:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
-            // InternalEssentialOCL.g:4978:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
+            // InternalEssentialOCL.g:4979:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
+            // InternalEssentialOCL.g:4980:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNextPathElementCSRule());
@@ -14326,21 +14326,21 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalEssentialOCL.g:4985:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
+    // InternalEssentialOCL.g:4987:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
     public final EObject ruleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:4988:28: ( ( ( ruleUnreservedName ) ) )
-            // InternalEssentialOCL.g:4989:1: ( ( ruleUnreservedName ) )
+            // InternalEssentialOCL.g:4990:28: ( ( ( ruleUnreservedName ) ) )
+            // InternalEssentialOCL.g:4991:1: ( ( ruleUnreservedName ) )
             {
-            // InternalEssentialOCL.g:4989:1: ( ( ruleUnreservedName ) )
-            // InternalEssentialOCL.g:4990:1: ( ruleUnreservedName )
+            // InternalEssentialOCL.g:4991:1: ( ( ruleUnreservedName ) )
+            // InternalEssentialOCL.g:4992:1: ( ruleUnreservedName )
             {
-            // InternalEssentialOCL.g:4990:1: ( ruleUnreservedName )
-            // InternalEssentialOCL.g:4991:3: ruleUnreservedName
+            // InternalEssentialOCL.g:4992:1: ( ruleUnreservedName )
+            // InternalEssentialOCL.g:4993:3: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
 
@@ -14395,7 +14395,7 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalEssentialOCL.g:5015:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
+    // InternalEssentialOCL.g:5017:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
     public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -14403,8 +14403,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5016:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
-            // InternalEssentialOCL.g:5017:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
+            // InternalEssentialOCL.g:5018:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
+            // InternalEssentialOCL.g:5019:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateBindingCSRule());
@@ -14435,7 +14435,7 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalEssentialOCL.g:5024:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
+    // InternalEssentialOCL.g:5026:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
     public final EObject ruleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -14450,17 +14450,17 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5027:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
-            // InternalEssentialOCL.g:5028:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalEssentialOCL.g:5029:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
+            // InternalEssentialOCL.g:5030:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
             {
-            // InternalEssentialOCL.g:5028:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
-            // InternalEssentialOCL.g:5028:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalEssentialOCL.g:5030:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalEssentialOCL.g:5030:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             {
-            // InternalEssentialOCL.g:5028:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
-            // InternalEssentialOCL.g:5029:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalEssentialOCL.g:5030:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
+            // InternalEssentialOCL.g:5031:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
             {
-            // InternalEssentialOCL.g:5029:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
-            // InternalEssentialOCL.g:5030:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
+            // InternalEssentialOCL.g:5031:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalEssentialOCL.g:5032:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
 
@@ -14491,7 +14491,7 @@
 
             }
 
-            // InternalEssentialOCL.g:5046:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
+            // InternalEssentialOCL.g:5048:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
             loop80:
             do {
                 int alt80=2;
@@ -14504,7 +14504,7 @@
 
                 switch (alt80) {
             	case 1 :
-            	    // InternalEssentialOCL.g:5046:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalEssentialOCL.g:5048:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
             	    {
             	    otherlv_1=(Token)match(input,57,FollowSets000.FOLLOW_55); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -14512,11 +14512,11 @@
             	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
 
             	    }
-            	    // InternalEssentialOCL.g:5050:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
-            	    // InternalEssentialOCL.g:5051:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalEssentialOCL.g:5052:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalEssentialOCL.g:5053:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
             	    {
-            	    // InternalEssentialOCL.g:5051:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
-            	    // InternalEssentialOCL.g:5052:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
+            	    // InternalEssentialOCL.g:5053:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalEssentialOCL.g:5054:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -14556,7 +14556,7 @@
                 }
             } while (true);
 
-            // InternalEssentialOCL.g:5068:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalEssentialOCL.g:5070:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             int alt81=2;
             int LA81_0 = input.LA(1);
 
@@ -14565,10 +14565,10 @@
             }
             switch (alt81) {
                 case 1 :
-                    // InternalEssentialOCL.g:5069:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalEssentialOCL.g:5071:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                     {
-                    // InternalEssentialOCL.g:5069:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
-                    // InternalEssentialOCL.g:5070:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
+                    // InternalEssentialOCL.g:5071:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalEssentialOCL.g:5072:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14625,7 +14625,7 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalEssentialOCL.g:5094:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalEssentialOCL.g:5096:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
     public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -14633,8 +14633,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5095:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
-            // InternalEssentialOCL.g:5096:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
+            // InternalEssentialOCL.g:5097:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
+            // InternalEssentialOCL.g:5098:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -14665,7 +14665,7 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalEssentialOCL.g:5103:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
+    // InternalEssentialOCL.g:5105:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
     public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -14675,14 +14675,14 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5106:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
-            // InternalEssentialOCL.g:5107:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalEssentialOCL.g:5108:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
+            // InternalEssentialOCL.g:5109:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
             {
-            // InternalEssentialOCL.g:5107:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
-            // InternalEssentialOCL.g:5108:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalEssentialOCL.g:5109:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalEssentialOCL.g:5110:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
             {
-            // InternalEssentialOCL.g:5108:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
-            // InternalEssentialOCL.g:5109:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
+            // InternalEssentialOCL.g:5110:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalEssentialOCL.g:5111:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -14733,7 +14733,7 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalEssentialOCL.g:5135:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
+    // InternalEssentialOCL.g:5137:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
     public final EObject entryRuleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -14741,8 +14741,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5136:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
-            // InternalEssentialOCL.g:5137:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
+            // InternalEssentialOCL.g:5138:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
+            // InternalEssentialOCL.g:5139:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeParameterCSRule());
@@ -14773,7 +14773,7 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalEssentialOCL.g:5144:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
+    // InternalEssentialOCL.g:5146:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
     public final EObject ruleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -14789,17 +14789,17 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5147:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
-            // InternalEssentialOCL.g:5148:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalEssentialOCL.g:5149:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
+            // InternalEssentialOCL.g:5150:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
             {
-            // InternalEssentialOCL.g:5148:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
-            // InternalEssentialOCL.g:5148:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalEssentialOCL.g:5150:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalEssentialOCL.g:5150:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             {
-            // InternalEssentialOCL.g:5148:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
-            // InternalEssentialOCL.g:5149:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalEssentialOCL.g:5150:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
+            // InternalEssentialOCL.g:5151:1: (lv_name_0_0= ruleUnrestrictedName )
             {
-            // InternalEssentialOCL.g:5149:1: (lv_name_0_0= ruleUnrestrictedName )
-            // InternalEssentialOCL.g:5150:3: lv_name_0_0= ruleUnrestrictedName
+            // InternalEssentialOCL.g:5151:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalEssentialOCL.g:5152:3: lv_name_0_0= ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -14830,7 +14830,7 @@
 
             }
 
-            // InternalEssentialOCL.g:5166:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalEssentialOCL.g:5168:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             int alt83=2;
             int LA83_0 = input.LA(1);
 
@@ -14839,7 +14839,7 @@
             }
             switch (alt83) {
                 case 1 :
-                    // InternalEssentialOCL.g:5166:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalEssentialOCL.g:5168:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     {
                     otherlv_1=(Token)match(input,87,FollowSets000.FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -14847,11 +14847,11 @@
                           	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
 
                     }
-                    // InternalEssentialOCL.g:5170:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
-                    // InternalEssentialOCL.g:5171:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalEssentialOCL.g:5172:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
+                    // InternalEssentialOCL.g:5173:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                     {
-                    // InternalEssentialOCL.g:5171:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
-                    // InternalEssentialOCL.g:5172:3: lv_ownedExtends_2_0= ruleTypedRefCS
+                    // InternalEssentialOCL.g:5173:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalEssentialOCL.g:5174:3: lv_ownedExtends_2_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14882,7 +14882,7 @@
 
                     }
 
-                    // InternalEssentialOCL.g:5188:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalEssentialOCL.g:5190:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     loop82:
                     do {
                         int alt82=2;
@@ -14895,7 +14895,7 @@
 
                         switch (alt82) {
                     	case 1 :
-                    	    // InternalEssentialOCL.g:5188:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalEssentialOCL.g:5190:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                     	    {
                     	    otherlv_3=(Token)match(input,88,FollowSets000.FOLLOW_10); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -14903,11 +14903,11 @@
                     	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
 
                     	    }
-                    	    // InternalEssentialOCL.g:5192:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
-                    	    // InternalEssentialOCL.g:5193:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalEssentialOCL.g:5194:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalEssentialOCL.g:5195:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                     	    {
-                    	    // InternalEssentialOCL.g:5193:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
-                    	    // InternalEssentialOCL.g:5194:3: lv_ownedExtends_4_0= ruleTypedRefCS
+                    	    // InternalEssentialOCL.g:5195:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalEssentialOCL.g:5196:3: lv_ownedExtends_4_0= ruleTypedRefCS
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -14976,7 +14976,7 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalEssentialOCL.g:5218:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
+    // InternalEssentialOCL.g:5220:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
     public final EObject entryRuleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -14984,8 +14984,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5219:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
-            // InternalEssentialOCL.g:5220:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
+            // InternalEssentialOCL.g:5221:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
+            // InternalEssentialOCL.g:5222:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeRefCSRule());
@@ -15016,7 +15016,7 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalEssentialOCL.g:5227:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
+    // InternalEssentialOCL.g:5229:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
     public final EObject ruleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15028,10 +15028,10 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5230:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
-            // InternalEssentialOCL.g:5231:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalEssentialOCL.g:5232:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
+            // InternalEssentialOCL.g:5233:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             {
-            // InternalEssentialOCL.g:5231:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalEssentialOCL.g:5233:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             int alt84=2;
             int LA84_0 = input.LA(1);
 
@@ -15050,7 +15050,7 @@
             }
             switch (alt84) {
                 case 1 :
-                    // InternalEssentialOCL.g:5232:2: this_TypedRefCS_0= ruleTypedRefCS
+                    // InternalEssentialOCL.g:5234:2: this_TypedRefCS_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15077,7 +15077,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:5245:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
+                    // InternalEssentialOCL.g:5247:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15126,7 +15126,7 @@
 
 
     // $ANTLR start "entryRuleTypedRefCS"
-    // InternalEssentialOCL.g:5264:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
+    // InternalEssentialOCL.g:5266:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
     public final EObject entryRuleTypedRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15134,8 +15134,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5265:2: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
-            // InternalEssentialOCL.g:5266:2: iv_ruleTypedRefCS= ruleTypedRefCS EOF
+            // InternalEssentialOCL.g:5267:2: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
+            // InternalEssentialOCL.g:5268:2: iv_ruleTypedRefCS= ruleTypedRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypedRefCSRule());
@@ -15166,7 +15166,7 @@
 
 
     // $ANTLR start "ruleTypedRefCS"
-    // InternalEssentialOCL.g:5273:1: ruleTypedRefCS returns [EObject current=null] : this_TypedTypeRefCS_0= ruleTypedTypeRefCS ;
+    // InternalEssentialOCL.g:5275:1: ruleTypedRefCS returns [EObject current=null] : this_TypedTypeRefCS_0= ruleTypedTypeRefCS ;
     public final EObject ruleTypedRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15176,8 +15176,8 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5276:28: (this_TypedTypeRefCS_0= ruleTypedTypeRefCS )
-            // InternalEssentialOCL.g:5278:2: this_TypedTypeRefCS_0= ruleTypedTypeRefCS
+            // InternalEssentialOCL.g:5278:28: (this_TypedTypeRefCS_0= ruleTypedTypeRefCS )
+            // InternalEssentialOCL.g:5280:2: this_TypedTypeRefCS_0= ruleTypedTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -15220,7 +15220,7 @@
 
 
     // $ANTLR start "entryRuleTypedTypeRefCS"
-    // InternalEssentialOCL.g:5297:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
+    // InternalEssentialOCL.g:5299:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
     public final EObject entryRuleTypedTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15228,8 +15228,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5298:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
-            // InternalEssentialOCL.g:5299:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
+            // InternalEssentialOCL.g:5300:2: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
+            // InternalEssentialOCL.g:5301:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypedTypeRefCSRule());
@@ -15260,7 +15260,7 @@
 
 
     // $ANTLR start "ruleTypedTypeRefCS"
-    // InternalEssentialOCL.g:5306:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
+    // InternalEssentialOCL.g:5308:1: ruleTypedTypeRefCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) ;
     public final EObject ruleTypedTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15274,17 +15274,17 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5309:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
-            // InternalEssentialOCL.g:5310:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
+            // InternalEssentialOCL.g:5311:28: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? ) )
+            // InternalEssentialOCL.g:5312:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
             {
-            // InternalEssentialOCL.g:5310:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
-            // InternalEssentialOCL.g:5310:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
+            // InternalEssentialOCL.g:5312:1: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )? )
+            // InternalEssentialOCL.g:5312:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
             {
-            // InternalEssentialOCL.g:5310:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
-            // InternalEssentialOCL.g:5311:1: (lv_ownedPathName_0_0= rulePathNameCS )
+            // InternalEssentialOCL.g:5312:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
+            // InternalEssentialOCL.g:5313:1: (lv_ownedPathName_0_0= rulePathNameCS )
             {
-            // InternalEssentialOCL.g:5311:1: (lv_ownedPathName_0_0= rulePathNameCS )
-            // InternalEssentialOCL.g:5312:3: lv_ownedPathName_0_0= rulePathNameCS
+            // InternalEssentialOCL.g:5313:1: (lv_ownedPathName_0_0= rulePathNameCS )
+            // InternalEssentialOCL.g:5314:3: lv_ownedPathName_0_0= rulePathNameCS
             {
             if ( state.backtracking==0 ) {
 
@@ -15315,7 +15315,7 @@
 
             }
 
-            // InternalEssentialOCL.g:5328:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
+            // InternalEssentialOCL.g:5330:2: (otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')' )?
             int alt85=2;
             int LA85_0 = input.LA(1);
 
@@ -15324,7 +15324,7 @@
             }
             switch (alt85) {
                 case 1 :
-                    // InternalEssentialOCL.g:5328:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
+                    // InternalEssentialOCL.g:5330:4: otherlv_1= '(' ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) ) otherlv_3= ')'
                     {
                     otherlv_1=(Token)match(input,55,FollowSets000.FOLLOW_55); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -15332,11 +15332,11 @@
                           	newLeafNode(otherlv_1, grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0());
 
                     }
-                    // InternalEssentialOCL.g:5332:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
-                    // InternalEssentialOCL.g:5333:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
+                    // InternalEssentialOCL.g:5334:1: ( (lv_ownedBinding_2_0= ruleTemplateBindingCS ) )
+                    // InternalEssentialOCL.g:5335:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
                     {
-                    // InternalEssentialOCL.g:5333:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
-                    // InternalEssentialOCL.g:5334:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
+                    // InternalEssentialOCL.g:5335:1: (lv_ownedBinding_2_0= ruleTemplateBindingCS )
+                    // InternalEssentialOCL.g:5336:3: lv_ownedBinding_2_0= ruleTemplateBindingCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15402,7 +15402,7 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalEssentialOCL.g:5362:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
+    // InternalEssentialOCL.g:5364:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
     public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15410,8 +15410,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5363:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
-            // InternalEssentialOCL.g:5364:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
+            // InternalEssentialOCL.g:5365:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
+            // InternalEssentialOCL.g:5366:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
@@ -15442,7 +15442,7 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalEssentialOCL.g:5371:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
+    // InternalEssentialOCL.g:5373:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
     public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -15454,14 +15454,14 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5374:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
-            // InternalEssentialOCL.g:5375:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalEssentialOCL.g:5376:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
+            // InternalEssentialOCL.g:5377:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
             {
-            // InternalEssentialOCL.g:5375:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
-            // InternalEssentialOCL.g:5375:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalEssentialOCL.g:5377:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalEssentialOCL.g:5377:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             {
-            // InternalEssentialOCL.g:5375:2: ()
-            // InternalEssentialOCL.g:5376:2:
+            // InternalEssentialOCL.g:5377:2: ()
+            // InternalEssentialOCL.g:5378:2:
             {
             if ( state.backtracking==0 ) {
 
@@ -15484,7 +15484,7 @@
                   	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
 
             }
-            // InternalEssentialOCL.g:5388:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalEssentialOCL.g:5390:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             int alt86=2;
             int LA86_0 = input.LA(1);
 
@@ -15493,7 +15493,7 @@
             }
             switch (alt86) {
                 case 1 :
-                    // InternalEssentialOCL.g:5388:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalEssentialOCL.g:5390:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                     {
                     otherlv_2=(Token)match(input,87,FollowSets000.FOLLOW_10); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -15501,11 +15501,11 @@
                           	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
 
                     }
-                    // InternalEssentialOCL.g:5392:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
-                    // InternalEssentialOCL.g:5393:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalEssentialOCL.g:5394:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalEssentialOCL.g:5395:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                     {
-                    // InternalEssentialOCL.g:5393:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
-                    // InternalEssentialOCL.g:5394:3: lv_ownedExtends_3_0= ruleTypedRefCS
+                    // InternalEssentialOCL.g:5395:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalEssentialOCL.g:5396:3: lv_ownedExtends_3_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15565,7 +15565,7 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalEssentialOCL.g:5418:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
+    // InternalEssentialOCL.g:5420:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
     public final String entryRuleID() throws RecognitionException {
         String current = null;
 
@@ -15573,8 +15573,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5419:2: (iv_ruleID= ruleID EOF )
-            // InternalEssentialOCL.g:5420:2: iv_ruleID= ruleID EOF
+            // InternalEssentialOCL.g:5421:2: (iv_ruleID= ruleID EOF )
+            // InternalEssentialOCL.g:5422:2: iv_ruleID= ruleID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIDRule());
@@ -15605,7 +15605,7 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalEssentialOCL.g:5427:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
+    // InternalEssentialOCL.g:5429:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
     public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -15615,10 +15615,10 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5430:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
-            // InternalEssentialOCL.g:5431:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalEssentialOCL.g:5432:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
+            // InternalEssentialOCL.g:5433:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             {
-            // InternalEssentialOCL.g:5431:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalEssentialOCL.g:5433:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             int alt87=2;
             int LA87_0 = input.LA(1);
 
@@ -15637,7 +15637,7 @@
             }
             switch (alt87) {
                 case 1 :
-                    // InternalEssentialOCL.g:5431:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
+                    // InternalEssentialOCL.g:5433:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                     {
                     this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -15654,7 +15654,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:5439:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
+                    // InternalEssentialOCL.g:5441:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                     {
                     this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -15693,7 +15693,7 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalEssentialOCL.g:5454:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
+    // InternalEssentialOCL.g:5456:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
     public final String entryRuleIdentifier() throws RecognitionException {
         String current = null;
 
@@ -15701,8 +15701,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5455:2: (iv_ruleIdentifier= ruleIdentifier EOF )
-            // InternalEssentialOCL.g:5456:2: iv_ruleIdentifier= ruleIdentifier EOF
+            // InternalEssentialOCL.g:5457:2: (iv_ruleIdentifier= ruleIdentifier EOF )
+            // InternalEssentialOCL.g:5458:2: iv_ruleIdentifier= ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIdentifierRule());
@@ -15733,7 +15733,7 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalEssentialOCL.g:5463:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
+    // InternalEssentialOCL.g:5465:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
     public final AntlrDatatypeRuleToken ruleIdentifier() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -15743,8 +15743,8 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5466:28: (this_ID_0= ruleID )
-            // InternalEssentialOCL.g:5468:5: this_ID_0= ruleID
+            // InternalEssentialOCL.g:5468:28: (this_ID_0= ruleID )
+            // InternalEssentialOCL.g:5470:5: this_ID_0= ruleID
             {
             if ( state.backtracking==0 ) {
 
@@ -15786,7 +15786,7 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalEssentialOCL.g:5486:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
+    // InternalEssentialOCL.g:5488:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
     public final String entryRuleLOWER() throws RecognitionException {
         String current = null;
 
@@ -15794,8 +15794,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5487:2: (iv_ruleLOWER= ruleLOWER EOF )
-            // InternalEssentialOCL.g:5488:2: iv_ruleLOWER= ruleLOWER EOF
+            // InternalEssentialOCL.g:5489:2: (iv_ruleLOWER= ruleLOWER EOF )
+            // InternalEssentialOCL.g:5490:2: iv_ruleLOWER= ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLOWERRule());
@@ -15826,7 +15826,7 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalEssentialOCL.g:5495:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalEssentialOCL.g:5497:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -15835,8 +15835,8 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5498:28: (this_INT_0= RULE_INT )
-            // InternalEssentialOCL.g:5499:5: this_INT_0= RULE_INT
+            // InternalEssentialOCL.g:5500:28: (this_INT_0= RULE_INT )
+            // InternalEssentialOCL.g:5501:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -15869,7 +15869,7 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalEssentialOCL.g:5514:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
+    // InternalEssentialOCL.g:5516:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
     public final String entryRuleNUMBER_LITERAL() throws RecognitionException {
         String current = null;
 
@@ -15877,8 +15877,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5515:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
-            // InternalEssentialOCL.g:5516:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
+            // InternalEssentialOCL.g:5517:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
+            // InternalEssentialOCL.g:5518:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNUMBER_LITERALRule());
@@ -15909,7 +15909,7 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalEssentialOCL.g:5523:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalEssentialOCL.g:5525:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleNUMBER_LITERAL() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -15918,8 +15918,8 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5526:28: (this_INT_0= RULE_INT )
-            // InternalEssentialOCL.g:5527:5: this_INT_0= RULE_INT
+            // InternalEssentialOCL.g:5528:28: (this_INT_0= RULE_INT )
+            // InternalEssentialOCL.g:5529:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -15952,7 +15952,7 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalEssentialOCL.g:5542:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
+    // InternalEssentialOCL.g:5544:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
     public final String entryRuleStringLiteral() throws RecognitionException {
         String current = null;
 
@@ -15960,8 +15960,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5543:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
-            // InternalEssentialOCL.g:5544:2: iv_ruleStringLiteral= ruleStringLiteral EOF
+            // InternalEssentialOCL.g:5545:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
+            // InternalEssentialOCL.g:5546:2: iv_ruleStringLiteral= ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getStringLiteralRule());
@@ -15992,7 +15992,7 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalEssentialOCL.g:5551:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalEssentialOCL.g:5553:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleStringLiteral() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -16001,8 +16001,8 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5554:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalEssentialOCL.g:5555:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalEssentialOCL.g:5556:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:5557:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -16035,7 +16035,7 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalEssentialOCL.g:5570:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
+    // InternalEssentialOCL.g:5572:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
     public final String entryRuleUPPER() throws RecognitionException {
         String current = null;
 
@@ -16043,8 +16043,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5571:2: (iv_ruleUPPER= ruleUPPER EOF )
-            // InternalEssentialOCL.g:5572:2: iv_ruleUPPER= ruleUPPER EOF
+            // InternalEssentialOCL.g:5573:2: (iv_ruleUPPER= ruleUPPER EOF )
+            // InternalEssentialOCL.g:5574:2: iv_ruleUPPER= ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUPPERRule());
@@ -16075,7 +16075,7 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalEssentialOCL.g:5579:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
+    // InternalEssentialOCL.g:5581:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -16085,10 +16085,10 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5582:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
-            // InternalEssentialOCL.g:5583:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalEssentialOCL.g:5584:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
+            // InternalEssentialOCL.g:5585:1: (this_INT_0= RULE_INT | kw= '*' )
             {
-            // InternalEssentialOCL.g:5583:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalEssentialOCL.g:5585:1: (this_INT_0= RULE_INT | kw= '*' )
             int alt88=2;
             int LA88_0 = input.LA(1);
 
@@ -16107,7 +16107,7 @@
             }
             switch (alt88) {
                 case 1 :
-                    // InternalEssentialOCL.g:5583:6: this_INT_0= RULE_INT
+                    // InternalEssentialOCL.g:5585:6: this_INT_0= RULE_INT
                     {
                     this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -16124,7 +16124,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalEssentialOCL.g:5592:2: kw= '*'
+                    // InternalEssentialOCL.g:5594:2: kw= '*'
                     {
                     kw=(Token)match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -16159,7 +16159,7 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalEssentialOCL.g:5605:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
+    // InternalEssentialOCL.g:5607:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
     public final String entryRuleURI() throws RecognitionException {
         String current = null;
 
@@ -16167,8 +16167,8 @@
 
 
         try {
-            // InternalEssentialOCL.g:5606:2: (iv_ruleURI= ruleURI EOF )
-            // InternalEssentialOCL.g:5607:2: iv_ruleURI= ruleURI EOF
+            // InternalEssentialOCL.g:5608:2: (iv_ruleURI= ruleURI EOF )
+            // InternalEssentialOCL.g:5609:2: iv_ruleURI= ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getURIRule());
@@ -16199,7 +16199,7 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalEssentialOCL.g:5614:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalEssentialOCL.g:5616:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleURI() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -16208,8 +16208,8 @@
          enterRule();
 
         try {
-            // InternalEssentialOCL.g:5617:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalEssentialOCL.g:5618:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalEssentialOCL.g:5619:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalEssentialOCL.g:5620:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/serializer/AbstractEssentialOCLSemanticSequencer.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/serializer/AbstractEssentialOCLSemanticSequencer.java
index 94f899e..789b897 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/serializer/AbstractEssentialOCLSemanticSequencer.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/serializer/AbstractEssentialOCLSemanticSequencer.java
@@ -138,6 +138,10 @@
 					sequence_URIPathNameCS(context, (PathNameCS) semanticObject);
 					return;
 				}
+				else if (rule == grammarAccess.getUnreservedPathNameCSRule()) {
+					sequence_UnreservedPathNameCS(context, (PathNameCS) semanticObject);
+					return;
+				}
 				else break;
 			case BaseCSPackage.PRIMITIVE_TYPE_REF_CS:
 				if (rule == grammarAccess.getPrimitiveTypeCSRule()
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/services/EssentialOCLGrammarAccess.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/services/EssentialOCLGrammarAccess.java
index f752de1..a9b80ce 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/services/EssentialOCLGrammarAccess.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src-gen/org/eclipse/ocl/xtext/essentialocl/services/EssentialOCLGrammarAccess.java
@@ -663,12 +663,12 @@
 		private final Keyword cRightParenthesisKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
 
 		//CollectionTypeCS:
-		//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS?
-		//	')')?;
+		//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS
+		//	? ')')?;
 		@Override public ParserRule getRule() { return rule; }
 
-		//name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS?
-		//')')?
+		//name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS
+		//? ')')?
 		public Group getGroup() { return cGroup; }
 
 		//name=CollectionTypeIdentifier
@@ -3344,8 +3344,8 @@
 	}
 
 	//CollectionTypeCS:
-	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS?
-	//	')')?;
+	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS
+	//	? ')')?;
 	public CollectionTypeCSElements getCollectionTypeCSAccess() {
 		return pCollectionTypeCS;
 	}
@@ -3934,6 +3934,16 @@
 		return getPathNameCSAccess().getRule();
 	}
 
+	//UnreservedPathNameCS PathNameCS:
+	//	ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*;
+	public BaseGrammarAccess.UnreservedPathNameCSElements getUnreservedPathNameCSAccess() {
+		return gaBase.getUnreservedPathNameCSAccess();
+	}
+
+	public ParserRule getUnreservedPathNameCSRule() {
+		return getUnreservedPathNameCSAccess().getRule();
+	}
+
 	//FirstPathElementCS PathElementCS:
 	//	referredElement=[pivot::NamedElement|super::UnrestrictedName];
 	public BaseGrammarAccess.FirstPathElementCSElements getFirstPathElementCSAccess() {
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/OCLinEcoreParser.java b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/OCLinEcoreParser.java
index cd3c969..aa75222 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/OCLinEcoreParser.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/OCLinEcoreParser.java
@@ -316,6 +316,8 @@
 					put(grammarAccess.getMultiplicityCSAccess().getGroup(), "rule__MultiplicityCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup(), "rule__PathNameCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup_1(), "rule__PathNameCS__Group_1__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup(), "rule__UnreservedPathNameCS__Group__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1(), "rule__UnreservedPathNameCS__Group_1__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup(), "rule__TemplateBindingCS__Group__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup_1(), "rule__TemplateBindingCS__Group_1__0");
 					put(grammarAccess.getTypeParameterCSAccess().getGroup(), "rule__TypeParameterCS__Group__0");
@@ -616,6 +618,8 @@
 					put(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment(), "rule__MultiplicityStringCS__StringBoundsAssignment");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__PathNameCS__OwnedPathElementsAssignment_0");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__PathNameCS__OwnedPathElementsAssignment_1_1");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1");
 					put(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment(), "rule__FirstPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment(), "rule__NextPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0(), "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0");
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcore.g b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcore.g
index 80694e8..a729343 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcore.g
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcore.g
@@ -2825,6 +2825,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS
 :
@@ -24224,6 +24226,8 @@
 
 
 
+
+
 rule__TemplateBindingCS__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -29803,6 +29807,8 @@
 	restoreStackSize(stackSize);
 }
 
+
+
 rule__FirstPathElementCS__ReferredElementAssignment
     @init {
 		int stackSize = keepStackSize();
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreLexer.java b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreLexer.java
index 404eef3..503179d 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreLexer.java
@@ -2828,8 +2828,8 @@
         try {
             int _type = RULE_UNQUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29965:22: ( '\\u00A3$%^\\u00A3$%^' )
-            // InternalOCLinEcore.g:29965:24: '\\u00A3$%^\\u00A3$%^'
+            // InternalOCLinEcore.g:29971:22: ( '\\u00A3$%^\\u00A3$%^' )
+            // InternalOCLinEcore.g:29971:24: '\\u00A3$%^\\u00A3$%^'
             {
             match("\u00A3$%^\u00A3$%^");
 
@@ -2847,8 +2847,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:29967:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalOCLinEcore.g:29967:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalOCLinEcore.g:29973:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalOCLinEcore.g:29973:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -2872,8 +2872,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:29969:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalOCLinEcore.g:29969:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalOCLinEcore.g:29975:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalOCLinEcore.g:29975:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2898,11 +2898,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29971:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalOCLinEcore.g:29971:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalOCLinEcore.g:29977:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalOCLinEcore.g:29977:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalOCLinEcore.g:29971:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalOCLinEcore.g:29977:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -2918,14 +2918,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalOCLinEcore.g:29971:34: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLinEcore.g:29977:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLinEcore.g:29971:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalOCLinEcore.g:29977:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2962,11 +2962,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29973:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalOCLinEcore.g:29973:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalOCLinEcore.g:29979:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalOCLinEcore.g:29979:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalOCLinEcore.g:29973:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalOCLinEcore.g:29979:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -2982,14 +2982,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalOCLinEcore.g:29973:35: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLinEcore.g:29979:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLinEcore.g:29973:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalOCLinEcore.g:29979:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3026,12 +3026,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29975:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalOCLinEcore.g:29975:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalOCLinEcore.g:29981:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalOCLinEcore.g:29981:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalOCLinEcore.g:29975:38: ( options {greedy=false; } : . )*
+            // InternalOCLinEcore.g:29981:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -3056,7 +3056,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalOCLinEcore.g:29975:66: .
+            	    // InternalOCLinEcore.g:29981:66: .
             	    {
             	    matchAny();
 
@@ -3086,11 +3086,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29977:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalOCLinEcore.g:29977:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLinEcore.g:29983:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalOCLinEcore.g:29983:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalOCLinEcore.g:29977:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLinEcore.g:29983:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -3139,8 +3139,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29979:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:29979:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:29985:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:29985:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -3160,10 +3160,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29981:10: ( ( '0' .. '9' )+ )
-            // InternalOCLinEcore.g:29981:12: ( '0' .. '9' )+
+            // InternalOCLinEcore.g:29987:10: ( ( '0' .. '9' )+ )
+            // InternalOCLinEcore.g:29987:12: ( '0' .. '9' )+
             {
-            // InternalOCLinEcore.g:29981:12: ( '0' .. '9' )+
+            // InternalOCLinEcore.g:29987:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -3177,7 +3177,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalOCLinEcore.g:29981:13: '0' .. '9'
+            	    // InternalOCLinEcore.g:29987:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -3209,12 +3209,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29983:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalOCLinEcore.g:29983:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalOCLinEcore.g:29989:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalOCLinEcore.g:29989:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalOCLinEcore.g:29983:24: ( options {greedy=false; } : . )*
+            // InternalOCLinEcore.g:29989:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -3239,7 +3239,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalOCLinEcore.g:29983:52: .
+            	    // InternalOCLinEcore.g:29989:52: .
             	    {
             	    matchAny();
 
@@ -3269,12 +3269,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29985:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalOCLinEcore.g:29985:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalOCLinEcore.g:29991:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalOCLinEcore.g:29991:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalOCLinEcore.g:29985:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalOCLinEcore.g:29991:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -3287,7 +3287,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalOCLinEcore.g:29985:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalOCLinEcore.g:29991:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3307,7 +3307,7 @@
                 }
             } while (true);
 
-            // InternalOCLinEcore.g:29985:40: ( ( '\\r' )? '\\n' )?
+            // InternalOCLinEcore.g:29991:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -3316,9 +3316,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalOCLinEcore.g:29985:41: ( '\\r' )? '\\n'
+                    // InternalOCLinEcore.g:29991:41: ( '\\r' )? '\\n'
                     {
-                    // InternalOCLinEcore.g:29985:41: ( '\\r' )?
+                    // InternalOCLinEcore.g:29991:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -3327,7 +3327,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalOCLinEcore.g:29985:41: '\\r'
+                            // InternalOCLinEcore.g:29991:41: '\\r'
                             {
                             match('\r');
 
@@ -3359,10 +3359,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29987:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalOCLinEcore.g:29987:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLinEcore.g:29993:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalOCLinEcore.g:29993:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalOCLinEcore.g:29987:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLinEcore.g:29993:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -3416,8 +3416,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:29989:16: ( . )
-            // InternalOCLinEcore.g:29989:18: .
+            // InternalOCLinEcore.g:29995:16: ( . )
+            // InternalOCLinEcore.g:29995:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreParser.java b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreParser.java
index 5e82825..e95dc87 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreParser.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore.ui/src-gen/org/eclipse/ocl/xtext/oclinecore/ui/contentassist/antlr/internal/InternalOCLinEcoreParser.java
@@ -8556,11 +8556,11 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalOCLinEcore.g:2829:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
+    // InternalOCLinEcore.g:2831:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
     public final void entryRuleFirstPathElementCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2830:1: ( ruleFirstPathElementCS EOF )
-            // InternalOCLinEcore.g:2831:1: ruleFirstPathElementCS EOF
+            // InternalOCLinEcore.g:2832:1: ( ruleFirstPathElementCS EOF )
+            // InternalOCLinEcore.g:2833:1: ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSRule());
@@ -8590,23 +8590,23 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalOCLinEcore.g:2838:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalOCLinEcore.g:2840:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleFirstPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:2842:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
-            // InternalOCLinEcore.g:2843:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLinEcore.g:2844:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
+            // InternalOCLinEcore.g:2845:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalOCLinEcore.g:2843:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
-            // InternalOCLinEcore.g:2844:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalOCLinEcore.g:2845:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLinEcore.g:2846:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalOCLinEcore.g:2845:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
-            // InternalOCLinEcore.g:2845:2: rule__FirstPathElementCS__ReferredElementAssignment
+            // InternalOCLinEcore.g:2847:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalOCLinEcore.g:2847:2: rule__FirstPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__FirstPathElementCS__ReferredElementAssignment();
@@ -8641,11 +8641,11 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalOCLinEcore.g:2857:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
+    // InternalOCLinEcore.g:2859:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
     public final void entryRuleNextPathElementCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2858:1: ( ruleNextPathElementCS EOF )
-            // InternalOCLinEcore.g:2859:1: ruleNextPathElementCS EOF
+            // InternalOCLinEcore.g:2860:1: ( ruleNextPathElementCS EOF )
+            // InternalOCLinEcore.g:2861:1: ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSRule());
@@ -8675,23 +8675,23 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalOCLinEcore.g:2866:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalOCLinEcore.g:2868:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleNextPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:2870:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
-            // InternalOCLinEcore.g:2871:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLinEcore.g:2872:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
+            // InternalOCLinEcore.g:2873:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalOCLinEcore.g:2871:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
-            // InternalOCLinEcore.g:2872:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalOCLinEcore.g:2873:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLinEcore.g:2874:1: ( rule__NextPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalOCLinEcore.g:2873:1: ( rule__NextPathElementCS__ReferredElementAssignment )
-            // InternalOCLinEcore.g:2873:2: rule__NextPathElementCS__ReferredElementAssignment
+            // InternalOCLinEcore.g:2875:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalOCLinEcore.g:2875:2: rule__NextPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NextPathElementCS__ReferredElementAssignment();
@@ -8726,11 +8726,11 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalOCLinEcore.g:2885:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
+    // InternalOCLinEcore.g:2887:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
     public final void entryRuleTemplateBindingCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2886:1: ( ruleTemplateBindingCS EOF )
-            // InternalOCLinEcore.g:2887:1: ruleTemplateBindingCS EOF
+            // InternalOCLinEcore.g:2888:1: ( ruleTemplateBindingCS EOF )
+            // InternalOCLinEcore.g:2889:1: ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSRule());
@@ -8760,23 +8760,23 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalOCLinEcore.g:2894:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
+    // InternalOCLinEcore.g:2896:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
     public final void ruleTemplateBindingCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:2898:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
-            // InternalOCLinEcore.g:2899:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalOCLinEcore.g:2900:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
+            // InternalOCLinEcore.g:2901:1: ( ( rule__TemplateBindingCS__Group__0 ) )
             {
-            // InternalOCLinEcore.g:2899:1: ( ( rule__TemplateBindingCS__Group__0 ) )
-            // InternalOCLinEcore.g:2900:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalOCLinEcore.g:2901:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalOCLinEcore.g:2902:1: ( rule__TemplateBindingCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup());
             }
-            // InternalOCLinEcore.g:2901:1: ( rule__TemplateBindingCS__Group__0 )
-            // InternalOCLinEcore.g:2901:2: rule__TemplateBindingCS__Group__0
+            // InternalOCLinEcore.g:2903:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalOCLinEcore.g:2903:2: rule__TemplateBindingCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__0();
@@ -8811,11 +8811,11 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalOCLinEcore.g:2913:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalOCLinEcore.g:2915:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
     public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2914:1: ( ruleTemplateParameterSubstitutionCS EOF )
-            // InternalOCLinEcore.g:2915:1: ruleTemplateParameterSubstitutionCS EOF
+            // InternalOCLinEcore.g:2916:1: ( ruleTemplateParameterSubstitutionCS EOF )
+            // InternalOCLinEcore.g:2917:1: ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -8845,23 +8845,23 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalOCLinEcore.g:2922:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
+    // InternalOCLinEcore.g:2924:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
     public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:2926:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
-            // InternalOCLinEcore.g:2927:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalOCLinEcore.g:2928:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
+            // InternalOCLinEcore.g:2929:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
             {
-            // InternalOCLinEcore.g:2927:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
-            // InternalOCLinEcore.g:2928:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalOCLinEcore.g:2929:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalOCLinEcore.g:2930:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
             }
-            // InternalOCLinEcore.g:2929:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
-            // InternalOCLinEcore.g:2929:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
+            // InternalOCLinEcore.g:2931:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalOCLinEcore.g:2931:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment();
@@ -8896,11 +8896,11 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalOCLinEcore.g:2941:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
+    // InternalOCLinEcore.g:2943:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
     public final void entryRuleTypeParameterCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2942:1: ( ruleTypeParameterCS EOF )
-            // InternalOCLinEcore.g:2943:1: ruleTypeParameterCS EOF
+            // InternalOCLinEcore.g:2944:1: ( ruleTypeParameterCS EOF )
+            // InternalOCLinEcore.g:2945:1: ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSRule());
@@ -8930,23 +8930,23 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalOCLinEcore.g:2950:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
+    // InternalOCLinEcore.g:2952:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
     public final void ruleTypeParameterCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:2954:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
-            // InternalOCLinEcore.g:2955:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalOCLinEcore.g:2956:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
+            // InternalOCLinEcore.g:2957:1: ( ( rule__TypeParameterCS__Group__0 ) )
             {
-            // InternalOCLinEcore.g:2955:1: ( ( rule__TypeParameterCS__Group__0 ) )
-            // InternalOCLinEcore.g:2956:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalOCLinEcore.g:2957:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalOCLinEcore.g:2958:1: ( rule__TypeParameterCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup());
             }
-            // InternalOCLinEcore.g:2957:1: ( rule__TypeParameterCS__Group__0 )
-            // InternalOCLinEcore.g:2957:2: rule__TypeParameterCS__Group__0
+            // InternalOCLinEcore.g:2959:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalOCLinEcore.g:2959:2: rule__TypeParameterCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__0();
@@ -8981,11 +8981,11 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalOCLinEcore.g:2969:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
+    // InternalOCLinEcore.g:2971:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
     public final void entryRuleTypeRefCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2970:1: ( ruleTypeRefCS EOF )
-            // InternalOCLinEcore.g:2971:1: ruleTypeRefCS EOF
+            // InternalOCLinEcore.g:2972:1: ( ruleTypeRefCS EOF )
+            // InternalOCLinEcore.g:2973:1: ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSRule());
@@ -9015,23 +9015,23 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalOCLinEcore.g:2978:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
+    // InternalOCLinEcore.g:2980:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
     public final void ruleTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:2982:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
-            // InternalOCLinEcore.g:2983:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalOCLinEcore.g:2984:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
+            // InternalOCLinEcore.g:2985:1: ( ( rule__TypeRefCS__Alternatives ) )
             {
-            // InternalOCLinEcore.g:2983:1: ( ( rule__TypeRefCS__Alternatives ) )
-            // InternalOCLinEcore.g:2984:1: ( rule__TypeRefCS__Alternatives )
+            // InternalOCLinEcore.g:2985:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalOCLinEcore.g:2986:1: ( rule__TypeRefCS__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSAccess().getAlternatives());
             }
-            // InternalOCLinEcore.g:2985:1: ( rule__TypeRefCS__Alternatives )
-            // InternalOCLinEcore.g:2985:2: rule__TypeRefCS__Alternatives
+            // InternalOCLinEcore.g:2987:1: ( rule__TypeRefCS__Alternatives )
+            // InternalOCLinEcore.g:2987:2: rule__TypeRefCS__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeRefCS__Alternatives();
@@ -9066,11 +9066,11 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalOCLinEcore.g:2997:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
+    // InternalOCLinEcore.g:2999:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
     public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:2998:1: ( ruleWildcardTypeRefCS EOF )
-            // InternalOCLinEcore.g:2999:1: ruleWildcardTypeRefCS EOF
+            // InternalOCLinEcore.g:3000:1: ( ruleWildcardTypeRefCS EOF )
+            // InternalOCLinEcore.g:3001:1: ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSRule());
@@ -9100,23 +9100,23 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalOCLinEcore.g:3006:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
+    // InternalOCLinEcore.g:3008:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
     public final void ruleWildcardTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3010:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
-            // InternalOCLinEcore.g:3011:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalOCLinEcore.g:3012:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
+            // InternalOCLinEcore.g:3013:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
             {
-            // InternalOCLinEcore.g:3011:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
-            // InternalOCLinEcore.g:3012:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalOCLinEcore.g:3013:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalOCLinEcore.g:3014:1: ( rule__WildcardTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
             }
-            // InternalOCLinEcore.g:3013:1: ( rule__WildcardTypeRefCS__Group__0 )
-            // InternalOCLinEcore.g:3013:2: rule__WildcardTypeRefCS__Group__0
+            // InternalOCLinEcore.g:3015:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalOCLinEcore.g:3015:2: rule__WildcardTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__0();
@@ -9151,11 +9151,11 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalOCLinEcore.g:3025:1: entryRuleID : ruleID EOF ;
+    // InternalOCLinEcore.g:3027:1: entryRuleID : ruleID EOF ;
     public final void entryRuleID() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3026:1: ( ruleID EOF )
-            // InternalOCLinEcore.g:3027:1: ruleID EOF
+            // InternalOCLinEcore.g:3028:1: ( ruleID EOF )
+            // InternalOCLinEcore.g:3029:1: ruleID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDRule());
@@ -9185,23 +9185,23 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalOCLinEcore.g:3034:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
+    // InternalOCLinEcore.g:3036:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
     public final void ruleID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3038:2: ( ( ( rule__ID__Alternatives ) ) )
-            // InternalOCLinEcore.g:3039:1: ( ( rule__ID__Alternatives ) )
+            // InternalOCLinEcore.g:3040:2: ( ( ( rule__ID__Alternatives ) ) )
+            // InternalOCLinEcore.g:3041:1: ( ( rule__ID__Alternatives ) )
             {
-            // InternalOCLinEcore.g:3039:1: ( ( rule__ID__Alternatives ) )
-            // InternalOCLinEcore.g:3040:1: ( rule__ID__Alternatives )
+            // InternalOCLinEcore.g:3041:1: ( ( rule__ID__Alternatives ) )
+            // InternalOCLinEcore.g:3042:1: ( rule__ID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDAccess().getAlternatives());
             }
-            // InternalOCLinEcore.g:3041:1: ( rule__ID__Alternatives )
-            // InternalOCLinEcore.g:3041:2: rule__ID__Alternatives
+            // InternalOCLinEcore.g:3043:1: ( rule__ID__Alternatives )
+            // InternalOCLinEcore.g:3043:2: rule__ID__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ID__Alternatives();
@@ -9236,11 +9236,11 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalOCLinEcore.g:3053:1: entryRuleIdentifier : ruleIdentifier EOF ;
+    // InternalOCLinEcore.g:3055:1: entryRuleIdentifier : ruleIdentifier EOF ;
     public final void entryRuleIdentifier() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3054:1: ( ruleIdentifier EOF )
-            // InternalOCLinEcore.g:3055:1: ruleIdentifier EOF
+            // InternalOCLinEcore.g:3056:1: ( ruleIdentifier EOF )
+            // InternalOCLinEcore.g:3057:1: ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierRule());
@@ -9270,17 +9270,17 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalOCLinEcore.g:3062:1: ruleIdentifier : ( ruleID ) ;
+    // InternalOCLinEcore.g:3064:1: ruleIdentifier : ( ruleID ) ;
     public final void ruleIdentifier() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3066:2: ( ( ruleID ) )
-            // InternalOCLinEcore.g:3067:1: ( ruleID )
+            // InternalOCLinEcore.g:3068:2: ( ( ruleID ) )
+            // InternalOCLinEcore.g:3069:1: ( ruleID )
             {
-            // InternalOCLinEcore.g:3067:1: ( ruleID )
-            // InternalOCLinEcore.g:3068:1: ruleID
+            // InternalOCLinEcore.g:3069:1: ( ruleID )
+            // InternalOCLinEcore.g:3070:1: ruleID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdentifierAccess().getIDParserRuleCall());
@@ -9315,11 +9315,11 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalOCLinEcore.g:3081:1: entryRuleLOWER : ruleLOWER EOF ;
+    // InternalOCLinEcore.g:3083:1: entryRuleLOWER : ruleLOWER EOF ;
     public final void entryRuleLOWER() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3082:1: ( ruleLOWER EOF )
-            // InternalOCLinEcore.g:3083:1: ruleLOWER EOF
+            // InternalOCLinEcore.g:3084:1: ( ruleLOWER EOF )
+            // InternalOCLinEcore.g:3085:1: ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERRule());
@@ -9349,17 +9349,17 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalOCLinEcore.g:3090:1: ruleLOWER : ( RULE_INT ) ;
+    // InternalOCLinEcore.g:3092:1: ruleLOWER : ( RULE_INT ) ;
     public final void ruleLOWER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3094:2: ( ( RULE_INT ) )
-            // InternalOCLinEcore.g:3095:1: ( RULE_INT )
+            // InternalOCLinEcore.g:3096:2: ( ( RULE_INT ) )
+            // InternalOCLinEcore.g:3097:1: ( RULE_INT )
             {
-            // InternalOCLinEcore.g:3095:1: ( RULE_INT )
-            // InternalOCLinEcore.g:3096:1: RULE_INT
+            // InternalOCLinEcore.g:3097:1: ( RULE_INT )
+            // InternalOCLinEcore.g:3098:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
@@ -9390,11 +9390,11 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalOCLinEcore.g:3109:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
+    // InternalOCLinEcore.g:3111:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
     public final void entryRuleNUMBER_LITERAL() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3110:1: ( ruleNUMBER_LITERAL EOF )
-            // InternalOCLinEcore.g:3111:1: ruleNUMBER_LITERAL EOF
+            // InternalOCLinEcore.g:3112:1: ( ruleNUMBER_LITERAL EOF )
+            // InternalOCLinEcore.g:3113:1: ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALRule());
@@ -9424,17 +9424,17 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalOCLinEcore.g:3118:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
+    // InternalOCLinEcore.g:3120:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
     public final void ruleNUMBER_LITERAL() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3122:2: ( ( RULE_INT ) )
-            // InternalOCLinEcore.g:3123:1: ( RULE_INT )
+            // InternalOCLinEcore.g:3124:2: ( ( RULE_INT ) )
+            // InternalOCLinEcore.g:3125:1: ( RULE_INT )
             {
-            // InternalOCLinEcore.g:3123:1: ( RULE_INT )
-            // InternalOCLinEcore.g:3124:1: RULE_INT
+            // InternalOCLinEcore.g:3125:1: ( RULE_INT )
+            // InternalOCLinEcore.g:3126:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());
@@ -9465,11 +9465,11 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalOCLinEcore.g:3137:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
+    // InternalOCLinEcore.g:3139:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
     public final void entryRuleStringLiteral() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3138:1: ( ruleStringLiteral EOF )
-            // InternalOCLinEcore.g:3139:1: ruleStringLiteral EOF
+            // InternalOCLinEcore.g:3140:1: ( ruleStringLiteral EOF )
+            // InternalOCLinEcore.g:3141:1: ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralRule());
@@ -9499,17 +9499,17 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalOCLinEcore.g:3146:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:3148:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleStringLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3150:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:3151:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:3152:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:3153:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:3151:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:3152:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:3153:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:3154:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -9540,11 +9540,11 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalOCLinEcore.g:3165:1: entryRuleUPPER : ruleUPPER EOF ;
+    // InternalOCLinEcore.g:3167:1: entryRuleUPPER : ruleUPPER EOF ;
     public final void entryRuleUPPER() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3166:1: ( ruleUPPER EOF )
-            // InternalOCLinEcore.g:3167:1: ruleUPPER EOF
+            // InternalOCLinEcore.g:3168:1: ( ruleUPPER EOF )
+            // InternalOCLinEcore.g:3169:1: ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERRule());
@@ -9574,23 +9574,23 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalOCLinEcore.g:3174:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
+    // InternalOCLinEcore.g:3176:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
     public final void ruleUPPER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3178:2: ( ( ( rule__UPPER__Alternatives ) ) )
-            // InternalOCLinEcore.g:3179:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalOCLinEcore.g:3180:2: ( ( ( rule__UPPER__Alternatives ) ) )
+            // InternalOCLinEcore.g:3181:1: ( ( rule__UPPER__Alternatives ) )
             {
-            // InternalOCLinEcore.g:3179:1: ( ( rule__UPPER__Alternatives ) )
-            // InternalOCLinEcore.g:3180:1: ( rule__UPPER__Alternatives )
+            // InternalOCLinEcore.g:3181:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalOCLinEcore.g:3182:1: ( rule__UPPER__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERAccess().getAlternatives());
             }
-            // InternalOCLinEcore.g:3181:1: ( rule__UPPER__Alternatives )
-            // InternalOCLinEcore.g:3181:2: rule__UPPER__Alternatives
+            // InternalOCLinEcore.g:3183:1: ( rule__UPPER__Alternatives )
+            // InternalOCLinEcore.g:3183:2: rule__UPPER__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UPPER__Alternatives();
@@ -9625,11 +9625,11 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalOCLinEcore.g:3193:1: entryRuleURI : ruleURI EOF ;
+    // InternalOCLinEcore.g:3195:1: entryRuleURI : ruleURI EOF ;
     public final void entryRuleURI() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:3194:1: ( ruleURI EOF )
-            // InternalOCLinEcore.g:3195:1: ruleURI EOF
+            // InternalOCLinEcore.g:3196:1: ( ruleURI EOF )
+            // InternalOCLinEcore.g:3197:1: ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIRule());
@@ -9659,17 +9659,17 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalOCLinEcore.g:3202:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:3204:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleURI() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3206:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:3207:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:3208:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:3209:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:3207:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:3208:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:3209:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:3210:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -9700,13 +9700,13 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralName__Alternatives"
-    // InternalOCLinEcore.g:3221:1: rule__EnumerationLiteralName__Alternatives : ( ( ruleEssentialOCLUnrestrictedName ) | ( 'abstract' ) | ( 'attribute' ) | ( 'body' ) | ( 'callable' ) | ( 'class' ) | ( 'composes' ) | ( 'datatype' ) | ( 'definition' ) | ( 'derivation' ) | ( 'derived' ) | ( 'enum' ) | ( 'extends' ) | ( 'id' ) | ( 'import' ) | ( 'initial' ) | ( 'interface' ) | ( 'key' ) | ( 'library' ) | ( 'module' ) | ( 'operation' ) | ( 'ordered' ) | ( 'package' ) | ( 'postcondition' ) | ( 'precondition' ) | ( 'primitive' ) | ( 'property' ) | ( 'readonly' ) | ( 'reference' ) | ( 'resolve' ) | ( 'static' ) | ( 'throws' ) | ( 'transient' ) | ( 'unique' ) | ( 'unsettable' ) | ( 'volatile' ) );
+    // InternalOCLinEcore.g:3223:1: rule__EnumerationLiteralName__Alternatives : ( ( ruleEssentialOCLUnrestrictedName ) | ( 'abstract' ) | ( 'attribute' ) | ( 'body' ) | ( 'callable' ) | ( 'class' ) | ( 'composes' ) | ( 'datatype' ) | ( 'definition' ) | ( 'derivation' ) | ( 'derived' ) | ( 'enum' ) | ( 'extends' ) | ( 'id' ) | ( 'import' ) | ( 'initial' ) | ( 'interface' ) | ( 'key' ) | ( 'library' ) | ( 'module' ) | ( 'operation' ) | ( 'ordered' ) | ( 'package' ) | ( 'postcondition' ) | ( 'precondition' ) | ( 'primitive' ) | ( 'property' ) | ( 'readonly' ) | ( 'reference' ) | ( 'resolve' ) | ( 'static' ) | ( 'throws' ) | ( 'transient' ) | ( 'unique' ) | ( 'unsettable' ) | ( 'volatile' ) );
     public final void rule__EnumerationLiteralName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3225:1: ( ( ruleEssentialOCLUnrestrictedName ) | ( 'abstract' ) | ( 'attribute' ) | ( 'body' ) | ( 'callable' ) | ( 'class' ) | ( 'composes' ) | ( 'datatype' ) | ( 'definition' ) | ( 'derivation' ) | ( 'derived' ) | ( 'enum' ) | ( 'extends' ) | ( 'id' ) | ( 'import' ) | ( 'initial' ) | ( 'interface' ) | ( 'key' ) | ( 'library' ) | ( 'module' ) | ( 'operation' ) | ( 'ordered' ) | ( 'package' ) | ( 'postcondition' ) | ( 'precondition' ) | ( 'primitive' ) | ( 'property' ) | ( 'readonly' ) | ( 'reference' ) | ( 'resolve' ) | ( 'static' ) | ( 'throws' ) | ( 'transient' ) | ( 'unique' ) | ( 'unsettable' ) | ( 'volatile' ) )
+            // InternalOCLinEcore.g:3227:1: ( ( ruleEssentialOCLUnrestrictedName ) | ( 'abstract' ) | ( 'attribute' ) | ( 'body' ) | ( 'callable' ) | ( 'class' ) | ( 'composes' ) | ( 'datatype' ) | ( 'definition' ) | ( 'derivation' ) | ( 'derived' ) | ( 'enum' ) | ( 'extends' ) | ( 'id' ) | ( 'import' ) | ( 'initial' ) | ( 'interface' ) | ( 'key' ) | ( 'library' ) | ( 'module' ) | ( 'operation' ) | ( 'ordered' ) | ( 'package' ) | ( 'postcondition' ) | ( 'precondition' ) | ( 'primitive' ) | ( 'property' ) | ( 'readonly' ) | ( 'reference' ) | ( 'resolve' ) | ( 'static' ) | ( 'throws' ) | ( 'transient' ) | ( 'unique' ) | ( 'unsettable' ) | ( 'volatile' ) )
             int alt2=36;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -9900,10 +9900,10 @@
 
             switch (alt2) {
                 case 1 :
-                    // InternalOCLinEcore.g:3226:1: ( ruleEssentialOCLUnrestrictedName )
+                    // InternalOCLinEcore.g:3228:1: ( ruleEssentialOCLUnrestrictedName )
                     {
-                    // InternalOCLinEcore.g:3226:1: ( ruleEssentialOCLUnrestrictedName )
-                    // InternalOCLinEcore.g:3227:1: ruleEssentialOCLUnrestrictedName
+                    // InternalOCLinEcore.g:3228:1: ( ruleEssentialOCLUnrestrictedName )
+                    // InternalOCLinEcore.g:3229:1: ruleEssentialOCLUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall_0());
@@ -9923,10 +9923,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3232:6: ( 'abstract' )
+                    // InternalOCLinEcore.g:3234:6: ( 'abstract' )
                     {
-                    // InternalOCLinEcore.g:3232:6: ( 'abstract' )
-                    // InternalOCLinEcore.g:3233:1: 'abstract'
+                    // InternalOCLinEcore.g:3234:6: ( 'abstract' )
+                    // InternalOCLinEcore.g:3235:1: 'abstract'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getAbstractKeyword_1());
@@ -9942,10 +9942,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:3240:6: ( 'attribute' )
+                    // InternalOCLinEcore.g:3242:6: ( 'attribute' )
                     {
-                    // InternalOCLinEcore.g:3240:6: ( 'attribute' )
-                    // InternalOCLinEcore.g:3241:1: 'attribute'
+                    // InternalOCLinEcore.g:3242:6: ( 'attribute' )
+                    // InternalOCLinEcore.g:3243:1: 'attribute'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getAttributeKeyword_2());
@@ -9961,10 +9961,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:3248:6: ( 'body' )
+                    // InternalOCLinEcore.g:3250:6: ( 'body' )
                     {
-                    // InternalOCLinEcore.g:3248:6: ( 'body' )
-                    // InternalOCLinEcore.g:3249:1: 'body'
+                    // InternalOCLinEcore.g:3250:6: ( 'body' )
+                    // InternalOCLinEcore.g:3251:1: 'body'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getBodyKeyword_3());
@@ -9980,10 +9980,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:3256:6: ( 'callable' )
+                    // InternalOCLinEcore.g:3258:6: ( 'callable' )
                     {
-                    // InternalOCLinEcore.g:3256:6: ( 'callable' )
-                    // InternalOCLinEcore.g:3257:1: 'callable'
+                    // InternalOCLinEcore.g:3258:6: ( 'callable' )
+                    // InternalOCLinEcore.g:3259:1: 'callable'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getCallableKeyword_4());
@@ -9999,10 +9999,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:3264:6: ( 'class' )
+                    // InternalOCLinEcore.g:3266:6: ( 'class' )
                     {
-                    // InternalOCLinEcore.g:3264:6: ( 'class' )
-                    // InternalOCLinEcore.g:3265:1: 'class'
+                    // InternalOCLinEcore.g:3266:6: ( 'class' )
+                    // InternalOCLinEcore.g:3267:1: 'class'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getClassKeyword_5());
@@ -10018,10 +10018,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:3272:6: ( 'composes' )
+                    // InternalOCLinEcore.g:3274:6: ( 'composes' )
                     {
-                    // InternalOCLinEcore.g:3272:6: ( 'composes' )
-                    // InternalOCLinEcore.g:3273:1: 'composes'
+                    // InternalOCLinEcore.g:3274:6: ( 'composes' )
+                    // InternalOCLinEcore.g:3275:1: 'composes'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getComposesKeyword_6());
@@ -10037,10 +10037,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:3280:6: ( 'datatype' )
+                    // InternalOCLinEcore.g:3282:6: ( 'datatype' )
                     {
-                    // InternalOCLinEcore.g:3280:6: ( 'datatype' )
-                    // InternalOCLinEcore.g:3281:1: 'datatype'
+                    // InternalOCLinEcore.g:3282:6: ( 'datatype' )
+                    // InternalOCLinEcore.g:3283:1: 'datatype'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getDatatypeKeyword_7());
@@ -10056,10 +10056,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLinEcore.g:3288:6: ( 'definition' )
+                    // InternalOCLinEcore.g:3290:6: ( 'definition' )
                     {
-                    // InternalOCLinEcore.g:3288:6: ( 'definition' )
-                    // InternalOCLinEcore.g:3289:1: 'definition'
+                    // InternalOCLinEcore.g:3290:6: ( 'definition' )
+                    // InternalOCLinEcore.g:3291:1: 'definition'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getDefinitionKeyword_8());
@@ -10075,10 +10075,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLinEcore.g:3296:6: ( 'derivation' )
+                    // InternalOCLinEcore.g:3298:6: ( 'derivation' )
                     {
-                    // InternalOCLinEcore.g:3296:6: ( 'derivation' )
-                    // InternalOCLinEcore.g:3297:1: 'derivation'
+                    // InternalOCLinEcore.g:3298:6: ( 'derivation' )
+                    // InternalOCLinEcore.g:3299:1: 'derivation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getDerivationKeyword_9());
@@ -10094,10 +10094,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLinEcore.g:3304:6: ( 'derived' )
+                    // InternalOCLinEcore.g:3306:6: ( 'derived' )
                     {
-                    // InternalOCLinEcore.g:3304:6: ( 'derived' )
-                    // InternalOCLinEcore.g:3305:1: 'derived'
+                    // InternalOCLinEcore.g:3306:6: ( 'derived' )
+                    // InternalOCLinEcore.g:3307:1: 'derived'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getDerivedKeyword_10());
@@ -10113,10 +10113,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLinEcore.g:3312:6: ( 'enum' )
+                    // InternalOCLinEcore.g:3314:6: ( 'enum' )
                     {
-                    // InternalOCLinEcore.g:3312:6: ( 'enum' )
-                    // InternalOCLinEcore.g:3313:1: 'enum'
+                    // InternalOCLinEcore.g:3314:6: ( 'enum' )
+                    // InternalOCLinEcore.g:3315:1: 'enum'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getEnumKeyword_11());
@@ -10132,10 +10132,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLinEcore.g:3320:6: ( 'extends' )
+                    // InternalOCLinEcore.g:3322:6: ( 'extends' )
                     {
-                    // InternalOCLinEcore.g:3320:6: ( 'extends' )
-                    // InternalOCLinEcore.g:3321:1: 'extends'
+                    // InternalOCLinEcore.g:3322:6: ( 'extends' )
+                    // InternalOCLinEcore.g:3323:1: 'extends'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getExtendsKeyword_12());
@@ -10151,10 +10151,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLinEcore.g:3328:6: ( 'id' )
+                    // InternalOCLinEcore.g:3330:6: ( 'id' )
                     {
-                    // InternalOCLinEcore.g:3328:6: ( 'id' )
-                    // InternalOCLinEcore.g:3329:1: 'id'
+                    // InternalOCLinEcore.g:3330:6: ( 'id' )
+                    // InternalOCLinEcore.g:3331:1: 'id'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getIdKeyword_13());
@@ -10170,10 +10170,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLinEcore.g:3336:6: ( 'import' )
+                    // InternalOCLinEcore.g:3338:6: ( 'import' )
                     {
-                    // InternalOCLinEcore.g:3336:6: ( 'import' )
-                    // InternalOCLinEcore.g:3337:1: 'import'
+                    // InternalOCLinEcore.g:3338:6: ( 'import' )
+                    // InternalOCLinEcore.g:3339:1: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getImportKeyword_14());
@@ -10189,10 +10189,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLinEcore.g:3344:6: ( 'initial' )
+                    // InternalOCLinEcore.g:3346:6: ( 'initial' )
                     {
-                    // InternalOCLinEcore.g:3344:6: ( 'initial' )
-                    // InternalOCLinEcore.g:3345:1: 'initial'
+                    // InternalOCLinEcore.g:3346:6: ( 'initial' )
+                    // InternalOCLinEcore.g:3347:1: 'initial'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getInitialKeyword_15());
@@ -10208,10 +10208,10 @@
                     }
                     break;
                 case 17 :
-                    // InternalOCLinEcore.g:3352:6: ( 'interface' )
+                    // InternalOCLinEcore.g:3354:6: ( 'interface' )
                     {
-                    // InternalOCLinEcore.g:3352:6: ( 'interface' )
-                    // InternalOCLinEcore.g:3353:1: 'interface'
+                    // InternalOCLinEcore.g:3354:6: ( 'interface' )
+                    // InternalOCLinEcore.g:3355:1: 'interface'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getInterfaceKeyword_16());
@@ -10227,10 +10227,10 @@
                     }
                     break;
                 case 18 :
-                    // InternalOCLinEcore.g:3360:6: ( 'key' )
+                    // InternalOCLinEcore.g:3362:6: ( 'key' )
                     {
-                    // InternalOCLinEcore.g:3360:6: ( 'key' )
-                    // InternalOCLinEcore.g:3361:1: 'key'
+                    // InternalOCLinEcore.g:3362:6: ( 'key' )
+                    // InternalOCLinEcore.g:3363:1: 'key'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getKeyKeyword_17());
@@ -10246,10 +10246,10 @@
                     }
                     break;
                 case 19 :
-                    // InternalOCLinEcore.g:3368:6: ( 'library' )
+                    // InternalOCLinEcore.g:3370:6: ( 'library' )
                     {
-                    // InternalOCLinEcore.g:3368:6: ( 'library' )
-                    // InternalOCLinEcore.g:3369:1: 'library'
+                    // InternalOCLinEcore.g:3370:6: ( 'library' )
+                    // InternalOCLinEcore.g:3371:1: 'library'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getLibraryKeyword_18());
@@ -10265,10 +10265,10 @@
                     }
                     break;
                 case 20 :
-                    // InternalOCLinEcore.g:3376:6: ( 'module' )
+                    // InternalOCLinEcore.g:3378:6: ( 'module' )
                     {
-                    // InternalOCLinEcore.g:3376:6: ( 'module' )
-                    // InternalOCLinEcore.g:3377:1: 'module'
+                    // InternalOCLinEcore.g:3378:6: ( 'module' )
+                    // InternalOCLinEcore.g:3379:1: 'module'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getModuleKeyword_19());
@@ -10284,10 +10284,10 @@
                     }
                     break;
                 case 21 :
-                    // InternalOCLinEcore.g:3384:6: ( 'operation' )
+                    // InternalOCLinEcore.g:3386:6: ( 'operation' )
                     {
-                    // InternalOCLinEcore.g:3384:6: ( 'operation' )
-                    // InternalOCLinEcore.g:3385:1: 'operation'
+                    // InternalOCLinEcore.g:3386:6: ( 'operation' )
+                    // InternalOCLinEcore.g:3387:1: 'operation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getOperationKeyword_20());
@@ -10303,10 +10303,10 @@
                     }
                     break;
                 case 22 :
-                    // InternalOCLinEcore.g:3392:6: ( 'ordered' )
+                    // InternalOCLinEcore.g:3394:6: ( 'ordered' )
                     {
-                    // InternalOCLinEcore.g:3392:6: ( 'ordered' )
-                    // InternalOCLinEcore.g:3393:1: 'ordered'
+                    // InternalOCLinEcore.g:3394:6: ( 'ordered' )
+                    // InternalOCLinEcore.g:3395:1: 'ordered'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getOrderedKeyword_21());
@@ -10322,10 +10322,10 @@
                     }
                     break;
                 case 23 :
-                    // InternalOCLinEcore.g:3400:6: ( 'package' )
+                    // InternalOCLinEcore.g:3402:6: ( 'package' )
                     {
-                    // InternalOCLinEcore.g:3400:6: ( 'package' )
-                    // InternalOCLinEcore.g:3401:1: 'package'
+                    // InternalOCLinEcore.g:3402:6: ( 'package' )
+                    // InternalOCLinEcore.g:3403:1: 'package'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getPackageKeyword_22());
@@ -10341,10 +10341,10 @@
                     }
                     break;
                 case 24 :
-                    // InternalOCLinEcore.g:3408:6: ( 'postcondition' )
+                    // InternalOCLinEcore.g:3410:6: ( 'postcondition' )
                     {
-                    // InternalOCLinEcore.g:3408:6: ( 'postcondition' )
-                    // InternalOCLinEcore.g:3409:1: 'postcondition'
+                    // InternalOCLinEcore.g:3410:6: ( 'postcondition' )
+                    // InternalOCLinEcore.g:3411:1: 'postcondition'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getPostconditionKeyword_23());
@@ -10360,10 +10360,10 @@
                     }
                     break;
                 case 25 :
-                    // InternalOCLinEcore.g:3416:6: ( 'precondition' )
+                    // InternalOCLinEcore.g:3418:6: ( 'precondition' )
                     {
-                    // InternalOCLinEcore.g:3416:6: ( 'precondition' )
-                    // InternalOCLinEcore.g:3417:1: 'precondition'
+                    // InternalOCLinEcore.g:3418:6: ( 'precondition' )
+                    // InternalOCLinEcore.g:3419:1: 'precondition'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getPreconditionKeyword_24());
@@ -10379,10 +10379,10 @@
                     }
                     break;
                 case 26 :
-                    // InternalOCLinEcore.g:3424:6: ( 'primitive' )
+                    // InternalOCLinEcore.g:3426:6: ( 'primitive' )
                     {
-                    // InternalOCLinEcore.g:3424:6: ( 'primitive' )
-                    // InternalOCLinEcore.g:3425:1: 'primitive'
+                    // InternalOCLinEcore.g:3426:6: ( 'primitive' )
+                    // InternalOCLinEcore.g:3427:1: 'primitive'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getPrimitiveKeyword_25());
@@ -10398,10 +10398,10 @@
                     }
                     break;
                 case 27 :
-                    // InternalOCLinEcore.g:3432:6: ( 'property' )
+                    // InternalOCLinEcore.g:3434:6: ( 'property' )
                     {
-                    // InternalOCLinEcore.g:3432:6: ( 'property' )
-                    // InternalOCLinEcore.g:3433:1: 'property'
+                    // InternalOCLinEcore.g:3434:6: ( 'property' )
+                    // InternalOCLinEcore.g:3435:1: 'property'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getPropertyKeyword_26());
@@ -10417,10 +10417,10 @@
                     }
                     break;
                 case 28 :
-                    // InternalOCLinEcore.g:3440:6: ( 'readonly' )
+                    // InternalOCLinEcore.g:3442:6: ( 'readonly' )
                     {
-                    // InternalOCLinEcore.g:3440:6: ( 'readonly' )
-                    // InternalOCLinEcore.g:3441:1: 'readonly'
+                    // InternalOCLinEcore.g:3442:6: ( 'readonly' )
+                    // InternalOCLinEcore.g:3443:1: 'readonly'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getReadonlyKeyword_27());
@@ -10436,10 +10436,10 @@
                     }
                     break;
                 case 29 :
-                    // InternalOCLinEcore.g:3448:6: ( 'reference' )
+                    // InternalOCLinEcore.g:3450:6: ( 'reference' )
                     {
-                    // InternalOCLinEcore.g:3448:6: ( 'reference' )
-                    // InternalOCLinEcore.g:3449:1: 'reference'
+                    // InternalOCLinEcore.g:3450:6: ( 'reference' )
+                    // InternalOCLinEcore.g:3451:1: 'reference'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getReferenceKeyword_28());
@@ -10455,10 +10455,10 @@
                     }
                     break;
                 case 30 :
-                    // InternalOCLinEcore.g:3456:6: ( 'resolve' )
+                    // InternalOCLinEcore.g:3458:6: ( 'resolve' )
                     {
-                    // InternalOCLinEcore.g:3456:6: ( 'resolve' )
-                    // InternalOCLinEcore.g:3457:1: 'resolve'
+                    // InternalOCLinEcore.g:3458:6: ( 'resolve' )
+                    // InternalOCLinEcore.g:3459:1: 'resolve'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getResolveKeyword_29());
@@ -10474,10 +10474,10 @@
                     }
                     break;
                 case 31 :
-                    // InternalOCLinEcore.g:3464:6: ( 'static' )
+                    // InternalOCLinEcore.g:3466:6: ( 'static' )
                     {
-                    // InternalOCLinEcore.g:3464:6: ( 'static' )
-                    // InternalOCLinEcore.g:3465:1: 'static'
+                    // InternalOCLinEcore.g:3466:6: ( 'static' )
+                    // InternalOCLinEcore.g:3467:1: 'static'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getStaticKeyword_30());
@@ -10493,10 +10493,10 @@
                     }
                     break;
                 case 32 :
-                    // InternalOCLinEcore.g:3472:6: ( 'throws' )
+                    // InternalOCLinEcore.g:3474:6: ( 'throws' )
                     {
-                    // InternalOCLinEcore.g:3472:6: ( 'throws' )
-                    // InternalOCLinEcore.g:3473:1: 'throws'
+                    // InternalOCLinEcore.g:3474:6: ( 'throws' )
+                    // InternalOCLinEcore.g:3475:1: 'throws'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getThrowsKeyword_31());
@@ -10512,10 +10512,10 @@
                     }
                     break;
                 case 33 :
-                    // InternalOCLinEcore.g:3480:6: ( 'transient' )
+                    // InternalOCLinEcore.g:3482:6: ( 'transient' )
                     {
-                    // InternalOCLinEcore.g:3480:6: ( 'transient' )
-                    // InternalOCLinEcore.g:3481:1: 'transient'
+                    // InternalOCLinEcore.g:3482:6: ( 'transient' )
+                    // InternalOCLinEcore.g:3483:1: 'transient'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getTransientKeyword_32());
@@ -10531,10 +10531,10 @@
                     }
                     break;
                 case 34 :
-                    // InternalOCLinEcore.g:3488:6: ( 'unique' )
+                    // InternalOCLinEcore.g:3490:6: ( 'unique' )
                     {
-                    // InternalOCLinEcore.g:3488:6: ( 'unique' )
-                    // InternalOCLinEcore.g:3489:1: 'unique'
+                    // InternalOCLinEcore.g:3490:6: ( 'unique' )
+                    // InternalOCLinEcore.g:3491:1: 'unique'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getUniqueKeyword_33());
@@ -10550,10 +10550,10 @@
                     }
                     break;
                 case 35 :
-                    // InternalOCLinEcore.g:3496:6: ( 'unsettable' )
+                    // InternalOCLinEcore.g:3498:6: ( 'unsettable' )
                     {
-                    // InternalOCLinEcore.g:3496:6: ( 'unsettable' )
-                    // InternalOCLinEcore.g:3497:1: 'unsettable'
+                    // InternalOCLinEcore.g:3498:6: ( 'unsettable' )
+                    // InternalOCLinEcore.g:3499:1: 'unsettable'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getUnsettableKeyword_34());
@@ -10569,10 +10569,10 @@
                     }
                     break;
                 case 36 :
-                    // InternalOCLinEcore.g:3504:6: ( 'volatile' )
+                    // InternalOCLinEcore.g:3506:6: ( 'volatile' )
                     {
-                    // InternalOCLinEcore.g:3504:6: ( 'volatile' )
-                    // InternalOCLinEcore.g:3505:1: 'volatile'
+                    // InternalOCLinEcore.g:3506:6: ( 'volatile' )
+                    // InternalOCLinEcore.g:3507:1: 'volatile'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralNameAccess().getVolatileKeyword_35());
@@ -10605,13 +10605,13 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Alternatives_3"
-    // InternalOCLinEcore.g:3517:1: rule__InvariantConstraintCS__Alternatives_3 : ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:3519:1: rule__InvariantConstraintCS__Alternatives_3 : ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) );
     public final void rule__InvariantConstraintCS__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3521:1: ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:3523:1: ( ( ( rule__InvariantConstraintCS__Group_3_0__0 ) ) | ( ';' ) )
             int alt3=2;
             int LA3_0 = input.LA(1);
 
@@ -10630,16 +10630,16 @@
             }
             switch (alt3) {
                 case 1 :
-                    // InternalOCLinEcore.g:3522:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
+                    // InternalOCLinEcore.g:3524:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:3522:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
-                    // InternalOCLinEcore.g:3523:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
+                    // InternalOCLinEcore.g:3524:1: ( ( rule__InvariantConstraintCS__Group_3_0__0 ) )
+                    // InternalOCLinEcore.g:3525:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getInvariantConstraintCSAccess().getGroup_3_0());
                     }
-                    // InternalOCLinEcore.g:3524:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
-                    // InternalOCLinEcore.g:3524:2: rule__InvariantConstraintCS__Group_3_0__0
+                    // InternalOCLinEcore.g:3526:1: ( rule__InvariantConstraintCS__Group_3_0__0 )
+                    // InternalOCLinEcore.g:3526:2: rule__InvariantConstraintCS__Group_3_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvariantConstraintCS__Group_3_0__0();
@@ -10659,10 +10659,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3528:6: ( ';' )
+                    // InternalOCLinEcore.g:3530:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:3528:6: ( ';' )
-                    // InternalOCLinEcore.g:3529:1: ';'
+                    // InternalOCLinEcore.g:3530:6: ( ';' )
+                    // InternalOCLinEcore.g:3531:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_1());
@@ -10695,13 +10695,13 @@
 
 
     // $ANTLR start "rule__AnnotationCS__NameAlternatives_2_0"
-    // InternalOCLinEcore.g:3541:1: rule__AnnotationCS__NameAlternatives_2_0 : ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) );
+    // InternalOCLinEcore.g:3543:1: rule__AnnotationCS__NameAlternatives_2_0 : ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) );
     public final void rule__AnnotationCS__NameAlternatives_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3545:1: ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:3547:1: ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) )
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -10720,10 +10720,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalOCLinEcore.g:3546:1: ( ruleUnrestrictedName )
+                    // InternalOCLinEcore.g:3548:1: ( ruleUnrestrictedName )
                     {
-                    // InternalOCLinEcore.g:3546:1: ( ruleUnrestrictedName )
-                    // InternalOCLinEcore.g:3547:1: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:3548:1: ( ruleUnrestrictedName )
+                    // InternalOCLinEcore.g:3549:1: ruleUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());
@@ -10743,10 +10743,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3552:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3554:6: ( RULE_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLinEcore.g:3552:6: ( RULE_SINGLE_QUOTED_STRING )
-                    // InternalOCLinEcore.g:3553:1: RULE_SINGLE_QUOTED_STRING
+                    // InternalOCLinEcore.g:3554:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3555:1: RULE_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
@@ -10779,13 +10779,13 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Alternatives_4"
-    // InternalOCLinEcore.g:3563:1: rule__AnnotationCS__Alternatives_4 : ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:3565:1: rule__AnnotationCS__Alternatives_4 : ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) );
     public final void rule__AnnotationCS__Alternatives_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3567:1: ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:3569:1: ( ( ( rule__AnnotationCS__Group_4_0__0 ) ) | ( ';' ) )
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -10804,16 +10804,16 @@
             }
             switch (alt5) {
                 case 1 :
-                    // InternalOCLinEcore.g:3568:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
+                    // InternalOCLinEcore.g:3570:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:3568:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
-                    // InternalOCLinEcore.g:3569:1: ( rule__AnnotationCS__Group_4_0__0 )
+                    // InternalOCLinEcore.g:3570:1: ( ( rule__AnnotationCS__Group_4_0__0 ) )
+                    // InternalOCLinEcore.g:3571:1: ( rule__AnnotationCS__Group_4_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getGroup_4_0());
                     }
-                    // InternalOCLinEcore.g:3570:1: ( rule__AnnotationCS__Group_4_0__0 )
-                    // InternalOCLinEcore.g:3570:2: rule__AnnotationCS__Group_4_0__0
+                    // InternalOCLinEcore.g:3572:1: ( rule__AnnotationCS__Group_4_0__0 )
+                    // InternalOCLinEcore.g:3572:2: rule__AnnotationCS__Group_4_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__Group_4_0__0();
@@ -10833,10 +10833,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3574:6: ( ';' )
+                    // InternalOCLinEcore.g:3576:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:3574:6: ( ';' )
-                    // InternalOCLinEcore.g:3575:1: ';'
+                    // InternalOCLinEcore.g:3576:6: ( ';' )
+                    // InternalOCLinEcore.g:3577:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getSemicolonKeyword_4_1());
@@ -10869,13 +10869,13 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Alternatives_4_0_1"
-    // InternalOCLinEcore.g:3587:1: rule__AnnotationCS__Alternatives_4_0_1 : ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) ) | ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) ) );
+    // InternalOCLinEcore.g:3589:1: rule__AnnotationCS__Alternatives_4_0_1 : ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) ) | ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) ) );
     public final void rule__AnnotationCS__Alternatives_4_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3591:1: ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) ) | ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) ) )
+            // InternalOCLinEcore.g:3593:1: ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) ) | ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) ) )
             int alt6=3;
             switch ( input.LA(1) ) {
             case 54:
@@ -10955,16 +10955,16 @@
 
             switch (alt6) {
                 case 1 :
-                    // InternalOCLinEcore.g:3592:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
+                    // InternalOCLinEcore.g:3594:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:3592:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
-                    // InternalOCLinEcore.g:3593:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
+                    // InternalOCLinEcore.g:3594:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
+                    // InternalOCLinEcore.g:3595:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                     }
-                    // InternalOCLinEcore.g:3594:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
-                    // InternalOCLinEcore.g:3594:2: rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0
+                    // InternalOCLinEcore.g:3596:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 )
+                    // InternalOCLinEcore.g:3596:2: rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0();
@@ -10984,16 +10984,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3598:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
+                    // InternalOCLinEcore.g:3600:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
                     {
-                    // InternalOCLinEcore.g:3598:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
-                    // InternalOCLinEcore.g:3599:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
+                    // InternalOCLinEcore.g:3600:6: ( ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 ) )
+                    // InternalOCLinEcore.g:3601:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getOwnedContentsAssignment_4_0_1_1());
                     }
-                    // InternalOCLinEcore.g:3600:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
-                    // InternalOCLinEcore.g:3600:2: rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1
+                    // InternalOCLinEcore.g:3602:1: ( rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 )
+                    // InternalOCLinEcore.g:3602:2: rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1();
@@ -11013,16 +11013,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:3604:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
+                    // InternalOCLinEcore.g:3606:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
                     {
-                    // InternalOCLinEcore.g:3604:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
-                    // InternalOCLinEcore.g:3605:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
+                    // InternalOCLinEcore.g:3606:6: ( ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 ) )
+                    // InternalOCLinEcore.g:3607:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getOwnedReferencesAssignment_4_0_1_2());
                     }
-                    // InternalOCLinEcore.g:3606:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
-                    // InternalOCLinEcore.g:3606:2: rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2
+                    // InternalOCLinEcore.g:3608:1: ( rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 )
+                    // InternalOCLinEcore.g:3608:2: rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2();
@@ -11059,13 +11059,13 @@
 
 
     // $ANTLR start "rule__AnnotationElementCS__Alternatives"
-    // InternalOCLinEcore.g:3615:1: rule__AnnotationElementCS__Alternatives : ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) );
+    // InternalOCLinEcore.g:3617:1: rule__AnnotationElementCS__Alternatives : ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) );
     public final void rule__AnnotationElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3619:1: ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) )
+            // InternalOCLinEcore.g:3621:1: ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) | ( ruleSysMLCS ) )
             int alt7=3;
             switch ( input.LA(1) ) {
             case 54:
@@ -11093,10 +11093,10 @@
 
             switch (alt7) {
                 case 1 :
-                    // InternalOCLinEcore.g:3620:1: ( ruleAnnotationCS )
+                    // InternalOCLinEcore.g:3622:1: ( ruleAnnotationCS )
                     {
-                    // InternalOCLinEcore.g:3620:1: ( ruleAnnotationCS )
-                    // InternalOCLinEcore.g:3621:1: ruleAnnotationCS
+                    // InternalOCLinEcore.g:3622:1: ( ruleAnnotationCS )
+                    // InternalOCLinEcore.g:3623:1: ruleAnnotationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationElementCSAccess().getAnnotationCSParserRuleCall_0());
@@ -11116,10 +11116,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3626:6: ( ruleDocumentationCS )
+                    // InternalOCLinEcore.g:3628:6: ( ruleDocumentationCS )
                     {
-                    // InternalOCLinEcore.g:3626:6: ( ruleDocumentationCS )
-                    // InternalOCLinEcore.g:3627:1: ruleDocumentationCS
+                    // InternalOCLinEcore.g:3628:6: ( ruleDocumentationCS )
+                    // InternalOCLinEcore.g:3629:1: ruleDocumentationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationElementCSAccess().getDocumentationCSParserRuleCall_1());
@@ -11139,10 +11139,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:3632:6: ( ruleSysMLCS )
+                    // InternalOCLinEcore.g:3634:6: ( ruleSysMLCS )
                     {
-                    // InternalOCLinEcore.g:3632:6: ( ruleSysMLCS )
-                    // InternalOCLinEcore.g:3633:1: ruleSysMLCS
+                    // InternalOCLinEcore.g:3634:6: ( ruleSysMLCS )
+                    // InternalOCLinEcore.g:3635:1: ruleSysMLCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationElementCSAccess().getSysMLCSParserRuleCall_2());
@@ -11179,13 +11179,13 @@
 
 
     // $ANTLR start "rule__AttributeCS__Alternatives_0"
-    // InternalOCLinEcore.g:3643:1: rule__AttributeCS__Alternatives_0 : ( ( ( rule__AttributeCS__Group_0_0__0 ) ) | ( ( rule__AttributeCS__Group_0_1__0 ) ) );
+    // InternalOCLinEcore.g:3645:1: rule__AttributeCS__Alternatives_0 : ( ( ( rule__AttributeCS__Group_0_0__0 ) ) | ( ( rule__AttributeCS__Group_0_1__0 ) ) );
     public final void rule__AttributeCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3647:1: ( ( ( rule__AttributeCS__Group_0_0__0 ) ) | ( ( rule__AttributeCS__Group_0_1__0 ) ) )
+            // InternalOCLinEcore.g:3649:1: ( ( ( rule__AttributeCS__Group_0_0__0 ) ) | ( ( rule__AttributeCS__Group_0_1__0 ) ) )
             int alt8=2;
             int LA8_0 = input.LA(1);
 
@@ -11204,16 +11204,16 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalOCLinEcore.g:3648:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:3650:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:3648:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
-                    // InternalOCLinEcore.g:3649:1: ( rule__AttributeCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:3650:1: ( ( rule__AttributeCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:3651:1: ( rule__AttributeCS__Group_0_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getGroup_0_0());
                     }
-                    // InternalOCLinEcore.g:3650:1: ( rule__AttributeCS__Group_0_0__0 )
-                    // InternalOCLinEcore.g:3650:2: rule__AttributeCS__Group_0_0__0
+                    // InternalOCLinEcore.g:3652:1: ( rule__AttributeCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:3652:2: rule__AttributeCS__Group_0_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_0_0__0();
@@ -11233,16 +11233,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3654:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
+                    // InternalOCLinEcore.g:3656:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:3654:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
-                    // InternalOCLinEcore.g:3655:1: ( rule__AttributeCS__Group_0_1__0 )
+                    // InternalOCLinEcore.g:3656:6: ( ( rule__AttributeCS__Group_0_1__0 ) )
+                    // InternalOCLinEcore.g:3657:1: ( rule__AttributeCS__Group_0_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getGroup_0_1());
                     }
-                    // InternalOCLinEcore.g:3656:1: ( rule__AttributeCS__Group_0_1__0 )
-                    // InternalOCLinEcore.g:3656:2: rule__AttributeCS__Group_0_1__0
+                    // InternalOCLinEcore.g:3658:1: ( rule__AttributeCS__Group_0_1__0 )
+                    // InternalOCLinEcore.g:3658:2: rule__AttributeCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_0_1__0();
@@ -11279,13 +11279,13 @@
 
 
     // $ANTLR start "rule__AttributeCS__Alternatives_5_1_0"
-    // InternalOCLinEcore.g:3665:1: rule__AttributeCS__Alternatives_5_1_0 : ( ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) ) );
+    // InternalOCLinEcore.g:3667:1: rule__AttributeCS__Alternatives_5_1_0 : ( ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) ) );
     public final void rule__AttributeCS__Alternatives_5_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3669:1: ( ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) ) )
+            // InternalOCLinEcore.g:3671:1: ( ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) ) | ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) ) )
             int alt9=16;
             switch ( input.LA(1) ) {
             case 26:
@@ -11378,16 +11378,16 @@
 
             switch (alt9) {
                 case 1 :
-                    // InternalOCLinEcore.g:3670:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
+                    // InternalOCLinEcore.g:3672:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
                     {
-                    // InternalOCLinEcore.g:3670:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
-                    // InternalOCLinEcore.g:3671:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
+                    // InternalOCLinEcore.g:3672:1: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 ) )
+                    // InternalOCLinEcore.g:3673:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_0());
                     }
-                    // InternalOCLinEcore.g:3672:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
-                    // InternalOCLinEcore.g:3672:2: rule__AttributeCS__QualifiersAssignment_5_1_0_0
+                    // InternalOCLinEcore.g:3674:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_0 )
+                    // InternalOCLinEcore.g:3674:2: rule__AttributeCS__QualifiersAssignment_5_1_0_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_0();
@@ -11407,16 +11407,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3676:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
+                    // InternalOCLinEcore.g:3678:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
                     {
-                    // InternalOCLinEcore.g:3676:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
-                    // InternalOCLinEcore.g:3677:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
+                    // InternalOCLinEcore.g:3678:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 ) )
+                    // InternalOCLinEcore.g:3679:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_1());
                     }
-                    // InternalOCLinEcore.g:3678:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
-                    // InternalOCLinEcore.g:3678:2: rule__AttributeCS__QualifiersAssignment_5_1_0_1
+                    // InternalOCLinEcore.g:3680:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_1 )
+                    // InternalOCLinEcore.g:3680:2: rule__AttributeCS__QualifiersAssignment_5_1_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_1();
@@ -11436,16 +11436,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:3682:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
+                    // InternalOCLinEcore.g:3684:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
                     {
-                    // InternalOCLinEcore.g:3682:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
-                    // InternalOCLinEcore.g:3683:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
+                    // InternalOCLinEcore.g:3684:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 ) )
+                    // InternalOCLinEcore.g:3685:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_2());
                     }
-                    // InternalOCLinEcore.g:3684:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
-                    // InternalOCLinEcore.g:3684:2: rule__AttributeCS__QualifiersAssignment_5_1_0_2
+                    // InternalOCLinEcore.g:3686:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_2 )
+                    // InternalOCLinEcore.g:3686:2: rule__AttributeCS__QualifiersAssignment_5_1_0_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_2();
@@ -11465,16 +11465,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:3688:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
+                    // InternalOCLinEcore.g:3690:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
                     {
-                    // InternalOCLinEcore.g:3688:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
-                    // InternalOCLinEcore.g:3689:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
+                    // InternalOCLinEcore.g:3690:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 ) )
+                    // InternalOCLinEcore.g:3691:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_3());
                     }
-                    // InternalOCLinEcore.g:3690:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
-                    // InternalOCLinEcore.g:3690:2: rule__AttributeCS__QualifiersAssignment_5_1_0_3
+                    // InternalOCLinEcore.g:3692:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_3 )
+                    // InternalOCLinEcore.g:3692:2: rule__AttributeCS__QualifiersAssignment_5_1_0_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_3();
@@ -11494,16 +11494,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:3694:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
+                    // InternalOCLinEcore.g:3696:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
                     {
-                    // InternalOCLinEcore.g:3694:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
-                    // InternalOCLinEcore.g:3695:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
+                    // InternalOCLinEcore.g:3696:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 ) )
+                    // InternalOCLinEcore.g:3697:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_4());
                     }
-                    // InternalOCLinEcore.g:3696:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
-                    // InternalOCLinEcore.g:3696:2: rule__AttributeCS__QualifiersAssignment_5_1_0_4
+                    // InternalOCLinEcore.g:3698:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_4 )
+                    // InternalOCLinEcore.g:3698:2: rule__AttributeCS__QualifiersAssignment_5_1_0_4
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_4();
@@ -11523,16 +11523,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:3700:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
+                    // InternalOCLinEcore.g:3702:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
                     {
-                    // InternalOCLinEcore.g:3700:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
-                    // InternalOCLinEcore.g:3701:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
+                    // InternalOCLinEcore.g:3702:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 ) )
+                    // InternalOCLinEcore.g:3703:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_5());
                     }
-                    // InternalOCLinEcore.g:3702:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
-                    // InternalOCLinEcore.g:3702:2: rule__AttributeCS__QualifiersAssignment_5_1_0_5
+                    // InternalOCLinEcore.g:3704:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_5 )
+                    // InternalOCLinEcore.g:3704:2: rule__AttributeCS__QualifiersAssignment_5_1_0_5
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_5();
@@ -11552,16 +11552,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:3706:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
+                    // InternalOCLinEcore.g:3708:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
                     {
-                    // InternalOCLinEcore.g:3706:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
-                    // InternalOCLinEcore.g:3707:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
+                    // InternalOCLinEcore.g:3708:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 ) )
+                    // InternalOCLinEcore.g:3709:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_6());
                     }
-                    // InternalOCLinEcore.g:3708:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
-                    // InternalOCLinEcore.g:3708:2: rule__AttributeCS__QualifiersAssignment_5_1_0_6
+                    // InternalOCLinEcore.g:3710:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_6 )
+                    // InternalOCLinEcore.g:3710:2: rule__AttributeCS__QualifiersAssignment_5_1_0_6
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_6();
@@ -11581,16 +11581,16 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:3712:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
+                    // InternalOCLinEcore.g:3714:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
                     {
-                    // InternalOCLinEcore.g:3712:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
-                    // InternalOCLinEcore.g:3713:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
+                    // InternalOCLinEcore.g:3714:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 ) )
+                    // InternalOCLinEcore.g:3715:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_7());
                     }
-                    // InternalOCLinEcore.g:3714:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
-                    // InternalOCLinEcore.g:3714:2: rule__AttributeCS__QualifiersAssignment_5_1_0_7
+                    // InternalOCLinEcore.g:3716:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_7 )
+                    // InternalOCLinEcore.g:3716:2: rule__AttributeCS__QualifiersAssignment_5_1_0_7
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_7();
@@ -11610,16 +11610,16 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLinEcore.g:3718:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
+                    // InternalOCLinEcore.g:3720:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
                     {
-                    // InternalOCLinEcore.g:3718:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
-                    // InternalOCLinEcore.g:3719:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
+                    // InternalOCLinEcore.g:3720:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 ) )
+                    // InternalOCLinEcore.g:3721:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_8());
                     }
-                    // InternalOCLinEcore.g:3720:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
-                    // InternalOCLinEcore.g:3720:2: rule__AttributeCS__QualifiersAssignment_5_1_0_8
+                    // InternalOCLinEcore.g:3722:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_8 )
+                    // InternalOCLinEcore.g:3722:2: rule__AttributeCS__QualifiersAssignment_5_1_0_8
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_8();
@@ -11639,16 +11639,16 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLinEcore.g:3724:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
+                    // InternalOCLinEcore.g:3726:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
                     {
-                    // InternalOCLinEcore.g:3724:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
-                    // InternalOCLinEcore.g:3725:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
+                    // InternalOCLinEcore.g:3726:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 ) )
+                    // InternalOCLinEcore.g:3727:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_9());
                     }
-                    // InternalOCLinEcore.g:3726:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
-                    // InternalOCLinEcore.g:3726:2: rule__AttributeCS__QualifiersAssignment_5_1_0_9
+                    // InternalOCLinEcore.g:3728:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_9 )
+                    // InternalOCLinEcore.g:3728:2: rule__AttributeCS__QualifiersAssignment_5_1_0_9
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_9();
@@ -11668,16 +11668,16 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLinEcore.g:3730:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
+                    // InternalOCLinEcore.g:3732:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
                     {
-                    // InternalOCLinEcore.g:3730:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
-                    // InternalOCLinEcore.g:3731:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
+                    // InternalOCLinEcore.g:3732:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 ) )
+                    // InternalOCLinEcore.g:3733:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_10());
                     }
-                    // InternalOCLinEcore.g:3732:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
-                    // InternalOCLinEcore.g:3732:2: rule__AttributeCS__QualifiersAssignment_5_1_0_10
+                    // InternalOCLinEcore.g:3734:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_10 )
+                    // InternalOCLinEcore.g:3734:2: rule__AttributeCS__QualifiersAssignment_5_1_0_10
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_10();
@@ -11697,16 +11697,16 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLinEcore.g:3736:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
+                    // InternalOCLinEcore.g:3738:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
                     {
-                    // InternalOCLinEcore.g:3736:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
-                    // InternalOCLinEcore.g:3737:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
+                    // InternalOCLinEcore.g:3738:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 ) )
+                    // InternalOCLinEcore.g:3739:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_11());
                     }
-                    // InternalOCLinEcore.g:3738:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
-                    // InternalOCLinEcore.g:3738:2: rule__AttributeCS__QualifiersAssignment_5_1_0_11
+                    // InternalOCLinEcore.g:3740:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_11 )
+                    // InternalOCLinEcore.g:3740:2: rule__AttributeCS__QualifiersAssignment_5_1_0_11
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_11();
@@ -11726,16 +11726,16 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLinEcore.g:3742:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
+                    // InternalOCLinEcore.g:3744:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
                     {
-                    // InternalOCLinEcore.g:3742:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
-                    // InternalOCLinEcore.g:3743:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
+                    // InternalOCLinEcore.g:3744:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 ) )
+                    // InternalOCLinEcore.g:3745:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_12());
                     }
-                    // InternalOCLinEcore.g:3744:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
-                    // InternalOCLinEcore.g:3744:2: rule__AttributeCS__QualifiersAssignment_5_1_0_12
+                    // InternalOCLinEcore.g:3746:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_12 )
+                    // InternalOCLinEcore.g:3746:2: rule__AttributeCS__QualifiersAssignment_5_1_0_12
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_12();
@@ -11755,16 +11755,16 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLinEcore.g:3748:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
+                    // InternalOCLinEcore.g:3750:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
                     {
-                    // InternalOCLinEcore.g:3748:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
-                    // InternalOCLinEcore.g:3749:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
+                    // InternalOCLinEcore.g:3750:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 ) )
+                    // InternalOCLinEcore.g:3751:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_13());
                     }
-                    // InternalOCLinEcore.g:3750:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
-                    // InternalOCLinEcore.g:3750:2: rule__AttributeCS__QualifiersAssignment_5_1_0_13
+                    // InternalOCLinEcore.g:3752:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_13 )
+                    // InternalOCLinEcore.g:3752:2: rule__AttributeCS__QualifiersAssignment_5_1_0_13
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_13();
@@ -11784,16 +11784,16 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLinEcore.g:3754:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
+                    // InternalOCLinEcore.g:3756:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
                     {
-                    // InternalOCLinEcore.g:3754:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
-                    // InternalOCLinEcore.g:3755:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
+                    // InternalOCLinEcore.g:3756:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 ) )
+                    // InternalOCLinEcore.g:3757:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_14());
                     }
-                    // InternalOCLinEcore.g:3756:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
-                    // InternalOCLinEcore.g:3756:2: rule__AttributeCS__QualifiersAssignment_5_1_0_14
+                    // InternalOCLinEcore.g:3758:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_14 )
+                    // InternalOCLinEcore.g:3758:2: rule__AttributeCS__QualifiersAssignment_5_1_0_14
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_14();
@@ -11813,16 +11813,16 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLinEcore.g:3760:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
+                    // InternalOCLinEcore.g:3762:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
                     {
-                    // InternalOCLinEcore.g:3760:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
-                    // InternalOCLinEcore.g:3761:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
+                    // InternalOCLinEcore.g:3762:6: ( ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 ) )
+                    // InternalOCLinEcore.g:3763:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_5_1_0_15());
                     }
-                    // InternalOCLinEcore.g:3762:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
-                    // InternalOCLinEcore.g:3762:2: rule__AttributeCS__QualifiersAssignment_5_1_0_15
+                    // InternalOCLinEcore.g:3764:1: ( rule__AttributeCS__QualifiersAssignment_5_1_0_15 )
+                    // InternalOCLinEcore.g:3764:2: rule__AttributeCS__QualifiersAssignment_5_1_0_15
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_5_1_0_15();
@@ -11859,13 +11859,13 @@
 
 
     // $ANTLR start "rule__AttributeCS__Alternatives_6"
-    // InternalOCLinEcore.g:3771:1: rule__AttributeCS__Alternatives_6 : ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:3773:1: rule__AttributeCS__Alternatives_6 : ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) );
     public final void rule__AttributeCS__Alternatives_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3775:1: ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:3777:1: ( ( ( rule__AttributeCS__Group_6_0__0 ) ) | ( ';' ) )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -11884,16 +11884,16 @@
             }
             switch (alt10) {
                 case 1 :
-                    // InternalOCLinEcore.g:3776:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
+                    // InternalOCLinEcore.g:3778:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:3776:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
-                    // InternalOCLinEcore.g:3777:1: ( rule__AttributeCS__Group_6_0__0 )
+                    // InternalOCLinEcore.g:3778:1: ( ( rule__AttributeCS__Group_6_0__0 ) )
+                    // InternalOCLinEcore.g:3779:1: ( rule__AttributeCS__Group_6_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getGroup_6_0());
                     }
-                    // InternalOCLinEcore.g:3778:1: ( rule__AttributeCS__Group_6_0__0 )
-                    // InternalOCLinEcore.g:3778:2: rule__AttributeCS__Group_6_0__0
+                    // InternalOCLinEcore.g:3780:1: ( rule__AttributeCS__Group_6_0__0 )
+                    // InternalOCLinEcore.g:3780:2: rule__AttributeCS__Group_6_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_6_0__0();
@@ -11913,10 +11913,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3782:6: ( ';' )
+                    // InternalOCLinEcore.g:3784:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:3782:6: ( ';' )
-                    // InternalOCLinEcore.g:3783:1: ';'
+                    // InternalOCLinEcore.g:3784:6: ( ';' )
+                    // InternalOCLinEcore.g:3785:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_1());
@@ -11949,13 +11949,13 @@
 
 
     // $ANTLR start "rule__AttributeCS__Alternatives_6_0_1"
-    // InternalOCLinEcore.g:3795:1: rule__AttributeCS__Alternatives_6_0_1 : ( ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_1__0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_2__0 ) ) );
+    // InternalOCLinEcore.g:3797:1: rule__AttributeCS__Alternatives_6_0_1 : ( ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_1__0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_2__0 ) ) );
     public final void rule__AttributeCS__Alternatives_6_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3799:1: ( ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_1__0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_2__0 ) ) )
+            // InternalOCLinEcore.g:3801:1: ( ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_1__0 ) ) | ( ( rule__AttributeCS__Group_6_0_1_2__0 ) ) )
             int alt11=3;
             switch ( input.LA(1) ) {
             case 54:
@@ -11985,16 +11985,16 @@
 
             switch (alt11) {
                 case 1 :
-                    // InternalOCLinEcore.g:3800:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
+                    // InternalOCLinEcore.g:3802:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:3800:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
-                    // InternalOCLinEcore.g:3801:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
+                    // InternalOCLinEcore.g:3802:1: ( ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
+                    // InternalOCLinEcore.g:3803:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                     }
-                    // InternalOCLinEcore.g:3802:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
-                    // InternalOCLinEcore.g:3802:2: rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0
+                    // InternalOCLinEcore.g:3804:1: ( rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 )
+                    // InternalOCLinEcore.g:3804:2: rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0();
@@ -12014,16 +12014,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3806:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
+                    // InternalOCLinEcore.g:3808:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:3806:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
-                    // InternalOCLinEcore.g:3807:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
+                    // InternalOCLinEcore.g:3808:6: ( ( rule__AttributeCS__Group_6_0_1_1__0 ) )
+                    // InternalOCLinEcore.g:3809:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_1());
                     }
-                    // InternalOCLinEcore.g:3808:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
-                    // InternalOCLinEcore.g:3808:2: rule__AttributeCS__Group_6_0_1_1__0
+                    // InternalOCLinEcore.g:3810:1: ( rule__AttributeCS__Group_6_0_1_1__0 )
+                    // InternalOCLinEcore.g:3810:2: rule__AttributeCS__Group_6_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_6_0_1_1__0();
@@ -12043,16 +12043,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:3812:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:3814:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
                     {
-                    // InternalOCLinEcore.g:3812:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
-                    // InternalOCLinEcore.g:3813:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
+                    // InternalOCLinEcore.g:3814:6: ( ( rule__AttributeCS__Group_6_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:3815:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAttributeCSAccess().getGroup_6_0_1_2());
                     }
-                    // InternalOCLinEcore.g:3814:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
-                    // InternalOCLinEcore.g:3814:2: rule__AttributeCS__Group_6_0_1_2__0
+                    // InternalOCLinEcore.g:3816:1: ( rule__AttributeCS__Group_6_0_1_2__0 )
+                    // InternalOCLinEcore.g:3816:2: rule__AttributeCS__Group_6_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_6_0_1_2__0();
@@ -12089,13 +12089,13 @@
 
 
     // $ANTLR start "rule__ClassCS__Alternatives"
-    // InternalOCLinEcore.g:3823:1: rule__ClassCS__Alternatives : ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) );
+    // InternalOCLinEcore.g:3825:1: rule__ClassCS__Alternatives : ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) );
     public final void rule__ClassCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3827:1: ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) )
+            // InternalOCLinEcore.g:3829:1: ( ( ruleStructuredClassCS ) | ( ruleDataTypeCS ) | ( ruleEnumerationCS ) )
             int alt12=3;
             switch ( input.LA(1) ) {
             case 17:
@@ -12125,10 +12125,10 @@
 
             switch (alt12) {
                 case 1 :
-                    // InternalOCLinEcore.g:3828:1: ( ruleStructuredClassCS )
+                    // InternalOCLinEcore.g:3830:1: ( ruleStructuredClassCS )
                     {
-                    // InternalOCLinEcore.g:3828:1: ( ruleStructuredClassCS )
-                    // InternalOCLinEcore.g:3829:1: ruleStructuredClassCS
+                    // InternalOCLinEcore.g:3830:1: ( ruleStructuredClassCS )
+                    // InternalOCLinEcore.g:3831:1: ruleStructuredClassCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getClassCSAccess().getStructuredClassCSParserRuleCall_0());
@@ -12148,10 +12148,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3834:6: ( ruleDataTypeCS )
+                    // InternalOCLinEcore.g:3836:6: ( ruleDataTypeCS )
                     {
-                    // InternalOCLinEcore.g:3834:6: ( ruleDataTypeCS )
-                    // InternalOCLinEcore.g:3835:1: ruleDataTypeCS
+                    // InternalOCLinEcore.g:3836:6: ( ruleDataTypeCS )
+                    // InternalOCLinEcore.g:3837:1: ruleDataTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getClassCSAccess().getDataTypeCSParserRuleCall_1());
@@ -12171,10 +12171,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:3840:6: ( ruleEnumerationCS )
+                    // InternalOCLinEcore.g:3842:6: ( ruleEnumerationCS )
                     {
-                    // InternalOCLinEcore.g:3840:6: ( ruleEnumerationCS )
-                    // InternalOCLinEcore.g:3841:1: ruleEnumerationCS
+                    // InternalOCLinEcore.g:3842:6: ( ruleEnumerationCS )
+                    // InternalOCLinEcore.g:3843:1: ruleEnumerationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getClassCSAccess().getEnumerationCSParserRuleCall_2());
@@ -12211,13 +12211,13 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Alternatives_5_1"
-    // InternalOCLinEcore.g:3851:1: rule__DataTypeCS__Alternatives_5_1 : ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) );
+    // InternalOCLinEcore.g:3853:1: rule__DataTypeCS__Alternatives_5_1 : ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) );
     public final void rule__DataTypeCS__Alternatives_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3855:1: ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) )
+            // InternalOCLinEcore.g:3857:1: ( ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) ) | ( '!serializable' ) )
             int alt13=2;
             int LA13_0 = input.LA(1);
 
@@ -12236,16 +12236,16 @@
             }
             switch (alt13) {
                 case 1 :
-                    // InternalOCLinEcore.g:3856:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
+                    // InternalOCLinEcore.g:3858:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:3856:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
-                    // InternalOCLinEcore.g:3857:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
+                    // InternalOCLinEcore.g:3858:1: ( ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 ) )
+                    // InternalOCLinEcore.g:3859:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataTypeCSAccess().getIsSerializableAssignment_5_1_0());
                     }
-                    // InternalOCLinEcore.g:3858:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
-                    // InternalOCLinEcore.g:3858:2: rule__DataTypeCS__IsSerializableAssignment_5_1_0
+                    // InternalOCLinEcore.g:3860:1: ( rule__DataTypeCS__IsSerializableAssignment_5_1_0 )
+                    // InternalOCLinEcore.g:3860:2: rule__DataTypeCS__IsSerializableAssignment_5_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__IsSerializableAssignment_5_1_0();
@@ -12265,10 +12265,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3862:6: ( '!serializable' )
+                    // InternalOCLinEcore.g:3864:6: ( '!serializable' )
                     {
-                    // InternalOCLinEcore.g:3862:6: ( '!serializable' )
-                    // InternalOCLinEcore.g:3863:1: '!serializable'
+                    // InternalOCLinEcore.g:3864:6: ( '!serializable' )
+                    // InternalOCLinEcore.g:3865:1: '!serializable'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataTypeCSAccess().getSerializableKeyword_5_1_1());
@@ -12301,13 +12301,13 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Alternatives_6"
-    // InternalOCLinEcore.g:3875:1: rule__DataTypeCS__Alternatives_6 : ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:3877:1: rule__DataTypeCS__Alternatives_6 : ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) );
     public final void rule__DataTypeCS__Alternatives_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3879:1: ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:3881:1: ( ( ( rule__DataTypeCS__Group_6_0__0 ) ) | ( ';' ) )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -12326,16 +12326,16 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalOCLinEcore.g:3880:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
+                    // InternalOCLinEcore.g:3882:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:3880:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
-                    // InternalOCLinEcore.g:3881:1: ( rule__DataTypeCS__Group_6_0__0 )
+                    // InternalOCLinEcore.g:3882:1: ( ( rule__DataTypeCS__Group_6_0__0 ) )
+                    // InternalOCLinEcore.g:3883:1: ( rule__DataTypeCS__Group_6_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataTypeCSAccess().getGroup_6_0());
                     }
-                    // InternalOCLinEcore.g:3882:1: ( rule__DataTypeCS__Group_6_0__0 )
-                    // InternalOCLinEcore.g:3882:2: rule__DataTypeCS__Group_6_0__0
+                    // InternalOCLinEcore.g:3884:1: ( rule__DataTypeCS__Group_6_0__0 )
+                    // InternalOCLinEcore.g:3884:2: rule__DataTypeCS__Group_6_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__Group_6_0__0();
@@ -12355,10 +12355,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3886:6: ( ';' )
+                    // InternalOCLinEcore.g:3888:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:3886:6: ( ';' )
-                    // InternalOCLinEcore.g:3887:1: ';'
+                    // InternalOCLinEcore.g:3888:6: ( ';' )
+                    // InternalOCLinEcore.g:3889:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataTypeCSAccess().getSemicolonKeyword_6_1());
@@ -12391,13 +12391,13 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Alternatives_6_0_1"
-    // InternalOCLinEcore.g:3899:1: rule__DataTypeCS__Alternatives_6_0_1 : ( ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) ) );
+    // InternalOCLinEcore.g:3901:1: rule__DataTypeCS__Alternatives_6_0_1 : ( ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) ) );
     public final void rule__DataTypeCS__Alternatives_6_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3903:1: ( ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) ) )
+            // InternalOCLinEcore.g:3905:1: ( ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) ) | ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) ) )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -12416,16 +12416,16 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalOCLinEcore.g:3904:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
+                    // InternalOCLinEcore.g:3906:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:3904:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
-                    // InternalOCLinEcore.g:3905:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
+                    // InternalOCLinEcore.g:3906:1: ( ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 ) )
+                    // InternalOCLinEcore.g:3907:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAssignment_6_0_1_0());
                     }
-                    // InternalOCLinEcore.g:3906:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
-                    // InternalOCLinEcore.g:3906:2: rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0
+                    // InternalOCLinEcore.g:3908:1: ( rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 )
+                    // InternalOCLinEcore.g:3908:2: rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0();
@@ -12445,16 +12445,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3910:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
+                    // InternalOCLinEcore.g:3912:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
                     {
-                    // InternalOCLinEcore.g:3910:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
-                    // InternalOCLinEcore.g:3911:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
+                    // InternalOCLinEcore.g:3912:6: ( ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 ) )
+                    // InternalOCLinEcore.g:3913:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsAssignment_6_0_1_1());
                     }
-                    // InternalOCLinEcore.g:3912:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
-                    // InternalOCLinEcore.g:3912:2: rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1
+                    // InternalOCLinEcore.g:3914:1: ( rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 )
+                    // InternalOCLinEcore.g:3914:2: rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1();
@@ -12491,13 +12491,13 @@
 
 
     // $ANTLR start "rule__DetailCS__NameAlternatives_0_0"
-    // InternalOCLinEcore.g:3921:1: rule__DetailCS__NameAlternatives_0_0 : ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) );
+    // InternalOCLinEcore.g:3923:1: rule__DetailCS__NameAlternatives_0_0 : ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) );
     public final void rule__DetailCS__NameAlternatives_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3925:1: ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:3927:1: ( ( ruleUnrestrictedName ) | ( RULE_SINGLE_QUOTED_STRING ) )
             int alt16=2;
             int LA16_0 = input.LA(1);
 
@@ -12516,10 +12516,10 @@
             }
             switch (alt16) {
                 case 1 :
-                    // InternalOCLinEcore.g:3926:1: ( ruleUnrestrictedName )
+                    // InternalOCLinEcore.g:3928:1: ( ruleUnrestrictedName )
                     {
-                    // InternalOCLinEcore.g:3926:1: ( ruleUnrestrictedName )
-                    // InternalOCLinEcore.g:3927:1: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:3928:1: ( ruleUnrestrictedName )
+                    // InternalOCLinEcore.g:3929:1: ruleUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_0());
@@ -12539,10 +12539,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3932:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3934:6: ( RULE_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLinEcore.g:3932:6: ( RULE_SINGLE_QUOTED_STRING )
-                    // InternalOCLinEcore.g:3933:1: RULE_SINGLE_QUOTED_STRING
+                    // InternalOCLinEcore.g:3934:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3935:1: RULE_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_0_0_1());
@@ -12575,13 +12575,13 @@
 
 
     // $ANTLR start "rule__DetailCS__ValuesAlternatives_2_0"
-    // InternalOCLinEcore.g:3943:1: rule__DetailCS__ValuesAlternatives_2_0 : ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) );
+    // InternalOCLinEcore.g:3945:1: rule__DetailCS__ValuesAlternatives_2_0 : ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) );
     public final void rule__DetailCS__ValuesAlternatives_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3947:1: ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:3949:1: ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) )
             int alt17=2;
             int LA17_0 = input.LA(1);
 
@@ -12600,10 +12600,10 @@
             }
             switch (alt17) {
                 case 1 :
-                    // InternalOCLinEcore.g:3948:1: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3950:1: ( RULE_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLinEcore.g:3948:1: ( RULE_SINGLE_QUOTED_STRING )
-                    // InternalOCLinEcore.g:3949:1: RULE_SINGLE_QUOTED_STRING
+                    // InternalOCLinEcore.g:3950:1: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3951:1: RULE_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getValuesSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_0());
@@ -12619,10 +12619,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3954:6: ( RULE_ML_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3956:6: ( RULE_ML_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLinEcore.g:3954:6: ( RULE_ML_SINGLE_QUOTED_STRING )
-                    // InternalOCLinEcore.g:3955:1: RULE_ML_SINGLE_QUOTED_STRING
+                    // InternalOCLinEcore.g:3956:6: ( RULE_ML_SINGLE_QUOTED_STRING )
+                    // InternalOCLinEcore.g:3957:1: RULE_ML_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getValuesML_SINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
@@ -12655,13 +12655,13 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Alternatives_4_1"
-    // InternalOCLinEcore.g:3965:1: rule__EnumerationCS__Alternatives_4_1 : ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) );
+    // InternalOCLinEcore.g:3967:1: rule__EnumerationCS__Alternatives_4_1 : ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) );
     public final void rule__EnumerationCS__Alternatives_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3969:1: ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) )
+            // InternalOCLinEcore.g:3971:1: ( ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) ) | ( '!serializable' ) )
             int alt18=2;
             int LA18_0 = input.LA(1);
 
@@ -12680,16 +12680,16 @@
             }
             switch (alt18) {
                 case 1 :
-                    // InternalOCLinEcore.g:3970:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
+                    // InternalOCLinEcore.g:3972:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:3970:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
-                    // InternalOCLinEcore.g:3971:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
+                    // InternalOCLinEcore.g:3972:1: ( ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 ) )
+                    // InternalOCLinEcore.g:3973:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getIsSerializableAssignment_4_1_0());
                     }
-                    // InternalOCLinEcore.g:3972:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
-                    // InternalOCLinEcore.g:3972:2: rule__EnumerationCS__IsSerializableAssignment_4_1_0
+                    // InternalOCLinEcore.g:3974:1: ( rule__EnumerationCS__IsSerializableAssignment_4_1_0 )
+                    // InternalOCLinEcore.g:3974:2: rule__EnumerationCS__IsSerializableAssignment_4_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__IsSerializableAssignment_4_1_0();
@@ -12709,10 +12709,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:3976:6: ( '!serializable' )
+                    // InternalOCLinEcore.g:3978:6: ( '!serializable' )
                     {
-                    // InternalOCLinEcore.g:3976:6: ( '!serializable' )
-                    // InternalOCLinEcore.g:3977:1: '!serializable'
+                    // InternalOCLinEcore.g:3978:6: ( '!serializable' )
+                    // InternalOCLinEcore.g:3979:1: '!serializable'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getSerializableKeyword_4_1_1());
@@ -12745,13 +12745,13 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Alternatives_5"
-    // InternalOCLinEcore.g:3989:1: rule__EnumerationCS__Alternatives_5 : ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:3991:1: rule__EnumerationCS__Alternatives_5 : ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) );
     public final void rule__EnumerationCS__Alternatives_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:3993:1: ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:3995:1: ( ( ( rule__EnumerationCS__Group_5_0__0 ) ) | ( ';' ) )
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -12770,16 +12770,16 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalOCLinEcore.g:3994:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
+                    // InternalOCLinEcore.g:3996:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:3994:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
-                    // InternalOCLinEcore.g:3995:1: ( rule__EnumerationCS__Group_5_0__0 )
+                    // InternalOCLinEcore.g:3996:1: ( ( rule__EnumerationCS__Group_5_0__0 ) )
+                    // InternalOCLinEcore.g:3997:1: ( rule__EnumerationCS__Group_5_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getGroup_5_0());
                     }
-                    // InternalOCLinEcore.g:3996:1: ( rule__EnumerationCS__Group_5_0__0 )
-                    // InternalOCLinEcore.g:3996:2: rule__EnumerationCS__Group_5_0__0
+                    // InternalOCLinEcore.g:3998:1: ( rule__EnumerationCS__Group_5_0__0 )
+                    // InternalOCLinEcore.g:3998:2: rule__EnumerationCS__Group_5_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__Group_5_0__0();
@@ -12799,10 +12799,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4000:6: ( ';' )
+                    // InternalOCLinEcore.g:4002:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:4000:6: ( ';' )
-                    // InternalOCLinEcore.g:4001:1: ';'
+                    // InternalOCLinEcore.g:4002:6: ( ';' )
+                    // InternalOCLinEcore.g:4003:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getSemicolonKeyword_5_1());
@@ -12835,13 +12835,13 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Alternatives_5_0_1"
-    // InternalOCLinEcore.g:4013:1: rule__EnumerationCS__Alternatives_5_0_1 : ( ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) ) | ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) ) | ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) ) );
+    // InternalOCLinEcore.g:4015:1: rule__EnumerationCS__Alternatives_5_0_1 : ( ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) ) | ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) ) | ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) ) );
     public final void rule__EnumerationCS__Alternatives_5_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4017:1: ( ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) ) | ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) ) | ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) ) )
+            // InternalOCLinEcore.g:4019:1: ( ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) ) | ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) ) | ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) ) )
             int alt20=3;
             switch ( input.LA(1) ) {
             case 54:
@@ -12926,16 +12926,16 @@
 
             switch (alt20) {
                 case 1 :
-                    // InternalOCLinEcore.g:4018:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
+                    // InternalOCLinEcore.g:4020:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:4018:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
-                    // InternalOCLinEcore.g:4019:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
+                    // InternalOCLinEcore.g:4020:1: ( ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 ) )
+                    // InternalOCLinEcore.g:4021:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAssignment_5_0_1_0());
                     }
-                    // InternalOCLinEcore.g:4020:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
-                    // InternalOCLinEcore.g:4020:2: rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0
+                    // InternalOCLinEcore.g:4022:1: ( rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 )
+                    // InternalOCLinEcore.g:4022:2: rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0();
@@ -12955,16 +12955,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4024:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
+                    // InternalOCLinEcore.g:4026:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
                     {
-                    // InternalOCLinEcore.g:4024:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
-                    // InternalOCLinEcore.g:4025:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
+                    // InternalOCLinEcore.g:4026:6: ( ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 ) )
+                    // InternalOCLinEcore.g:4027:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsAssignment_5_0_1_1());
                     }
-                    // InternalOCLinEcore.g:4026:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
-                    // InternalOCLinEcore.g:4026:2: rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1
+                    // InternalOCLinEcore.g:4028:1: ( rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 )
+                    // InternalOCLinEcore.g:4028:2: rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1();
@@ -12984,16 +12984,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4030:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
+                    // InternalOCLinEcore.g:4032:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
                     {
-                    // InternalOCLinEcore.g:4030:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
-                    // InternalOCLinEcore.g:4031:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
+                    // InternalOCLinEcore.g:4032:6: ( ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 ) )
+                    // InternalOCLinEcore.g:4033:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsAssignment_5_0_1_2());
                     }
-                    // InternalOCLinEcore.g:4032:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
-                    // InternalOCLinEcore.g:4032:2: rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2
+                    // InternalOCLinEcore.g:4034:1: ( rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 )
+                    // InternalOCLinEcore.g:4034:2: rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2();
@@ -13030,13 +13030,13 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Alternatives_0"
-    // InternalOCLinEcore.g:4041:1: rule__EnumerationLiteralCS__Alternatives_0 : ( ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) ) | ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) ) );
+    // InternalOCLinEcore.g:4043:1: rule__EnumerationLiteralCS__Alternatives_0 : ( ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) ) | ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) ) );
     public final void rule__EnumerationLiteralCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4045:1: ( ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) ) | ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) ) )
+            // InternalOCLinEcore.g:4047:1: ( ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) ) | ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) ) )
             int alt21=2;
             int LA21_0 = input.LA(1);
 
@@ -13055,16 +13055,16 @@
             }
             switch (alt21) {
                 case 1 :
-                    // InternalOCLinEcore.g:4046:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:4048:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4046:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
-                    // InternalOCLinEcore.g:4047:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:4048:1: ( ( rule__EnumerationLiteralCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:4049:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_0_0());
                     }
-                    // InternalOCLinEcore.g:4048:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
-                    // InternalOCLinEcore.g:4048:2: rule__EnumerationLiteralCS__Group_0_0__0
+                    // InternalOCLinEcore.g:4050:1: ( rule__EnumerationLiteralCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:4050:2: rule__EnumerationLiteralCS__Group_0_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationLiteralCS__Group_0_0__0();
@@ -13084,16 +13084,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4052:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
+                    // InternalOCLinEcore.g:4054:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
                     {
-                    // InternalOCLinEcore.g:4052:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
-                    // InternalOCLinEcore.g:4053:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
+                    // InternalOCLinEcore.g:4054:6: ( ( rule__EnumerationLiteralCS__NameAssignment_0_1 ) )
+                    // InternalOCLinEcore.g:4055:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_1());
                     }
-                    // InternalOCLinEcore.g:4054:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
-                    // InternalOCLinEcore.g:4054:2: rule__EnumerationLiteralCS__NameAssignment_0_1
+                    // InternalOCLinEcore.g:4056:1: ( rule__EnumerationLiteralCS__NameAssignment_0_1 )
+                    // InternalOCLinEcore.g:4056:2: rule__EnumerationLiteralCS__NameAssignment_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationLiteralCS__NameAssignment_0_1();
@@ -13130,13 +13130,13 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Alternatives_3"
-    // InternalOCLinEcore.g:4063:1: rule__EnumerationLiteralCS__Alternatives_3 : ( ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:4065:1: rule__EnumerationLiteralCS__Alternatives_3 : ( ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) ) | ( ';' ) );
     public final void rule__EnumerationLiteralCS__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4067:1: ( ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:4069:1: ( ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) ) | ( ';' ) )
             int alt22=2;
             int LA22_0 = input.LA(1);
 
@@ -13155,16 +13155,16 @@
             }
             switch (alt22) {
                 case 1 :
-                    // InternalOCLinEcore.g:4068:1: ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) )
+                    // InternalOCLinEcore.g:4070:1: ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4068:1: ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) )
-                    // InternalOCLinEcore.g:4069:1: ( rule__EnumerationLiteralCS__Group_3_0__0 )
+                    // InternalOCLinEcore.g:4070:1: ( ( rule__EnumerationLiteralCS__Group_3_0__0 ) )
+                    // InternalOCLinEcore.g:4071:1: ( rule__EnumerationLiteralCS__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_3_0());
                     }
-                    // InternalOCLinEcore.g:4070:1: ( rule__EnumerationLiteralCS__Group_3_0__0 )
-                    // InternalOCLinEcore.g:4070:2: rule__EnumerationLiteralCS__Group_3_0__0
+                    // InternalOCLinEcore.g:4072:1: ( rule__EnumerationLiteralCS__Group_3_0__0 )
+                    // InternalOCLinEcore.g:4072:2: rule__EnumerationLiteralCS__Group_3_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationLiteralCS__Group_3_0__0();
@@ -13184,10 +13184,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4074:6: ( ';' )
+                    // InternalOCLinEcore.g:4076:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:4074:6: ( ';' )
-                    // InternalOCLinEcore.g:4075:1: ';'
+                    // InternalOCLinEcore.g:4076:6: ( ';' )
+                    // InternalOCLinEcore.g:4077:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_3_1());
@@ -13220,13 +13220,13 @@
 
 
     // $ANTLR start "rule__ImportCS__Alternatives_0"
-    // InternalOCLinEcore.g:4087:1: rule__ImportCS__Alternatives_0 : ( ( 'import' ) | ( 'library' ) );
+    // InternalOCLinEcore.g:4089:1: rule__ImportCS__Alternatives_0 : ( ( 'import' ) | ( 'library' ) );
     public final void rule__ImportCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4091:1: ( ( 'import' ) | ( 'library' ) )
+            // InternalOCLinEcore.g:4093:1: ( ( 'import' ) | ( 'library' ) )
             int alt23=2;
             int LA23_0 = input.LA(1);
 
@@ -13245,10 +13245,10 @@
             }
             switch (alt23) {
                 case 1 :
-                    // InternalOCLinEcore.g:4092:1: ( 'import' )
+                    // InternalOCLinEcore.g:4094:1: ( 'import' )
                     {
-                    // InternalOCLinEcore.g:4092:1: ( 'import' )
-                    // InternalOCLinEcore.g:4093:1: 'import'
+                    // InternalOCLinEcore.g:4094:1: ( 'import' )
+                    // InternalOCLinEcore.g:4095:1: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImportCSAccess().getImportKeyword_0_0());
@@ -13264,10 +13264,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4100:6: ( 'library' )
+                    // InternalOCLinEcore.g:4102:6: ( 'library' )
                     {
-                    // InternalOCLinEcore.g:4100:6: ( 'library' )
-                    // InternalOCLinEcore.g:4101:1: 'library'
+                    // InternalOCLinEcore.g:4102:6: ( 'library' )
+                    // InternalOCLinEcore.g:4103:1: 'library'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImportCSAccess().getLibraryKeyword_0_1());
@@ -13300,21 +13300,21 @@
 
 
     // $ANTLR start "rule__ModelElementCS__Alternatives"
-    // InternalOCLinEcore.g:4113:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );
+    // InternalOCLinEcore.g:4115:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );
     public final void rule__ModelElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4117:1: ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) )
+            // InternalOCLinEcore.g:4119:1: ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) )
             int alt24=5;
             alt24 = dfa24.predict(input);
             switch (alt24) {
                 case 1 :
-                    // InternalOCLinEcore.g:4118:1: ( ruleClassCS )
+                    // InternalOCLinEcore.g:4120:1: ( ruleClassCS )
                     {
-                    // InternalOCLinEcore.g:4118:1: ( ruleClassCS )
-                    // InternalOCLinEcore.g:4119:1: ruleClassCS
+                    // InternalOCLinEcore.g:4120:1: ( ruleClassCS )
+                    // InternalOCLinEcore.g:4121:1: ruleClassCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getModelElementCSAccess().getClassCSParserRuleCall_0());
@@ -13334,10 +13334,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4124:6: ( ruleEnumerationLiteralCS )
+                    // InternalOCLinEcore.g:4126:6: ( ruleEnumerationLiteralCS )
                     {
-                    // InternalOCLinEcore.g:4124:6: ( ruleEnumerationLiteralCS )
-                    // InternalOCLinEcore.g:4125:1: ruleEnumerationLiteralCS
+                    // InternalOCLinEcore.g:4126:6: ( ruleEnumerationLiteralCS )
+                    // InternalOCLinEcore.g:4127:1: ruleEnumerationLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getModelElementCSAccess().getEnumerationLiteralCSParserRuleCall_1());
@@ -13357,10 +13357,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4130:6: ( ruleOperationCS )
+                    // InternalOCLinEcore.g:4132:6: ( ruleOperationCS )
                     {
-                    // InternalOCLinEcore.g:4130:6: ( ruleOperationCS )
-                    // InternalOCLinEcore.g:4131:1: ruleOperationCS
+                    // InternalOCLinEcore.g:4132:6: ( ruleOperationCS )
+                    // InternalOCLinEcore.g:4133:1: ruleOperationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getModelElementCSAccess().getOperationCSParserRuleCall_2());
@@ -13380,10 +13380,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4136:6: ( rulePackageCS )
+                    // InternalOCLinEcore.g:4138:6: ( rulePackageCS )
                     {
-                    // InternalOCLinEcore.g:4136:6: ( rulePackageCS )
-                    // InternalOCLinEcore.g:4137:1: rulePackageCS
+                    // InternalOCLinEcore.g:4138:6: ( rulePackageCS )
+                    // InternalOCLinEcore.g:4139:1: rulePackageCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getModelElementCSAccess().getPackageCSParserRuleCall_3());
@@ -13403,10 +13403,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:4142:6: ( ruleStructuralFeatureCS )
+                    // InternalOCLinEcore.g:4144:6: ( ruleStructuralFeatureCS )
                     {
-                    // InternalOCLinEcore.g:4142:6: ( ruleStructuralFeatureCS )
-                    // InternalOCLinEcore.g:4143:1: ruleStructuralFeatureCS
+                    // InternalOCLinEcore.g:4144:6: ( ruleStructuralFeatureCS )
+                    // InternalOCLinEcore.g:4145:1: ruleStructuralFeatureCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getModelElementCSAccess().getStructuralFeatureCSParserRuleCall_4());
@@ -13443,13 +13443,13 @@
 
 
     // $ANTLR start "rule__OperationCS__Alternatives_0"
-    // InternalOCLinEcore.g:4153:1: rule__OperationCS__Alternatives_0 : ( ( ( rule__OperationCS__Group_0_0__0 ) ) | ( ( rule__OperationCS__Group_0_1__0 ) ) );
+    // InternalOCLinEcore.g:4155:1: rule__OperationCS__Alternatives_0 : ( ( ( rule__OperationCS__Group_0_0__0 ) ) | ( ( rule__OperationCS__Group_0_1__0 ) ) );
     public final void rule__OperationCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4157:1: ( ( ( rule__OperationCS__Group_0_0__0 ) ) | ( ( rule__OperationCS__Group_0_1__0 ) ) )
+            // InternalOCLinEcore.g:4159:1: ( ( ( rule__OperationCS__Group_0_0__0 ) ) | ( ( rule__OperationCS__Group_0_1__0 ) ) )
             int alt25=2;
             int LA25_0 = input.LA(1);
 
@@ -13468,16 +13468,16 @@
             }
             switch (alt25) {
                 case 1 :
-                    // InternalOCLinEcore.g:4158:1: ( ( rule__OperationCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:4160:1: ( ( rule__OperationCS__Group_0_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4158:1: ( ( rule__OperationCS__Group_0_0__0 ) )
-                    // InternalOCLinEcore.g:4159:1: ( rule__OperationCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:4160:1: ( ( rule__OperationCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:4161:1: ( rule__OperationCS__Group_0_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getGroup_0_0());
                     }
-                    // InternalOCLinEcore.g:4160:1: ( rule__OperationCS__Group_0_0__0 )
-                    // InternalOCLinEcore.g:4160:2: rule__OperationCS__Group_0_0__0
+                    // InternalOCLinEcore.g:4162:1: ( rule__OperationCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:4162:2: rule__OperationCS__Group_0_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_0_0__0();
@@ -13497,16 +13497,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4164:6: ( ( rule__OperationCS__Group_0_1__0 ) )
+                    // InternalOCLinEcore.g:4166:6: ( ( rule__OperationCS__Group_0_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:4164:6: ( ( rule__OperationCS__Group_0_1__0 ) )
-                    // InternalOCLinEcore.g:4165:1: ( rule__OperationCS__Group_0_1__0 )
+                    // InternalOCLinEcore.g:4166:6: ( ( rule__OperationCS__Group_0_1__0 ) )
+                    // InternalOCLinEcore.g:4167:1: ( rule__OperationCS__Group_0_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getGroup_0_1());
                     }
-                    // InternalOCLinEcore.g:4166:1: ( rule__OperationCS__Group_0_1__0 )
-                    // InternalOCLinEcore.g:4166:2: rule__OperationCS__Group_0_1__0
+                    // InternalOCLinEcore.g:4168:1: ( rule__OperationCS__Group_0_1__0 )
+                    // InternalOCLinEcore.g:4168:2: rule__OperationCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_0_1__0();
@@ -13543,13 +13543,13 @@
 
 
     // $ANTLR start "rule__OperationCS__Alternatives_9_1_0"
-    // InternalOCLinEcore.g:4175:1: rule__OperationCS__Alternatives_9_1_0 : ( ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) ) );
+    // InternalOCLinEcore.g:4177:1: rule__OperationCS__Alternatives_9_1_0 : ( ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) ) );
     public final void rule__OperationCS__Alternatives_9_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4179:1: ( ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) ) )
+            // InternalOCLinEcore.g:4181:1: ( ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) ) | ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) ) )
             int alt26=8;
             switch ( input.LA(1) ) {
             case 26:
@@ -13602,16 +13602,16 @@
 
             switch (alt26) {
                 case 1 :
-                    // InternalOCLinEcore.g:4180:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
+                    // InternalOCLinEcore.g:4182:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
                     {
-                    // InternalOCLinEcore.g:4180:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
-                    // InternalOCLinEcore.g:4181:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
+                    // InternalOCLinEcore.g:4182:1: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_0 ) )
+                    // InternalOCLinEcore.g:4183:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_0());
                     }
-                    // InternalOCLinEcore.g:4182:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
-                    // InternalOCLinEcore.g:4182:2: rule__OperationCS__QualifiersAssignment_9_1_0_0
+                    // InternalOCLinEcore.g:4184:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_0 )
+                    // InternalOCLinEcore.g:4184:2: rule__OperationCS__QualifiersAssignment_9_1_0_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_0();
@@ -13631,16 +13631,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4186:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
+                    // InternalOCLinEcore.g:4188:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
                     {
-                    // InternalOCLinEcore.g:4186:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
-                    // InternalOCLinEcore.g:4187:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
+                    // InternalOCLinEcore.g:4188:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_1 ) )
+                    // InternalOCLinEcore.g:4189:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_1());
                     }
-                    // InternalOCLinEcore.g:4188:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
-                    // InternalOCLinEcore.g:4188:2: rule__OperationCS__QualifiersAssignment_9_1_0_1
+                    // InternalOCLinEcore.g:4190:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_1 )
+                    // InternalOCLinEcore.g:4190:2: rule__OperationCS__QualifiersAssignment_9_1_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_1();
@@ -13660,16 +13660,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4192:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
+                    // InternalOCLinEcore.g:4194:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
                     {
-                    // InternalOCLinEcore.g:4192:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
-                    // InternalOCLinEcore.g:4193:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
+                    // InternalOCLinEcore.g:4194:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_2 ) )
+                    // InternalOCLinEcore.g:4195:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_2());
                     }
-                    // InternalOCLinEcore.g:4194:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
-                    // InternalOCLinEcore.g:4194:2: rule__OperationCS__QualifiersAssignment_9_1_0_2
+                    // InternalOCLinEcore.g:4196:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_2 )
+                    // InternalOCLinEcore.g:4196:2: rule__OperationCS__QualifiersAssignment_9_1_0_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_2();
@@ -13689,16 +13689,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4198:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
+                    // InternalOCLinEcore.g:4200:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
                     {
-                    // InternalOCLinEcore.g:4198:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
-                    // InternalOCLinEcore.g:4199:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
+                    // InternalOCLinEcore.g:4200:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_3 ) )
+                    // InternalOCLinEcore.g:4201:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_3());
                     }
-                    // InternalOCLinEcore.g:4200:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
-                    // InternalOCLinEcore.g:4200:2: rule__OperationCS__QualifiersAssignment_9_1_0_3
+                    // InternalOCLinEcore.g:4202:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_3 )
+                    // InternalOCLinEcore.g:4202:2: rule__OperationCS__QualifiersAssignment_9_1_0_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_3();
@@ -13718,16 +13718,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:4204:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
+                    // InternalOCLinEcore.g:4206:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
                     {
-                    // InternalOCLinEcore.g:4204:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
-                    // InternalOCLinEcore.g:4205:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
+                    // InternalOCLinEcore.g:4206:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_4 ) )
+                    // InternalOCLinEcore.g:4207:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_4());
                     }
-                    // InternalOCLinEcore.g:4206:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
-                    // InternalOCLinEcore.g:4206:2: rule__OperationCS__QualifiersAssignment_9_1_0_4
+                    // InternalOCLinEcore.g:4208:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_4 )
+                    // InternalOCLinEcore.g:4208:2: rule__OperationCS__QualifiersAssignment_9_1_0_4
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_4();
@@ -13747,16 +13747,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:4210:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
+                    // InternalOCLinEcore.g:4212:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
                     {
-                    // InternalOCLinEcore.g:4210:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
-                    // InternalOCLinEcore.g:4211:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
+                    // InternalOCLinEcore.g:4212:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_5 ) )
+                    // InternalOCLinEcore.g:4213:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_5());
                     }
-                    // InternalOCLinEcore.g:4212:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
-                    // InternalOCLinEcore.g:4212:2: rule__OperationCS__QualifiersAssignment_9_1_0_5
+                    // InternalOCLinEcore.g:4214:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_5 )
+                    // InternalOCLinEcore.g:4214:2: rule__OperationCS__QualifiersAssignment_9_1_0_5
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_5();
@@ -13776,16 +13776,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:4216:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
+                    // InternalOCLinEcore.g:4218:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
                     {
-                    // InternalOCLinEcore.g:4216:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
-                    // InternalOCLinEcore.g:4217:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
+                    // InternalOCLinEcore.g:4218:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_6 ) )
+                    // InternalOCLinEcore.g:4219:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_6());
                     }
-                    // InternalOCLinEcore.g:4218:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
-                    // InternalOCLinEcore.g:4218:2: rule__OperationCS__QualifiersAssignment_9_1_0_6
+                    // InternalOCLinEcore.g:4220:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_6 )
+                    // InternalOCLinEcore.g:4220:2: rule__OperationCS__QualifiersAssignment_9_1_0_6
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_6();
@@ -13805,16 +13805,16 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:4222:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
+                    // InternalOCLinEcore.g:4224:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
                     {
-                    // InternalOCLinEcore.g:4222:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
-                    // InternalOCLinEcore.g:4223:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
+                    // InternalOCLinEcore.g:4224:6: ( ( rule__OperationCS__QualifiersAssignment_9_1_0_7 ) )
+                    // InternalOCLinEcore.g:4225:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_9_1_0_7());
                     }
-                    // InternalOCLinEcore.g:4224:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
-                    // InternalOCLinEcore.g:4224:2: rule__OperationCS__QualifiersAssignment_9_1_0_7
+                    // InternalOCLinEcore.g:4226:1: ( rule__OperationCS__QualifiersAssignment_9_1_0_7 )
+                    // InternalOCLinEcore.g:4226:2: rule__OperationCS__QualifiersAssignment_9_1_0_7
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_9_1_0_7();
@@ -13851,13 +13851,13 @@
 
 
     // $ANTLR start "rule__OperationCS__Alternatives_10"
-    // InternalOCLinEcore.g:4233:1: rule__OperationCS__Alternatives_10 : ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:4235:1: rule__OperationCS__Alternatives_10 : ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) );
     public final void rule__OperationCS__Alternatives_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4237:1: ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:4239:1: ( ( ( rule__OperationCS__Group_10_0__0 ) ) | ( ';' ) )
             int alt27=2;
             int LA27_0 = input.LA(1);
 
@@ -13876,16 +13876,16 @@
             }
             switch (alt27) {
                 case 1 :
-                    // InternalOCLinEcore.g:4238:1: ( ( rule__OperationCS__Group_10_0__0 ) )
+                    // InternalOCLinEcore.g:4240:1: ( ( rule__OperationCS__Group_10_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4238:1: ( ( rule__OperationCS__Group_10_0__0 ) )
-                    // InternalOCLinEcore.g:4239:1: ( rule__OperationCS__Group_10_0__0 )
+                    // InternalOCLinEcore.g:4240:1: ( ( rule__OperationCS__Group_10_0__0 ) )
+                    // InternalOCLinEcore.g:4241:1: ( rule__OperationCS__Group_10_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getGroup_10_0());
                     }
-                    // InternalOCLinEcore.g:4240:1: ( rule__OperationCS__Group_10_0__0 )
-                    // InternalOCLinEcore.g:4240:2: rule__OperationCS__Group_10_0__0
+                    // InternalOCLinEcore.g:4242:1: ( rule__OperationCS__Group_10_0__0 )
+                    // InternalOCLinEcore.g:4242:2: rule__OperationCS__Group_10_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_10_0__0();
@@ -13905,10 +13905,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4244:6: ( ';' )
+                    // InternalOCLinEcore.g:4246:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:4244:6: ( ';' )
-                    // InternalOCLinEcore.g:4245:1: ';'
+                    // InternalOCLinEcore.g:4246:6: ( ';' )
+                    // InternalOCLinEcore.g:4247:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_1());
@@ -13941,13 +13941,13 @@
 
 
     // $ANTLR start "rule__OperationCS__Alternatives_10_0_1"
-    // InternalOCLinEcore.g:4257:1: rule__OperationCS__Alternatives_10_0_1 : ( ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) ) | ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) ) | ( ( rule__OperationCS__Group_10_0_1_2__0 ) ) | ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) ) );
+    // InternalOCLinEcore.g:4259:1: rule__OperationCS__Alternatives_10_0_1 : ( ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) ) | ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) ) | ( ( rule__OperationCS__Group_10_0_1_2__0 ) ) | ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) ) );
     public final void rule__OperationCS__Alternatives_10_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4261:1: ( ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) ) | ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) ) | ( ( rule__OperationCS__Group_10_0_1_2__0 ) ) | ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) ) )
+            // InternalOCLinEcore.g:4263:1: ( ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) ) | ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) ) | ( ( rule__OperationCS__Group_10_0_1_2__0 ) ) | ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) ) )
             int alt28=4;
             switch ( input.LA(1) ) {
             case 54:
@@ -13982,16 +13982,16 @@
 
             switch (alt28) {
                 case 1 :
-                    // InternalOCLinEcore.g:4262:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
+                    // InternalOCLinEcore.g:4264:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:4262:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
-                    // InternalOCLinEcore.g:4263:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
+                    // InternalOCLinEcore.g:4264:1: ( ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 ) )
+                    // InternalOCLinEcore.g:4265:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAssignment_10_0_1_0());
                     }
-                    // InternalOCLinEcore.g:4264:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
-                    // InternalOCLinEcore.g:4264:2: rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0
+                    // InternalOCLinEcore.g:4266:1: ( rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 )
+                    // InternalOCLinEcore.g:4266:2: rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0();
@@ -14011,16 +14011,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4268:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
+                    // InternalOCLinEcore.g:4270:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
                     {
-                    // InternalOCLinEcore.g:4268:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
-                    // InternalOCLinEcore.g:4269:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
+                    // InternalOCLinEcore.g:4270:6: ( ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 ) )
+                    // InternalOCLinEcore.g:4271:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getOwnedPreconditionsAssignment_10_0_1_1());
                     }
-                    // InternalOCLinEcore.g:4270:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
-                    // InternalOCLinEcore.g:4270:2: rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1
+                    // InternalOCLinEcore.g:4272:1: ( rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 )
+                    // InternalOCLinEcore.g:4272:2: rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1();
@@ -14040,16 +14040,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4274:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:4276:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
                     {
-                    // InternalOCLinEcore.g:4274:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
-                    // InternalOCLinEcore.g:4275:1: ( rule__OperationCS__Group_10_0_1_2__0 )
+                    // InternalOCLinEcore.g:4276:6: ( ( rule__OperationCS__Group_10_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:4277:1: ( rule__OperationCS__Group_10_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getGroup_10_0_1_2());
                     }
-                    // InternalOCLinEcore.g:4276:1: ( rule__OperationCS__Group_10_0_1_2__0 )
-                    // InternalOCLinEcore.g:4276:2: rule__OperationCS__Group_10_0_1_2__0
+                    // InternalOCLinEcore.g:4278:1: ( rule__OperationCS__Group_10_0_1_2__0 )
+                    // InternalOCLinEcore.g:4278:2: rule__OperationCS__Group_10_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_10_0_1_2__0();
@@ -14069,16 +14069,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4280:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
+                    // InternalOCLinEcore.g:4282:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
                     {
-                    // InternalOCLinEcore.g:4280:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
-                    // InternalOCLinEcore.g:4281:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
+                    // InternalOCLinEcore.g:4282:6: ( ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 ) )
+                    // InternalOCLinEcore.g:4283:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getOwnedPostconditionsAssignment_10_0_1_3());
                     }
-                    // InternalOCLinEcore.g:4282:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
-                    // InternalOCLinEcore.g:4282:2: rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3
+                    // InternalOCLinEcore.g:4284:1: ( rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 )
+                    // InternalOCLinEcore.g:4284:2: rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3();
@@ -14115,13 +14115,13 @@
 
 
     // $ANTLR start "rule__PackageCS__Alternatives_4"
-    // InternalOCLinEcore.g:4291:1: rule__PackageCS__Alternatives_4 : ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:4293:1: rule__PackageCS__Alternatives_4 : ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) );
     public final void rule__PackageCS__Alternatives_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4295:1: ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:4297:1: ( ( ( rule__PackageCS__Group_4_0__0 ) ) | ( ';' ) )
             int alt29=2;
             int LA29_0 = input.LA(1);
 
@@ -14140,16 +14140,16 @@
             }
             switch (alt29) {
                 case 1 :
-                    // InternalOCLinEcore.g:4296:1: ( ( rule__PackageCS__Group_4_0__0 ) )
+                    // InternalOCLinEcore.g:4298:1: ( ( rule__PackageCS__Group_4_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4296:1: ( ( rule__PackageCS__Group_4_0__0 ) )
-                    // InternalOCLinEcore.g:4297:1: ( rule__PackageCS__Group_4_0__0 )
+                    // InternalOCLinEcore.g:4298:1: ( ( rule__PackageCS__Group_4_0__0 ) )
+                    // InternalOCLinEcore.g:4299:1: ( rule__PackageCS__Group_4_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getGroup_4_0());
                     }
-                    // InternalOCLinEcore.g:4298:1: ( rule__PackageCS__Group_4_0__0 )
-                    // InternalOCLinEcore.g:4298:2: rule__PackageCS__Group_4_0__0
+                    // InternalOCLinEcore.g:4300:1: ( rule__PackageCS__Group_4_0__0 )
+                    // InternalOCLinEcore.g:4300:2: rule__PackageCS__Group_4_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__Group_4_0__0();
@@ -14169,10 +14169,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4302:6: ( ';' )
+                    // InternalOCLinEcore.g:4304:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:4302:6: ( ';' )
-                    // InternalOCLinEcore.g:4303:1: ';'
+                    // InternalOCLinEcore.g:4304:6: ( ';' )
+                    // InternalOCLinEcore.g:4305:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getSemicolonKeyword_4_1());
@@ -14205,13 +14205,13 @@
 
 
     // $ANTLR start "rule__PackageCS__Alternatives_4_0_1"
-    // InternalOCLinEcore.g:4315:1: rule__PackageCS__Alternatives_4_0_1 : ( ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) ) );
+    // InternalOCLinEcore.g:4317:1: rule__PackageCS__Alternatives_4_0_1 : ( ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) ) );
     public final void rule__PackageCS__Alternatives_4_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4319:1: ( ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) ) )
+            // InternalOCLinEcore.g:4321:1: ( ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) ) | ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) ) )
             int alt30=3;
             switch ( input.LA(1) ) {
             case 54:
@@ -14245,16 +14245,16 @@
 
             switch (alt30) {
                 case 1 :
-                    // InternalOCLinEcore.g:4320:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
+                    // InternalOCLinEcore.g:4322:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:4320:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
-                    // InternalOCLinEcore.g:4321:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
+                    // InternalOCLinEcore.g:4322:1: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 ) )
+                    // InternalOCLinEcore.g:4323:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAssignment_4_0_1_0());
                     }
-                    // InternalOCLinEcore.g:4322:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
-                    // InternalOCLinEcore.g:4322:2: rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0
+                    // InternalOCLinEcore.g:4324:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 )
+                    // InternalOCLinEcore.g:4324:2: rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0();
@@ -14274,16 +14274,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4326:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
+                    // InternalOCLinEcore.g:4328:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
                     {
-                    // InternalOCLinEcore.g:4326:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
-                    // InternalOCLinEcore.g:4327:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
+                    // InternalOCLinEcore.g:4328:6: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 ) )
+                    // InternalOCLinEcore.g:4329:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getOwnedPackagesAssignment_4_0_1_1());
                     }
-                    // InternalOCLinEcore.g:4328:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
-                    // InternalOCLinEcore.g:4328:2: rule__PackageCS__OwnedPackagesAssignment_4_0_1_1
+                    // InternalOCLinEcore.g:4330:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 )
+                    // InternalOCLinEcore.g:4330:2: rule__PackageCS__OwnedPackagesAssignment_4_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__OwnedPackagesAssignment_4_0_1_1();
@@ -14303,16 +14303,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4332:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
+                    // InternalOCLinEcore.g:4334:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
                     {
-                    // InternalOCLinEcore.g:4332:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
-                    // InternalOCLinEcore.g:4333:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
+                    // InternalOCLinEcore.g:4334:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 ) )
+                    // InternalOCLinEcore.g:4335:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getOwnedClassesAssignment_4_0_1_2());
                     }
-                    // InternalOCLinEcore.g:4334:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
-                    // InternalOCLinEcore.g:4334:2: rule__PackageCS__OwnedClassesAssignment_4_0_1_2
+                    // InternalOCLinEcore.g:4336:1: ( rule__PackageCS__OwnedClassesAssignment_4_0_1_2 )
+                    // InternalOCLinEcore.g:4336:2: rule__PackageCS__OwnedClassesAssignment_4_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__OwnedClassesAssignment_4_0_1_2();
@@ -14349,13 +14349,13 @@
 
 
     // $ANTLR start "rule__ParameterCS__Alternatives_2_1_0"
-    // InternalOCLinEcore.g:4343:1: rule__ParameterCS__Alternatives_2_1_0 : ( ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) ) );
+    // InternalOCLinEcore.g:4345:1: rule__ParameterCS__Alternatives_2_1_0 : ( ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) ) );
     public final void rule__ParameterCS__Alternatives_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4347:1: ( ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) ) )
+            // InternalOCLinEcore.g:4349:1: ( ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) ) | ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) ) )
             int alt31=4;
             switch ( input.LA(1) ) {
             case 37:
@@ -14388,16 +14388,16 @@
 
             switch (alt31) {
                 case 1 :
-                    // InternalOCLinEcore.g:4348:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
+                    // InternalOCLinEcore.g:4350:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
                     {
-                    // InternalOCLinEcore.g:4348:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
-                    // InternalOCLinEcore.g:4349:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
+                    // InternalOCLinEcore.g:4350:1: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 ) )
+                    // InternalOCLinEcore.g:4351:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_0());
                     }
-                    // InternalOCLinEcore.g:4350:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
-                    // InternalOCLinEcore.g:4350:2: rule__ParameterCS__QualifiersAssignment_2_1_0_0
+                    // InternalOCLinEcore.g:4352:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_0 )
+                    // InternalOCLinEcore.g:4352:2: rule__ParameterCS__QualifiersAssignment_2_1_0_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__QualifiersAssignment_2_1_0_0();
@@ -14417,16 +14417,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4354:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
+                    // InternalOCLinEcore.g:4356:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
                     {
-                    // InternalOCLinEcore.g:4354:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
-                    // InternalOCLinEcore.g:4355:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
+                    // InternalOCLinEcore.g:4356:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 ) )
+                    // InternalOCLinEcore.g:4357:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_1());
                     }
-                    // InternalOCLinEcore.g:4356:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
-                    // InternalOCLinEcore.g:4356:2: rule__ParameterCS__QualifiersAssignment_2_1_0_1
+                    // InternalOCLinEcore.g:4358:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_1 )
+                    // InternalOCLinEcore.g:4358:2: rule__ParameterCS__QualifiersAssignment_2_1_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__QualifiersAssignment_2_1_0_1();
@@ -14446,16 +14446,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4360:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
+                    // InternalOCLinEcore.g:4362:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
                     {
-                    // InternalOCLinEcore.g:4360:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
-                    // InternalOCLinEcore.g:4361:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
+                    // InternalOCLinEcore.g:4362:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 ) )
+                    // InternalOCLinEcore.g:4363:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_2());
                     }
-                    // InternalOCLinEcore.g:4362:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
-                    // InternalOCLinEcore.g:4362:2: rule__ParameterCS__QualifiersAssignment_2_1_0_2
+                    // InternalOCLinEcore.g:4364:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_2 )
+                    // InternalOCLinEcore.g:4364:2: rule__ParameterCS__QualifiersAssignment_2_1_0_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__QualifiersAssignment_2_1_0_2();
@@ -14475,16 +14475,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4366:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
+                    // InternalOCLinEcore.g:4368:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
                     {
-                    // InternalOCLinEcore.g:4366:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
-                    // InternalOCLinEcore.g:4367:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
+                    // InternalOCLinEcore.g:4368:6: ( ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 ) )
+                    // InternalOCLinEcore.g:4369:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getParameterCSAccess().getQualifiersAssignment_2_1_0_3());
                     }
-                    // InternalOCLinEcore.g:4368:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
-                    // InternalOCLinEcore.g:4368:2: rule__ParameterCS__QualifiersAssignment_2_1_0_3
+                    // InternalOCLinEcore.g:4370:1: ( rule__ParameterCS__QualifiersAssignment_2_1_0_3 )
+                    // InternalOCLinEcore.g:4370:2: rule__ParameterCS__QualifiersAssignment_2_1_0_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__QualifiersAssignment_2_1_0_3();
@@ -14521,13 +14521,13 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Alternatives_4_1_0"
-    // InternalOCLinEcore.g:4377:1: rule__ImplicitOppositeCS__Alternatives_4_1_0 : ( ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) ) );
+    // InternalOCLinEcore.g:4379:1: rule__ImplicitOppositeCS__Alternatives_4_1_0 : ( ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) ) );
     public final void rule__ImplicitOppositeCS__Alternatives_4_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4381:1: ( ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) ) )
+            // InternalOCLinEcore.g:4383:1: ( ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) ) | ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) ) )
             int alt32=4;
             switch ( input.LA(1) ) {
             case 37:
@@ -14560,16 +14560,16 @@
 
             switch (alt32) {
                 case 1 :
-                    // InternalOCLinEcore.g:4382:1: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) )
+                    // InternalOCLinEcore.g:4384:1: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) )
                     {
-                    // InternalOCLinEcore.g:4382:1: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) )
-                    // InternalOCLinEcore.g:4383:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 )
+                    // InternalOCLinEcore.g:4384:1: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 ) )
+                    // InternalOCLinEcore.g:4385:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_0());
                     }
-                    // InternalOCLinEcore.g:4384:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 )
-                    // InternalOCLinEcore.g:4384:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0
+                    // InternalOCLinEcore.g:4386:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 )
+                    // InternalOCLinEcore.g:4386:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0();
@@ -14589,16 +14589,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4388:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) )
+                    // InternalOCLinEcore.g:4390:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) )
                     {
-                    // InternalOCLinEcore.g:4388:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) )
-                    // InternalOCLinEcore.g:4389:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 )
+                    // InternalOCLinEcore.g:4390:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 ) )
+                    // InternalOCLinEcore.g:4391:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_1());
                     }
-                    // InternalOCLinEcore.g:4390:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 )
-                    // InternalOCLinEcore.g:4390:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1
+                    // InternalOCLinEcore.g:4392:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 )
+                    // InternalOCLinEcore.g:4392:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1();
@@ -14618,16 +14618,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4394:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) )
+                    // InternalOCLinEcore.g:4396:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) )
                     {
-                    // InternalOCLinEcore.g:4394:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) )
-                    // InternalOCLinEcore.g:4395:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 )
+                    // InternalOCLinEcore.g:4396:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 ) )
+                    // InternalOCLinEcore.g:4397:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_2());
                     }
-                    // InternalOCLinEcore.g:4396:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 )
-                    // InternalOCLinEcore.g:4396:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2
+                    // InternalOCLinEcore.g:4398:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 )
+                    // InternalOCLinEcore.g:4398:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2();
@@ -14647,16 +14647,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4400:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) )
+                    // InternalOCLinEcore.g:4402:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) )
                     {
-                    // InternalOCLinEcore.g:4400:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) )
-                    // InternalOCLinEcore.g:4401:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 )
+                    // InternalOCLinEcore.g:4402:6: ( ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 ) )
+                    // InternalOCLinEcore.g:4403:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersAssignment_4_1_0_3());
                     }
-                    // InternalOCLinEcore.g:4402:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 )
-                    // InternalOCLinEcore.g:4402:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3
+                    // InternalOCLinEcore.g:4404:1: ( rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 )
+                    // InternalOCLinEcore.g:4404:2: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3();
@@ -14693,13 +14693,13 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Alternatives_0"
-    // InternalOCLinEcore.g:4411:1: rule__ReferenceCS__Alternatives_0 : ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) );
+    // InternalOCLinEcore.g:4413:1: rule__ReferenceCS__Alternatives_0 : ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) );
     public final void rule__ReferenceCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4415:1: ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) )
+            // InternalOCLinEcore.g:4417:1: ( ( ( rule__ReferenceCS__Group_0_0__0 ) ) | ( ( rule__ReferenceCS__Group_0_1__0 ) ) )
             int alt33=2;
             int LA33_0 = input.LA(1);
 
@@ -14718,16 +14718,16 @@
             }
             switch (alt33) {
                 case 1 :
-                    // InternalOCLinEcore.g:4416:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:4418:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4416:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
-                    // InternalOCLinEcore.g:4417:1: ( rule__ReferenceCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:4418:1: ( ( rule__ReferenceCS__Group_0_0__0 ) )
+                    // InternalOCLinEcore.g:4419:1: ( rule__ReferenceCS__Group_0_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_0_0());
                     }
-                    // InternalOCLinEcore.g:4418:1: ( rule__ReferenceCS__Group_0_0__0 )
-                    // InternalOCLinEcore.g:4418:2: rule__ReferenceCS__Group_0_0__0
+                    // InternalOCLinEcore.g:4420:1: ( rule__ReferenceCS__Group_0_0__0 )
+                    // InternalOCLinEcore.g:4420:2: rule__ReferenceCS__Group_0_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_0_0__0();
@@ -14747,16 +14747,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4422:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
+                    // InternalOCLinEcore.g:4424:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:4422:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
-                    // InternalOCLinEcore.g:4423:1: ( rule__ReferenceCS__Group_0_1__0 )
+                    // InternalOCLinEcore.g:4424:6: ( ( rule__ReferenceCS__Group_0_1__0 ) )
+                    // InternalOCLinEcore.g:4425:1: ( rule__ReferenceCS__Group_0_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_0_1());
                     }
-                    // InternalOCLinEcore.g:4424:1: ( rule__ReferenceCS__Group_0_1__0 )
-                    // InternalOCLinEcore.g:4424:2: rule__ReferenceCS__Group_0_1__0
+                    // InternalOCLinEcore.g:4426:1: ( rule__ReferenceCS__Group_0_1__0 )
+                    // InternalOCLinEcore.g:4426:2: rule__ReferenceCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_0_1__0();
@@ -14793,13 +14793,13 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Alternatives_6_1_0"
-    // InternalOCLinEcore.g:4433:1: rule__ReferenceCS__Alternatives_6_1_0 : ( ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) ) );
+    // InternalOCLinEcore.g:4435:1: rule__ReferenceCS__Alternatives_6_1_0 : ( ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) ) );
     public final void rule__ReferenceCS__Alternatives_6_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4437:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) ) )
+            // InternalOCLinEcore.g:4439:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) ) | ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) ) )
             int alt34=18;
             switch ( input.LA(1) ) {
             case 22:
@@ -14902,16 +14902,16 @@
 
             switch (alt34) {
                 case 1 :
-                    // InternalOCLinEcore.g:4438:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
+                    // InternalOCLinEcore.g:4440:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
                     {
-                    // InternalOCLinEcore.g:4438:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
-                    // InternalOCLinEcore.g:4439:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
+                    // InternalOCLinEcore.g:4440:1: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 ) )
+                    // InternalOCLinEcore.g:4441:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_0());
                     }
-                    // InternalOCLinEcore.g:4440:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
-                    // InternalOCLinEcore.g:4440:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_0
+                    // InternalOCLinEcore.g:4442:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_0 )
+                    // InternalOCLinEcore.g:4442:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_0();
@@ -14931,16 +14931,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4444:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
+                    // InternalOCLinEcore.g:4446:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
                     {
-                    // InternalOCLinEcore.g:4444:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
-                    // InternalOCLinEcore.g:4445:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
+                    // InternalOCLinEcore.g:4446:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 ) )
+                    // InternalOCLinEcore.g:4447:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_1());
                     }
-                    // InternalOCLinEcore.g:4446:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
-                    // InternalOCLinEcore.g:4446:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_1
+                    // InternalOCLinEcore.g:4448:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_1 )
+                    // InternalOCLinEcore.g:4448:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_1();
@@ -14960,16 +14960,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4450:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
+                    // InternalOCLinEcore.g:4452:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
                     {
-                    // InternalOCLinEcore.g:4450:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
-                    // InternalOCLinEcore.g:4451:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
+                    // InternalOCLinEcore.g:4452:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 ) )
+                    // InternalOCLinEcore.g:4453:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_2());
                     }
-                    // InternalOCLinEcore.g:4452:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
-                    // InternalOCLinEcore.g:4452:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_2
+                    // InternalOCLinEcore.g:4454:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_2 )
+                    // InternalOCLinEcore.g:4454:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_2();
@@ -14989,16 +14989,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4456:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
+                    // InternalOCLinEcore.g:4458:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
                     {
-                    // InternalOCLinEcore.g:4456:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
-                    // InternalOCLinEcore.g:4457:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
+                    // InternalOCLinEcore.g:4458:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 ) )
+                    // InternalOCLinEcore.g:4459:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_3());
                     }
-                    // InternalOCLinEcore.g:4458:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
-                    // InternalOCLinEcore.g:4458:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_3
+                    // InternalOCLinEcore.g:4460:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_3 )
+                    // InternalOCLinEcore.g:4460:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_3();
@@ -15018,16 +15018,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:4462:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
+                    // InternalOCLinEcore.g:4464:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
                     {
-                    // InternalOCLinEcore.g:4462:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
-                    // InternalOCLinEcore.g:4463:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
+                    // InternalOCLinEcore.g:4464:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 ) )
+                    // InternalOCLinEcore.g:4465:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_4());
                     }
-                    // InternalOCLinEcore.g:4464:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
-                    // InternalOCLinEcore.g:4464:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_4
+                    // InternalOCLinEcore.g:4466:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_4 )
+                    // InternalOCLinEcore.g:4466:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_4
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_4();
@@ -15047,16 +15047,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:4468:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
+                    // InternalOCLinEcore.g:4470:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
                     {
-                    // InternalOCLinEcore.g:4468:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
-                    // InternalOCLinEcore.g:4469:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
+                    // InternalOCLinEcore.g:4470:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 ) )
+                    // InternalOCLinEcore.g:4471:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_5());
                     }
-                    // InternalOCLinEcore.g:4470:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
-                    // InternalOCLinEcore.g:4470:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_5
+                    // InternalOCLinEcore.g:4472:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_5 )
+                    // InternalOCLinEcore.g:4472:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_5
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_5();
@@ -15076,16 +15076,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:4474:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
+                    // InternalOCLinEcore.g:4476:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
                     {
-                    // InternalOCLinEcore.g:4474:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
-                    // InternalOCLinEcore.g:4475:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
+                    // InternalOCLinEcore.g:4476:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 ) )
+                    // InternalOCLinEcore.g:4477:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_6());
                     }
-                    // InternalOCLinEcore.g:4476:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
-                    // InternalOCLinEcore.g:4476:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_6
+                    // InternalOCLinEcore.g:4478:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_6 )
+                    // InternalOCLinEcore.g:4478:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_6
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_6();
@@ -15105,16 +15105,16 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:4480:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
+                    // InternalOCLinEcore.g:4482:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
                     {
-                    // InternalOCLinEcore.g:4480:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
-                    // InternalOCLinEcore.g:4481:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
+                    // InternalOCLinEcore.g:4482:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 ) )
+                    // InternalOCLinEcore.g:4483:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_7());
                     }
-                    // InternalOCLinEcore.g:4482:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
-                    // InternalOCLinEcore.g:4482:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_7
+                    // InternalOCLinEcore.g:4484:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_7 )
+                    // InternalOCLinEcore.g:4484:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_7
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_7();
@@ -15134,16 +15134,16 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLinEcore.g:4486:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
+                    // InternalOCLinEcore.g:4488:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
                     {
-                    // InternalOCLinEcore.g:4486:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
-                    // InternalOCLinEcore.g:4487:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
+                    // InternalOCLinEcore.g:4488:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 ) )
+                    // InternalOCLinEcore.g:4489:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_8());
                     }
-                    // InternalOCLinEcore.g:4488:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
-                    // InternalOCLinEcore.g:4488:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_8
+                    // InternalOCLinEcore.g:4490:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_8 )
+                    // InternalOCLinEcore.g:4490:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_8
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_8();
@@ -15163,16 +15163,16 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLinEcore.g:4492:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
+                    // InternalOCLinEcore.g:4494:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
                     {
-                    // InternalOCLinEcore.g:4492:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
-                    // InternalOCLinEcore.g:4493:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
+                    // InternalOCLinEcore.g:4494:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 ) )
+                    // InternalOCLinEcore.g:4495:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_9());
                     }
-                    // InternalOCLinEcore.g:4494:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
-                    // InternalOCLinEcore.g:4494:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_9
+                    // InternalOCLinEcore.g:4496:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_9 )
+                    // InternalOCLinEcore.g:4496:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_9
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_9();
@@ -15192,16 +15192,16 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLinEcore.g:4498:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
+                    // InternalOCLinEcore.g:4500:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
                     {
-                    // InternalOCLinEcore.g:4498:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
-                    // InternalOCLinEcore.g:4499:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
+                    // InternalOCLinEcore.g:4500:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 ) )
+                    // InternalOCLinEcore.g:4501:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_10());
                     }
-                    // InternalOCLinEcore.g:4500:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
-                    // InternalOCLinEcore.g:4500:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_10
+                    // InternalOCLinEcore.g:4502:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_10 )
+                    // InternalOCLinEcore.g:4502:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_10
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_10();
@@ -15221,16 +15221,16 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLinEcore.g:4504:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
+                    // InternalOCLinEcore.g:4506:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
                     {
-                    // InternalOCLinEcore.g:4504:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
-                    // InternalOCLinEcore.g:4505:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
+                    // InternalOCLinEcore.g:4506:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 ) )
+                    // InternalOCLinEcore.g:4507:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_11());
                     }
-                    // InternalOCLinEcore.g:4506:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
-                    // InternalOCLinEcore.g:4506:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_11
+                    // InternalOCLinEcore.g:4508:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_11 )
+                    // InternalOCLinEcore.g:4508:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_11
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_11();
@@ -15250,16 +15250,16 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLinEcore.g:4510:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
+                    // InternalOCLinEcore.g:4512:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
                     {
-                    // InternalOCLinEcore.g:4510:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
-                    // InternalOCLinEcore.g:4511:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
+                    // InternalOCLinEcore.g:4512:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 ) )
+                    // InternalOCLinEcore.g:4513:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_12());
                     }
-                    // InternalOCLinEcore.g:4512:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
-                    // InternalOCLinEcore.g:4512:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_12
+                    // InternalOCLinEcore.g:4514:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_12 )
+                    // InternalOCLinEcore.g:4514:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_12
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_12();
@@ -15279,16 +15279,16 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLinEcore.g:4516:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
+                    // InternalOCLinEcore.g:4518:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
                     {
-                    // InternalOCLinEcore.g:4516:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
-                    // InternalOCLinEcore.g:4517:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
+                    // InternalOCLinEcore.g:4518:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 ) )
+                    // InternalOCLinEcore.g:4519:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_13());
                     }
-                    // InternalOCLinEcore.g:4518:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
-                    // InternalOCLinEcore.g:4518:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_13
+                    // InternalOCLinEcore.g:4520:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_13 )
+                    // InternalOCLinEcore.g:4520:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_13
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_13();
@@ -15308,16 +15308,16 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLinEcore.g:4522:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
+                    // InternalOCLinEcore.g:4524:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
                     {
-                    // InternalOCLinEcore.g:4522:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
-                    // InternalOCLinEcore.g:4523:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
+                    // InternalOCLinEcore.g:4524:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 ) )
+                    // InternalOCLinEcore.g:4525:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_14());
                     }
-                    // InternalOCLinEcore.g:4524:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
-                    // InternalOCLinEcore.g:4524:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_14
+                    // InternalOCLinEcore.g:4526:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_14 )
+                    // InternalOCLinEcore.g:4526:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_14
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_14();
@@ -15337,16 +15337,16 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLinEcore.g:4528:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
+                    // InternalOCLinEcore.g:4530:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
                     {
-                    // InternalOCLinEcore.g:4528:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
-                    // InternalOCLinEcore.g:4529:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
+                    // InternalOCLinEcore.g:4530:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 ) )
+                    // InternalOCLinEcore.g:4531:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_15());
                     }
-                    // InternalOCLinEcore.g:4530:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
-                    // InternalOCLinEcore.g:4530:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_15
+                    // InternalOCLinEcore.g:4532:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_15 )
+                    // InternalOCLinEcore.g:4532:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_15
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_15();
@@ -15366,16 +15366,16 @@
                     }
                     break;
                 case 17 :
-                    // InternalOCLinEcore.g:4534:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
+                    // InternalOCLinEcore.g:4536:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
                     {
-                    // InternalOCLinEcore.g:4534:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
-                    // InternalOCLinEcore.g:4535:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
+                    // InternalOCLinEcore.g:4536:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 ) )
+                    // InternalOCLinEcore.g:4537:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_16());
                     }
-                    // InternalOCLinEcore.g:4536:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
-                    // InternalOCLinEcore.g:4536:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_16
+                    // InternalOCLinEcore.g:4538:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_16 )
+                    // InternalOCLinEcore.g:4538:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_16
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_16();
@@ -15395,16 +15395,16 @@
                     }
                     break;
                 case 18 :
-                    // InternalOCLinEcore.g:4540:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
+                    // InternalOCLinEcore.g:4542:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
                     {
-                    // InternalOCLinEcore.g:4540:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
-                    // InternalOCLinEcore.g:4541:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
+                    // InternalOCLinEcore.g:4542:6: ( ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 ) )
+                    // InternalOCLinEcore.g:4543:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_6_1_0_17());
                     }
-                    // InternalOCLinEcore.g:4542:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
-                    // InternalOCLinEcore.g:4542:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_17
+                    // InternalOCLinEcore.g:4544:1: ( rule__ReferenceCS__QualifiersAssignment_6_1_0_17 )
+                    // InternalOCLinEcore.g:4544:2: rule__ReferenceCS__QualifiersAssignment_6_1_0_17
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_6_1_0_17();
@@ -15441,13 +15441,13 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Alternatives_7"
-    // InternalOCLinEcore.g:4551:1: rule__ReferenceCS__Alternatives_7 : ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:4553:1: rule__ReferenceCS__Alternatives_7 : ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) );
     public final void rule__ReferenceCS__Alternatives_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4555:1: ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:4557:1: ( ( ( rule__ReferenceCS__Group_7_0__0 ) ) | ( ';' ) )
             int alt35=2;
             int LA35_0 = input.LA(1);
 
@@ -15466,16 +15466,16 @@
             }
             switch (alt35) {
                 case 1 :
-                    // InternalOCLinEcore.g:4556:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
+                    // InternalOCLinEcore.g:4558:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4556:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
-                    // InternalOCLinEcore.g:4557:1: ( rule__ReferenceCS__Group_7_0__0 )
+                    // InternalOCLinEcore.g:4558:1: ( ( rule__ReferenceCS__Group_7_0__0 ) )
+                    // InternalOCLinEcore.g:4559:1: ( rule__ReferenceCS__Group_7_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_7_0());
                     }
-                    // InternalOCLinEcore.g:4558:1: ( rule__ReferenceCS__Group_7_0__0 )
-                    // InternalOCLinEcore.g:4558:2: rule__ReferenceCS__Group_7_0__0
+                    // InternalOCLinEcore.g:4560:1: ( rule__ReferenceCS__Group_7_0__0 )
+                    // InternalOCLinEcore.g:4560:2: rule__ReferenceCS__Group_7_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_7_0__0();
@@ -15495,10 +15495,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4562:6: ( ';' )
+                    // InternalOCLinEcore.g:4564:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:4562:6: ( ';' )
-                    // InternalOCLinEcore.g:4563:1: ';'
+                    // InternalOCLinEcore.g:4564:6: ( ';' )
+                    // InternalOCLinEcore.g:4565:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_1());
@@ -15531,13 +15531,13 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Alternatives_7_0_1"
-    // InternalOCLinEcore.g:4575:1: rule__ReferenceCS__Alternatives_7_0_1 : ( ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) ) );
+    // InternalOCLinEcore.g:4577:1: rule__ReferenceCS__Alternatives_7_0_1 : ( ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) ) );
     public final void rule__ReferenceCS__Alternatives_7_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4579:1: ( ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) ) )
+            // InternalOCLinEcore.g:4581:1: ( ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) ) | ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) ) )
             int alt36=5;
             switch ( input.LA(1) ) {
             case 54:
@@ -15577,16 +15577,16 @@
 
             switch (alt36) {
                 case 1 :
-                    // InternalOCLinEcore.g:4580:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
+                    // InternalOCLinEcore.g:4582:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:4580:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
-                    // InternalOCLinEcore.g:4581:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
+                    // InternalOCLinEcore.g:4582:1: ( ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
+                    // InternalOCLinEcore.g:4583:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                     }
-                    // InternalOCLinEcore.g:4582:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
-                    // InternalOCLinEcore.g:4582:2: rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0
+                    // InternalOCLinEcore.g:4584:1: ( rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 )
+                    // InternalOCLinEcore.g:4584:2: rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0();
@@ -15606,16 +15606,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4586:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
+                    // InternalOCLinEcore.g:4588:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:4586:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
-                    // InternalOCLinEcore.g:4587:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
+                    // InternalOCLinEcore.g:4588:6: ( ( rule__ReferenceCS__Group_7_0_1_1__0 ) )
+                    // InternalOCLinEcore.g:4589:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1());
                     }
-                    // InternalOCLinEcore.g:4588:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
-                    // InternalOCLinEcore.g:4588:2: rule__ReferenceCS__Group_7_0_1_1__0
+                    // InternalOCLinEcore.g:4590:1: ( rule__ReferenceCS__Group_7_0_1_1__0 )
+                    // InternalOCLinEcore.g:4590:2: rule__ReferenceCS__Group_7_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_7_0_1_1__0();
@@ -15635,16 +15635,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4592:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:4594:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
                     {
-                    // InternalOCLinEcore.g:4592:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
-                    // InternalOCLinEcore.g:4593:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
+                    // InternalOCLinEcore.g:4594:6: ( ( rule__ReferenceCS__Group_7_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:4595:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_2());
                     }
-                    // InternalOCLinEcore.g:4594:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
-                    // InternalOCLinEcore.g:4594:2: rule__ReferenceCS__Group_7_0_1_2__0
+                    // InternalOCLinEcore.g:4596:1: ( rule__ReferenceCS__Group_7_0_1_2__0 )
+                    // InternalOCLinEcore.g:4596:2: rule__ReferenceCS__Group_7_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_7_0_1_2__0();
@@ -15664,16 +15664,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4598:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
+                    // InternalOCLinEcore.g:4600:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
                     {
-                    // InternalOCLinEcore.g:4598:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
-                    // InternalOCLinEcore.g:4599:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
+                    // InternalOCLinEcore.g:4600:6: ( ( rule__ReferenceCS__Group_7_0_1_3__0 ) )
+                    // InternalOCLinEcore.g:4601:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_3());
                     }
-                    // InternalOCLinEcore.g:4600:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
-                    // InternalOCLinEcore.g:4600:2: rule__ReferenceCS__Group_7_0_1_3__0
+                    // InternalOCLinEcore.g:4602:1: ( rule__ReferenceCS__Group_7_0_1_3__0 )
+                    // InternalOCLinEcore.g:4602:2: rule__ReferenceCS__Group_7_0_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_7_0_1_3__0();
@@ -15693,16 +15693,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:4604:6: ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) )
+                    // InternalOCLinEcore.g:4606:6: ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) )
                     {
-                    // InternalOCLinEcore.g:4604:6: ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) )
-                    // InternalOCLinEcore.g:4605:1: ( rule__ReferenceCS__Group_7_0_1_4__0 )
+                    // InternalOCLinEcore.g:4606:6: ( ( rule__ReferenceCS__Group_7_0_1_4__0 ) )
+                    // InternalOCLinEcore.g:4607:1: ( rule__ReferenceCS__Group_7_0_1_4__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_4());
                     }
-                    // InternalOCLinEcore.g:4606:1: ( rule__ReferenceCS__Group_7_0_1_4__0 )
-                    // InternalOCLinEcore.g:4606:2: rule__ReferenceCS__Group_7_0_1_4__0
+                    // InternalOCLinEcore.g:4608:1: ( rule__ReferenceCS__Group_7_0_1_4__0 )
+                    // InternalOCLinEcore.g:4608:2: rule__ReferenceCS__Group_7_0_1_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_7_0_1_4__0();
@@ -15739,13 +15739,13 @@
 
 
     // $ANTLR start "rule__SpecificationCS__Alternatives"
-    // InternalOCLinEcore.g:4615:1: rule__SpecificationCS__Alternatives : ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) );
+    // InternalOCLinEcore.g:4617:1: rule__SpecificationCS__Alternatives : ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) );
     public final void rule__SpecificationCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4619:1: ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) )
+            // InternalOCLinEcore.g:4621:1: ( ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) ) | ( ( rule__SpecificationCS__ExprStringAssignment_1 ) ) )
             int alt37=2;
             int LA37_0 = input.LA(1);
 
@@ -15764,16 +15764,16 @@
             }
             switch (alt37) {
                 case 1 :
-                    // InternalOCLinEcore.g:4620:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
+                    // InternalOCLinEcore.g:4622:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
                     {
-                    // InternalOCLinEcore.g:4620:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
-                    // InternalOCLinEcore.g:4621:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
+                    // InternalOCLinEcore.g:4622:1: ( ( rule__SpecificationCS__OwnedExpressionAssignment_0 ) )
+                    // InternalOCLinEcore.g:4623:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionAssignment_0());
                     }
-                    // InternalOCLinEcore.g:4622:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
-                    // InternalOCLinEcore.g:4622:2: rule__SpecificationCS__OwnedExpressionAssignment_0
+                    // InternalOCLinEcore.g:4624:1: ( rule__SpecificationCS__OwnedExpressionAssignment_0 )
+                    // InternalOCLinEcore.g:4624:2: rule__SpecificationCS__OwnedExpressionAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__SpecificationCS__OwnedExpressionAssignment_0();
@@ -15793,16 +15793,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4626:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
+                    // InternalOCLinEcore.g:4628:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
                     {
-                    // InternalOCLinEcore.g:4626:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
-                    // InternalOCLinEcore.g:4627:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
+                    // InternalOCLinEcore.g:4628:6: ( ( rule__SpecificationCS__ExprStringAssignment_1 ) )
+                    // InternalOCLinEcore.g:4629:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSpecificationCSAccess().getExprStringAssignment_1());
                     }
-                    // InternalOCLinEcore.g:4628:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
-                    // InternalOCLinEcore.g:4628:2: rule__SpecificationCS__ExprStringAssignment_1
+                    // InternalOCLinEcore.g:4630:1: ( rule__SpecificationCS__ExprStringAssignment_1 )
+                    // InternalOCLinEcore.g:4630:2: rule__SpecificationCS__ExprStringAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__SpecificationCS__ExprStringAssignment_1();
@@ -15839,13 +15839,13 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Alternatives_7"
-    // InternalOCLinEcore.g:4637:1: rule__StructuredClassCS__Alternatives_7 : ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) );
+    // InternalOCLinEcore.g:4639:1: rule__StructuredClassCS__Alternatives_7 : ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) );
     public final void rule__StructuredClassCS__Alternatives_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4641:1: ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) )
+            // InternalOCLinEcore.g:4643:1: ( ( ( rule__StructuredClassCS__Group_7_0__0 ) ) | ( ';' ) )
             int alt38=2;
             int LA38_0 = input.LA(1);
 
@@ -15864,16 +15864,16 @@
             }
             switch (alt38) {
                 case 1 :
-                    // InternalOCLinEcore.g:4642:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
+                    // InternalOCLinEcore.g:4644:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4642:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
-                    // InternalOCLinEcore.g:4643:1: ( rule__StructuredClassCS__Group_7_0__0 )
+                    // InternalOCLinEcore.g:4644:1: ( ( rule__StructuredClassCS__Group_7_0__0 ) )
+                    // InternalOCLinEcore.g:4645:1: ( rule__StructuredClassCS__Group_7_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuredClassCSAccess().getGroup_7_0());
                     }
-                    // InternalOCLinEcore.g:4644:1: ( rule__StructuredClassCS__Group_7_0__0 )
-                    // InternalOCLinEcore.g:4644:2: rule__StructuredClassCS__Group_7_0__0
+                    // InternalOCLinEcore.g:4646:1: ( rule__StructuredClassCS__Group_7_0__0 )
+                    // InternalOCLinEcore.g:4646:2: rule__StructuredClassCS__Group_7_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__Group_7_0__0();
@@ -15893,10 +15893,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4648:6: ( ';' )
+                    // InternalOCLinEcore.g:4650:6: ( ';' )
                     {
-                    // InternalOCLinEcore.g:4648:6: ( ';' )
-                    // InternalOCLinEcore.g:4649:1: ';'
+                    // InternalOCLinEcore.g:4650:6: ( ';' )
+                    // InternalOCLinEcore.g:4651:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuredClassCSAccess().getSemicolonKeyword_7_1());
@@ -15929,13 +15929,13 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Alternatives_7_0_1"
-    // InternalOCLinEcore.g:4661:1: rule__StructuredClassCS__Alternatives_7_0_1 : ( ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) ) | ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) ) | ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) ) );
+    // InternalOCLinEcore.g:4663:1: rule__StructuredClassCS__Alternatives_7_0_1 : ( ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) ) | ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) ) | ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) ) );
     public final void rule__StructuredClassCS__Alternatives_7_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4665:1: ( ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) ) | ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) ) | ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) ) )
+            // InternalOCLinEcore.g:4667:1: ( ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) ) | ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) ) | ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) ) )
             int alt39=4;
             switch ( input.LA(1) ) {
             case 54:
@@ -16058,16 +16058,16 @@
 
             switch (alt39) {
                 case 1 :
-                    // InternalOCLinEcore.g:4666:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
+                    // InternalOCLinEcore.g:4668:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                     {
-                    // InternalOCLinEcore.g:4666:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
-                    // InternalOCLinEcore.g:4667:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
+                    // InternalOCLinEcore.g:4668:1: ( ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
+                    // InternalOCLinEcore.g:4669:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                     }
-                    // InternalOCLinEcore.g:4668:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
-                    // InternalOCLinEcore.g:4668:2: rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0
+                    // InternalOCLinEcore.g:4670:1: ( rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 )
+                    // InternalOCLinEcore.g:4670:2: rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0();
@@ -16087,16 +16087,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4672:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
+                    // InternalOCLinEcore.g:4674:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
                     {
-                    // InternalOCLinEcore.g:4672:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
-                    // InternalOCLinEcore.g:4673:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
+                    // InternalOCLinEcore.g:4674:6: ( ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 ) )
+                    // InternalOCLinEcore.g:4675:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsAssignment_7_0_1_1());
                     }
-                    // InternalOCLinEcore.g:4674:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
-                    // InternalOCLinEcore.g:4674:2: rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1
+                    // InternalOCLinEcore.g:4676:1: ( rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 )
+                    // InternalOCLinEcore.g:4676:2: rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1();
@@ -16116,16 +16116,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4678:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
+                    // InternalOCLinEcore.g:4680:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
                     {
-                    // InternalOCLinEcore.g:4678:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
-                    // InternalOCLinEcore.g:4679:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
+                    // InternalOCLinEcore.g:4680:6: ( ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 ) )
+                    // InternalOCLinEcore.g:4681:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesAssignment_7_0_1_2());
                     }
-                    // InternalOCLinEcore.g:4680:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
-                    // InternalOCLinEcore.g:4680:2: rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2
+                    // InternalOCLinEcore.g:4682:1: ( rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 )
+                    // InternalOCLinEcore.g:4682:2: rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2();
@@ -16145,16 +16145,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4684:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
+                    // InternalOCLinEcore.g:4686:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
                     {
-                    // InternalOCLinEcore.g:4684:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
-                    // InternalOCLinEcore.g:4685:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
+                    // InternalOCLinEcore.g:4686:6: ( ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 ) )
+                    // InternalOCLinEcore.g:4687:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsAssignment_7_0_1_3());
                     }
-                    // InternalOCLinEcore.g:4686:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
-                    // InternalOCLinEcore.g:4686:2: rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3
+                    // InternalOCLinEcore.g:4688:1: ( rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 )
+                    // InternalOCLinEcore.g:4688:2: rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3();
@@ -16191,13 +16191,13 @@
 
 
     // $ANTLR start "rule__StructuralFeatureCS__Alternatives"
-    // InternalOCLinEcore.g:4695:1: rule__StructuralFeatureCS__Alternatives : ( ( ruleAttributeCS ) | ( ruleReferenceCS ) );
+    // InternalOCLinEcore.g:4697:1: rule__StructuralFeatureCS__Alternatives : ( ( ruleAttributeCS ) | ( ruleReferenceCS ) );
     public final void rule__StructuralFeatureCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4699:1: ( ( ruleAttributeCS ) | ( ruleReferenceCS ) )
+            // InternalOCLinEcore.g:4701:1: ( ( ruleAttributeCS ) | ( ruleReferenceCS ) )
             int alt40=2;
             switch ( input.LA(1) ) {
             case 46:
@@ -16304,10 +16304,10 @@
 
             switch (alt40) {
                 case 1 :
-                    // InternalOCLinEcore.g:4700:1: ( ruleAttributeCS )
+                    // InternalOCLinEcore.g:4702:1: ( ruleAttributeCS )
                     {
-                    // InternalOCLinEcore.g:4700:1: ( ruleAttributeCS )
-                    // InternalOCLinEcore.g:4701:1: ruleAttributeCS
+                    // InternalOCLinEcore.g:4702:1: ( ruleAttributeCS )
+                    // InternalOCLinEcore.g:4703:1: ruleAttributeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuralFeatureCSAccess().getAttributeCSParserRuleCall_0());
@@ -16327,10 +16327,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4706:6: ( ruleReferenceCS )
+                    // InternalOCLinEcore.g:4708:6: ( ruleReferenceCS )
                     {
-                    // InternalOCLinEcore.g:4706:6: ( ruleReferenceCS )
-                    // InternalOCLinEcore.g:4707:1: ruleReferenceCS
+                    // InternalOCLinEcore.g:4708:6: ( ruleReferenceCS )
+                    // InternalOCLinEcore.g:4709:1: ruleReferenceCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getStructuralFeatureCSAccess().getReferenceCSParserRuleCall_1());
@@ -16367,13 +16367,13 @@
 
 
     // $ANTLR start "rule__SysMLCS__Alternatives_2"
-    // InternalOCLinEcore.g:4717:1: rule__SysMLCS__Alternatives_2 : ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) );
+    // InternalOCLinEcore.g:4719:1: rule__SysMLCS__Alternatives_2 : ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) );
     public final void rule__SysMLCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4721:1: ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) )
+            // InternalOCLinEcore.g:4723:1: ( ( ( rule__SysMLCS__Group_2_0__0 ) ) | ( ( rule__SysMLCS__Group_2_1__0 ) ) )
             int alt41=2;
             int LA41_0 = input.LA(1);
 
@@ -16392,16 +16392,16 @@
             }
             switch (alt41) {
                 case 1 :
-                    // InternalOCLinEcore.g:4722:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
+                    // InternalOCLinEcore.g:4724:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4722:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
-                    // InternalOCLinEcore.g:4723:1: ( rule__SysMLCS__Group_2_0__0 )
+                    // InternalOCLinEcore.g:4724:1: ( ( rule__SysMLCS__Group_2_0__0 ) )
+                    // InternalOCLinEcore.g:4725:1: ( rule__SysMLCS__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSysMLCSAccess().getGroup_2_0());
                     }
-                    // InternalOCLinEcore.g:4724:1: ( rule__SysMLCS__Group_2_0__0 )
-                    // InternalOCLinEcore.g:4724:2: rule__SysMLCS__Group_2_0__0
+                    // InternalOCLinEcore.g:4726:1: ( rule__SysMLCS__Group_2_0__0 )
+                    // InternalOCLinEcore.g:4726:2: rule__SysMLCS__Group_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__SysMLCS__Group_2_0__0();
@@ -16421,16 +16421,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4728:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
+                    // InternalOCLinEcore.g:4730:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:4728:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
-                    // InternalOCLinEcore.g:4729:1: ( rule__SysMLCS__Group_2_1__0 )
+                    // InternalOCLinEcore.g:4730:6: ( ( rule__SysMLCS__Group_2_1__0 ) )
+                    // InternalOCLinEcore.g:4731:1: ( rule__SysMLCS__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSysMLCSAccess().getGroup_2_1());
                     }
-                    // InternalOCLinEcore.g:4730:1: ( rule__SysMLCS__Group_2_1__0 )
-                    // InternalOCLinEcore.g:4730:2: rule__SysMLCS__Group_2_1__0
+                    // InternalOCLinEcore.g:4732:1: ( rule__SysMLCS__Group_2_1__0 )
+                    // InternalOCLinEcore.g:4732:2: rule__SysMLCS__Group_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__SysMLCS__Group_2_1__0();
@@ -16467,13 +16467,13 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Alternatives"
-    // InternalOCLinEcore.g:4740:1: rule__TemplateSignatureCS__Alternatives : ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) );
+    // InternalOCLinEcore.g:4742:1: rule__TemplateSignatureCS__Alternatives : ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) );
     public final void rule__TemplateSignatureCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4744:1: ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) )
+            // InternalOCLinEcore.g:4746:1: ( ( ( rule__TemplateSignatureCS__Group_0__0 ) ) | ( ( rule__TemplateSignatureCS__Group_1__0 ) ) )
             int alt42=2;
             int LA42_0 = input.LA(1);
 
@@ -16492,16 +16492,16 @@
             }
             switch (alt42) {
                 case 1 :
-                    // InternalOCLinEcore.g:4745:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:4747:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4745:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:4746:1: ( rule__TemplateSignatureCS__Group_0__0 )
+                    // InternalOCLinEcore.g:4747:1: ( ( rule__TemplateSignatureCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:4748:1: ( rule__TemplateSignatureCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:4747:1: ( rule__TemplateSignatureCS__Group_0__0 )
-                    // InternalOCLinEcore.g:4747:2: rule__TemplateSignatureCS__Group_0__0
+                    // InternalOCLinEcore.g:4749:1: ( rule__TemplateSignatureCS__Group_0__0 )
+                    // InternalOCLinEcore.g:4749:2: rule__TemplateSignatureCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateSignatureCS__Group_0__0();
@@ -16521,16 +16521,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4751:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
+                    // InternalOCLinEcore.g:4753:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:4751:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
-                    // InternalOCLinEcore.g:4752:1: ( rule__TemplateSignatureCS__Group_1__0 )
+                    // InternalOCLinEcore.g:4753:6: ( ( rule__TemplateSignatureCS__Group_1__0 ) )
+                    // InternalOCLinEcore.g:4754:1: ( rule__TemplateSignatureCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1());
                     }
-                    // InternalOCLinEcore.g:4753:1: ( rule__TemplateSignatureCS__Group_1__0 )
-                    // InternalOCLinEcore.g:4753:2: rule__TemplateSignatureCS__Group_1__0
+                    // InternalOCLinEcore.g:4755:1: ( rule__TemplateSignatureCS__Group_1__0 )
+                    // InternalOCLinEcore.g:4755:2: rule__TemplateSignatureCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateSignatureCS__Group_1__0();
@@ -16567,13 +16567,13 @@
 
 
     // $ANTLR start "rule__TypedRefCS__Alternatives"
-    // InternalOCLinEcore.g:4762:1: rule__TypedRefCS__Alternatives : ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) );
+    // InternalOCLinEcore.g:4764:1: rule__TypedRefCS__Alternatives : ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) );
     public final void rule__TypedRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4766:1: ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) )
+            // InternalOCLinEcore.g:4768:1: ( ( ruleTypeLiteralCS ) | ( ruleTypedTypeRefCS ) )
             int alt43=2;
             int LA43_0 = input.LA(1);
 
@@ -16592,10 +16592,10 @@
             }
             switch (alt43) {
                 case 1 :
-                    // InternalOCLinEcore.g:4767:1: ( ruleTypeLiteralCS )
+                    // InternalOCLinEcore.g:4769:1: ( ruleTypeLiteralCS )
                     {
-                    // InternalOCLinEcore.g:4767:1: ( ruleTypeLiteralCS )
-                    // InternalOCLinEcore.g:4768:1: ruleTypeLiteralCS
+                    // InternalOCLinEcore.g:4769:1: ( ruleTypeLiteralCS )
+                    // InternalOCLinEcore.g:4770:1: ruleTypeLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getTypeLiteralCSParserRuleCall_0());
@@ -16615,10 +16615,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4773:6: ( ruleTypedTypeRefCS )
+                    // InternalOCLinEcore.g:4775:6: ( ruleTypedTypeRefCS )
                     {
-                    // InternalOCLinEcore.g:4773:6: ( ruleTypedTypeRefCS )
-                    // InternalOCLinEcore.g:4774:1: ruleTypedTypeRefCS
+                    // InternalOCLinEcore.g:4775:6: ( ruleTypedTypeRefCS )
+                    // InternalOCLinEcore.g:4776:1: ruleTypedTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_1());
@@ -16655,13 +16655,13 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Alternatives_1"
-    // InternalOCLinEcore.g:4784:1: rule__TypedTypeRefCS__Alternatives_1 : ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) );
+    // InternalOCLinEcore.g:4786:1: rule__TypedTypeRefCS__Alternatives_1 : ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) );
     public final void rule__TypedTypeRefCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4788:1: ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) )
+            // InternalOCLinEcore.g:4790:1: ( ( ( rule__TypedTypeRefCS__Group_1_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1_1__0 ) ) )
             int alt44=2;
             int LA44_0 = input.LA(1);
 
@@ -16680,16 +16680,16 @@
             }
             switch (alt44) {
                 case 1 :
-                    // InternalOCLinEcore.g:4789:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
+                    // InternalOCLinEcore.g:4791:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:4789:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
-                    // InternalOCLinEcore.g:4790:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
+                    // InternalOCLinEcore.g:4791:1: ( ( rule__TypedTypeRefCS__Group_1_0__0 ) )
+                    // InternalOCLinEcore.g:4792:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_0());
                     }
-                    // InternalOCLinEcore.g:4791:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
-                    // InternalOCLinEcore.g:4791:2: rule__TypedTypeRefCS__Group_1_0__0
+                    // InternalOCLinEcore.g:4793:1: ( rule__TypedTypeRefCS__Group_1_0__0 )
+                    // InternalOCLinEcore.g:4793:2: rule__TypedTypeRefCS__Group_1_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1_0__0();
@@ -16709,16 +16709,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4795:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
+                    // InternalOCLinEcore.g:4797:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:4795:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
-                    // InternalOCLinEcore.g:4796:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
+                    // InternalOCLinEcore.g:4797:6: ( ( rule__TypedTypeRefCS__Group_1_1__0 ) )
+                    // InternalOCLinEcore.g:4798:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_1());
                     }
-                    // InternalOCLinEcore.g:4797:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
-                    // InternalOCLinEcore.g:4797:2: rule__TypedTypeRefCS__Group_1_1__0
+                    // InternalOCLinEcore.g:4799:1: ( rule__TypedTypeRefCS__Group_1_1__0 )
+                    // InternalOCLinEcore.g:4799:2: rule__TypedTypeRefCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1_1__0();
@@ -16755,13 +16755,13 @@
 
 
     // $ANTLR start "rule__UnrestrictedName__Alternatives"
-    // InternalOCLinEcore.g:4806:1: rule__UnrestrictedName__Alternatives : ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'opposite' ) | ( 'serializable' ) | ( 'sysml' ) );
+    // InternalOCLinEcore.g:4808:1: rule__UnrestrictedName__Alternatives : ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'opposite' ) | ( 'serializable' ) | ( 'sysml' ) );
     public final void rule__UnrestrictedName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4810:1: ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'opposite' ) | ( 'serializable' ) | ( 'sysml' ) )
+            // InternalOCLinEcore.g:4812:1: ( ( ruleEnumerationLiteralName ) | ( 'annotation' ) | ( 'documentation' ) | ( 'invariant' ) | ( 'literal' ) | ( 'opposite' ) | ( 'serializable' ) | ( 'sysml' ) )
             int alt45=8;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -16850,10 +16850,10 @@
 
             switch (alt45) {
                 case 1 :
-                    // InternalOCLinEcore.g:4811:1: ( ruleEnumerationLiteralName )
+                    // InternalOCLinEcore.g:4813:1: ( ruleEnumerationLiteralName )
                     {
-                    // InternalOCLinEcore.g:4811:1: ( ruleEnumerationLiteralName )
-                    // InternalOCLinEcore.g:4812:1: ruleEnumerationLiteralName
+                    // InternalOCLinEcore.g:4813:1: ( ruleEnumerationLiteralName )
+                    // InternalOCLinEcore.g:4814:1: ruleEnumerationLiteralName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getEnumerationLiteralNameParserRuleCall_0());
@@ -16873,10 +16873,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4817:6: ( 'annotation' )
+                    // InternalOCLinEcore.g:4819:6: ( 'annotation' )
                     {
-                    // InternalOCLinEcore.g:4817:6: ( 'annotation' )
-                    // InternalOCLinEcore.g:4818:1: 'annotation'
+                    // InternalOCLinEcore.g:4819:6: ( 'annotation' )
+                    // InternalOCLinEcore.g:4820:1: 'annotation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getAnnotationKeyword_1());
@@ -16892,10 +16892,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4825:6: ( 'documentation' )
+                    // InternalOCLinEcore.g:4827:6: ( 'documentation' )
                     {
-                    // InternalOCLinEcore.g:4825:6: ( 'documentation' )
-                    // InternalOCLinEcore.g:4826:1: 'documentation'
+                    // InternalOCLinEcore.g:4827:6: ( 'documentation' )
+                    // InternalOCLinEcore.g:4828:1: 'documentation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getDocumentationKeyword_2());
@@ -16911,10 +16911,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4833:6: ( 'invariant' )
+                    // InternalOCLinEcore.g:4835:6: ( 'invariant' )
                     {
-                    // InternalOCLinEcore.g:4833:6: ( 'invariant' )
-                    // InternalOCLinEcore.g:4834:1: 'invariant'
+                    // InternalOCLinEcore.g:4835:6: ( 'invariant' )
+                    // InternalOCLinEcore.g:4836:1: 'invariant'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getInvariantKeyword_3());
@@ -16930,10 +16930,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:4841:6: ( 'literal' )
+                    // InternalOCLinEcore.g:4843:6: ( 'literal' )
                     {
-                    // InternalOCLinEcore.g:4841:6: ( 'literal' )
-                    // InternalOCLinEcore.g:4842:1: 'literal'
+                    // InternalOCLinEcore.g:4843:6: ( 'literal' )
+                    // InternalOCLinEcore.g:4844:1: 'literal'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getLiteralKeyword_4());
@@ -16949,10 +16949,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:4849:6: ( 'opposite' )
+                    // InternalOCLinEcore.g:4851:6: ( 'opposite' )
                     {
-                    // InternalOCLinEcore.g:4849:6: ( 'opposite' )
-                    // InternalOCLinEcore.g:4850:1: 'opposite'
+                    // InternalOCLinEcore.g:4851:6: ( 'opposite' )
+                    // InternalOCLinEcore.g:4852:1: 'opposite'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getOppositeKeyword_5());
@@ -16968,10 +16968,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:4857:6: ( 'serializable' )
+                    // InternalOCLinEcore.g:4859:6: ( 'serializable' )
                     {
-                    // InternalOCLinEcore.g:4857:6: ( 'serializable' )
-                    // InternalOCLinEcore.g:4858:1: 'serializable'
+                    // InternalOCLinEcore.g:4859:6: ( 'serializable' )
+                    // InternalOCLinEcore.g:4860:1: 'serializable'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getSerializableKeyword_6());
@@ -16987,10 +16987,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:4865:6: ( 'sysml' )
+                    // InternalOCLinEcore.g:4867:6: ( 'sysml' )
                     {
-                    // InternalOCLinEcore.g:4865:6: ( 'sysml' )
-                    // InternalOCLinEcore.g:4866:1: 'sysml'
+                    // InternalOCLinEcore.g:4867:6: ( 'sysml' )
+                    // InternalOCLinEcore.g:4868:1: 'sysml'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUnrestrictedNameAccess().getSysmlKeyword_7());
@@ -17023,13 +17023,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnaryOperatorName__Alternatives"
-    // InternalOCLinEcore.g:4879:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
+    // InternalOCLinEcore.g:4881:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
     public final void rule__EssentialOCLUnaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4883:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
+            // InternalOCLinEcore.g:4885:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
             int alt46=3;
             switch ( input.LA(1) ) {
             case 61:
@@ -17057,10 +17057,10 @@
 
             switch (alt46) {
                 case 1 :
-                    // InternalOCLinEcore.g:4884:1: ( '-' )
+                    // InternalOCLinEcore.g:4886:1: ( '-' )
                     {
-                    // InternalOCLinEcore.g:4884:1: ( '-' )
-                    // InternalOCLinEcore.g:4885:1: '-'
+                    // InternalOCLinEcore.g:4886:1: ( '-' )
+                    // InternalOCLinEcore.g:4887:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
@@ -17076,10 +17076,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4892:6: ( 'not' )
+                    // InternalOCLinEcore.g:4894:6: ( 'not' )
                     {
-                    // InternalOCLinEcore.g:4892:6: ( 'not' )
-                    // InternalOCLinEcore.g:4893:1: 'not'
+                    // InternalOCLinEcore.g:4894:6: ( 'not' )
+                    // InternalOCLinEcore.g:4895:1: 'not'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
@@ -17095,10 +17095,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4900:6: ( 'not2' )
+                    // InternalOCLinEcore.g:4902:6: ( 'not2' )
                     {
-                    // InternalOCLinEcore.g:4900:6: ( 'not2' )
-                    // InternalOCLinEcore.g:4901:1: 'not2'
+                    // InternalOCLinEcore.g:4902:6: ( 'not2' )
+                    // InternalOCLinEcore.g:4903:1: 'not2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());
@@ -17131,13 +17131,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLInfixOperatorName__Alternatives"
-    // InternalOCLinEcore.g:4913:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
+    // InternalOCLinEcore.g:4915:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
     public final void rule__EssentialOCLInfixOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:4917:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
+            // InternalOCLinEcore.g:4919:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
             int alt47=18;
             switch ( input.LA(1) ) {
             case 64:
@@ -17240,10 +17240,10 @@
 
             switch (alt47) {
                 case 1 :
-                    // InternalOCLinEcore.g:4918:1: ( '*' )
+                    // InternalOCLinEcore.g:4920:1: ( '*' )
                     {
-                    // InternalOCLinEcore.g:4918:1: ( '*' )
-                    // InternalOCLinEcore.g:4919:1: '*'
+                    // InternalOCLinEcore.g:4920:1: ( '*' )
+                    // InternalOCLinEcore.g:4921:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
@@ -17259,10 +17259,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:4926:6: ( '/' )
+                    // InternalOCLinEcore.g:4928:6: ( '/' )
                     {
-                    // InternalOCLinEcore.g:4926:6: ( '/' )
-                    // InternalOCLinEcore.g:4927:1: '/'
+                    // InternalOCLinEcore.g:4928:6: ( '/' )
+                    // InternalOCLinEcore.g:4929:1: '/'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
@@ -17278,10 +17278,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:4934:6: ( '+' )
+                    // InternalOCLinEcore.g:4936:6: ( '+' )
                     {
-                    // InternalOCLinEcore.g:4934:6: ( '+' )
-                    // InternalOCLinEcore.g:4935:1: '+'
+                    // InternalOCLinEcore.g:4936:6: ( '+' )
+                    // InternalOCLinEcore.g:4937:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
@@ -17297,10 +17297,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:4942:6: ( '-' )
+                    // InternalOCLinEcore.g:4944:6: ( '-' )
                     {
-                    // InternalOCLinEcore.g:4942:6: ( '-' )
-                    // InternalOCLinEcore.g:4943:1: '-'
+                    // InternalOCLinEcore.g:4944:6: ( '-' )
+                    // InternalOCLinEcore.g:4945:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
@@ -17316,10 +17316,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:4950:6: ( '>' )
+                    // InternalOCLinEcore.g:4952:6: ( '>' )
                     {
-                    // InternalOCLinEcore.g:4950:6: ( '>' )
-                    // InternalOCLinEcore.g:4951:1: '>'
+                    // InternalOCLinEcore.g:4952:6: ( '>' )
+                    // InternalOCLinEcore.g:4953:1: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
@@ -17335,10 +17335,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:4958:6: ( '<' )
+                    // InternalOCLinEcore.g:4960:6: ( '<' )
                     {
-                    // InternalOCLinEcore.g:4958:6: ( '<' )
-                    // InternalOCLinEcore.g:4959:1: '<'
+                    // InternalOCLinEcore.g:4960:6: ( '<' )
+                    // InternalOCLinEcore.g:4961:1: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
@@ -17354,10 +17354,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:4966:6: ( '>=' )
+                    // InternalOCLinEcore.g:4968:6: ( '>=' )
                     {
-                    // InternalOCLinEcore.g:4966:6: ( '>=' )
-                    // InternalOCLinEcore.g:4967:1: '>='
+                    // InternalOCLinEcore.g:4968:6: ( '>=' )
+                    // InternalOCLinEcore.g:4969:1: '>='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
@@ -17373,10 +17373,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:4974:6: ( '<=' )
+                    // InternalOCLinEcore.g:4976:6: ( '<=' )
                     {
-                    // InternalOCLinEcore.g:4974:6: ( '<=' )
-                    // InternalOCLinEcore.g:4975:1: '<='
+                    // InternalOCLinEcore.g:4976:6: ( '<=' )
+                    // InternalOCLinEcore.g:4977:1: '<='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
@@ -17392,10 +17392,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLinEcore.g:4982:6: ( '=' )
+                    // InternalOCLinEcore.g:4984:6: ( '=' )
                     {
-                    // InternalOCLinEcore.g:4982:6: ( '=' )
-                    // InternalOCLinEcore.g:4983:1: '='
+                    // InternalOCLinEcore.g:4984:6: ( '=' )
+                    // InternalOCLinEcore.g:4985:1: '='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
@@ -17411,10 +17411,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLinEcore.g:4990:6: ( '<>' )
+                    // InternalOCLinEcore.g:4992:6: ( '<>' )
                     {
-                    // InternalOCLinEcore.g:4990:6: ( '<>' )
-                    // InternalOCLinEcore.g:4991:1: '<>'
+                    // InternalOCLinEcore.g:4992:6: ( '<>' )
+                    // InternalOCLinEcore.g:4993:1: '<>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
@@ -17430,10 +17430,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLinEcore.g:4998:6: ( 'and' )
+                    // InternalOCLinEcore.g:5000:6: ( 'and' )
                     {
-                    // InternalOCLinEcore.g:4998:6: ( 'and' )
-                    // InternalOCLinEcore.g:4999:1: 'and'
+                    // InternalOCLinEcore.g:5000:6: ( 'and' )
+                    // InternalOCLinEcore.g:5001:1: 'and'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
@@ -17449,10 +17449,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLinEcore.g:5006:6: ( 'and2' )
+                    // InternalOCLinEcore.g:5008:6: ( 'and2' )
                     {
-                    // InternalOCLinEcore.g:5006:6: ( 'and2' )
-                    // InternalOCLinEcore.g:5007:1: 'and2'
+                    // InternalOCLinEcore.g:5008:6: ( 'and2' )
+                    // InternalOCLinEcore.g:5009:1: 'and2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());
@@ -17468,10 +17468,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLinEcore.g:5014:6: ( 'implies' )
+                    // InternalOCLinEcore.g:5016:6: ( 'implies' )
                     {
-                    // InternalOCLinEcore.g:5014:6: ( 'implies' )
-                    // InternalOCLinEcore.g:5015:1: 'implies'
+                    // InternalOCLinEcore.g:5016:6: ( 'implies' )
+                    // InternalOCLinEcore.g:5017:1: 'implies'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());
@@ -17487,10 +17487,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLinEcore.g:5022:6: ( 'implies2' )
+                    // InternalOCLinEcore.g:5024:6: ( 'implies2' )
                     {
-                    // InternalOCLinEcore.g:5022:6: ( 'implies2' )
-                    // InternalOCLinEcore.g:5023:1: 'implies2'
+                    // InternalOCLinEcore.g:5024:6: ( 'implies2' )
+                    // InternalOCLinEcore.g:5025:1: 'implies2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());
@@ -17506,10 +17506,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLinEcore.g:5030:6: ( 'or' )
+                    // InternalOCLinEcore.g:5032:6: ( 'or' )
                     {
-                    // InternalOCLinEcore.g:5030:6: ( 'or' )
-                    // InternalOCLinEcore.g:5031:1: 'or'
+                    // InternalOCLinEcore.g:5032:6: ( 'or' )
+                    // InternalOCLinEcore.g:5033:1: 'or'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());
@@ -17525,10 +17525,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLinEcore.g:5038:6: ( 'or2' )
+                    // InternalOCLinEcore.g:5040:6: ( 'or2' )
                     {
-                    // InternalOCLinEcore.g:5038:6: ( 'or2' )
-                    // InternalOCLinEcore.g:5039:1: 'or2'
+                    // InternalOCLinEcore.g:5040:6: ( 'or2' )
+                    // InternalOCLinEcore.g:5041:1: 'or2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());
@@ -17544,10 +17544,10 @@
                     }
                     break;
                 case 17 :
-                    // InternalOCLinEcore.g:5046:6: ( 'xor' )
+                    // InternalOCLinEcore.g:5048:6: ( 'xor' )
                     {
-                    // InternalOCLinEcore.g:5046:6: ( 'xor' )
-                    // InternalOCLinEcore.g:5047:1: 'xor'
+                    // InternalOCLinEcore.g:5048:6: ( 'xor' )
+                    // InternalOCLinEcore.g:5049:1: 'xor'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());
@@ -17563,10 +17563,10 @@
                     }
                     break;
                 case 18 :
-                    // InternalOCLinEcore.g:5054:6: ( 'xor2' )
+                    // InternalOCLinEcore.g:5056:6: ( 'xor2' )
                     {
-                    // InternalOCLinEcore.g:5054:6: ( 'xor2' )
-                    // InternalOCLinEcore.g:5055:1: 'xor2'
+                    // InternalOCLinEcore.g:5056:6: ( 'xor2' )
+                    // InternalOCLinEcore.g:5057:1: 'xor2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());
@@ -17599,13 +17599,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLNavigationOperatorName__Alternatives"
-    // InternalOCLinEcore.g:5067:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
+    // InternalOCLinEcore.g:5069:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
     public final void rule__EssentialOCLNavigationOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5071:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
+            // InternalOCLinEcore.g:5073:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
             int alt48=4;
             switch ( input.LA(1) ) {
             case 81:
@@ -17638,10 +17638,10 @@
 
             switch (alt48) {
                 case 1 :
-                    // InternalOCLinEcore.g:5072:1: ( '.' )
+                    // InternalOCLinEcore.g:5074:1: ( '.' )
                     {
-                    // InternalOCLinEcore.g:5072:1: ( '.' )
-                    // InternalOCLinEcore.g:5073:1: '.'
+                    // InternalOCLinEcore.g:5074:1: ( '.' )
+                    // InternalOCLinEcore.g:5075:1: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
@@ -17657,10 +17657,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5080:6: ( '->' )
+                    // InternalOCLinEcore.g:5082:6: ( '->' )
                     {
-                    // InternalOCLinEcore.g:5080:6: ( '->' )
-                    // InternalOCLinEcore.g:5081:1: '->'
+                    // InternalOCLinEcore.g:5082:6: ( '->' )
+                    // InternalOCLinEcore.g:5083:1: '->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
@@ -17676,10 +17676,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5088:6: ( '?.' )
+                    // InternalOCLinEcore.g:5090:6: ( '?.' )
                     {
-                    // InternalOCLinEcore.g:5088:6: ( '?.' )
-                    // InternalOCLinEcore.g:5089:1: '?.'
+                    // InternalOCLinEcore.g:5090:6: ( '?.' )
+                    // InternalOCLinEcore.g:5091:1: '?.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
@@ -17695,10 +17695,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5096:6: ( '?->' )
+                    // InternalOCLinEcore.g:5098:6: ( '?->' )
                     {
-                    // InternalOCLinEcore.g:5096:6: ( '?->' )
-                    // InternalOCLinEcore.g:5097:1: '?->'
+                    // InternalOCLinEcore.g:5098:6: ( '?->' )
+                    // InternalOCLinEcore.g:5099:1: '?->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
@@ -17731,13 +17731,13 @@
 
 
     // $ANTLR start "rule__BinaryOperatorName__Alternatives"
-    // InternalOCLinEcore.g:5109:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
+    // InternalOCLinEcore.g:5111:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
     public final void rule__BinaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5113:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
+            // InternalOCLinEcore.g:5115:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
             int alt49=2;
             int LA49_0 = input.LA(1);
 
@@ -17756,10 +17756,10 @@
             }
             switch (alt49) {
                 case 1 :
-                    // InternalOCLinEcore.g:5114:1: ( ruleInfixOperatorName )
+                    // InternalOCLinEcore.g:5116:1: ( ruleInfixOperatorName )
                     {
-                    // InternalOCLinEcore.g:5114:1: ( ruleInfixOperatorName )
-                    // InternalOCLinEcore.g:5115:1: ruleInfixOperatorName
+                    // InternalOCLinEcore.g:5116:1: ( ruleInfixOperatorName )
+                    // InternalOCLinEcore.g:5117:1: ruleInfixOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());
@@ -17779,10 +17779,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5120:6: ( ruleNavigationOperatorName )
+                    // InternalOCLinEcore.g:5122:6: ( ruleNavigationOperatorName )
                     {
-                    // InternalOCLinEcore.g:5120:6: ( ruleNavigationOperatorName )
-                    // InternalOCLinEcore.g:5121:1: ruleNavigationOperatorName
+                    // InternalOCLinEcore.g:5122:6: ( ruleNavigationOperatorName )
+                    // InternalOCLinEcore.g:5123:1: ruleNavigationOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());
@@ -17819,13 +17819,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnreservedName__Alternatives"
-    // InternalOCLinEcore.g:5131:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
+    // InternalOCLinEcore.g:5133:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
     public final void rule__EssentialOCLUnreservedName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5135:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
+            // InternalOCLinEcore.g:5137:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
             int alt50=5;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -17917,10 +17917,10 @@
 
             switch (alt50) {
                 case 1 :
-                    // InternalOCLinEcore.g:5136:1: ( ruleUnrestrictedName )
+                    // InternalOCLinEcore.g:5138:1: ( ruleUnrestrictedName )
                     {
-                    // InternalOCLinEcore.g:5136:1: ( ruleUnrestrictedName )
-                    // InternalOCLinEcore.g:5137:1: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:5138:1: ( ruleUnrestrictedName )
+                    // InternalOCLinEcore.g:5139:1: ruleUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());
@@ -17940,10 +17940,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5142:6: ( ruleCollectionTypeIdentifier )
+                    // InternalOCLinEcore.g:5144:6: ( ruleCollectionTypeIdentifier )
                     {
-                    // InternalOCLinEcore.g:5142:6: ( ruleCollectionTypeIdentifier )
-                    // InternalOCLinEcore.g:5143:1: ruleCollectionTypeIdentifier
+                    // InternalOCLinEcore.g:5144:6: ( ruleCollectionTypeIdentifier )
+                    // InternalOCLinEcore.g:5145:1: ruleCollectionTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());
@@ -17963,10 +17963,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5148:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalOCLinEcore.g:5150:6: ( rulePrimitiveTypeIdentifier )
                     {
-                    // InternalOCLinEcore.g:5148:6: ( rulePrimitiveTypeIdentifier )
-                    // InternalOCLinEcore.g:5149:1: rulePrimitiveTypeIdentifier
+                    // InternalOCLinEcore.g:5150:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalOCLinEcore.g:5151:1: rulePrimitiveTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());
@@ -17986,10 +17986,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5154:6: ( 'Map' )
+                    // InternalOCLinEcore.g:5156:6: ( 'Map' )
                     {
-                    // InternalOCLinEcore.g:5154:6: ( 'Map' )
-                    // InternalOCLinEcore.g:5155:1: 'Map'
+                    // InternalOCLinEcore.g:5156:6: ( 'Map' )
+                    // InternalOCLinEcore.g:5157:1: 'Map'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
@@ -18005,10 +18005,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:5162:6: ( 'Tuple' )
+                    // InternalOCLinEcore.g:5164:6: ( 'Tuple' )
                     {
-                    // InternalOCLinEcore.g:5162:6: ( 'Tuple' )
-                    // InternalOCLinEcore.g:5163:1: 'Tuple'
+                    // InternalOCLinEcore.g:5164:6: ( 'Tuple' )
+                    // InternalOCLinEcore.g:5165:1: 'Tuple'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
@@ -18041,13 +18041,13 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Alternatives"
-    // InternalOCLinEcore.g:5175:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
+    // InternalOCLinEcore.g:5177:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
     public final void rule__URIFirstPathElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5179:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
+            // InternalOCLinEcore.g:5181:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -18066,16 +18066,16 @@
             }
             switch (alt51) {
                 case 1 :
-                    // InternalOCLinEcore.g:5180:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalOCLinEcore.g:5182:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                     {
-                    // InternalOCLinEcore.g:5180:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
-                    // InternalOCLinEcore.g:5181:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalOCLinEcore.g:5182:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalOCLinEcore.g:5183:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                     }
-                    // InternalOCLinEcore.g:5182:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
-                    // InternalOCLinEcore.g:5182:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
+                    // InternalOCLinEcore.g:5184:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalOCLinEcore.g:5184:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__ReferredElementAssignment_0();
@@ -18095,16 +18095,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5186:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalOCLinEcore.g:5188:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:5186:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
-                    // InternalOCLinEcore.g:5187:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalOCLinEcore.g:5188:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalOCLinEcore.g:5189:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                     }
-                    // InternalOCLinEcore.g:5188:1: ( rule__URIFirstPathElementCS__Group_1__0 )
-                    // InternalOCLinEcore.g:5188:2: rule__URIFirstPathElementCS__Group_1__0
+                    // InternalOCLinEcore.g:5190:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalOCLinEcore.g:5190:2: rule__URIFirstPathElementCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__Group_1__0();
@@ -18141,13 +18141,13 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeIdentifier__Alternatives"
-    // InternalOCLinEcore.g:5197:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
+    // InternalOCLinEcore.g:5199:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
     public final void rule__PrimitiveTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5201:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
+            // InternalOCLinEcore.g:5203:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
             int alt52=8;
             switch ( input.LA(1) ) {
             case 87:
@@ -18200,10 +18200,10 @@
 
             switch (alt52) {
                 case 1 :
-                    // InternalOCLinEcore.g:5202:1: ( 'Boolean' )
+                    // InternalOCLinEcore.g:5204:1: ( 'Boolean' )
                     {
-                    // InternalOCLinEcore.g:5202:1: ( 'Boolean' )
-                    // InternalOCLinEcore.g:5203:1: 'Boolean'
+                    // InternalOCLinEcore.g:5204:1: ( 'Boolean' )
+                    // InternalOCLinEcore.g:5205:1: 'Boolean'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
@@ -18219,10 +18219,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5210:6: ( 'Integer' )
+                    // InternalOCLinEcore.g:5212:6: ( 'Integer' )
                     {
-                    // InternalOCLinEcore.g:5210:6: ( 'Integer' )
-                    // InternalOCLinEcore.g:5211:1: 'Integer'
+                    // InternalOCLinEcore.g:5212:6: ( 'Integer' )
+                    // InternalOCLinEcore.g:5213:1: 'Integer'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
@@ -18238,10 +18238,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5218:6: ( 'Real' )
+                    // InternalOCLinEcore.g:5220:6: ( 'Real' )
                     {
-                    // InternalOCLinEcore.g:5218:6: ( 'Real' )
-                    // InternalOCLinEcore.g:5219:1: 'Real'
+                    // InternalOCLinEcore.g:5220:6: ( 'Real' )
+                    // InternalOCLinEcore.g:5221:1: 'Real'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
@@ -18257,10 +18257,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5226:6: ( 'String' )
+                    // InternalOCLinEcore.g:5228:6: ( 'String' )
                     {
-                    // InternalOCLinEcore.g:5226:6: ( 'String' )
-                    // InternalOCLinEcore.g:5227:1: 'String'
+                    // InternalOCLinEcore.g:5228:6: ( 'String' )
+                    // InternalOCLinEcore.g:5229:1: 'String'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
@@ -18276,10 +18276,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:5234:6: ( 'UnlimitedNatural' )
+                    // InternalOCLinEcore.g:5236:6: ( 'UnlimitedNatural' )
                     {
-                    // InternalOCLinEcore.g:5234:6: ( 'UnlimitedNatural' )
-                    // InternalOCLinEcore.g:5235:1: 'UnlimitedNatural'
+                    // InternalOCLinEcore.g:5236:6: ( 'UnlimitedNatural' )
+                    // InternalOCLinEcore.g:5237:1: 'UnlimitedNatural'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
@@ -18295,10 +18295,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:5242:6: ( 'OclAny' )
+                    // InternalOCLinEcore.g:5244:6: ( 'OclAny' )
                     {
-                    // InternalOCLinEcore.g:5242:6: ( 'OclAny' )
-                    // InternalOCLinEcore.g:5243:1: 'OclAny'
+                    // InternalOCLinEcore.g:5244:6: ( 'OclAny' )
+                    // InternalOCLinEcore.g:5245:1: 'OclAny'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
@@ -18314,10 +18314,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:5250:6: ( 'OclInvalid' )
+                    // InternalOCLinEcore.g:5252:6: ( 'OclInvalid' )
                     {
-                    // InternalOCLinEcore.g:5250:6: ( 'OclInvalid' )
-                    // InternalOCLinEcore.g:5251:1: 'OclInvalid'
+                    // InternalOCLinEcore.g:5252:6: ( 'OclInvalid' )
+                    // InternalOCLinEcore.g:5253:1: 'OclInvalid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
@@ -18333,10 +18333,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:5258:6: ( 'OclVoid' )
+                    // InternalOCLinEcore.g:5260:6: ( 'OclVoid' )
                     {
-                    // InternalOCLinEcore.g:5258:6: ( 'OclVoid' )
-                    // InternalOCLinEcore.g:5259:1: 'OclVoid'
+                    // InternalOCLinEcore.g:5260:6: ( 'OclVoid' )
+                    // InternalOCLinEcore.g:5261:1: 'OclVoid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());
@@ -18369,13 +18369,13 @@
 
 
     // $ANTLR start "rule__CollectionTypeIdentifier__Alternatives"
-    // InternalOCLinEcore.g:5271:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
+    // InternalOCLinEcore.g:5273:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
     public final void rule__CollectionTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5275:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
+            // InternalOCLinEcore.g:5277:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
             int alt53=5;
             switch ( input.LA(1) ) {
             case 95:
@@ -18413,10 +18413,10 @@
 
             switch (alt53) {
                 case 1 :
-                    // InternalOCLinEcore.g:5276:1: ( 'Set' )
+                    // InternalOCLinEcore.g:5278:1: ( 'Set' )
                     {
-                    // InternalOCLinEcore.g:5276:1: ( 'Set' )
-                    // InternalOCLinEcore.g:5277:1: 'Set'
+                    // InternalOCLinEcore.g:5278:1: ( 'Set' )
+                    // InternalOCLinEcore.g:5279:1: 'Set'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
@@ -18432,10 +18432,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5284:6: ( 'Bag' )
+                    // InternalOCLinEcore.g:5286:6: ( 'Bag' )
                     {
-                    // InternalOCLinEcore.g:5284:6: ( 'Bag' )
-                    // InternalOCLinEcore.g:5285:1: 'Bag'
+                    // InternalOCLinEcore.g:5286:6: ( 'Bag' )
+                    // InternalOCLinEcore.g:5287:1: 'Bag'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
@@ -18451,10 +18451,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5292:6: ( 'Sequence' )
+                    // InternalOCLinEcore.g:5294:6: ( 'Sequence' )
                     {
-                    // InternalOCLinEcore.g:5292:6: ( 'Sequence' )
-                    // InternalOCLinEcore.g:5293:1: 'Sequence'
+                    // InternalOCLinEcore.g:5294:6: ( 'Sequence' )
+                    // InternalOCLinEcore.g:5295:1: 'Sequence'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
@@ -18470,10 +18470,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5300:6: ( 'Collection' )
+                    // InternalOCLinEcore.g:5302:6: ( 'Collection' )
                     {
-                    // InternalOCLinEcore.g:5300:6: ( 'Collection' )
-                    // InternalOCLinEcore.g:5301:1: 'Collection'
+                    // InternalOCLinEcore.g:5302:6: ( 'Collection' )
+                    // InternalOCLinEcore.g:5303:1: 'Collection'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
@@ -18489,10 +18489,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:5308:6: ( 'OrderedSet' )
+                    // InternalOCLinEcore.g:5310:6: ( 'OrderedSet' )
                     {
-                    // InternalOCLinEcore.g:5308:6: ( 'OrderedSet' )
-                    // InternalOCLinEcore.g:5309:1: 'OrderedSet'
+                    // InternalOCLinEcore.g:5310:6: ( 'OrderedSet' )
+                    // InternalOCLinEcore.g:5311:1: 'OrderedSet'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
@@ -18525,27 +18525,27 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Alternatives"
-    // InternalOCLinEcore.g:5321:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
+    // InternalOCLinEcore.g:5323:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
     public final void rule__CollectionLiteralPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5325:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:5327:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
             int alt54=2;
             alt54 = dfa54.predict(input);
             switch (alt54) {
                 case 1 :
-                    // InternalOCLinEcore.g:5326:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5328:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5326:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:5327:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5328:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5329:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:5328:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
-                    // InternalOCLinEcore.g:5328:2: rule__CollectionLiteralPartCS__Group_0__0
+                    // InternalOCLinEcore.g:5330:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5330:2: rule__CollectionLiteralPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0__0();
@@ -18565,16 +18565,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5332:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalOCLinEcore.g:5334:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                     {
-                    // InternalOCLinEcore.g:5332:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
-                    // InternalOCLinEcore.g:5333:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalOCLinEcore.g:5334:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalOCLinEcore.g:5335:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                     }
-                    // InternalOCLinEcore.g:5334:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
-                    // InternalOCLinEcore.g:5334:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
+                    // InternalOCLinEcore.g:5336:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalOCLinEcore.g:5336:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1();
@@ -18611,13 +18611,13 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Alternatives"
-    // InternalOCLinEcore.g:5343:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
+    // InternalOCLinEcore.g:5345:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
     public final void rule__ShadowPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5347:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:5349:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
             int alt55=2;
             int LA55_0 = input.LA(1);
 
@@ -18636,16 +18636,16 @@
             }
             switch (alt55) {
                 case 1 :
-                    // InternalOCLinEcore.g:5348:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5350:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5348:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:5349:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5350:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5351:1: ( rule__ShadowPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:5350:1: ( rule__ShadowPartCS__Group_0__0 )
-                    // InternalOCLinEcore.g:5350:2: rule__ShadowPartCS__Group_0__0
+                    // InternalOCLinEcore.g:5352:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5352:2: rule__ShadowPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__Group_0__0();
@@ -18665,16 +18665,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5354:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalOCLinEcore.g:5356:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
                     {
-                    // InternalOCLinEcore.g:5354:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
-                    // InternalOCLinEcore.g:5355:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalOCLinEcore.g:5356:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalOCLinEcore.g:5357:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_1());
                     }
-                    // InternalOCLinEcore.g:5356:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
-                    // InternalOCLinEcore.g:5356:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
+                    // InternalOCLinEcore.g:5358:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalOCLinEcore.g:5358:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__OwnedInitExpressionAssignment_1();
@@ -18711,21 +18711,21 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0"
-    // InternalOCLinEcore.g:5365:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalOCLinEcore.g:5367:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5369:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalOCLinEcore.g:5371:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt56=2;
             alt56 = dfa56.predict(input);
             switch (alt56) {
                 case 1 :
-                    // InternalOCLinEcore.g:5370:1: ( ruleExpCS )
+                    // InternalOCLinEcore.g:5372:1: ( ruleExpCS )
                     {
-                    // InternalOCLinEcore.g:5370:1: ( ruleExpCS )
-                    // InternalOCLinEcore.g:5371:1: ruleExpCS
+                    // InternalOCLinEcore.g:5372:1: ( ruleExpCS )
+                    // InternalOCLinEcore.g:5373:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());
@@ -18745,10 +18745,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5376:6: ( rulePatternExpCS )
+                    // InternalOCLinEcore.g:5378:6: ( rulePatternExpCS )
                     {
-                    // InternalOCLinEcore.g:5376:6: ( rulePatternExpCS )
-                    // InternalOCLinEcore.g:5377:1: rulePatternExpCS
+                    // InternalOCLinEcore.g:5378:6: ( rulePatternExpCS )
+                    // InternalOCLinEcore.g:5379:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());
@@ -18785,13 +18785,13 @@
 
 
     // $ANTLR start "rule__PrimitiveLiteralExpCS__Alternatives"
-    // InternalOCLinEcore.g:5387:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
+    // InternalOCLinEcore.g:5389:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
     public final void rule__PrimitiveLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5391:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
+            // InternalOCLinEcore.g:5393:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
             int alt57=6;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -18835,10 +18835,10 @@
 
             switch (alt57) {
                 case 1 :
-                    // InternalOCLinEcore.g:5392:1: ( ruleNumberLiteralExpCS )
+                    // InternalOCLinEcore.g:5394:1: ( ruleNumberLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5392:1: ( ruleNumberLiteralExpCS )
-                    // InternalOCLinEcore.g:5393:1: ruleNumberLiteralExpCS
+                    // InternalOCLinEcore.g:5394:1: ( ruleNumberLiteralExpCS )
+                    // InternalOCLinEcore.g:5395:1: ruleNumberLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());
@@ -18858,10 +18858,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5398:6: ( ruleStringLiteralExpCS )
+                    // InternalOCLinEcore.g:5400:6: ( ruleStringLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5398:6: ( ruleStringLiteralExpCS )
-                    // InternalOCLinEcore.g:5399:1: ruleStringLiteralExpCS
+                    // InternalOCLinEcore.g:5400:6: ( ruleStringLiteralExpCS )
+                    // InternalOCLinEcore.g:5401:1: ruleStringLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());
@@ -18881,10 +18881,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5404:6: ( ruleBooleanLiteralExpCS )
+                    // InternalOCLinEcore.g:5406:6: ( ruleBooleanLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5404:6: ( ruleBooleanLiteralExpCS )
-                    // InternalOCLinEcore.g:5405:1: ruleBooleanLiteralExpCS
+                    // InternalOCLinEcore.g:5406:6: ( ruleBooleanLiteralExpCS )
+                    // InternalOCLinEcore.g:5407:1: ruleBooleanLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());
@@ -18904,10 +18904,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5410:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalOCLinEcore.g:5412:6: ( ruleUnlimitedNaturalLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5410:6: ( ruleUnlimitedNaturalLiteralExpCS )
-                    // InternalOCLinEcore.g:5411:1: ruleUnlimitedNaturalLiteralExpCS
+                    // InternalOCLinEcore.g:5412:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalOCLinEcore.g:5413:1: ruleUnlimitedNaturalLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());
@@ -18927,10 +18927,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:5416:6: ( ruleInvalidLiteralExpCS )
+                    // InternalOCLinEcore.g:5418:6: ( ruleInvalidLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5416:6: ( ruleInvalidLiteralExpCS )
-                    // InternalOCLinEcore.g:5417:1: ruleInvalidLiteralExpCS
+                    // InternalOCLinEcore.g:5418:6: ( ruleInvalidLiteralExpCS )
+                    // InternalOCLinEcore.g:5419:1: ruleInvalidLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());
@@ -18950,10 +18950,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:5422:6: ( ruleNullLiteralExpCS )
+                    // InternalOCLinEcore.g:5424:6: ( ruleNullLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5422:6: ( ruleNullLiteralExpCS )
-                    // InternalOCLinEcore.g:5423:1: ruleNullLiteralExpCS
+                    // InternalOCLinEcore.g:5424:6: ( ruleNullLiteralExpCS )
+                    // InternalOCLinEcore.g:5425:1: ruleNullLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());
@@ -18990,13 +18990,13 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__Alternatives"
-    // InternalOCLinEcore.g:5433:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
+    // InternalOCLinEcore.g:5435:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
     public final void rule__BooleanLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5437:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
+            // InternalOCLinEcore.g:5439:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
             int alt58=2;
             int LA58_0 = input.LA(1);
 
@@ -19015,16 +19015,16 @@
             }
             switch (alt58) {
                 case 1 :
-                    // InternalOCLinEcore.g:5438:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalOCLinEcore.g:5440:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                     {
-                    // InternalOCLinEcore.g:5438:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
-                    // InternalOCLinEcore.g:5439:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalOCLinEcore.g:5440:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalOCLinEcore.g:5441:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                     }
-                    // InternalOCLinEcore.g:5440:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
-                    // InternalOCLinEcore.g:5440:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
+                    // InternalOCLinEcore.g:5442:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalOCLinEcore.g:5442:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_0();
@@ -19044,16 +19044,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5444:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalOCLinEcore.g:5446:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                     {
-                    // InternalOCLinEcore.g:5444:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
-                    // InternalOCLinEcore.g:5445:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalOCLinEcore.g:5446:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalOCLinEcore.g:5447:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                     }
-                    // InternalOCLinEcore.g:5446:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
-                    // InternalOCLinEcore.g:5446:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
+                    // InternalOCLinEcore.g:5448:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalOCLinEcore.g:5448:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_1();
@@ -19090,13 +19090,13 @@
 
 
     // $ANTLR start "rule__TypeLiteralCS__Alternatives"
-    // InternalOCLinEcore.g:5455:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
+    // InternalOCLinEcore.g:5457:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
     public final void rule__TypeLiteralCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5459:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
+            // InternalOCLinEcore.g:5461:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
             int alt59=4;
             switch ( input.LA(1) ) {
             case 87:
@@ -19140,10 +19140,10 @@
 
             switch (alt59) {
                 case 1 :
-                    // InternalOCLinEcore.g:5460:1: ( rulePrimitiveTypeCS )
+                    // InternalOCLinEcore.g:5462:1: ( rulePrimitiveTypeCS )
                     {
-                    // InternalOCLinEcore.g:5460:1: ( rulePrimitiveTypeCS )
-                    // InternalOCLinEcore.g:5461:1: rulePrimitiveTypeCS
+                    // InternalOCLinEcore.g:5462:1: ( rulePrimitiveTypeCS )
+                    // InternalOCLinEcore.g:5463:1: rulePrimitiveTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());
@@ -19163,10 +19163,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5466:6: ( ruleCollectionTypeCS )
+                    // InternalOCLinEcore.g:5468:6: ( ruleCollectionTypeCS )
                     {
-                    // InternalOCLinEcore.g:5466:6: ( ruleCollectionTypeCS )
-                    // InternalOCLinEcore.g:5467:1: ruleCollectionTypeCS
+                    // InternalOCLinEcore.g:5468:6: ( ruleCollectionTypeCS )
+                    // InternalOCLinEcore.g:5469:1: ruleCollectionTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());
@@ -19186,10 +19186,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5472:6: ( ruleMapTypeCS )
+                    // InternalOCLinEcore.g:5474:6: ( ruleMapTypeCS )
                     {
-                    // InternalOCLinEcore.g:5472:6: ( ruleMapTypeCS )
-                    // InternalOCLinEcore.g:5473:1: ruleMapTypeCS
+                    // InternalOCLinEcore.g:5474:6: ( ruleMapTypeCS )
+                    // InternalOCLinEcore.g:5475:1: ruleMapTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());
@@ -19209,10 +19209,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5478:6: ( ruleTupleTypeCS )
+                    // InternalOCLinEcore.g:5480:6: ( ruleTupleTypeCS )
                     {
-                    // InternalOCLinEcore.g:5478:6: ( ruleTupleTypeCS )
-                    // InternalOCLinEcore.g:5479:1: ruleTupleTypeCS
+                    // InternalOCLinEcore.g:5480:6: ( ruleTupleTypeCS )
+                    // InternalOCLinEcore.g:5481:1: ruleTupleTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());
@@ -19249,21 +19249,21 @@
 
 
     // $ANTLR start "rule__TypeExpWithoutMultiplicityCS__Alternatives"
-    // InternalOCLinEcore.g:5489:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
+    // InternalOCLinEcore.g:5491:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
     public final void rule__TypeExpWithoutMultiplicityCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5493:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
+            // InternalOCLinEcore.g:5495:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
             int alt60=3;
             alt60 = dfa60.predict(input);
             switch (alt60) {
                 case 1 :
-                    // InternalOCLinEcore.g:5494:1: ( ruleTypeNameExpCS )
+                    // InternalOCLinEcore.g:5496:1: ( ruleTypeNameExpCS )
                     {
-                    // InternalOCLinEcore.g:5494:1: ( ruleTypeNameExpCS )
-                    // InternalOCLinEcore.g:5495:1: ruleTypeNameExpCS
+                    // InternalOCLinEcore.g:5496:1: ( ruleTypeNameExpCS )
+                    // InternalOCLinEcore.g:5497:1: ruleTypeNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());
@@ -19283,10 +19283,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5500:6: ( ruleTypeLiteralCS )
+                    // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
                     {
-                    // InternalOCLinEcore.g:5500:6: ( ruleTypeLiteralCS )
-                    // InternalOCLinEcore.g:5501:1: ruleTypeLiteralCS
+                    // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
+                    // InternalOCLinEcore.g:5503:1: ruleTypeLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -19306,10 +19306,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5506:6: ( ruleCollectionPatternCS )
+                    // InternalOCLinEcore.g:5508:6: ( ruleCollectionPatternCS )
                     {
-                    // InternalOCLinEcore.g:5506:6: ( ruleCollectionPatternCS )
-                    // InternalOCLinEcore.g:5507:1: ruleCollectionPatternCS
+                    // InternalOCLinEcore.g:5508:6: ( ruleCollectionPatternCS )
+                    // InternalOCLinEcore.g:5509:1: ruleCollectionPatternCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());
@@ -19346,27 +19346,27 @@
 
 
     // $ANTLR start "rule__ExpCS__Alternatives"
-    // InternalOCLinEcore.g:5517:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
+    // InternalOCLinEcore.g:5519:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
     public final void rule__ExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5521:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
+            // InternalOCLinEcore.g:5523:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
             int alt61=2;
             alt61 = dfa61.predict(input);
             switch (alt61) {
                 case 1 :
-                    // InternalOCLinEcore.g:5522:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5522:1: ( ( rule__ExpCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:5523:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5525:1: ( rule__ExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:5524:1: ( rule__ExpCS__Group_0__0 )
-                    // InternalOCLinEcore.g:5524:2: rule__ExpCS__Group_0__0
+                    // InternalOCLinEcore.g:5526:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5526:2: rule__ExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0__0();
@@ -19386,10 +19386,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5528:6: ( rulePrefixedLetExpCS )
+                    // InternalOCLinEcore.g:5530:6: ( rulePrefixedLetExpCS )
                     {
-                    // InternalOCLinEcore.g:5528:6: ( rulePrefixedLetExpCS )
-                    // InternalOCLinEcore.g:5529:1: rulePrefixedLetExpCS
+                    // InternalOCLinEcore.g:5530:6: ( rulePrefixedLetExpCS )
+                    // InternalOCLinEcore.g:5531:1: rulePrefixedLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());
@@ -19426,13 +19426,13 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Alternatives"
-    // InternalOCLinEcore.g:5539:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
+    // InternalOCLinEcore.g:5541:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
     public final void rule__PrefixedLetExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5543:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
+            // InternalOCLinEcore.g:5545:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
             int alt62=2;
             int LA62_0 = input.LA(1);
 
@@ -19451,16 +19451,16 @@
             }
             switch (alt62) {
                 case 1 :
-                    // InternalOCLinEcore.g:5544:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5546:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5544:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:5545:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5546:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5547:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:5546:1: ( rule__PrefixedLetExpCS__Group_0__0 )
-                    // InternalOCLinEcore.g:5546:2: rule__PrefixedLetExpCS__Group_0__0
+                    // InternalOCLinEcore.g:5548:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5548:2: rule__PrefixedLetExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedLetExpCS__Group_0__0();
@@ -19480,10 +19480,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5550:6: ( ruleLetExpCS )
+                    // InternalOCLinEcore.g:5552:6: ( ruleLetExpCS )
                     {
-                    // InternalOCLinEcore.g:5550:6: ( ruleLetExpCS )
-                    // InternalOCLinEcore.g:5551:1: ruleLetExpCS
+                    // InternalOCLinEcore.g:5552:6: ( ruleLetExpCS )
+                    // InternalOCLinEcore.g:5553:1: ruleLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());
@@ -19520,13 +19520,13 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Alternatives"
-    // InternalOCLinEcore.g:5561:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
+    // InternalOCLinEcore.g:5563:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
     public final void rule__PrefixedPrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5565:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
+            // InternalOCLinEcore.g:5567:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
             int alt63=2;
             int LA63_0 = input.LA(1);
 
@@ -19545,16 +19545,16 @@
             }
             switch (alt63) {
                 case 1 :
-                    // InternalOCLinEcore.g:5566:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5568:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5566:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:5567:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5568:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5569:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:5568:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
-                    // InternalOCLinEcore.g:5568:2: rule__PrefixedPrimaryExpCS__Group_0__0
+                    // InternalOCLinEcore.g:5570:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5570:2: rule__PrefixedPrimaryExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedPrimaryExpCS__Group_0__0();
@@ -19574,10 +19574,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5572:6: ( rulePrimaryExpCS )
+                    // InternalOCLinEcore.g:5574:6: ( rulePrimaryExpCS )
                     {
-                    // InternalOCLinEcore.g:5572:6: ( rulePrimaryExpCS )
-                    // InternalOCLinEcore.g:5573:1: rulePrimaryExpCS
+                    // InternalOCLinEcore.g:5574:6: ( rulePrimaryExpCS )
+                    // InternalOCLinEcore.g:5575:1: rulePrimaryExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());
@@ -19614,21 +19614,21 @@
 
 
     // $ANTLR start "rule__PrimaryExpCS__Alternatives"
-    // InternalOCLinEcore.g:5583:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
+    // InternalOCLinEcore.g:5585:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
     public final void rule__PrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5587:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
+            // InternalOCLinEcore.g:5589:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
             int alt64=10;
             alt64 = dfa64.predict(input);
             switch (alt64) {
                 case 1 :
-                    // InternalOCLinEcore.g:5588:1: ( ruleNestedExpCS )
+                    // InternalOCLinEcore.g:5590:1: ( ruleNestedExpCS )
                     {
-                    // InternalOCLinEcore.g:5588:1: ( ruleNestedExpCS )
-                    // InternalOCLinEcore.g:5589:1: ruleNestedExpCS
+                    // InternalOCLinEcore.g:5590:1: ( ruleNestedExpCS )
+                    // InternalOCLinEcore.g:5591:1: ruleNestedExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());
@@ -19648,10 +19648,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5594:6: ( ruleIfExpCS )
+                    // InternalOCLinEcore.g:5596:6: ( ruleIfExpCS )
                     {
-                    // InternalOCLinEcore.g:5594:6: ( ruleIfExpCS )
-                    // InternalOCLinEcore.g:5595:1: ruleIfExpCS
+                    // InternalOCLinEcore.g:5596:6: ( ruleIfExpCS )
+                    // InternalOCLinEcore.g:5597:1: ruleIfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());
@@ -19671,10 +19671,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5600:6: ( ruleSelfExpCS )
+                    // InternalOCLinEcore.g:5602:6: ( ruleSelfExpCS )
                     {
-                    // InternalOCLinEcore.g:5600:6: ( ruleSelfExpCS )
-                    // InternalOCLinEcore.g:5601:1: ruleSelfExpCS
+                    // InternalOCLinEcore.g:5602:6: ( ruleSelfExpCS )
+                    // InternalOCLinEcore.g:5603:1: ruleSelfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());
@@ -19694,10 +19694,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLinEcore.g:5606:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalOCLinEcore.g:5608:6: ( rulePrimitiveLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5606:6: ( rulePrimitiveLiteralExpCS )
-                    // InternalOCLinEcore.g:5607:1: rulePrimitiveLiteralExpCS
+                    // InternalOCLinEcore.g:5608:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalOCLinEcore.g:5609:1: rulePrimitiveLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());
@@ -19717,10 +19717,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLinEcore.g:5612:6: ( ruleTupleLiteralExpCS )
+                    // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5612:6: ( ruleTupleLiteralExpCS )
-                    // InternalOCLinEcore.g:5613:1: ruleTupleLiteralExpCS
+                    // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
+                    // InternalOCLinEcore.g:5615:1: ruleTupleLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -19740,10 +19740,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLinEcore.g:5618:6: ( ruleMapLiteralExpCS )
+                    // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5618:6: ( ruleMapLiteralExpCS )
-                    // InternalOCLinEcore.g:5619:1: ruleMapLiteralExpCS
+                    // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
+                    // InternalOCLinEcore.g:5621:1: ruleMapLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -19763,10 +19763,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLinEcore.g:5624:6: ( ruleCollectionLiteralExpCS )
+                    // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5624:6: ( ruleCollectionLiteralExpCS )
-                    // InternalOCLinEcore.g:5625:1: ruleCollectionLiteralExpCS
+                    // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
+                    // InternalOCLinEcore.g:5627:1: ruleCollectionLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -19786,10 +19786,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLinEcore.g:5630:6: ( ruleLambdaLiteralExpCS )
+                    // InternalOCLinEcore.g:5632:6: ( ruleLambdaLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5630:6: ( ruleLambdaLiteralExpCS )
-                    // InternalOCLinEcore.g:5631:1: ruleLambdaLiteralExpCS
+                    // InternalOCLinEcore.g:5632:6: ( ruleLambdaLiteralExpCS )
+                    // InternalOCLinEcore.g:5633:1: ruleLambdaLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());
@@ -19809,10 +19809,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLinEcore.g:5636:6: ( ruleTypeLiteralExpCS )
+                    // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
                     {
-                    // InternalOCLinEcore.g:5636:6: ( ruleTypeLiteralExpCS )
-                    // InternalOCLinEcore.g:5637:1: ruleTypeLiteralExpCS
+                    // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
+                    // InternalOCLinEcore.g:5639:1: ruleTypeLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -19832,10 +19832,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLinEcore.g:5642:6: ( ruleNameExpCS )
+                    // InternalOCLinEcore.g:5644:6: ( ruleNameExpCS )
                     {
-                    // InternalOCLinEcore.g:5642:6: ( ruleNameExpCS )
-                    // InternalOCLinEcore.g:5643:1: ruleNameExpCS
+                    // InternalOCLinEcore.g:5644:6: ( ruleNameExpCS )
+                    // InternalOCLinEcore.g:5645:1: ruleNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());
@@ -19872,13 +19872,13 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0"
-    // InternalOCLinEcore.g:5653:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
+    // InternalOCLinEcore.g:5655:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5657:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
+            // InternalOCLinEcore.g:5659:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
             int alt65=3;
             switch ( input.LA(1) ) {
             case 105:
@@ -19906,10 +19906,10 @@
 
             switch (alt65) {
                 case 1 :
-                    // InternalOCLinEcore.g:5658:1: ( ruleNavigatingCommaArgCS )
+                    // InternalOCLinEcore.g:5660:1: ( ruleNavigatingCommaArgCS )
                     {
-                    // InternalOCLinEcore.g:5658:1: ( ruleNavigatingCommaArgCS )
-                    // InternalOCLinEcore.g:5659:1: ruleNavigatingCommaArgCS
+                    // InternalOCLinEcore.g:5660:1: ( ruleNavigatingCommaArgCS )
+                    // InternalOCLinEcore.g:5661:1: ruleNavigatingCommaArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
@@ -19929,10 +19929,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5664:6: ( ruleNavigatingSemiArgCS )
+                    // InternalOCLinEcore.g:5666:6: ( ruleNavigatingSemiArgCS )
                     {
-                    // InternalOCLinEcore.g:5664:6: ( ruleNavigatingSemiArgCS )
-                    // InternalOCLinEcore.g:5665:1: ruleNavigatingSemiArgCS
+                    // InternalOCLinEcore.g:5666:6: ( ruleNavigatingSemiArgCS )
+                    // InternalOCLinEcore.g:5667:1: ruleNavigatingSemiArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
@@ -19952,10 +19952,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5670:6: ( ruleNavigatingBarArgCS )
+                    // InternalOCLinEcore.g:5672:6: ( ruleNavigatingBarArgCS )
                     {
-                    // InternalOCLinEcore.g:5670:6: ( ruleNavigatingBarArgCS )
-                    // InternalOCLinEcore.g:5671:1: ruleNavigatingBarArgCS
+                    // InternalOCLinEcore.g:5672:6: ( ruleNavigatingBarArgCS )
+                    // InternalOCLinEcore.g:5673:1: ruleNavigatingBarArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
@@ -19992,13 +19992,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives"
-    // InternalOCLinEcore.g:5681:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
+    // InternalOCLinEcore.g:5683:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5685:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
+            // InternalOCLinEcore.g:5687:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
             int alt66=2;
             int LA66_0 = input.LA(1);
 
@@ -20017,16 +20017,16 @@
             }
             switch (alt66) {
                 case 1 :
-                    // InternalOCLinEcore.g:5686:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5688:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5686:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
-                    // InternalOCLinEcore.g:5687:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5688:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalOCLinEcore.g:5689:1: ( rule__NavigatingArgCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                     }
-                    // InternalOCLinEcore.g:5688:1: ( rule__NavigatingArgCS__Group_0__0 )
-                    // InternalOCLinEcore.g:5688:2: rule__NavigatingArgCS__Group_0__0
+                    // InternalOCLinEcore.g:5690:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalOCLinEcore.g:5690:2: rule__NavigatingArgCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0__0();
@@ -20046,16 +20046,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5692:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalOCLinEcore.g:5694:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:5692:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
-                    // InternalOCLinEcore.g:5693:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalOCLinEcore.g:5694:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalOCLinEcore.g:5695:1: ( rule__NavigatingArgCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                     }
-                    // InternalOCLinEcore.g:5694:1: ( rule__NavigatingArgCS__Group_1__0 )
-                    // InternalOCLinEcore.g:5694:2: rule__NavigatingArgCS__Group_1__0
+                    // InternalOCLinEcore.g:5696:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalOCLinEcore.g:5696:2: rule__NavigatingArgCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_1__0();
@@ -20092,13 +20092,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives_0_1"
-    // InternalOCLinEcore.g:5703:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
+    // InternalOCLinEcore.g:5705:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5707:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
+            // InternalOCLinEcore.g:5709:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
             int alt67=3;
             switch ( input.LA(1) ) {
             case 113:
@@ -20154,16 +20154,16 @@
 
             switch (alt67) {
                 case 1 :
-                    // InternalOCLinEcore.g:5708:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5708:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-                    // InternalOCLinEcore.g:5709:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalOCLinEcore.g:5711:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                     }
-                    // InternalOCLinEcore.g:5710:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-                    // InternalOCLinEcore.g:5710:2: rule__NavigatingArgCS__Group_0_1_0__0
+                    // InternalOCLinEcore.g:5712:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalOCLinEcore.g:5712:2: rule__NavigatingArgCS__Group_0_1_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0__0();
@@ -20183,16 +20183,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5714:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:5714:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-                    // InternalOCLinEcore.g:5715:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalOCLinEcore.g:5717:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                     }
-                    // InternalOCLinEcore.g:5716:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-                    // InternalOCLinEcore.g:5716:2: rule__NavigatingArgCS__Group_0_1_1__0
+                    // InternalOCLinEcore.g:5718:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalOCLinEcore.g:5718:2: rule__NavigatingArgCS__Group_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1__0();
@@ -20212,16 +20212,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5720:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:5722:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
                     {
-                    // InternalOCLinEcore.g:5720:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
-                    // InternalOCLinEcore.g:5721:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalOCLinEcore.g:5722:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalOCLinEcore.g:5723:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2());
                     }
-                    // InternalOCLinEcore.g:5722:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
-                    // InternalOCLinEcore.g:5722:2: rule__NavigatingArgCS__Group_0_1_2__0
+                    // InternalOCLinEcore.g:5724:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalOCLinEcore.g:5724:2: rule__NavigatingArgCS__Group_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2__0();
@@ -20258,13 +20258,13 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Alternatives_2"
-    // InternalOCLinEcore.g:5731:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
+    // InternalOCLinEcore.g:5733:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
     public final void rule__NavigatingCommaArgCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5735:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
+            // InternalOCLinEcore.g:5737:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
             int alt68=3;
             switch ( input.LA(1) ) {
             case 113:
@@ -20320,16 +20320,16 @@
 
             switch (alt68) {
                 case 1 :
-                    // InternalOCLinEcore.g:5736:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                     {
-                    // InternalOCLinEcore.g:5736:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-                    // InternalOCLinEcore.g:5737:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalOCLinEcore.g:5739:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                     }
-                    // InternalOCLinEcore.g:5738:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-                    // InternalOCLinEcore.g:5738:2: rule__NavigatingCommaArgCS__Group_2_0__0
+                    // InternalOCLinEcore.g:5740:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalOCLinEcore.g:5740:2: rule__NavigatingCommaArgCS__Group_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -20349,16 +20349,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5742:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                     {
-                    // InternalOCLinEcore.g:5742:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-                    // InternalOCLinEcore.g:5743:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalOCLinEcore.g:5745:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                     }
-                    // InternalOCLinEcore.g:5744:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-                    // InternalOCLinEcore.g:5744:2: rule__NavigatingCommaArgCS__Group_2_1__0
+                    // InternalOCLinEcore.g:5746:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalOCLinEcore.g:5746:2: rule__NavigatingCommaArgCS__Group_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -20378,16 +20378,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5748:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalOCLinEcore.g:5750:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
                     {
-                    // InternalOCLinEcore.g:5748:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
-                    // InternalOCLinEcore.g:5749:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalOCLinEcore.g:5750:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalOCLinEcore.g:5751:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2());
                     }
-                    // InternalOCLinEcore.g:5750:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
-                    // InternalOCLinEcore.g:5750:2: rule__NavigatingCommaArgCS__Group_2_2__0
+                    // InternalOCLinEcore.g:5752:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalOCLinEcore.g:5752:2: rule__NavigatingCommaArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2__0();
@@ -20424,21 +20424,21 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAlternatives_1_0"
-    // InternalOCLinEcore.g:5759:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalOCLinEcore.g:5761:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__IfExpCS__OwnedConditionAlternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5763:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalOCLinEcore.g:5765:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt69=2;
             alt69 = dfa69.predict(input);
             switch (alt69) {
                 case 1 :
-                    // InternalOCLinEcore.g:5764:1: ( ruleExpCS )
+                    // InternalOCLinEcore.g:5766:1: ( ruleExpCS )
                     {
-                    // InternalOCLinEcore.g:5764:1: ( ruleExpCS )
-                    // InternalOCLinEcore.g:5765:1: ruleExpCS
+                    // InternalOCLinEcore.g:5766:1: ( ruleExpCS )
+                    // InternalOCLinEcore.g:5767:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
@@ -20458,10 +20458,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5770:6: ( rulePatternExpCS )
+                    // InternalOCLinEcore.g:5772:6: ( rulePatternExpCS )
                     {
-                    // InternalOCLinEcore.g:5770:6: ( rulePatternExpCS )
-                    // InternalOCLinEcore.g:5771:1: rulePatternExpCS
+                    // InternalOCLinEcore.g:5772:6: ( rulePatternExpCS )
+                    // InternalOCLinEcore.g:5773:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
@@ -20498,13 +20498,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_1"
-    // InternalOCLinEcore.g:5781:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
+    // InternalOCLinEcore.g:5783:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
     public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5785:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
+            // InternalOCLinEcore.g:5787:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
             int alt70=2;
             int LA70_0 = input.LA(1);
 
@@ -20523,10 +20523,10 @@
             }
             switch (alt70) {
                 case 1 :
-                    // InternalOCLinEcore.g:5786:1: ( ruleMultiplicityBoundsCS )
+                    // InternalOCLinEcore.g:5788:1: ( ruleMultiplicityBoundsCS )
                     {
-                    // InternalOCLinEcore.g:5786:1: ( ruleMultiplicityBoundsCS )
-                    // InternalOCLinEcore.g:5787:1: ruleMultiplicityBoundsCS
+                    // InternalOCLinEcore.g:5788:1: ( ruleMultiplicityBoundsCS )
+                    // InternalOCLinEcore.g:5789:1: ruleMultiplicityBoundsCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
@@ -20546,10 +20546,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5792:6: ( ruleMultiplicityStringCS )
+                    // InternalOCLinEcore.g:5794:6: ( ruleMultiplicityStringCS )
                     {
-                    // InternalOCLinEcore.g:5792:6: ( ruleMultiplicityStringCS )
-                    // InternalOCLinEcore.g:5793:1: ruleMultiplicityStringCS
+                    // InternalOCLinEcore.g:5794:6: ( ruleMultiplicityStringCS )
+                    // InternalOCLinEcore.g:5795:1: ruleMultiplicityStringCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
@@ -20586,13 +20586,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_2"
-    // InternalOCLinEcore.g:5803:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
+    // InternalOCLinEcore.g:5805:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
     public final void rule__MultiplicityCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5807:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:5809:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
             int alt71=2;
             int LA71_0 = input.LA(1);
 
@@ -20611,10 +20611,10 @@
             }
             switch (alt71) {
                 case 1 :
-                    // InternalOCLinEcore.g:5808:1: ( '|?' )
+                    // InternalOCLinEcore.g:5810:1: ( '|?' )
                     {
-                    // InternalOCLinEcore.g:5808:1: ( '|?' )
-                    // InternalOCLinEcore.g:5809:1: '|?'
+                    // InternalOCLinEcore.g:5810:1: ( '|?' )
+                    // InternalOCLinEcore.g:5811:1: '|?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
@@ -20630,16 +20630,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5816:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalOCLinEcore.g:5818:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                     {
-                    // InternalOCLinEcore.g:5816:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
-                    // InternalOCLinEcore.g:5817:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalOCLinEcore.g:5818:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalOCLinEcore.g:5819:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                     }
-                    // InternalOCLinEcore.g:5818:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
-                    // InternalOCLinEcore.g:5818:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
+                    // InternalOCLinEcore.g:5820:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalOCLinEcore.g:5820:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__IsNullFreeAssignment_2_1();
@@ -20676,13 +20676,13 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAlternatives_0"
-    // InternalOCLinEcore.g:5827:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
+    // InternalOCLinEcore.g:5829:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
     public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5831:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
+            // InternalOCLinEcore.g:5833:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
             int alt72=3;
             switch ( input.LA(1) ) {
             case 64:
@@ -20710,10 +20710,10 @@
 
             switch (alt72) {
                 case 1 :
-                    // InternalOCLinEcore.g:5832:1: ( '*' )
+                    // InternalOCLinEcore.g:5834:1: ( '*' )
                     {
-                    // InternalOCLinEcore.g:5832:1: ( '*' )
-                    // InternalOCLinEcore.g:5833:1: '*'
+                    // InternalOCLinEcore.g:5834:1: ( '*' )
+                    // InternalOCLinEcore.g:5835:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
@@ -20729,10 +20729,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5840:6: ( '+' )
+                    // InternalOCLinEcore.g:5842:6: ( '+' )
                     {
-                    // InternalOCLinEcore.g:5840:6: ( '+' )
-                    // InternalOCLinEcore.g:5841:1: '+'
+                    // InternalOCLinEcore.g:5842:6: ( '+' )
+                    // InternalOCLinEcore.g:5843:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
@@ -20748,10 +20748,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLinEcore.g:5848:6: ( '?' )
+                    // InternalOCLinEcore.g:5850:6: ( '?' )
                     {
-                    // InternalOCLinEcore.g:5848:6: ( '?' )
-                    // InternalOCLinEcore.g:5849:1: '?'
+                    // InternalOCLinEcore.g:5850:6: ( '?' )
+                    // InternalOCLinEcore.g:5851:1: '?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
@@ -20784,13 +20784,13 @@
 
 
     // $ANTLR start "rule__TypeRefCS__Alternatives"
-    // InternalOCLinEcore.g:5861:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
+    // InternalOCLinEcore.g:5863:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
     public final void rule__TypeRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5865:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
+            // InternalOCLinEcore.g:5867:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
             int alt73=2;
             int LA73_0 = input.LA(1);
 
@@ -20809,10 +20809,10 @@
             }
             switch (alt73) {
                 case 1 :
-                    // InternalOCLinEcore.g:5866:1: ( ruleTypedRefCS )
+                    // InternalOCLinEcore.g:5868:1: ( ruleTypedRefCS )
                     {
-                    // InternalOCLinEcore.g:5866:1: ( ruleTypedRefCS )
-                    // InternalOCLinEcore.g:5867:1: ruleTypedRefCS
+                    // InternalOCLinEcore.g:5868:1: ( ruleTypedRefCS )
+                    // InternalOCLinEcore.g:5869:1: ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
@@ -20832,10 +20832,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5872:6: ( ruleWildcardTypeRefCS )
+                    // InternalOCLinEcore.g:5874:6: ( ruleWildcardTypeRefCS )
                     {
-                    // InternalOCLinEcore.g:5872:6: ( ruleWildcardTypeRefCS )
-                    // InternalOCLinEcore.g:5873:1: ruleWildcardTypeRefCS
+                    // InternalOCLinEcore.g:5874:6: ( ruleWildcardTypeRefCS )
+                    // InternalOCLinEcore.g:5875:1: ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
@@ -20872,13 +20872,13 @@
 
 
     // $ANTLR start "rule__ID__Alternatives"
-    // InternalOCLinEcore.g:5883:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
+    // InternalOCLinEcore.g:5885:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
     public final void rule__ID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5887:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
+            // InternalOCLinEcore.g:5889:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
             int alt74=2;
             int LA74_0 = input.LA(1);
 
@@ -20897,10 +20897,10 @@
             }
             switch (alt74) {
                 case 1 :
-                    // InternalOCLinEcore.g:5888:1: ( RULE_SIMPLE_ID )
+                    // InternalOCLinEcore.g:5890:1: ( RULE_SIMPLE_ID )
                     {
-                    // InternalOCLinEcore.g:5888:1: ( RULE_SIMPLE_ID )
-                    // InternalOCLinEcore.g:5889:1: RULE_SIMPLE_ID
+                    // InternalOCLinEcore.g:5890:1: ( RULE_SIMPLE_ID )
+                    // InternalOCLinEcore.g:5891:1: RULE_SIMPLE_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
@@ -20916,10 +20916,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5894:6: ( RULE_ESCAPED_ID )
+                    // InternalOCLinEcore.g:5896:6: ( RULE_ESCAPED_ID )
                     {
-                    // InternalOCLinEcore.g:5894:6: ( RULE_ESCAPED_ID )
-                    // InternalOCLinEcore.g:5895:1: RULE_ESCAPED_ID
+                    // InternalOCLinEcore.g:5896:6: ( RULE_ESCAPED_ID )
+                    // InternalOCLinEcore.g:5897:1: RULE_ESCAPED_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
@@ -20952,13 +20952,13 @@
 
 
     // $ANTLR start "rule__UPPER__Alternatives"
-    // InternalOCLinEcore.g:5905:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
+    // InternalOCLinEcore.g:5907:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
     public final void rule__UPPER__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5909:1: ( ( RULE_INT ) | ( '*' ) )
+            // InternalOCLinEcore.g:5911:1: ( ( RULE_INT ) | ( '*' ) )
             int alt75=2;
             int LA75_0 = input.LA(1);
 
@@ -20977,10 +20977,10 @@
             }
             switch (alt75) {
                 case 1 :
-                    // InternalOCLinEcore.g:5910:1: ( RULE_INT )
+                    // InternalOCLinEcore.g:5912:1: ( RULE_INT )
                     {
-                    // InternalOCLinEcore.g:5910:1: ( RULE_INT )
-                    // InternalOCLinEcore.g:5911:1: RULE_INT
+                    // InternalOCLinEcore.g:5912:1: ( RULE_INT )
+                    // InternalOCLinEcore.g:5913:1: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
@@ -20996,10 +20996,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:5916:6: ( '*' )
+                    // InternalOCLinEcore.g:5918:6: ( '*' )
                     {
-                    // InternalOCLinEcore.g:5916:6: ( '*' )
-                    // InternalOCLinEcore.g:5917:1: '*'
+                    // InternalOCLinEcore.g:5918:6: ( '*' )
+                    // InternalOCLinEcore.g:5919:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
@@ -21032,14 +21032,14 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__0"
-    // InternalOCLinEcore.g:5931:1: rule__TopLevelCS__Group__0 : rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 ;
+    // InternalOCLinEcore.g:5933:1: rule__TopLevelCS__Group__0 : rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 ;
     public final void rule__TopLevelCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5935:1: ( rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 )
-            // InternalOCLinEcore.g:5936:2: rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1
+            // InternalOCLinEcore.g:5937:1: ( rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1 )
+            // InternalOCLinEcore.g:5938:2: rule__TopLevelCS__Group__0__Impl rule__TopLevelCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__TopLevelCS__Group__0__Impl();
@@ -21070,23 +21070,23 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__0__Impl"
-    // InternalOCLinEcore.g:5943:1: rule__TopLevelCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:5945:1: rule__TopLevelCS__Group__0__Impl : ( () ) ;
     public final void rule__TopLevelCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5947:1: ( ( () ) )
-            // InternalOCLinEcore.g:5948:1: ( () )
+            // InternalOCLinEcore.g:5949:1: ( ( () ) )
+            // InternalOCLinEcore.g:5950:1: ( () )
             {
-            // InternalOCLinEcore.g:5948:1: ( () )
-            // InternalOCLinEcore.g:5949:1: ()
+            // InternalOCLinEcore.g:5950:1: ( () )
+            // InternalOCLinEcore.g:5951:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getTopLevelCSAction_0());
             }
-            // InternalOCLinEcore.g:5950:1: ()
-            // InternalOCLinEcore.g:5952:1:
+            // InternalOCLinEcore.g:5952:1: ()
+            // InternalOCLinEcore.g:5954:1:
             {
             }
 
@@ -21111,14 +21111,14 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__1"
-    // InternalOCLinEcore.g:5962:1: rule__TopLevelCS__Group__1 : rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 ;
+    // InternalOCLinEcore.g:5964:1: rule__TopLevelCS__Group__1 : rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 ;
     public final void rule__TopLevelCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5966:1: ( rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 )
-            // InternalOCLinEcore.g:5967:2: rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2
+            // InternalOCLinEcore.g:5968:1: ( rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2 )
+            // InternalOCLinEcore.g:5969:2: rule__TopLevelCS__Group__1__Impl rule__TopLevelCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__TopLevelCS__Group__1__Impl();
@@ -21149,22 +21149,22 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__1__Impl"
-    // InternalOCLinEcore.g:5974:1: rule__TopLevelCS__Group__1__Impl : ( ( rule__TopLevelCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:5976:1: rule__TopLevelCS__Group__1__Impl : ( ( rule__TopLevelCS__Group_1__0 )? ) ;
     public final void rule__TopLevelCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5978:1: ( ( ( rule__TopLevelCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:5979:1: ( ( rule__TopLevelCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:5980:1: ( ( ( rule__TopLevelCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:5981:1: ( ( rule__TopLevelCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:5979:1: ( ( rule__TopLevelCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:5980:1: ( rule__TopLevelCS__Group_1__0 )?
+            // InternalOCLinEcore.g:5981:1: ( ( rule__TopLevelCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:5982:1: ( rule__TopLevelCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:5981:1: ( rule__TopLevelCS__Group_1__0 )?
+            // InternalOCLinEcore.g:5983:1: ( rule__TopLevelCS__Group_1__0 )?
             int alt76=2;
             int LA76_0 = input.LA(1);
 
@@ -21173,7 +21173,7 @@
             }
             switch (alt76) {
                 case 1 :
-                    // InternalOCLinEcore.g:5981:2: rule__TopLevelCS__Group_1__0
+                    // InternalOCLinEcore.g:5983:2: rule__TopLevelCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TopLevelCS__Group_1__0();
@@ -21211,14 +21211,14 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__2"
-    // InternalOCLinEcore.g:5991:1: rule__TopLevelCS__Group__2 : rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 ;
+    // InternalOCLinEcore.g:5993:1: rule__TopLevelCS__Group__2 : rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 ;
     public final void rule__TopLevelCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:5995:1: ( rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 )
-            // InternalOCLinEcore.g:5996:2: rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3
+            // InternalOCLinEcore.g:5997:1: ( rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3 )
+            // InternalOCLinEcore.g:5998:2: rule__TopLevelCS__Group__2__Impl rule__TopLevelCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__TopLevelCS__Group__2__Impl();
@@ -21249,22 +21249,22 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__2__Impl"
-    // InternalOCLinEcore.g:6003:1: rule__TopLevelCS__Group__2__Impl : ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) ;
+    // InternalOCLinEcore.g:6005:1: rule__TopLevelCS__Group__2__Impl : ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) ;
     public final void rule__TopLevelCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6007:1: ( ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) )
-            // InternalOCLinEcore.g:6008:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
+            // InternalOCLinEcore.g:6009:1: ( ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* ) )
+            // InternalOCLinEcore.g:6010:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
             {
-            // InternalOCLinEcore.g:6008:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
-            // InternalOCLinEcore.g:6009:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
+            // InternalOCLinEcore.g:6010:1: ( ( rule__TopLevelCS__OwnedImportsAssignment_2 )* )
+            // InternalOCLinEcore.g:6011:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getOwnedImportsAssignment_2());
             }
-            // InternalOCLinEcore.g:6010:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
+            // InternalOCLinEcore.g:6012:1: ( rule__TopLevelCS__OwnedImportsAssignment_2 )*
             loop77:
             do {
                 int alt77=2;
@@ -21277,7 +21277,7 @@
 
                 switch (alt77) {
             	case 1 :
-            	    // InternalOCLinEcore.g:6010:2: rule__TopLevelCS__OwnedImportsAssignment_2
+            	    // InternalOCLinEcore.g:6012:2: rule__TopLevelCS__OwnedImportsAssignment_2
             	    {
             	    pushFollow(FollowSets000.FOLLOW_5);
             	    rule__TopLevelCS__OwnedImportsAssignment_2();
@@ -21318,14 +21318,14 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__3"
-    // InternalOCLinEcore.g:6020:1: rule__TopLevelCS__Group__3 : rule__TopLevelCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:6022:1: rule__TopLevelCS__Group__3 : rule__TopLevelCS__Group__3__Impl ;
     public final void rule__TopLevelCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6024:1: ( rule__TopLevelCS__Group__3__Impl )
-            // InternalOCLinEcore.g:6025:2: rule__TopLevelCS__Group__3__Impl
+            // InternalOCLinEcore.g:6026:1: ( rule__TopLevelCS__Group__3__Impl )
+            // InternalOCLinEcore.g:6027:2: rule__TopLevelCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TopLevelCS__Group__3__Impl();
@@ -21351,22 +21351,22 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group__3__Impl"
-    // InternalOCLinEcore.g:6031:1: rule__TopLevelCS__Group__3__Impl : ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) ;
+    // InternalOCLinEcore.g:6033:1: rule__TopLevelCS__Group__3__Impl : ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) ;
     public final void rule__TopLevelCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6035:1: ( ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) )
-            // InternalOCLinEcore.g:6036:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
+            // InternalOCLinEcore.g:6037:1: ( ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* ) )
+            // InternalOCLinEcore.g:6038:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
             {
-            // InternalOCLinEcore.g:6036:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
-            // InternalOCLinEcore.g:6037:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
+            // InternalOCLinEcore.g:6038:1: ( ( rule__TopLevelCS__OwnedPackagesAssignment_3 )* )
+            // InternalOCLinEcore.g:6039:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getOwnedPackagesAssignment_3());
             }
-            // InternalOCLinEcore.g:6038:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
+            // InternalOCLinEcore.g:6040:1: ( rule__TopLevelCS__OwnedPackagesAssignment_3 )*
             loop78:
             do {
                 int alt78=2;
@@ -21379,7 +21379,7 @@
 
                 switch (alt78) {
             	case 1 :
-            	    // InternalOCLinEcore.g:6038:2: rule__TopLevelCS__OwnedPackagesAssignment_3
+            	    // InternalOCLinEcore.g:6040:2: rule__TopLevelCS__OwnedPackagesAssignment_3
             	    {
             	    pushFollow(FollowSets000.FOLLOW_6);
             	    rule__TopLevelCS__OwnedPackagesAssignment_3();
@@ -21420,14 +21420,14 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group_1__0"
-    // InternalOCLinEcore.g:6056:1: rule__TopLevelCS__Group_1__0 : rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 ;
+    // InternalOCLinEcore.g:6058:1: rule__TopLevelCS__Group_1__0 : rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 ;
     public final void rule__TopLevelCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6060:1: ( rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 )
-            // InternalOCLinEcore.g:6061:2: rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1
+            // InternalOCLinEcore.g:6062:1: ( rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1 )
+            // InternalOCLinEcore.g:6063:2: rule__TopLevelCS__Group_1__0__Impl rule__TopLevelCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TopLevelCS__Group_1__0__Impl();
@@ -21458,17 +21458,17 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:6068:1: rule__TopLevelCS__Group_1__0__Impl : ( 'module' ) ;
+    // InternalOCLinEcore.g:6070:1: rule__TopLevelCS__Group_1__0__Impl : ( 'module' ) ;
     public final void rule__TopLevelCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6072:1: ( ( 'module' ) )
-            // InternalOCLinEcore.g:6073:1: ( 'module' )
+            // InternalOCLinEcore.g:6074:1: ( ( 'module' ) )
+            // InternalOCLinEcore.g:6075:1: ( 'module' )
             {
-            // InternalOCLinEcore.g:6073:1: ( 'module' )
-            // InternalOCLinEcore.g:6074:1: 'module'
+            // InternalOCLinEcore.g:6075:1: ( 'module' )
+            // InternalOCLinEcore.g:6076:1: 'module'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getModuleKeyword_1_0());
@@ -21499,14 +21499,14 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group_1__1"
-    // InternalOCLinEcore.g:6087:1: rule__TopLevelCS__Group_1__1 : rule__TopLevelCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:6089:1: rule__TopLevelCS__Group_1__1 : rule__TopLevelCS__Group_1__1__Impl ;
     public final void rule__TopLevelCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6091:1: ( rule__TopLevelCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:6092:2: rule__TopLevelCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:6093:1: ( rule__TopLevelCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:6094:2: rule__TopLevelCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TopLevelCS__Group_1__1__Impl();
@@ -21532,17 +21532,17 @@
 
 
     // $ANTLR start "rule__TopLevelCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:6098:1: rule__TopLevelCS__Group_1__1__Impl : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:6100:1: rule__TopLevelCS__Group_1__1__Impl : ( ruleUnrestrictedName ) ;
     public final void rule__TopLevelCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6102:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:6103:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:6104:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:6105:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:6103:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:6104:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:6105:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:6106:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getUnrestrictedNameParserRuleCall_1_1());
@@ -21577,14 +21577,14 @@
 
 
     // $ANTLR start "rule__SIGNED__Group__0"
-    // InternalOCLinEcore.g:6119:1: rule__SIGNED__Group__0 : rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 ;
+    // InternalOCLinEcore.g:6121:1: rule__SIGNED__Group__0 : rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 ;
     public final void rule__SIGNED__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6123:1: ( rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 )
-            // InternalOCLinEcore.g:6124:2: rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1
+            // InternalOCLinEcore.g:6125:1: ( rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1 )
+            // InternalOCLinEcore.g:6126:2: rule__SIGNED__Group__0__Impl rule__SIGNED__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__SIGNED__Group__0__Impl();
@@ -21615,22 +21615,22 @@
 
 
     // $ANTLR start "rule__SIGNED__Group__0__Impl"
-    // InternalOCLinEcore.g:6131:1: rule__SIGNED__Group__0__Impl : ( ( '-' )? ) ;
+    // InternalOCLinEcore.g:6133:1: rule__SIGNED__Group__0__Impl : ( ( '-' )? ) ;
     public final void rule__SIGNED__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6135:1: ( ( ( '-' )? ) )
-            // InternalOCLinEcore.g:6136:1: ( ( '-' )? )
+            // InternalOCLinEcore.g:6137:1: ( ( ( '-' )? ) )
+            // InternalOCLinEcore.g:6138:1: ( ( '-' )? )
             {
-            // InternalOCLinEcore.g:6136:1: ( ( '-' )? )
-            // InternalOCLinEcore.g:6137:1: ( '-' )?
+            // InternalOCLinEcore.g:6138:1: ( ( '-' )? )
+            // InternalOCLinEcore.g:6139:1: ( '-' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSIGNEDAccess().getHyphenMinusKeyword_0());
             }
-            // InternalOCLinEcore.g:6138:1: ( '-' )?
+            // InternalOCLinEcore.g:6140:1: ( '-' )?
             int alt79=2;
             int LA79_0 = input.LA(1);
 
@@ -21639,7 +21639,7 @@
             }
             switch (alt79) {
                 case 1 :
-                    // InternalOCLinEcore.g:6139:2: '-'
+                    // InternalOCLinEcore.g:6141:2: '-'
                     {
                     match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
 
@@ -21673,14 +21673,14 @@
 
 
     // $ANTLR start "rule__SIGNED__Group__1"
-    // InternalOCLinEcore.g:6150:1: rule__SIGNED__Group__1 : rule__SIGNED__Group__1__Impl ;
+    // InternalOCLinEcore.g:6152:1: rule__SIGNED__Group__1 : rule__SIGNED__Group__1__Impl ;
     public final void rule__SIGNED__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6154:1: ( rule__SIGNED__Group__1__Impl )
-            // InternalOCLinEcore.g:6155:2: rule__SIGNED__Group__1__Impl
+            // InternalOCLinEcore.g:6156:1: ( rule__SIGNED__Group__1__Impl )
+            // InternalOCLinEcore.g:6157:2: rule__SIGNED__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SIGNED__Group__1__Impl();
@@ -21706,17 +21706,17 @@
 
 
     // $ANTLR start "rule__SIGNED__Group__1__Impl"
-    // InternalOCLinEcore.g:6161:1: rule__SIGNED__Group__1__Impl : ( RULE_INT ) ;
+    // InternalOCLinEcore.g:6163:1: rule__SIGNED__Group__1__Impl : ( RULE_INT ) ;
     public final void rule__SIGNED__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6165:1: ( ( RULE_INT ) )
-            // InternalOCLinEcore.g:6166:1: ( RULE_INT )
+            // InternalOCLinEcore.g:6167:1: ( ( RULE_INT ) )
+            // InternalOCLinEcore.g:6168:1: ( RULE_INT )
             {
-            // InternalOCLinEcore.g:6166:1: ( RULE_INT )
-            // InternalOCLinEcore.g:6167:1: RULE_INT
+            // InternalOCLinEcore.g:6168:1: ( RULE_INT )
+            // InternalOCLinEcore.g:6169:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSIGNEDAccess().getINTTerminalRuleCall_1());
@@ -21747,14 +21747,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__0"
-    // InternalOCLinEcore.g:6182:1: rule__InvariantConstraintCS__Group__0 : rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 ;
+    // InternalOCLinEcore.g:6184:1: rule__InvariantConstraintCS__Group__0 : rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 ;
     public final void rule__InvariantConstraintCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6186:1: ( rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 )
-            // InternalOCLinEcore.g:6187:2: rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1
+            // InternalOCLinEcore.g:6188:1: ( rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1 )
+            // InternalOCLinEcore.g:6189:2: rule__InvariantConstraintCS__Group__0__Impl rule__InvariantConstraintCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_9);
             rule__InvariantConstraintCS__Group__0__Impl();
@@ -21785,22 +21785,22 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__0__Impl"
-    // InternalOCLinEcore.g:6194:1: rule__InvariantConstraintCS__Group__0__Impl : ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) ;
+    // InternalOCLinEcore.g:6196:1: rule__InvariantConstraintCS__Group__0__Impl : ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) ;
     public final void rule__InvariantConstraintCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6198:1: ( ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) )
-            // InternalOCLinEcore.g:6199:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
+            // InternalOCLinEcore.g:6200:1: ( ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? ) )
+            // InternalOCLinEcore.g:6201:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
             {
-            // InternalOCLinEcore.g:6199:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
-            // InternalOCLinEcore.g:6200:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
+            // InternalOCLinEcore.g:6201:1: ( ( rule__InvariantConstraintCS__IsCallableAssignment_0 )? )
+            // InternalOCLinEcore.g:6202:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableAssignment_0());
             }
-            // InternalOCLinEcore.g:6201:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
+            // InternalOCLinEcore.g:6203:1: ( rule__InvariantConstraintCS__IsCallableAssignment_0 )?
             int alt80=2;
             int LA80_0 = input.LA(1);
 
@@ -21809,7 +21809,7 @@
             }
             switch (alt80) {
                 case 1 :
-                    // InternalOCLinEcore.g:6201:2: rule__InvariantConstraintCS__IsCallableAssignment_0
+                    // InternalOCLinEcore.g:6203:2: rule__InvariantConstraintCS__IsCallableAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvariantConstraintCS__IsCallableAssignment_0();
@@ -21847,14 +21847,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__1"
-    // InternalOCLinEcore.g:6211:1: rule__InvariantConstraintCS__Group__1 : rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 ;
+    // InternalOCLinEcore.g:6213:1: rule__InvariantConstraintCS__Group__1 : rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 ;
     public final void rule__InvariantConstraintCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6215:1: ( rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 )
-            // InternalOCLinEcore.g:6216:2: rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2
+            // InternalOCLinEcore.g:6217:1: ( rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2 )
+            // InternalOCLinEcore.g:6218:2: rule__InvariantConstraintCS__Group__1__Impl rule__InvariantConstraintCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__InvariantConstraintCS__Group__1__Impl();
@@ -21885,23 +21885,23 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__1__Impl"
-    // InternalOCLinEcore.g:6223:1: rule__InvariantConstraintCS__Group__1__Impl : ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:6225:1: rule__InvariantConstraintCS__Group__1__Impl : ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) ;
     public final void rule__InvariantConstraintCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6227:1: ( ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) )
-            // InternalOCLinEcore.g:6228:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
+            // InternalOCLinEcore.g:6229:1: ( ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) ) )
+            // InternalOCLinEcore.g:6230:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:6228:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
-            // InternalOCLinEcore.g:6229:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
+            // InternalOCLinEcore.g:6230:1: ( ( rule__InvariantConstraintCS__StereotypeAssignment_1 ) )
+            // InternalOCLinEcore.g:6231:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeAssignment_1());
             }
-            // InternalOCLinEcore.g:6230:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
-            // InternalOCLinEcore.g:6230:2: rule__InvariantConstraintCS__StereotypeAssignment_1
+            // InternalOCLinEcore.g:6232:1: ( rule__InvariantConstraintCS__StereotypeAssignment_1 )
+            // InternalOCLinEcore.g:6232:2: rule__InvariantConstraintCS__StereotypeAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__StereotypeAssignment_1();
@@ -21936,14 +21936,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__2"
-    // InternalOCLinEcore.g:6240:1: rule__InvariantConstraintCS__Group__2 : rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 ;
+    // InternalOCLinEcore.g:6242:1: rule__InvariantConstraintCS__Group__2 : rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 ;
     public final void rule__InvariantConstraintCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6244:1: ( rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 )
-            // InternalOCLinEcore.g:6245:2: rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3
+            // InternalOCLinEcore.g:6246:1: ( rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3 )
+            // InternalOCLinEcore.g:6247:2: rule__InvariantConstraintCS__Group__2__Impl rule__InvariantConstraintCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__InvariantConstraintCS__Group__2__Impl();
@@ -21974,22 +21974,22 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__2__Impl"
-    // InternalOCLinEcore.g:6252:1: rule__InvariantConstraintCS__Group__2__Impl : ( ( rule__InvariantConstraintCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:6254:1: rule__InvariantConstraintCS__Group__2__Impl : ( ( rule__InvariantConstraintCS__Group_2__0 )? ) ;
     public final void rule__InvariantConstraintCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6256:1: ( ( ( rule__InvariantConstraintCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:6257:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:6258:1: ( ( ( rule__InvariantConstraintCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:6259:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:6257:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:6258:1: ( rule__InvariantConstraintCS__Group_2__0 )?
+            // InternalOCLinEcore.g:6259:1: ( ( rule__InvariantConstraintCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:6260:1: ( rule__InvariantConstraintCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:6259:1: ( rule__InvariantConstraintCS__Group_2__0 )?
+            // InternalOCLinEcore.g:6261:1: ( rule__InvariantConstraintCS__Group_2__0 )?
             int alt81=2;
             int LA81_0 = input.LA(1);
 
@@ -21998,7 +21998,7 @@
             }
             switch (alt81) {
                 case 1 :
-                    // InternalOCLinEcore.g:6259:2: rule__InvariantConstraintCS__Group_2__0
+                    // InternalOCLinEcore.g:6261:2: rule__InvariantConstraintCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvariantConstraintCS__Group_2__0();
@@ -22036,14 +22036,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__3"
-    // InternalOCLinEcore.g:6269:1: rule__InvariantConstraintCS__Group__3 : rule__InvariantConstraintCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:6271:1: rule__InvariantConstraintCS__Group__3 : rule__InvariantConstraintCS__Group__3__Impl ;
     public final void rule__InvariantConstraintCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6273:1: ( rule__InvariantConstraintCS__Group__3__Impl )
-            // InternalOCLinEcore.g:6274:2: rule__InvariantConstraintCS__Group__3__Impl
+            // InternalOCLinEcore.g:6275:1: ( rule__InvariantConstraintCS__Group__3__Impl )
+            // InternalOCLinEcore.g:6276:2: rule__InvariantConstraintCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__Group__3__Impl();
@@ -22069,23 +22069,23 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group__3__Impl"
-    // InternalOCLinEcore.g:6280:1: rule__InvariantConstraintCS__Group__3__Impl : ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) ;
+    // InternalOCLinEcore.g:6282:1: rule__InvariantConstraintCS__Group__3__Impl : ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) ;
     public final void rule__InvariantConstraintCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6284:1: ( ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) )
-            // InternalOCLinEcore.g:6285:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
+            // InternalOCLinEcore.g:6286:1: ( ( ( rule__InvariantConstraintCS__Alternatives_3 ) ) )
+            // InternalOCLinEcore.g:6287:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
             {
-            // InternalOCLinEcore.g:6285:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
-            // InternalOCLinEcore.g:6286:1: ( rule__InvariantConstraintCS__Alternatives_3 )
+            // InternalOCLinEcore.g:6287:1: ( ( rule__InvariantConstraintCS__Alternatives_3 ) )
+            // InternalOCLinEcore.g:6288:1: ( rule__InvariantConstraintCS__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getAlternatives_3());
             }
-            // InternalOCLinEcore.g:6287:1: ( rule__InvariantConstraintCS__Alternatives_3 )
-            // InternalOCLinEcore.g:6287:2: rule__InvariantConstraintCS__Alternatives_3
+            // InternalOCLinEcore.g:6289:1: ( rule__InvariantConstraintCS__Alternatives_3 )
+            // InternalOCLinEcore.g:6289:2: rule__InvariantConstraintCS__Alternatives_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__Alternatives_3();
@@ -22120,14 +22120,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2__0"
-    // InternalOCLinEcore.g:6305:1: rule__InvariantConstraintCS__Group_2__0 : rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 ;
+    // InternalOCLinEcore.g:6307:1: rule__InvariantConstraintCS__Group_2__0 : rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 ;
     public final void rule__InvariantConstraintCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6309:1: ( rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 )
-            // InternalOCLinEcore.g:6310:2: rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1
+            // InternalOCLinEcore.g:6311:1: ( rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1 )
+            // InternalOCLinEcore.g:6312:2: rule__InvariantConstraintCS__Group_2__0__Impl rule__InvariantConstraintCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__InvariantConstraintCS__Group_2__0__Impl();
@@ -22158,23 +22158,23 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:6317:1: rule__InvariantConstraintCS__Group_2__0__Impl : ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) ;
+    // InternalOCLinEcore.g:6319:1: rule__InvariantConstraintCS__Group_2__0__Impl : ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) ;
     public final void rule__InvariantConstraintCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6321:1: ( ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) )
-            // InternalOCLinEcore.g:6322:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
+            // InternalOCLinEcore.g:6323:1: ( ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) ) )
+            // InternalOCLinEcore.g:6324:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
             {
-            // InternalOCLinEcore.g:6322:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
-            // InternalOCLinEcore.g:6323:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
+            // InternalOCLinEcore.g:6324:1: ( ( rule__InvariantConstraintCS__NameAssignment_2_0 ) )
+            // InternalOCLinEcore.g:6325:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getNameAssignment_2_0());
             }
-            // InternalOCLinEcore.g:6324:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
-            // InternalOCLinEcore.g:6324:2: rule__InvariantConstraintCS__NameAssignment_2_0
+            // InternalOCLinEcore.g:6326:1: ( rule__InvariantConstraintCS__NameAssignment_2_0 )
+            // InternalOCLinEcore.g:6326:2: rule__InvariantConstraintCS__NameAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__NameAssignment_2_0();
@@ -22209,14 +22209,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2__1"
-    // InternalOCLinEcore.g:6334:1: rule__InvariantConstraintCS__Group_2__1 : rule__InvariantConstraintCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:6336:1: rule__InvariantConstraintCS__Group_2__1 : rule__InvariantConstraintCS__Group_2__1__Impl ;
     public final void rule__InvariantConstraintCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6338:1: ( rule__InvariantConstraintCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:6339:2: rule__InvariantConstraintCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:6340:1: ( rule__InvariantConstraintCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:6341:2: rule__InvariantConstraintCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__Group_2__1__Impl();
@@ -22242,22 +22242,22 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:6345:1: rule__InvariantConstraintCS__Group_2__1__Impl : ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) ;
+    // InternalOCLinEcore.g:6347:1: rule__InvariantConstraintCS__Group_2__1__Impl : ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) ;
     public final void rule__InvariantConstraintCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6349:1: ( ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) )
-            // InternalOCLinEcore.g:6350:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
+            // InternalOCLinEcore.g:6351:1: ( ( ( rule__InvariantConstraintCS__Group_2_1__0 )? ) )
+            // InternalOCLinEcore.g:6352:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
             {
-            // InternalOCLinEcore.g:6350:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
-            // InternalOCLinEcore.g:6351:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
+            // InternalOCLinEcore.g:6352:1: ( ( rule__InvariantConstraintCS__Group_2_1__0 )? )
+            // InternalOCLinEcore.g:6353:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:6352:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
+            // InternalOCLinEcore.g:6354:1: ( rule__InvariantConstraintCS__Group_2_1__0 )?
             int alt82=2;
             int LA82_0 = input.LA(1);
 
@@ -22266,7 +22266,7 @@
             }
             switch (alt82) {
                 case 1 :
-                    // InternalOCLinEcore.g:6352:2: rule__InvariantConstraintCS__Group_2_1__0
+                    // InternalOCLinEcore.g:6354:2: rule__InvariantConstraintCS__Group_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvariantConstraintCS__Group_2_1__0();
@@ -22304,14 +22304,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__0"
-    // InternalOCLinEcore.g:6366:1: rule__InvariantConstraintCS__Group_2_1__0 : rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:6368:1: rule__InvariantConstraintCS__Group_2_1__0 : rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 ;
     public final void rule__InvariantConstraintCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6370:1: ( rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:6371:2: rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1
+            // InternalOCLinEcore.g:6372:1: ( rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:6373:2: rule__InvariantConstraintCS__Group_2_1__0__Impl rule__InvariantConstraintCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__InvariantConstraintCS__Group_2_1__0__Impl();
@@ -22342,17 +22342,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:6378:1: rule__InvariantConstraintCS__Group_2_1__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:6380:1: rule__InvariantConstraintCS__Group_2_1__0__Impl : ( '(' ) ;
     public final void rule__InvariantConstraintCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6382:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:6383:1: ( '(' )
+            // InternalOCLinEcore.g:6384:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:6385:1: ( '(' )
             {
-            // InternalOCLinEcore.g:6383:1: ( '(' )
-            // InternalOCLinEcore.g:6384:1: '('
+            // InternalOCLinEcore.g:6385:1: ( '(' )
+            // InternalOCLinEcore.g:6386:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getLeftParenthesisKeyword_2_1_0());
@@ -22383,14 +22383,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__1"
-    // InternalOCLinEcore.g:6397:1: rule__InvariantConstraintCS__Group_2_1__1 : rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 ;
+    // InternalOCLinEcore.g:6399:1: rule__InvariantConstraintCS__Group_2_1__1 : rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 ;
     public final void rule__InvariantConstraintCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6401:1: ( rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 )
-            // InternalOCLinEcore.g:6402:2: rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2
+            // InternalOCLinEcore.g:6403:1: ( rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2 )
+            // InternalOCLinEcore.g:6404:2: rule__InvariantConstraintCS__Group_2_1__1__Impl rule__InvariantConstraintCS__Group_2_1__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__InvariantConstraintCS__Group_2_1__1__Impl();
@@ -22421,23 +22421,23 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:6409:1: rule__InvariantConstraintCS__Group_2_1__1__Impl : ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:6411:1: rule__InvariantConstraintCS__Group_2_1__1__Impl : ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) ;
     public final void rule__InvariantConstraintCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6413:1: ( ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) )
-            // InternalOCLinEcore.g:6414:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:6415:1: ( ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) ) )
+            // InternalOCLinEcore.g:6416:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:6414:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
-            // InternalOCLinEcore.g:6415:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
+            // InternalOCLinEcore.g:6416:1: ( ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:6417:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationAssignment_2_1_1());
             }
-            // InternalOCLinEcore.g:6416:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
-            // InternalOCLinEcore.g:6416:2: rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1
+            // InternalOCLinEcore.g:6418:1: ( rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 )
+            // InternalOCLinEcore.g:6418:2: rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1();
@@ -22472,14 +22472,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__2"
-    // InternalOCLinEcore.g:6426:1: rule__InvariantConstraintCS__Group_2_1__2 : rule__InvariantConstraintCS__Group_2_1__2__Impl ;
+    // InternalOCLinEcore.g:6428:1: rule__InvariantConstraintCS__Group_2_1__2 : rule__InvariantConstraintCS__Group_2_1__2__Impl ;
     public final void rule__InvariantConstraintCS__Group_2_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6430:1: ( rule__InvariantConstraintCS__Group_2_1__2__Impl )
-            // InternalOCLinEcore.g:6431:2: rule__InvariantConstraintCS__Group_2_1__2__Impl
+            // InternalOCLinEcore.g:6432:1: ( rule__InvariantConstraintCS__Group_2_1__2__Impl )
+            // InternalOCLinEcore.g:6433:2: rule__InvariantConstraintCS__Group_2_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__Group_2_1__2__Impl();
@@ -22505,17 +22505,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_2_1__2__Impl"
-    // InternalOCLinEcore.g:6437:1: rule__InvariantConstraintCS__Group_2_1__2__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:6439:1: rule__InvariantConstraintCS__Group_2_1__2__Impl : ( ')' ) ;
     public final void rule__InvariantConstraintCS__Group_2_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6441:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:6442:1: ( ')' )
+            // InternalOCLinEcore.g:6443:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:6444:1: ( ')' )
             {
-            // InternalOCLinEcore.g:6442:1: ( ')' )
-            // InternalOCLinEcore.g:6443:1: ')'
+            // InternalOCLinEcore.g:6444:1: ( ')' )
+            // InternalOCLinEcore.g:6445:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getRightParenthesisKeyword_2_1_2());
@@ -22546,14 +22546,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__0"
-    // InternalOCLinEcore.g:6462:1: rule__InvariantConstraintCS__Group_3_0__0 : rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 ;
+    // InternalOCLinEcore.g:6464:1: rule__InvariantConstraintCS__Group_3_0__0 : rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 ;
     public final void rule__InvariantConstraintCS__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6466:1: ( rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 )
-            // InternalOCLinEcore.g:6467:2: rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1
+            // InternalOCLinEcore.g:6468:1: ( rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1 )
+            // InternalOCLinEcore.g:6469:2: rule__InvariantConstraintCS__Group_3_0__0__Impl rule__InvariantConstraintCS__Group_3_0__1
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__InvariantConstraintCS__Group_3_0__0__Impl();
@@ -22584,17 +22584,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__0__Impl"
-    // InternalOCLinEcore.g:6474:1: rule__InvariantConstraintCS__Group_3_0__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:6476:1: rule__InvariantConstraintCS__Group_3_0__0__Impl : ( ':' ) ;
     public final void rule__InvariantConstraintCS__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6478:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:6479:1: ( ':' )
+            // InternalOCLinEcore.g:6480:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:6481:1: ( ':' )
             {
-            // InternalOCLinEcore.g:6479:1: ( ':' )
-            // InternalOCLinEcore.g:6480:1: ':'
+            // InternalOCLinEcore.g:6481:1: ( ':' )
+            // InternalOCLinEcore.g:6482:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getColonKeyword_3_0_0());
@@ -22625,14 +22625,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__1"
-    // InternalOCLinEcore.g:6493:1: rule__InvariantConstraintCS__Group_3_0__1 : rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 ;
+    // InternalOCLinEcore.g:6495:1: rule__InvariantConstraintCS__Group_3_0__1 : rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 ;
     public final void rule__InvariantConstraintCS__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6497:1: ( rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 )
-            // InternalOCLinEcore.g:6498:2: rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2
+            // InternalOCLinEcore.g:6499:1: ( rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2 )
+            // InternalOCLinEcore.g:6500:2: rule__InvariantConstraintCS__Group_3_0__1__Impl rule__InvariantConstraintCS__Group_3_0__2
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__InvariantConstraintCS__Group_3_0__1__Impl();
@@ -22663,22 +22663,22 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__1__Impl"
-    // InternalOCLinEcore.g:6505:1: rule__InvariantConstraintCS__Group_3_0__1__Impl : ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) ;
+    // InternalOCLinEcore.g:6507:1: rule__InvariantConstraintCS__Group_3_0__1__Impl : ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) ;
     public final void rule__InvariantConstraintCS__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6509:1: ( ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) )
-            // InternalOCLinEcore.g:6510:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
+            // InternalOCLinEcore.g:6511:1: ( ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? ) )
+            // InternalOCLinEcore.g:6512:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
             {
-            // InternalOCLinEcore.g:6510:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
-            // InternalOCLinEcore.g:6511:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
+            // InternalOCLinEcore.g:6512:1: ( ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )? )
+            // InternalOCLinEcore.g:6513:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationAssignment_3_0_1());
             }
-            // InternalOCLinEcore.g:6512:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
+            // InternalOCLinEcore.g:6514:1: ( rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 )?
             int alt83=2;
             int LA83_0 = input.LA(1);
 
@@ -22687,7 +22687,7 @@
             }
             switch (alt83) {
                 case 1 :
-                    // InternalOCLinEcore.g:6512:2: rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1
+                    // InternalOCLinEcore.g:6514:2: rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1();
@@ -22725,14 +22725,14 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__2"
-    // InternalOCLinEcore.g:6522:1: rule__InvariantConstraintCS__Group_3_0__2 : rule__InvariantConstraintCS__Group_3_0__2__Impl ;
+    // InternalOCLinEcore.g:6524:1: rule__InvariantConstraintCS__Group_3_0__2 : rule__InvariantConstraintCS__Group_3_0__2__Impl ;
     public final void rule__InvariantConstraintCS__Group_3_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6526:1: ( rule__InvariantConstraintCS__Group_3_0__2__Impl )
-            // InternalOCLinEcore.g:6527:2: rule__InvariantConstraintCS__Group_3_0__2__Impl
+            // InternalOCLinEcore.g:6528:1: ( rule__InvariantConstraintCS__Group_3_0__2__Impl )
+            // InternalOCLinEcore.g:6529:2: rule__InvariantConstraintCS__Group_3_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvariantConstraintCS__Group_3_0__2__Impl();
@@ -22758,17 +22758,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__Group_3_0__2__Impl"
-    // InternalOCLinEcore.g:6533:1: rule__InvariantConstraintCS__Group_3_0__2__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:6535:1: rule__InvariantConstraintCS__Group_3_0__2__Impl : ( ';' ) ;
     public final void rule__InvariantConstraintCS__Group_3_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6537:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:6538:1: ( ';' )
+            // InternalOCLinEcore.g:6539:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:6540:1: ( ';' )
             {
-            // InternalOCLinEcore.g:6538:1: ( ';' )
-            // InternalOCLinEcore.g:6539:1: ';'
+            // InternalOCLinEcore.g:6540:1: ( ';' )
+            // InternalOCLinEcore.g:6541:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getSemicolonKeyword_3_0_2());
@@ -22799,14 +22799,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__0"
-    // InternalOCLinEcore.g:6558:1: rule__PostconditionConstraintCS__Group__0 : rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 ;
+    // InternalOCLinEcore.g:6560:1: rule__PostconditionConstraintCS__Group__0 : rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 ;
     public final void rule__PostconditionConstraintCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6562:1: ( rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 )
-            // InternalOCLinEcore.g:6563:2: rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1
+            // InternalOCLinEcore.g:6564:1: ( rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1 )
+            // InternalOCLinEcore.g:6565:2: rule__PostconditionConstraintCS__Group__0__Impl rule__PostconditionConstraintCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__PostconditionConstraintCS__Group__0__Impl();
@@ -22837,23 +22837,23 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__0__Impl"
-    // InternalOCLinEcore.g:6570:1: rule__PostconditionConstraintCS__Group__0__Impl : ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:6572:1: rule__PostconditionConstraintCS__Group__0__Impl : ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) ;
     public final void rule__PostconditionConstraintCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6574:1: ( ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) )
-            // InternalOCLinEcore.g:6575:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
+            // InternalOCLinEcore.g:6576:1: ( ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) ) )
+            // InternalOCLinEcore.g:6577:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:6575:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
-            // InternalOCLinEcore.g:6576:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
+            // InternalOCLinEcore.g:6577:1: ( ( rule__PostconditionConstraintCS__StereotypeAssignment_0 ) )
+            // InternalOCLinEcore.g:6578:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypeAssignment_0());
             }
-            // InternalOCLinEcore.g:6577:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
-            // InternalOCLinEcore.g:6577:2: rule__PostconditionConstraintCS__StereotypeAssignment_0
+            // InternalOCLinEcore.g:6579:1: ( rule__PostconditionConstraintCS__StereotypeAssignment_0 )
+            // InternalOCLinEcore.g:6579:2: rule__PostconditionConstraintCS__StereotypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostconditionConstraintCS__StereotypeAssignment_0();
@@ -22888,14 +22888,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__1"
-    // InternalOCLinEcore.g:6587:1: rule__PostconditionConstraintCS__Group__1 : rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 ;
+    // InternalOCLinEcore.g:6589:1: rule__PostconditionConstraintCS__Group__1 : rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 ;
     public final void rule__PostconditionConstraintCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6591:1: ( rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 )
-            // InternalOCLinEcore.g:6592:2: rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2
+            // InternalOCLinEcore.g:6593:1: ( rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2 )
+            // InternalOCLinEcore.g:6594:2: rule__PostconditionConstraintCS__Group__1__Impl rule__PostconditionConstraintCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__PostconditionConstraintCS__Group__1__Impl();
@@ -22926,22 +22926,22 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__1__Impl"
-    // InternalOCLinEcore.g:6599:1: rule__PostconditionConstraintCS__Group__1__Impl : ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:6601:1: rule__PostconditionConstraintCS__Group__1__Impl : ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) ;
     public final void rule__PostconditionConstraintCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6603:1: ( ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:6604:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:6605:1: ( ( ( rule__PostconditionConstraintCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:6606:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:6604:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:6605:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
+            // InternalOCLinEcore.g:6606:1: ( ( rule__PostconditionConstraintCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:6607:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:6606:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
+            // InternalOCLinEcore.g:6608:1: ( rule__PostconditionConstraintCS__Group_1__0 )?
             int alt84=2;
             int LA84_0 = input.LA(1);
 
@@ -22950,7 +22950,7 @@
             }
             switch (alt84) {
                 case 1 :
-                    // InternalOCLinEcore.g:6606:2: rule__PostconditionConstraintCS__Group_1__0
+                    // InternalOCLinEcore.g:6608:2: rule__PostconditionConstraintCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PostconditionConstraintCS__Group_1__0();
@@ -22988,14 +22988,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__2"
-    // InternalOCLinEcore.g:6616:1: rule__PostconditionConstraintCS__Group__2 : rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 ;
+    // InternalOCLinEcore.g:6618:1: rule__PostconditionConstraintCS__Group__2 : rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 ;
     public final void rule__PostconditionConstraintCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6620:1: ( rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 )
-            // InternalOCLinEcore.g:6621:2: rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3
+            // InternalOCLinEcore.g:6622:1: ( rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3 )
+            // InternalOCLinEcore.g:6623:2: rule__PostconditionConstraintCS__Group__2__Impl rule__PostconditionConstraintCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__PostconditionConstraintCS__Group__2__Impl();
@@ -23026,17 +23026,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__2__Impl"
-    // InternalOCLinEcore.g:6628:1: rule__PostconditionConstraintCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:6630:1: rule__PostconditionConstraintCS__Group__2__Impl : ( ':' ) ;
     public final void rule__PostconditionConstraintCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6632:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:6633:1: ( ':' )
+            // InternalOCLinEcore.g:6634:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:6635:1: ( ':' )
             {
-            // InternalOCLinEcore.g:6633:1: ( ':' )
-            // InternalOCLinEcore.g:6634:1: ':'
+            // InternalOCLinEcore.g:6635:1: ( ':' )
+            // InternalOCLinEcore.g:6636:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getColonKeyword_2());
@@ -23067,14 +23067,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__3"
-    // InternalOCLinEcore.g:6647:1: rule__PostconditionConstraintCS__Group__3 : rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 ;
+    // InternalOCLinEcore.g:6649:1: rule__PostconditionConstraintCS__Group__3 : rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 ;
     public final void rule__PostconditionConstraintCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6651:1: ( rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 )
-            // InternalOCLinEcore.g:6652:2: rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4
+            // InternalOCLinEcore.g:6653:1: ( rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4 )
+            // InternalOCLinEcore.g:6654:2: rule__PostconditionConstraintCS__Group__3__Impl rule__PostconditionConstraintCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__PostconditionConstraintCS__Group__3__Impl();
@@ -23105,22 +23105,22 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__3__Impl"
-    // InternalOCLinEcore.g:6659:1: rule__PostconditionConstraintCS__Group__3__Impl : ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) ;
+    // InternalOCLinEcore.g:6661:1: rule__PostconditionConstraintCS__Group__3__Impl : ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) ;
     public final void rule__PostconditionConstraintCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6663:1: ( ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
-            // InternalOCLinEcore.g:6664:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
+            // InternalOCLinEcore.g:6665:1: ( ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
+            // InternalOCLinEcore.g:6666:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
             {
-            // InternalOCLinEcore.g:6664:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
-            // InternalOCLinEcore.g:6665:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
+            // InternalOCLinEcore.g:6666:1: ( ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
+            // InternalOCLinEcore.g:6667:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
             }
-            // InternalOCLinEcore.g:6666:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
+            // InternalOCLinEcore.g:6668:1: ( rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 )?
             int alt85=2;
             int LA85_0 = input.LA(1);
 
@@ -23129,7 +23129,7 @@
             }
             switch (alt85) {
                 case 1 :
-                    // InternalOCLinEcore.g:6666:2: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3
+                    // InternalOCLinEcore.g:6668:2: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3();
@@ -23167,14 +23167,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__4"
-    // InternalOCLinEcore.g:6676:1: rule__PostconditionConstraintCS__Group__4 : rule__PostconditionConstraintCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:6678:1: rule__PostconditionConstraintCS__Group__4 : rule__PostconditionConstraintCS__Group__4__Impl ;
     public final void rule__PostconditionConstraintCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6680:1: ( rule__PostconditionConstraintCS__Group__4__Impl )
-            // InternalOCLinEcore.g:6681:2: rule__PostconditionConstraintCS__Group__4__Impl
+            // InternalOCLinEcore.g:6682:1: ( rule__PostconditionConstraintCS__Group__4__Impl )
+            // InternalOCLinEcore.g:6683:2: rule__PostconditionConstraintCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostconditionConstraintCS__Group__4__Impl();
@@ -23200,17 +23200,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group__4__Impl"
-    // InternalOCLinEcore.g:6687:1: rule__PostconditionConstraintCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:6689:1: rule__PostconditionConstraintCS__Group__4__Impl : ( ';' ) ;
     public final void rule__PostconditionConstraintCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6691:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:6692:1: ( ';' )
+            // InternalOCLinEcore.g:6693:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:6694:1: ( ';' )
             {
-            // InternalOCLinEcore.g:6692:1: ( ';' )
-            // InternalOCLinEcore.g:6693:1: ';'
+            // InternalOCLinEcore.g:6694:1: ( ';' )
+            // InternalOCLinEcore.g:6695:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getSemicolonKeyword_4());
@@ -23241,14 +23241,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1__0"
-    // InternalOCLinEcore.g:6716:1: rule__PostconditionConstraintCS__Group_1__0 : rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 ;
+    // InternalOCLinEcore.g:6718:1: rule__PostconditionConstraintCS__Group_1__0 : rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 ;
     public final void rule__PostconditionConstraintCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6720:1: ( rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 )
-            // InternalOCLinEcore.g:6721:2: rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1
+            // InternalOCLinEcore.g:6722:1: ( rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1 )
+            // InternalOCLinEcore.g:6723:2: rule__PostconditionConstraintCS__Group_1__0__Impl rule__PostconditionConstraintCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__PostconditionConstraintCS__Group_1__0__Impl();
@@ -23279,23 +23279,23 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:6728:1: rule__PostconditionConstraintCS__Group_1__0__Impl : ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLinEcore.g:6730:1: rule__PostconditionConstraintCS__Group_1__0__Impl : ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) ;
     public final void rule__PostconditionConstraintCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6732:1: ( ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) )
-            // InternalOCLinEcore.g:6733:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
+            // InternalOCLinEcore.g:6734:1: ( ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) ) )
+            // InternalOCLinEcore.g:6735:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLinEcore.g:6733:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
-            // InternalOCLinEcore.g:6734:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
+            // InternalOCLinEcore.g:6735:1: ( ( rule__PostconditionConstraintCS__NameAssignment_1_0 ) )
+            // InternalOCLinEcore.g:6736:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLinEcore.g:6735:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
-            // InternalOCLinEcore.g:6735:2: rule__PostconditionConstraintCS__NameAssignment_1_0
+            // InternalOCLinEcore.g:6737:1: ( rule__PostconditionConstraintCS__NameAssignment_1_0 )
+            // InternalOCLinEcore.g:6737:2: rule__PostconditionConstraintCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostconditionConstraintCS__NameAssignment_1_0();
@@ -23330,14 +23330,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1__1"
-    // InternalOCLinEcore.g:6745:1: rule__PostconditionConstraintCS__Group_1__1 : rule__PostconditionConstraintCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:6747:1: rule__PostconditionConstraintCS__Group_1__1 : rule__PostconditionConstraintCS__Group_1__1__Impl ;
     public final void rule__PostconditionConstraintCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6749:1: ( rule__PostconditionConstraintCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:6750:2: rule__PostconditionConstraintCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:6751:1: ( rule__PostconditionConstraintCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:6752:2: rule__PostconditionConstraintCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostconditionConstraintCS__Group_1__1__Impl();
@@ -23363,22 +23363,22 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:6756:1: rule__PostconditionConstraintCS__Group_1__1__Impl : ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) ;
+    // InternalOCLinEcore.g:6758:1: rule__PostconditionConstraintCS__Group_1__1__Impl : ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) ;
     public final void rule__PostconditionConstraintCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6760:1: ( ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) )
-            // InternalOCLinEcore.g:6761:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:6762:1: ( ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? ) )
+            // InternalOCLinEcore.g:6763:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
             {
-            // InternalOCLinEcore.g:6761:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
-            // InternalOCLinEcore.g:6762:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:6763:1: ( ( rule__PostconditionConstraintCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:6764:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getGroup_1_1());
             }
-            // InternalOCLinEcore.g:6763:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:6765:1: ( rule__PostconditionConstraintCS__Group_1_1__0 )?
             int alt86=2;
             int LA86_0 = input.LA(1);
 
@@ -23387,7 +23387,7 @@
             }
             switch (alt86) {
                 case 1 :
-                    // InternalOCLinEcore.g:6763:2: rule__PostconditionConstraintCS__Group_1_1__0
+                    // InternalOCLinEcore.g:6765:2: rule__PostconditionConstraintCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PostconditionConstraintCS__Group_1_1__0();
@@ -23425,14 +23425,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__0"
-    // InternalOCLinEcore.g:6777:1: rule__PostconditionConstraintCS__Group_1_1__0 : rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 ;
+    // InternalOCLinEcore.g:6779:1: rule__PostconditionConstraintCS__Group_1_1__0 : rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 ;
     public final void rule__PostconditionConstraintCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6781:1: ( rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 )
-            // InternalOCLinEcore.g:6782:2: rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1
+            // InternalOCLinEcore.g:6783:1: ( rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1 )
+            // InternalOCLinEcore.g:6784:2: rule__PostconditionConstraintCS__Group_1_1__0__Impl rule__PostconditionConstraintCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__PostconditionConstraintCS__Group_1_1__0__Impl();
@@ -23463,17 +23463,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__0__Impl"
-    // InternalOCLinEcore.g:6789:1: rule__PostconditionConstraintCS__Group_1_1__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:6791:1: rule__PostconditionConstraintCS__Group_1_1__0__Impl : ( '(' ) ;
     public final void rule__PostconditionConstraintCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6793:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:6794:1: ( '(' )
+            // InternalOCLinEcore.g:6795:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:6796:1: ( '(' )
             {
-            // InternalOCLinEcore.g:6794:1: ( '(' )
-            // InternalOCLinEcore.g:6795:1: '('
+            // InternalOCLinEcore.g:6796:1: ( '(' )
+            // InternalOCLinEcore.g:6797:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
@@ -23504,14 +23504,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__1"
-    // InternalOCLinEcore.g:6808:1: rule__PostconditionConstraintCS__Group_1_1__1 : rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 ;
+    // InternalOCLinEcore.g:6810:1: rule__PostconditionConstraintCS__Group_1_1__1 : rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 ;
     public final void rule__PostconditionConstraintCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6812:1: ( rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 )
-            // InternalOCLinEcore.g:6813:2: rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2
+            // InternalOCLinEcore.g:6814:1: ( rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2 )
+            // InternalOCLinEcore.g:6815:2: rule__PostconditionConstraintCS__Group_1_1__1__Impl rule__PostconditionConstraintCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__PostconditionConstraintCS__Group_1_1__1__Impl();
@@ -23542,23 +23542,23 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__1__Impl"
-    // InternalOCLinEcore.g:6820:1: rule__PostconditionConstraintCS__Group_1_1__1__Impl : ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:6822:1: rule__PostconditionConstraintCS__Group_1_1__1__Impl : ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
     public final void rule__PostconditionConstraintCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6824:1: ( ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
-            // InternalOCLinEcore.g:6825:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:6826:1: ( ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
+            // InternalOCLinEcore.g:6827:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:6825:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
-            // InternalOCLinEcore.g:6826:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLinEcore.g:6827:1: ( ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:6828:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
             }
-            // InternalOCLinEcore.g:6827:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
-            // InternalOCLinEcore.g:6827:2: rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1
+            // InternalOCLinEcore.g:6829:1: ( rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLinEcore.g:6829:2: rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1();
@@ -23593,14 +23593,14 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__2"
-    // InternalOCLinEcore.g:6837:1: rule__PostconditionConstraintCS__Group_1_1__2 : rule__PostconditionConstraintCS__Group_1_1__2__Impl ;
+    // InternalOCLinEcore.g:6839:1: rule__PostconditionConstraintCS__Group_1_1__2 : rule__PostconditionConstraintCS__Group_1_1__2__Impl ;
     public final void rule__PostconditionConstraintCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6841:1: ( rule__PostconditionConstraintCS__Group_1_1__2__Impl )
-            // InternalOCLinEcore.g:6842:2: rule__PostconditionConstraintCS__Group_1_1__2__Impl
+            // InternalOCLinEcore.g:6843:1: ( rule__PostconditionConstraintCS__Group_1_1__2__Impl )
+            // InternalOCLinEcore.g:6844:2: rule__PostconditionConstraintCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostconditionConstraintCS__Group_1_1__2__Impl();
@@ -23626,17 +23626,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__Group_1_1__2__Impl"
-    // InternalOCLinEcore.g:6848:1: rule__PostconditionConstraintCS__Group_1_1__2__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:6850:1: rule__PostconditionConstraintCS__Group_1_1__2__Impl : ( ')' ) ;
     public final void rule__PostconditionConstraintCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6852:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:6853:1: ( ')' )
+            // InternalOCLinEcore.g:6854:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:6855:1: ( ')' )
             {
-            // InternalOCLinEcore.g:6853:1: ( ')' )
-            // InternalOCLinEcore.g:6854:1: ')'
+            // InternalOCLinEcore.g:6855:1: ( ')' )
+            // InternalOCLinEcore.g:6856:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
@@ -23667,14 +23667,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__0"
-    // InternalOCLinEcore.g:6873:1: rule__PreconditionConstraintCS__Group__0 : rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 ;
+    // InternalOCLinEcore.g:6875:1: rule__PreconditionConstraintCS__Group__0 : rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 ;
     public final void rule__PreconditionConstraintCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6877:1: ( rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 )
-            // InternalOCLinEcore.g:6878:2: rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1
+            // InternalOCLinEcore.g:6879:1: ( rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1 )
+            // InternalOCLinEcore.g:6880:2: rule__PreconditionConstraintCS__Group__0__Impl rule__PreconditionConstraintCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__PreconditionConstraintCS__Group__0__Impl();
@@ -23705,23 +23705,23 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__0__Impl"
-    // InternalOCLinEcore.g:6885:1: rule__PreconditionConstraintCS__Group__0__Impl : ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:6887:1: rule__PreconditionConstraintCS__Group__0__Impl : ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) ;
     public final void rule__PreconditionConstraintCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6889:1: ( ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) )
-            // InternalOCLinEcore.g:6890:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
+            // InternalOCLinEcore.g:6891:1: ( ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) ) )
+            // InternalOCLinEcore.g:6892:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:6890:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
-            // InternalOCLinEcore.g:6891:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
+            // InternalOCLinEcore.g:6892:1: ( ( rule__PreconditionConstraintCS__StereotypeAssignment_0 ) )
+            // InternalOCLinEcore.g:6893:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypeAssignment_0());
             }
-            // InternalOCLinEcore.g:6892:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
-            // InternalOCLinEcore.g:6892:2: rule__PreconditionConstraintCS__StereotypeAssignment_0
+            // InternalOCLinEcore.g:6894:1: ( rule__PreconditionConstraintCS__StereotypeAssignment_0 )
+            // InternalOCLinEcore.g:6894:2: rule__PreconditionConstraintCS__StereotypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreconditionConstraintCS__StereotypeAssignment_0();
@@ -23756,14 +23756,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__1"
-    // InternalOCLinEcore.g:6902:1: rule__PreconditionConstraintCS__Group__1 : rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 ;
+    // InternalOCLinEcore.g:6904:1: rule__PreconditionConstraintCS__Group__1 : rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 ;
     public final void rule__PreconditionConstraintCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6906:1: ( rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 )
-            // InternalOCLinEcore.g:6907:2: rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2
+            // InternalOCLinEcore.g:6908:1: ( rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2 )
+            // InternalOCLinEcore.g:6909:2: rule__PreconditionConstraintCS__Group__1__Impl rule__PreconditionConstraintCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__PreconditionConstraintCS__Group__1__Impl();
@@ -23794,22 +23794,22 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__1__Impl"
-    // InternalOCLinEcore.g:6914:1: rule__PreconditionConstraintCS__Group__1__Impl : ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:6916:1: rule__PreconditionConstraintCS__Group__1__Impl : ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) ;
     public final void rule__PreconditionConstraintCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6918:1: ( ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:6919:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:6920:1: ( ( ( rule__PreconditionConstraintCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:6921:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:6919:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:6920:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
+            // InternalOCLinEcore.g:6921:1: ( ( rule__PreconditionConstraintCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:6922:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:6921:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
+            // InternalOCLinEcore.g:6923:1: ( rule__PreconditionConstraintCS__Group_1__0 )?
             int alt87=2;
             int LA87_0 = input.LA(1);
 
@@ -23818,7 +23818,7 @@
             }
             switch (alt87) {
                 case 1 :
-                    // InternalOCLinEcore.g:6921:2: rule__PreconditionConstraintCS__Group_1__0
+                    // InternalOCLinEcore.g:6923:2: rule__PreconditionConstraintCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PreconditionConstraintCS__Group_1__0();
@@ -23856,14 +23856,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__2"
-    // InternalOCLinEcore.g:6931:1: rule__PreconditionConstraintCS__Group__2 : rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 ;
+    // InternalOCLinEcore.g:6933:1: rule__PreconditionConstraintCS__Group__2 : rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 ;
     public final void rule__PreconditionConstraintCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6935:1: ( rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 )
-            // InternalOCLinEcore.g:6936:2: rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3
+            // InternalOCLinEcore.g:6937:1: ( rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3 )
+            // InternalOCLinEcore.g:6938:2: rule__PreconditionConstraintCS__Group__2__Impl rule__PreconditionConstraintCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__PreconditionConstraintCS__Group__2__Impl();
@@ -23894,17 +23894,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__2__Impl"
-    // InternalOCLinEcore.g:6943:1: rule__PreconditionConstraintCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:6945:1: rule__PreconditionConstraintCS__Group__2__Impl : ( ':' ) ;
     public final void rule__PreconditionConstraintCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6947:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:6948:1: ( ':' )
+            // InternalOCLinEcore.g:6949:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:6950:1: ( ':' )
             {
-            // InternalOCLinEcore.g:6948:1: ( ':' )
-            // InternalOCLinEcore.g:6949:1: ':'
+            // InternalOCLinEcore.g:6950:1: ( ':' )
+            // InternalOCLinEcore.g:6951:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getColonKeyword_2());
@@ -23935,14 +23935,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__3"
-    // InternalOCLinEcore.g:6962:1: rule__PreconditionConstraintCS__Group__3 : rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 ;
+    // InternalOCLinEcore.g:6964:1: rule__PreconditionConstraintCS__Group__3 : rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 ;
     public final void rule__PreconditionConstraintCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6966:1: ( rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 )
-            // InternalOCLinEcore.g:6967:2: rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4
+            // InternalOCLinEcore.g:6968:1: ( rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4 )
+            // InternalOCLinEcore.g:6969:2: rule__PreconditionConstraintCS__Group__3__Impl rule__PreconditionConstraintCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__PreconditionConstraintCS__Group__3__Impl();
@@ -23973,22 +23973,22 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__3__Impl"
-    // InternalOCLinEcore.g:6974:1: rule__PreconditionConstraintCS__Group__3__Impl : ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) ;
+    // InternalOCLinEcore.g:6976:1: rule__PreconditionConstraintCS__Group__3__Impl : ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) ;
     public final void rule__PreconditionConstraintCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6978:1: ( ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
-            // InternalOCLinEcore.g:6979:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
+            // InternalOCLinEcore.g:6980:1: ( ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? ) )
+            // InternalOCLinEcore.g:6981:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
             {
-            // InternalOCLinEcore.g:6979:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
-            // InternalOCLinEcore.g:6980:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
+            // InternalOCLinEcore.g:6981:1: ( ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )? )
+            // InternalOCLinEcore.g:6982:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationAssignment_3());
             }
-            // InternalOCLinEcore.g:6981:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
+            // InternalOCLinEcore.g:6983:1: ( rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 )?
             int alt88=2;
             int LA88_0 = input.LA(1);
 
@@ -23997,7 +23997,7 @@
             }
             switch (alt88) {
                 case 1 :
-                    // InternalOCLinEcore.g:6981:2: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3
+                    // InternalOCLinEcore.g:6983:2: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3();
@@ -24035,14 +24035,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__4"
-    // InternalOCLinEcore.g:6991:1: rule__PreconditionConstraintCS__Group__4 : rule__PreconditionConstraintCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:6993:1: rule__PreconditionConstraintCS__Group__4 : rule__PreconditionConstraintCS__Group__4__Impl ;
     public final void rule__PreconditionConstraintCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:6995:1: ( rule__PreconditionConstraintCS__Group__4__Impl )
-            // InternalOCLinEcore.g:6996:2: rule__PreconditionConstraintCS__Group__4__Impl
+            // InternalOCLinEcore.g:6997:1: ( rule__PreconditionConstraintCS__Group__4__Impl )
+            // InternalOCLinEcore.g:6998:2: rule__PreconditionConstraintCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreconditionConstraintCS__Group__4__Impl();
@@ -24068,17 +24068,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group__4__Impl"
-    // InternalOCLinEcore.g:7002:1: rule__PreconditionConstraintCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:7004:1: rule__PreconditionConstraintCS__Group__4__Impl : ( ';' ) ;
     public final void rule__PreconditionConstraintCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7006:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:7007:1: ( ';' )
+            // InternalOCLinEcore.g:7008:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:7009:1: ( ';' )
             {
-            // InternalOCLinEcore.g:7007:1: ( ';' )
-            // InternalOCLinEcore.g:7008:1: ';'
+            // InternalOCLinEcore.g:7009:1: ( ';' )
+            // InternalOCLinEcore.g:7010:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getSemicolonKeyword_4());
@@ -24109,14 +24109,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1__0"
-    // InternalOCLinEcore.g:7031:1: rule__PreconditionConstraintCS__Group_1__0 : rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 ;
+    // InternalOCLinEcore.g:7033:1: rule__PreconditionConstraintCS__Group_1__0 : rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 ;
     public final void rule__PreconditionConstraintCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7035:1: ( rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 )
-            // InternalOCLinEcore.g:7036:2: rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1
+            // InternalOCLinEcore.g:7037:1: ( rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1 )
+            // InternalOCLinEcore.g:7038:2: rule__PreconditionConstraintCS__Group_1__0__Impl rule__PreconditionConstraintCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__PreconditionConstraintCS__Group_1__0__Impl();
@@ -24147,23 +24147,23 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:7043:1: rule__PreconditionConstraintCS__Group_1__0__Impl : ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLinEcore.g:7045:1: rule__PreconditionConstraintCS__Group_1__0__Impl : ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) ;
     public final void rule__PreconditionConstraintCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7047:1: ( ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) )
-            // InternalOCLinEcore.g:7048:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
+            // InternalOCLinEcore.g:7049:1: ( ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) ) )
+            // InternalOCLinEcore.g:7050:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLinEcore.g:7048:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
-            // InternalOCLinEcore.g:7049:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
+            // InternalOCLinEcore.g:7050:1: ( ( rule__PreconditionConstraintCS__NameAssignment_1_0 ) )
+            // InternalOCLinEcore.g:7051:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLinEcore.g:7050:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
-            // InternalOCLinEcore.g:7050:2: rule__PreconditionConstraintCS__NameAssignment_1_0
+            // InternalOCLinEcore.g:7052:1: ( rule__PreconditionConstraintCS__NameAssignment_1_0 )
+            // InternalOCLinEcore.g:7052:2: rule__PreconditionConstraintCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreconditionConstraintCS__NameAssignment_1_0();
@@ -24198,14 +24198,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1__1"
-    // InternalOCLinEcore.g:7060:1: rule__PreconditionConstraintCS__Group_1__1 : rule__PreconditionConstraintCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:7062:1: rule__PreconditionConstraintCS__Group_1__1 : rule__PreconditionConstraintCS__Group_1__1__Impl ;
     public final void rule__PreconditionConstraintCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7064:1: ( rule__PreconditionConstraintCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:7065:2: rule__PreconditionConstraintCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:7066:1: ( rule__PreconditionConstraintCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:7067:2: rule__PreconditionConstraintCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreconditionConstraintCS__Group_1__1__Impl();
@@ -24231,22 +24231,22 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:7071:1: rule__PreconditionConstraintCS__Group_1__1__Impl : ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) ;
+    // InternalOCLinEcore.g:7073:1: rule__PreconditionConstraintCS__Group_1__1__Impl : ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) ;
     public final void rule__PreconditionConstraintCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7075:1: ( ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) )
-            // InternalOCLinEcore.g:7076:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:7077:1: ( ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? ) )
+            // InternalOCLinEcore.g:7078:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
             {
-            // InternalOCLinEcore.g:7076:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
-            // InternalOCLinEcore.g:7077:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:7078:1: ( ( rule__PreconditionConstraintCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:7079:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getGroup_1_1());
             }
-            // InternalOCLinEcore.g:7078:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:7080:1: ( rule__PreconditionConstraintCS__Group_1_1__0 )?
             int alt89=2;
             int LA89_0 = input.LA(1);
 
@@ -24255,7 +24255,7 @@
             }
             switch (alt89) {
                 case 1 :
-                    // InternalOCLinEcore.g:7078:2: rule__PreconditionConstraintCS__Group_1_1__0
+                    // InternalOCLinEcore.g:7080:2: rule__PreconditionConstraintCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PreconditionConstraintCS__Group_1_1__0();
@@ -24293,14 +24293,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__0"
-    // InternalOCLinEcore.g:7092:1: rule__PreconditionConstraintCS__Group_1_1__0 : rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 ;
+    // InternalOCLinEcore.g:7094:1: rule__PreconditionConstraintCS__Group_1_1__0 : rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 ;
     public final void rule__PreconditionConstraintCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7096:1: ( rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 )
-            // InternalOCLinEcore.g:7097:2: rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1
+            // InternalOCLinEcore.g:7098:1: ( rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1 )
+            // InternalOCLinEcore.g:7099:2: rule__PreconditionConstraintCS__Group_1_1__0__Impl rule__PreconditionConstraintCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__PreconditionConstraintCS__Group_1_1__0__Impl();
@@ -24331,17 +24331,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__0__Impl"
-    // InternalOCLinEcore.g:7104:1: rule__PreconditionConstraintCS__Group_1_1__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:7106:1: rule__PreconditionConstraintCS__Group_1_1__0__Impl : ( '(' ) ;
     public final void rule__PreconditionConstraintCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7108:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:7109:1: ( '(' )
+            // InternalOCLinEcore.g:7110:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:7111:1: ( '(' )
             {
-            // InternalOCLinEcore.g:7109:1: ( '(' )
-            // InternalOCLinEcore.g:7110:1: '('
+            // InternalOCLinEcore.g:7111:1: ( '(' )
+            // InternalOCLinEcore.g:7112:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getLeftParenthesisKeyword_1_1_0());
@@ -24372,14 +24372,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__1"
-    // InternalOCLinEcore.g:7123:1: rule__PreconditionConstraintCS__Group_1_1__1 : rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 ;
+    // InternalOCLinEcore.g:7125:1: rule__PreconditionConstraintCS__Group_1_1__1 : rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 ;
     public final void rule__PreconditionConstraintCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7127:1: ( rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 )
-            // InternalOCLinEcore.g:7128:2: rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2
+            // InternalOCLinEcore.g:7129:1: ( rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2 )
+            // InternalOCLinEcore.g:7130:2: rule__PreconditionConstraintCS__Group_1_1__1__Impl rule__PreconditionConstraintCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__PreconditionConstraintCS__Group_1_1__1__Impl();
@@ -24410,23 +24410,23 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__1__Impl"
-    // InternalOCLinEcore.g:7135:1: rule__PreconditionConstraintCS__Group_1_1__1__Impl : ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:7137:1: rule__PreconditionConstraintCS__Group_1_1__1__Impl : ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
     public final void rule__PreconditionConstraintCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7139:1: ( ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
-            // InternalOCLinEcore.g:7140:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:7141:1: ( ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
+            // InternalOCLinEcore.g:7142:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:7140:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
-            // InternalOCLinEcore.g:7141:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLinEcore.g:7142:1: ( ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:7143:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
             }
-            // InternalOCLinEcore.g:7142:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
-            // InternalOCLinEcore.g:7142:2: rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1
+            // InternalOCLinEcore.g:7144:1: ( rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLinEcore.g:7144:2: rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1();
@@ -24461,14 +24461,14 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__2"
-    // InternalOCLinEcore.g:7152:1: rule__PreconditionConstraintCS__Group_1_1__2 : rule__PreconditionConstraintCS__Group_1_1__2__Impl ;
+    // InternalOCLinEcore.g:7154:1: rule__PreconditionConstraintCS__Group_1_1__2 : rule__PreconditionConstraintCS__Group_1_1__2__Impl ;
     public final void rule__PreconditionConstraintCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7156:1: ( rule__PreconditionConstraintCS__Group_1_1__2__Impl )
-            // InternalOCLinEcore.g:7157:2: rule__PreconditionConstraintCS__Group_1_1__2__Impl
+            // InternalOCLinEcore.g:7158:1: ( rule__PreconditionConstraintCS__Group_1_1__2__Impl )
+            // InternalOCLinEcore.g:7159:2: rule__PreconditionConstraintCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreconditionConstraintCS__Group_1_1__2__Impl();
@@ -24494,17 +24494,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__Group_1_1__2__Impl"
-    // InternalOCLinEcore.g:7163:1: rule__PreconditionConstraintCS__Group_1_1__2__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:7165:1: rule__PreconditionConstraintCS__Group_1_1__2__Impl : ( ')' ) ;
     public final void rule__PreconditionConstraintCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7167:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:7168:1: ( ')' )
+            // InternalOCLinEcore.g:7169:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:7170:1: ( ')' )
             {
-            // InternalOCLinEcore.g:7168:1: ( ')' )
-            // InternalOCLinEcore.g:7169:1: ')'
+            // InternalOCLinEcore.g:7170:1: ( ')' )
+            // InternalOCLinEcore.g:7171:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getRightParenthesisKeyword_1_1_2());
@@ -24535,14 +24535,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__0"
-    // InternalOCLinEcore.g:7188:1: rule__AnnotationCS__Group__0 : rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 ;
+    // InternalOCLinEcore.g:7190:1: rule__AnnotationCS__Group__0 : rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 ;
     public final void rule__AnnotationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7192:1: ( rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 )
-            // InternalOCLinEcore.g:7193:2: rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1
+            // InternalOCLinEcore.g:7194:1: ( rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 )
+            // InternalOCLinEcore.g:7195:2: rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__AnnotationCS__Group__0__Impl();
@@ -24573,23 +24573,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__0__Impl"
-    // InternalOCLinEcore.g:7200:1: rule__AnnotationCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:7202:1: rule__AnnotationCS__Group__0__Impl : ( () ) ;
     public final void rule__AnnotationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7204:1: ( ( () ) )
-            // InternalOCLinEcore.g:7205:1: ( () )
+            // InternalOCLinEcore.g:7206:1: ( ( () ) )
+            // InternalOCLinEcore.g:7207:1: ( () )
             {
-            // InternalOCLinEcore.g:7205:1: ( () )
-            // InternalOCLinEcore.g:7206:1: ()
+            // InternalOCLinEcore.g:7207:1: ( () )
+            // InternalOCLinEcore.g:7208:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAnnotationCSAction_0());
             }
-            // InternalOCLinEcore.g:7207:1: ()
-            // InternalOCLinEcore.g:7209:1:
+            // InternalOCLinEcore.g:7209:1: ()
+            // InternalOCLinEcore.g:7211:1:
             {
             }
 
@@ -24614,14 +24614,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__1"
-    // InternalOCLinEcore.g:7219:1: rule__AnnotationCS__Group__1 : rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 ;
+    // InternalOCLinEcore.g:7221:1: rule__AnnotationCS__Group__1 : rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 ;
     public final void rule__AnnotationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7223:1: ( rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 )
-            // InternalOCLinEcore.g:7224:2: rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2
+            // InternalOCLinEcore.g:7225:1: ( rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 )
+            // InternalOCLinEcore.g:7226:2: rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_17);
             rule__AnnotationCS__Group__1__Impl();
@@ -24652,17 +24652,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__1__Impl"
-    // InternalOCLinEcore.g:7231:1: rule__AnnotationCS__Group__1__Impl : ( 'annotation' ) ;
+    // InternalOCLinEcore.g:7233:1: rule__AnnotationCS__Group__1__Impl : ( 'annotation' ) ;
     public final void rule__AnnotationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7235:1: ( ( 'annotation' ) )
-            // InternalOCLinEcore.g:7236:1: ( 'annotation' )
+            // InternalOCLinEcore.g:7237:1: ( ( 'annotation' ) )
+            // InternalOCLinEcore.g:7238:1: ( 'annotation' )
             {
-            // InternalOCLinEcore.g:7236:1: ( 'annotation' )
-            // InternalOCLinEcore.g:7237:1: 'annotation'
+            // InternalOCLinEcore.g:7238:1: ( 'annotation' )
+            // InternalOCLinEcore.g:7239:1: 'annotation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAnnotationKeyword_1());
@@ -24693,14 +24693,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__2"
-    // InternalOCLinEcore.g:7250:1: rule__AnnotationCS__Group__2 : rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 ;
+    // InternalOCLinEcore.g:7252:1: rule__AnnotationCS__Group__2 : rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 ;
     public final void rule__AnnotationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7254:1: ( rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 )
-            // InternalOCLinEcore.g:7255:2: rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3
+            // InternalOCLinEcore.g:7256:1: ( rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 )
+            // InternalOCLinEcore.g:7257:2: rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_17);
             rule__AnnotationCS__Group__2__Impl();
@@ -24731,22 +24731,22 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__2__Impl"
-    // InternalOCLinEcore.g:7262:1: rule__AnnotationCS__Group__2__Impl : ( ( rule__AnnotationCS__NameAssignment_2 )? ) ;
+    // InternalOCLinEcore.g:7264:1: rule__AnnotationCS__Group__2__Impl : ( ( rule__AnnotationCS__NameAssignment_2 )? ) ;
     public final void rule__AnnotationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7266:1: ( ( ( rule__AnnotationCS__NameAssignment_2 )? ) )
-            // InternalOCLinEcore.g:7267:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
+            // InternalOCLinEcore.g:7268:1: ( ( ( rule__AnnotationCS__NameAssignment_2 )? ) )
+            // InternalOCLinEcore.g:7269:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
             {
-            // InternalOCLinEcore.g:7267:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
-            // InternalOCLinEcore.g:7268:1: ( rule__AnnotationCS__NameAssignment_2 )?
+            // InternalOCLinEcore.g:7269:1: ( ( rule__AnnotationCS__NameAssignment_2 )? )
+            // InternalOCLinEcore.g:7270:1: ( rule__AnnotationCS__NameAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getNameAssignment_2());
             }
-            // InternalOCLinEcore.g:7269:1: ( rule__AnnotationCS__NameAssignment_2 )?
+            // InternalOCLinEcore.g:7271:1: ( rule__AnnotationCS__NameAssignment_2 )?
             int alt90=2;
             int LA90_0 = input.LA(1);
 
@@ -24755,7 +24755,7 @@
             }
             switch (alt90) {
                 case 1 :
-                    // InternalOCLinEcore.g:7269:2: rule__AnnotationCS__NameAssignment_2
+                    // InternalOCLinEcore.g:7271:2: rule__AnnotationCS__NameAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__NameAssignment_2();
@@ -24793,14 +24793,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__3"
-    // InternalOCLinEcore.g:7279:1: rule__AnnotationCS__Group__3 : rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 ;
+    // InternalOCLinEcore.g:7281:1: rule__AnnotationCS__Group__3 : rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 ;
     public final void rule__AnnotationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7283:1: ( rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 )
-            // InternalOCLinEcore.g:7284:2: rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4
+            // InternalOCLinEcore.g:7285:1: ( rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4 )
+            // InternalOCLinEcore.g:7286:2: rule__AnnotationCS__Group__3__Impl rule__AnnotationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_17);
             rule__AnnotationCS__Group__3__Impl();
@@ -24831,22 +24831,22 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__3__Impl"
-    // InternalOCLinEcore.g:7291:1: rule__AnnotationCS__Group__3__Impl : ( ( rule__AnnotationCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:7293:1: rule__AnnotationCS__Group__3__Impl : ( ( rule__AnnotationCS__Group_3__0 )? ) ;
     public final void rule__AnnotationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7295:1: ( ( ( rule__AnnotationCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:7296:1: ( ( rule__AnnotationCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:7297:1: ( ( ( rule__AnnotationCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:7298:1: ( ( rule__AnnotationCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:7296:1: ( ( rule__AnnotationCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:7297:1: ( rule__AnnotationCS__Group_3__0 )?
+            // InternalOCLinEcore.g:7298:1: ( ( rule__AnnotationCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:7299:1: ( rule__AnnotationCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:7298:1: ( rule__AnnotationCS__Group_3__0 )?
+            // InternalOCLinEcore.g:7300:1: ( rule__AnnotationCS__Group_3__0 )?
             int alt91=2;
             int LA91_0 = input.LA(1);
 
@@ -24855,7 +24855,7 @@
             }
             switch (alt91) {
                 case 1 :
-                    // InternalOCLinEcore.g:7298:2: rule__AnnotationCS__Group_3__0
+                    // InternalOCLinEcore.g:7300:2: rule__AnnotationCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__Group_3__0();
@@ -24893,14 +24893,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__4"
-    // InternalOCLinEcore.g:7308:1: rule__AnnotationCS__Group__4 : rule__AnnotationCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:7310:1: rule__AnnotationCS__Group__4 : rule__AnnotationCS__Group__4__Impl ;
     public final void rule__AnnotationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7312:1: ( rule__AnnotationCS__Group__4__Impl )
-            // InternalOCLinEcore.g:7313:2: rule__AnnotationCS__Group__4__Impl
+            // InternalOCLinEcore.g:7314:1: ( rule__AnnotationCS__Group__4__Impl )
+            // InternalOCLinEcore.g:7315:2: rule__AnnotationCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group__4__Impl();
@@ -24926,23 +24926,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__4__Impl"
-    // InternalOCLinEcore.g:7319:1: rule__AnnotationCS__Group__4__Impl : ( ( rule__AnnotationCS__Alternatives_4 ) ) ;
+    // InternalOCLinEcore.g:7321:1: rule__AnnotationCS__Group__4__Impl : ( ( rule__AnnotationCS__Alternatives_4 ) ) ;
     public final void rule__AnnotationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7323:1: ( ( ( rule__AnnotationCS__Alternatives_4 ) ) )
-            // InternalOCLinEcore.g:7324:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
+            // InternalOCLinEcore.g:7325:1: ( ( ( rule__AnnotationCS__Alternatives_4 ) ) )
+            // InternalOCLinEcore.g:7326:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
             {
-            // InternalOCLinEcore.g:7324:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
-            // InternalOCLinEcore.g:7325:1: ( rule__AnnotationCS__Alternatives_4 )
+            // InternalOCLinEcore.g:7326:1: ( ( rule__AnnotationCS__Alternatives_4 ) )
+            // InternalOCLinEcore.g:7327:1: ( rule__AnnotationCS__Alternatives_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAlternatives_4());
             }
-            // InternalOCLinEcore.g:7326:1: ( rule__AnnotationCS__Alternatives_4 )
-            // InternalOCLinEcore.g:7326:2: rule__AnnotationCS__Alternatives_4
+            // InternalOCLinEcore.g:7328:1: ( rule__AnnotationCS__Alternatives_4 )
+            // InternalOCLinEcore.g:7328:2: rule__AnnotationCS__Alternatives_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Alternatives_4();
@@ -24977,14 +24977,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__0"
-    // InternalOCLinEcore.g:7346:1: rule__AnnotationCS__Group_3__0 : rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 ;
+    // InternalOCLinEcore.g:7348:1: rule__AnnotationCS__Group_3__0 : rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 ;
     public final void rule__AnnotationCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7350:1: ( rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 )
-            // InternalOCLinEcore.g:7351:2: rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1
+            // InternalOCLinEcore.g:7352:1: ( rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1 )
+            // InternalOCLinEcore.g:7353:2: rule__AnnotationCS__Group_3__0__Impl rule__AnnotationCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__AnnotationCS__Group_3__0__Impl();
@@ -25015,17 +25015,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:7358:1: rule__AnnotationCS__Group_3__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:7360:1: rule__AnnotationCS__Group_3__0__Impl : ( '(' ) ;
     public final void rule__AnnotationCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7362:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:7363:1: ( '(' )
+            // InternalOCLinEcore.g:7364:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:7365:1: ( '(' )
             {
-            // InternalOCLinEcore.g:7363:1: ( '(' )
-            // InternalOCLinEcore.g:7364:1: '('
+            // InternalOCLinEcore.g:7365:1: ( '(' )
+            // InternalOCLinEcore.g:7366:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getLeftParenthesisKeyword_3_0());
@@ -25056,14 +25056,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__1"
-    // InternalOCLinEcore.g:7377:1: rule__AnnotationCS__Group_3__1 : rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 ;
+    // InternalOCLinEcore.g:7379:1: rule__AnnotationCS__Group_3__1 : rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 ;
     public final void rule__AnnotationCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7381:1: ( rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 )
-            // InternalOCLinEcore.g:7382:2: rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2
+            // InternalOCLinEcore.g:7383:1: ( rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2 )
+            // InternalOCLinEcore.g:7384:2: rule__AnnotationCS__Group_3__1__Impl rule__AnnotationCS__Group_3__2
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__AnnotationCS__Group_3__1__Impl();
@@ -25094,23 +25094,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:7389:1: rule__AnnotationCS__Group_3__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:7391:1: rule__AnnotationCS__Group_3__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) ;
     public final void rule__AnnotationCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7393:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:7394:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
+            // InternalOCLinEcore.g:7395:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:7396:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:7394:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
-            // InternalOCLinEcore.g:7395:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
+            // InternalOCLinEcore.g:7396:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 ) )
+            // InternalOCLinEcore.g:7397:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_1());
             }
-            // InternalOCLinEcore.g:7396:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
-            // InternalOCLinEcore.g:7396:2: rule__AnnotationCS__OwnedDetailsAssignment_3_1
+            // InternalOCLinEcore.g:7398:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_1 )
+            // InternalOCLinEcore.g:7398:2: rule__AnnotationCS__OwnedDetailsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__OwnedDetailsAssignment_3_1();
@@ -25145,14 +25145,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__2"
-    // InternalOCLinEcore.g:7406:1: rule__AnnotationCS__Group_3__2 : rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 ;
+    // InternalOCLinEcore.g:7408:1: rule__AnnotationCS__Group_3__2 : rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 ;
     public final void rule__AnnotationCS__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7410:1: ( rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 )
-            // InternalOCLinEcore.g:7411:2: rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3
+            // InternalOCLinEcore.g:7412:1: ( rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3 )
+            // InternalOCLinEcore.g:7413:2: rule__AnnotationCS__Group_3__2__Impl rule__AnnotationCS__Group_3__3
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__AnnotationCS__Group_3__2__Impl();
@@ -25183,22 +25183,22 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__2__Impl"
-    // InternalOCLinEcore.g:7418:1: rule__AnnotationCS__Group_3__2__Impl : ( ( rule__AnnotationCS__Group_3_2__0 )* ) ;
+    // InternalOCLinEcore.g:7420:1: rule__AnnotationCS__Group_3__2__Impl : ( ( rule__AnnotationCS__Group_3_2__0 )* ) ;
     public final void rule__AnnotationCS__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7422:1: ( ( ( rule__AnnotationCS__Group_3_2__0 )* ) )
-            // InternalOCLinEcore.g:7423:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
+            // InternalOCLinEcore.g:7424:1: ( ( ( rule__AnnotationCS__Group_3_2__0 )* ) )
+            // InternalOCLinEcore.g:7425:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
             {
-            // InternalOCLinEcore.g:7423:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
-            // InternalOCLinEcore.g:7424:1: ( rule__AnnotationCS__Group_3_2__0 )*
+            // InternalOCLinEcore.g:7425:1: ( ( rule__AnnotationCS__Group_3_2__0 )* )
+            // InternalOCLinEcore.g:7426:1: ( rule__AnnotationCS__Group_3_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getGroup_3_2());
             }
-            // InternalOCLinEcore.g:7425:1: ( rule__AnnotationCS__Group_3_2__0 )*
+            // InternalOCLinEcore.g:7427:1: ( rule__AnnotationCS__Group_3_2__0 )*
             loop92:
             do {
                 int alt92=2;
@@ -25211,7 +25211,7 @@
 
                 switch (alt92) {
             	case 1 :
-            	    // InternalOCLinEcore.g:7425:2: rule__AnnotationCS__Group_3_2__0
+            	    // InternalOCLinEcore.g:7427:2: rule__AnnotationCS__Group_3_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__AnnotationCS__Group_3_2__0();
@@ -25252,14 +25252,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__3"
-    // InternalOCLinEcore.g:7435:1: rule__AnnotationCS__Group_3__3 : rule__AnnotationCS__Group_3__3__Impl ;
+    // InternalOCLinEcore.g:7437:1: rule__AnnotationCS__Group_3__3 : rule__AnnotationCS__Group_3__3__Impl ;
     public final void rule__AnnotationCS__Group_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7439:1: ( rule__AnnotationCS__Group_3__3__Impl )
-            // InternalOCLinEcore.g:7440:2: rule__AnnotationCS__Group_3__3__Impl
+            // InternalOCLinEcore.g:7441:1: ( rule__AnnotationCS__Group_3__3__Impl )
+            // InternalOCLinEcore.g:7442:2: rule__AnnotationCS__Group_3__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group_3__3__Impl();
@@ -25285,17 +25285,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3__3__Impl"
-    // InternalOCLinEcore.g:7446:1: rule__AnnotationCS__Group_3__3__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:7448:1: rule__AnnotationCS__Group_3__3__Impl : ( ')' ) ;
     public final void rule__AnnotationCS__Group_3__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7450:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:7451:1: ( ')' )
+            // InternalOCLinEcore.g:7452:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:7453:1: ( ')' )
             {
-            // InternalOCLinEcore.g:7451:1: ( ')' )
-            // InternalOCLinEcore.g:7452:1: ')'
+            // InternalOCLinEcore.g:7453:1: ( ')' )
+            // InternalOCLinEcore.g:7454:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getRightParenthesisKeyword_3_3());
@@ -25326,14 +25326,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_2__0"
-    // InternalOCLinEcore.g:7473:1: rule__AnnotationCS__Group_3_2__0 : rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 ;
+    // InternalOCLinEcore.g:7475:1: rule__AnnotationCS__Group_3_2__0 : rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 ;
     public final void rule__AnnotationCS__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7477:1: ( rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 )
-            // InternalOCLinEcore.g:7478:2: rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1
+            // InternalOCLinEcore.g:7479:1: ( rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1 )
+            // InternalOCLinEcore.g:7480:2: rule__AnnotationCS__Group_3_2__0__Impl rule__AnnotationCS__Group_3_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__AnnotationCS__Group_3_2__0__Impl();
@@ -25364,17 +25364,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_2__0__Impl"
-    // InternalOCLinEcore.g:7485:1: rule__AnnotationCS__Group_3_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:7487:1: rule__AnnotationCS__Group_3_2__0__Impl : ( ',' ) ;
     public final void rule__AnnotationCS__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7489:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:7490:1: ( ',' )
+            // InternalOCLinEcore.g:7491:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:7492:1: ( ',' )
             {
-            // InternalOCLinEcore.g:7490:1: ( ',' )
-            // InternalOCLinEcore.g:7491:1: ','
+            // InternalOCLinEcore.g:7492:1: ( ',' )
+            // InternalOCLinEcore.g:7493:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getCommaKeyword_3_2_0());
@@ -25405,14 +25405,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_2__1"
-    // InternalOCLinEcore.g:7504:1: rule__AnnotationCS__Group_3_2__1 : rule__AnnotationCS__Group_3_2__1__Impl ;
+    // InternalOCLinEcore.g:7506:1: rule__AnnotationCS__Group_3_2__1 : rule__AnnotationCS__Group_3_2__1__Impl ;
     public final void rule__AnnotationCS__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7508:1: ( rule__AnnotationCS__Group_3_2__1__Impl )
-            // InternalOCLinEcore.g:7509:2: rule__AnnotationCS__Group_3_2__1__Impl
+            // InternalOCLinEcore.g:7510:1: ( rule__AnnotationCS__Group_3_2__1__Impl )
+            // InternalOCLinEcore.g:7511:2: rule__AnnotationCS__Group_3_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group_3_2__1__Impl();
@@ -25438,23 +25438,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_2__1__Impl"
-    // InternalOCLinEcore.g:7515:1: rule__AnnotationCS__Group_3_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
+    // InternalOCLinEcore.g:7517:1: rule__AnnotationCS__Group_3_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
     public final void rule__AnnotationCS__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7519:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) )
-            // InternalOCLinEcore.g:7520:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
+            // InternalOCLinEcore.g:7521:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) ) )
+            // InternalOCLinEcore.g:7522:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
             {
-            // InternalOCLinEcore.g:7520:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
-            // InternalOCLinEcore.g:7521:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
+            // InternalOCLinEcore.g:7522:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 ) )
+            // InternalOCLinEcore.g:7523:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_3_2_1());
             }
-            // InternalOCLinEcore.g:7522:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
-            // InternalOCLinEcore.g:7522:2: rule__AnnotationCS__OwnedDetailsAssignment_3_2_1
+            // InternalOCLinEcore.g:7524:1: ( rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 )
+            // InternalOCLinEcore.g:7524:2: rule__AnnotationCS__OwnedDetailsAssignment_3_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__OwnedDetailsAssignment_3_2_1();
@@ -25489,14 +25489,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_4_0__0"
-    // InternalOCLinEcore.g:7536:1: rule__AnnotationCS__Group_4_0__0 : rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 ;
+    // InternalOCLinEcore.g:7538:1: rule__AnnotationCS__Group_4_0__0 : rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 ;
     public final void rule__AnnotationCS__Group_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7540:1: ( rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 )
-            // InternalOCLinEcore.g:7541:2: rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1
+            // InternalOCLinEcore.g:7542:1: ( rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1 )
+            // InternalOCLinEcore.g:7543:2: rule__AnnotationCS__Group_4_0__0__Impl rule__AnnotationCS__Group_4_0__1
             {
             pushFollow(FollowSets000.FOLLOW_21);
             rule__AnnotationCS__Group_4_0__0__Impl();
@@ -25527,17 +25527,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_4_0__0__Impl"
-    // InternalOCLinEcore.g:7548:1: rule__AnnotationCS__Group_4_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:7550:1: rule__AnnotationCS__Group_4_0__0__Impl : ( '{' ) ;
     public final void rule__AnnotationCS__Group_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7552:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:7553:1: ( '{' )
+            // InternalOCLinEcore.g:7554:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:7555:1: ( '{' )
             {
-            // InternalOCLinEcore.g:7553:1: ( '{' )
-            // InternalOCLinEcore.g:7554:1: '{'
+            // InternalOCLinEcore.g:7555:1: ( '{' )
+            // InternalOCLinEcore.g:7556:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getLeftCurlyBracketKeyword_4_0_0());
@@ -25568,14 +25568,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_4_0__1"
-    // InternalOCLinEcore.g:7567:1: rule__AnnotationCS__Group_4_0__1 : rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 ;
+    // InternalOCLinEcore.g:7569:1: rule__AnnotationCS__Group_4_0__1 : rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 ;
     public final void rule__AnnotationCS__Group_4_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7571:1: ( rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 )
-            // InternalOCLinEcore.g:7572:2: rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2
+            // InternalOCLinEcore.g:7573:1: ( rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2 )
+            // InternalOCLinEcore.g:7574:2: rule__AnnotationCS__Group_4_0__1__Impl rule__AnnotationCS__Group_4_0__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__AnnotationCS__Group_4_0__1__Impl();
@@ -25606,26 +25606,26 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_4_0__1__Impl"
-    // InternalOCLinEcore.g:7579:1: rule__AnnotationCS__Group_4_0__1__Impl : ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) ;
+    // InternalOCLinEcore.g:7581:1: rule__AnnotationCS__Group_4_0__1__Impl : ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) ;
     public final void rule__AnnotationCS__Group_4_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7583:1: ( ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) )
-            // InternalOCLinEcore.g:7584:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
+            // InternalOCLinEcore.g:7585:1: ( ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) ) )
+            // InternalOCLinEcore.g:7586:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
             {
-            // InternalOCLinEcore.g:7584:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
-            // InternalOCLinEcore.g:7585:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
+            // InternalOCLinEcore.g:7586:1: ( ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* ) )
+            // InternalOCLinEcore.g:7587:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) ) ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
             {
-            // InternalOCLinEcore.g:7585:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) )
-            // InternalOCLinEcore.g:7586:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
+            // InternalOCLinEcore.g:7587:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 ) )
+            // InternalOCLinEcore.g:7588:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
             }
-            // InternalOCLinEcore.g:7587:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
-            // InternalOCLinEcore.g:7587:2: rule__AnnotationCS__Alternatives_4_0_1
+            // InternalOCLinEcore.g:7589:1: ( rule__AnnotationCS__Alternatives_4_0_1 )
+            // InternalOCLinEcore.g:7589:2: rule__AnnotationCS__Alternatives_4_0_1
             {
             pushFollow(FollowSets000.FOLLOW_23);
             rule__AnnotationCS__Alternatives_4_0_1();
@@ -25641,13 +25641,13 @@
 
             }
 
-            // InternalOCLinEcore.g:7590:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
-            // InternalOCLinEcore.g:7591:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
+            // InternalOCLinEcore.g:7592:1: ( ( rule__AnnotationCS__Alternatives_4_0_1 )* )
+            // InternalOCLinEcore.g:7593:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAlternatives_4_0_1());
             }
-            // InternalOCLinEcore.g:7592:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
+            // InternalOCLinEcore.g:7594:1: ( rule__AnnotationCS__Alternatives_4_0_1 )*
             loop93:
             do {
                 int alt93=2;
@@ -25660,7 +25660,7 @@
 
                 switch (alt93) {
             	case 1 :
-            	    // InternalOCLinEcore.g:7592:2: rule__AnnotationCS__Alternatives_4_0_1
+            	    // InternalOCLinEcore.g:7594:2: rule__AnnotationCS__Alternatives_4_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_23);
             	    rule__AnnotationCS__Alternatives_4_0_1();
@@ -25704,14 +25704,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_4_0__2"
-    // InternalOCLinEcore.g:7603:1: rule__AnnotationCS__Group_4_0__2 : rule__AnnotationCS__Group_4_0__2__Impl ;
+    // InternalOCLinEcore.g:7605:1: rule__AnnotationCS__Group_4_0__2 : rule__AnnotationCS__Group_4_0__2__Impl ;
     public final void rule__AnnotationCS__Group_4_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7607:1: ( rule__AnnotationCS__Group_4_0__2__Impl )
-            // InternalOCLinEcore.g:7608:2: rule__AnnotationCS__Group_4_0__2__Impl
+            // InternalOCLinEcore.g:7609:1: ( rule__AnnotationCS__Group_4_0__2__Impl )
+            // InternalOCLinEcore.g:7610:2: rule__AnnotationCS__Group_4_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group_4_0__2__Impl();
@@ -25737,17 +25737,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_4_0__2__Impl"
-    // InternalOCLinEcore.g:7614:1: rule__AnnotationCS__Group_4_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:7616:1: rule__AnnotationCS__Group_4_0__2__Impl : ( '}' ) ;
     public final void rule__AnnotationCS__Group_4_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7618:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:7619:1: ( '}' )
+            // InternalOCLinEcore.g:7620:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:7621:1: ( '}' )
             {
-            // InternalOCLinEcore.g:7619:1: ( '}' )
-            // InternalOCLinEcore.g:7620:1: '}'
+            // InternalOCLinEcore.g:7621:1: ( '}' )
+            // InternalOCLinEcore.g:7622:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getRightCurlyBracketKeyword_4_0_2());
@@ -25778,14 +25778,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__0"
-    // InternalOCLinEcore.g:7639:1: rule__AttributeCS__Group__0 : rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 ;
+    // InternalOCLinEcore.g:7641:1: rule__AttributeCS__Group__0 : rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 ;
     public final void rule__AttributeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7643:1: ( rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 )
-            // InternalOCLinEcore.g:7644:2: rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1
+            // InternalOCLinEcore.g:7645:1: ( rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1 )
+            // InternalOCLinEcore.g:7646:2: rule__AttributeCS__Group__0__Impl rule__AttributeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_24);
             rule__AttributeCS__Group__0__Impl();
@@ -25816,22 +25816,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__0__Impl"
-    // InternalOCLinEcore.g:7651:1: rule__AttributeCS__Group__0__Impl : ( ( rule__AttributeCS__Alternatives_0 )? ) ;
+    // InternalOCLinEcore.g:7653:1: rule__AttributeCS__Group__0__Impl : ( ( rule__AttributeCS__Alternatives_0 )? ) ;
     public final void rule__AttributeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7655:1: ( ( ( rule__AttributeCS__Alternatives_0 )? ) )
-            // InternalOCLinEcore.g:7656:1: ( ( rule__AttributeCS__Alternatives_0 )? )
+            // InternalOCLinEcore.g:7657:1: ( ( ( rule__AttributeCS__Alternatives_0 )? ) )
+            // InternalOCLinEcore.g:7658:1: ( ( rule__AttributeCS__Alternatives_0 )? )
             {
-            // InternalOCLinEcore.g:7656:1: ( ( rule__AttributeCS__Alternatives_0 )? )
-            // InternalOCLinEcore.g:7657:1: ( rule__AttributeCS__Alternatives_0 )?
+            // InternalOCLinEcore.g:7658:1: ( ( rule__AttributeCS__Alternatives_0 )? )
+            // InternalOCLinEcore.g:7659:1: ( rule__AttributeCS__Alternatives_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getAlternatives_0());
             }
-            // InternalOCLinEcore.g:7658:1: ( rule__AttributeCS__Alternatives_0 )?
+            // InternalOCLinEcore.g:7660:1: ( rule__AttributeCS__Alternatives_0 )?
             int alt94=2;
             int LA94_0 = input.LA(1);
 
@@ -25840,7 +25840,7 @@
             }
             switch (alt94) {
                 case 1 :
-                    // InternalOCLinEcore.g:7658:2: rule__AttributeCS__Alternatives_0
+                    // InternalOCLinEcore.g:7660:2: rule__AttributeCS__Alternatives_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Alternatives_0();
@@ -25878,14 +25878,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__1"
-    // InternalOCLinEcore.g:7668:1: rule__AttributeCS__Group__1 : rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 ;
+    // InternalOCLinEcore.g:7670:1: rule__AttributeCS__Group__1 : rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 ;
     public final void rule__AttributeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7672:1: ( rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 )
-            // InternalOCLinEcore.g:7673:2: rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2
+            // InternalOCLinEcore.g:7674:1: ( rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2 )
+            // InternalOCLinEcore.g:7675:2: rule__AttributeCS__Group__1__Impl rule__AttributeCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__AttributeCS__Group__1__Impl();
@@ -25916,17 +25916,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__1__Impl"
-    // InternalOCLinEcore.g:7680:1: rule__AttributeCS__Group__1__Impl : ( 'attribute' ) ;
+    // InternalOCLinEcore.g:7682:1: rule__AttributeCS__Group__1__Impl : ( 'attribute' ) ;
     public final void rule__AttributeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7684:1: ( ( 'attribute' ) )
-            // InternalOCLinEcore.g:7685:1: ( 'attribute' )
+            // InternalOCLinEcore.g:7686:1: ( ( 'attribute' ) )
+            // InternalOCLinEcore.g:7687:1: ( 'attribute' )
             {
-            // InternalOCLinEcore.g:7685:1: ( 'attribute' )
-            // InternalOCLinEcore.g:7686:1: 'attribute'
+            // InternalOCLinEcore.g:7687:1: ( 'attribute' )
+            // InternalOCLinEcore.g:7688:1: 'attribute'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getAttributeKeyword_1());
@@ -25957,14 +25957,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__2"
-    // InternalOCLinEcore.g:7699:1: rule__AttributeCS__Group__2 : rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 ;
+    // InternalOCLinEcore.g:7701:1: rule__AttributeCS__Group__2 : rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 ;
     public final void rule__AttributeCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7703:1: ( rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 )
-            // InternalOCLinEcore.g:7704:2: rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3
+            // InternalOCLinEcore.g:7705:1: ( rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3 )
+            // InternalOCLinEcore.g:7706:2: rule__AttributeCS__Group__2__Impl rule__AttributeCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__AttributeCS__Group__2__Impl();
@@ -25995,23 +25995,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__2__Impl"
-    // InternalOCLinEcore.g:7711:1: rule__AttributeCS__Group__2__Impl : ( ( rule__AttributeCS__NameAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:7713:1: rule__AttributeCS__Group__2__Impl : ( ( rule__AttributeCS__NameAssignment_2 ) ) ;
     public final void rule__AttributeCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7715:1: ( ( ( rule__AttributeCS__NameAssignment_2 ) ) )
-            // InternalOCLinEcore.g:7716:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:7717:1: ( ( ( rule__AttributeCS__NameAssignment_2 ) ) )
+            // InternalOCLinEcore.g:7718:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:7716:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
-            // InternalOCLinEcore.g:7717:1: ( rule__AttributeCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:7718:1: ( ( rule__AttributeCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:7719:1: ( rule__AttributeCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getNameAssignment_2());
             }
-            // InternalOCLinEcore.g:7718:1: ( rule__AttributeCS__NameAssignment_2 )
-            // InternalOCLinEcore.g:7718:2: rule__AttributeCS__NameAssignment_2
+            // InternalOCLinEcore.g:7720:1: ( rule__AttributeCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:7720:2: rule__AttributeCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__NameAssignment_2();
@@ -26046,14 +26046,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__3"
-    // InternalOCLinEcore.g:7728:1: rule__AttributeCS__Group__3 : rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 ;
+    // InternalOCLinEcore.g:7730:1: rule__AttributeCS__Group__3 : rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 ;
     public final void rule__AttributeCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7732:1: ( rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 )
-            // InternalOCLinEcore.g:7733:2: rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4
+            // InternalOCLinEcore.g:7734:1: ( rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4 )
+            // InternalOCLinEcore.g:7735:2: rule__AttributeCS__Group__3__Impl rule__AttributeCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__AttributeCS__Group__3__Impl();
@@ -26084,22 +26084,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__3__Impl"
-    // InternalOCLinEcore.g:7740:1: rule__AttributeCS__Group__3__Impl : ( ( rule__AttributeCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:7742:1: rule__AttributeCS__Group__3__Impl : ( ( rule__AttributeCS__Group_3__0 )? ) ;
     public final void rule__AttributeCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7744:1: ( ( ( rule__AttributeCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:7745:1: ( ( rule__AttributeCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:7746:1: ( ( ( rule__AttributeCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:7747:1: ( ( rule__AttributeCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:7745:1: ( ( rule__AttributeCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:7746:1: ( rule__AttributeCS__Group_3__0 )?
+            // InternalOCLinEcore.g:7747:1: ( ( rule__AttributeCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:7748:1: ( rule__AttributeCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:7747:1: ( rule__AttributeCS__Group_3__0 )?
+            // InternalOCLinEcore.g:7749:1: ( rule__AttributeCS__Group_3__0 )?
             int alt95=2;
             int LA95_0 = input.LA(1);
 
@@ -26108,7 +26108,7 @@
             }
             switch (alt95) {
                 case 1 :
-                    // InternalOCLinEcore.g:7747:2: rule__AttributeCS__Group_3__0
+                    // InternalOCLinEcore.g:7749:2: rule__AttributeCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_3__0();
@@ -26146,14 +26146,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__4"
-    // InternalOCLinEcore.g:7757:1: rule__AttributeCS__Group__4 : rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 ;
+    // InternalOCLinEcore.g:7759:1: rule__AttributeCS__Group__4 : rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 ;
     public final void rule__AttributeCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7761:1: ( rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 )
-            // InternalOCLinEcore.g:7762:2: rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5
+            // InternalOCLinEcore.g:7763:1: ( rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5 )
+            // InternalOCLinEcore.g:7764:2: rule__AttributeCS__Group__4__Impl rule__AttributeCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__AttributeCS__Group__4__Impl();
@@ -26184,22 +26184,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__4__Impl"
-    // InternalOCLinEcore.g:7769:1: rule__AttributeCS__Group__4__Impl : ( ( rule__AttributeCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:7771:1: rule__AttributeCS__Group__4__Impl : ( ( rule__AttributeCS__Group_4__0 )? ) ;
     public final void rule__AttributeCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7773:1: ( ( ( rule__AttributeCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:7774:1: ( ( rule__AttributeCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:7775:1: ( ( ( rule__AttributeCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:7776:1: ( ( rule__AttributeCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:7774:1: ( ( rule__AttributeCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:7775:1: ( rule__AttributeCS__Group_4__0 )?
+            // InternalOCLinEcore.g:7776:1: ( ( rule__AttributeCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:7777:1: ( rule__AttributeCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:7776:1: ( rule__AttributeCS__Group_4__0 )?
+            // InternalOCLinEcore.g:7778:1: ( rule__AttributeCS__Group_4__0 )?
             int alt96=2;
             int LA96_0 = input.LA(1);
 
@@ -26208,7 +26208,7 @@
             }
             switch (alt96) {
                 case 1 :
-                    // InternalOCLinEcore.g:7776:2: rule__AttributeCS__Group_4__0
+                    // InternalOCLinEcore.g:7778:2: rule__AttributeCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_4__0();
@@ -26246,14 +26246,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__5"
-    // InternalOCLinEcore.g:7786:1: rule__AttributeCS__Group__5 : rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 ;
+    // InternalOCLinEcore.g:7788:1: rule__AttributeCS__Group__5 : rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 ;
     public final void rule__AttributeCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7790:1: ( rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 )
-            // InternalOCLinEcore.g:7791:2: rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6
+            // InternalOCLinEcore.g:7792:1: ( rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6 )
+            // InternalOCLinEcore.g:7793:2: rule__AttributeCS__Group__5__Impl rule__AttributeCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__AttributeCS__Group__5__Impl();
@@ -26284,22 +26284,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__5__Impl"
-    // InternalOCLinEcore.g:7798:1: rule__AttributeCS__Group__5__Impl : ( ( rule__AttributeCS__Group_5__0 )? ) ;
+    // InternalOCLinEcore.g:7800:1: rule__AttributeCS__Group__5__Impl : ( ( rule__AttributeCS__Group_5__0 )? ) ;
     public final void rule__AttributeCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7802:1: ( ( ( rule__AttributeCS__Group_5__0 )? ) )
-            // InternalOCLinEcore.g:7803:1: ( ( rule__AttributeCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:7804:1: ( ( ( rule__AttributeCS__Group_5__0 )? ) )
+            // InternalOCLinEcore.g:7805:1: ( ( rule__AttributeCS__Group_5__0 )? )
             {
-            // InternalOCLinEcore.g:7803:1: ( ( rule__AttributeCS__Group_5__0 )? )
-            // InternalOCLinEcore.g:7804:1: ( rule__AttributeCS__Group_5__0 )?
+            // InternalOCLinEcore.g:7805:1: ( ( rule__AttributeCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:7806:1: ( rule__AttributeCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getGroup_5());
             }
-            // InternalOCLinEcore.g:7805:1: ( rule__AttributeCS__Group_5__0 )?
+            // InternalOCLinEcore.g:7807:1: ( rule__AttributeCS__Group_5__0 )?
             int alt97=2;
             int LA97_0 = input.LA(1);
 
@@ -26312,7 +26312,7 @@
             }
             switch (alt97) {
                 case 1 :
-                    // InternalOCLinEcore.g:7805:2: rule__AttributeCS__Group_5__0
+                    // InternalOCLinEcore.g:7807:2: rule__AttributeCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__Group_5__0();
@@ -26350,14 +26350,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__6"
-    // InternalOCLinEcore.g:7815:1: rule__AttributeCS__Group__6 : rule__AttributeCS__Group__6__Impl ;
+    // InternalOCLinEcore.g:7817:1: rule__AttributeCS__Group__6 : rule__AttributeCS__Group__6__Impl ;
     public final void rule__AttributeCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7819:1: ( rule__AttributeCS__Group__6__Impl )
-            // InternalOCLinEcore.g:7820:2: rule__AttributeCS__Group__6__Impl
+            // InternalOCLinEcore.g:7821:1: ( rule__AttributeCS__Group__6__Impl )
+            // InternalOCLinEcore.g:7822:2: rule__AttributeCS__Group__6__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group__6__Impl();
@@ -26383,23 +26383,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group__6__Impl"
-    // InternalOCLinEcore.g:7826:1: rule__AttributeCS__Group__6__Impl : ( ( rule__AttributeCS__Alternatives_6 ) ) ;
+    // InternalOCLinEcore.g:7828:1: rule__AttributeCS__Group__6__Impl : ( ( rule__AttributeCS__Alternatives_6 ) ) ;
     public final void rule__AttributeCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7830:1: ( ( ( rule__AttributeCS__Alternatives_6 ) ) )
-            // InternalOCLinEcore.g:7831:1: ( ( rule__AttributeCS__Alternatives_6 ) )
+            // InternalOCLinEcore.g:7832:1: ( ( ( rule__AttributeCS__Alternatives_6 ) ) )
+            // InternalOCLinEcore.g:7833:1: ( ( rule__AttributeCS__Alternatives_6 ) )
             {
-            // InternalOCLinEcore.g:7831:1: ( ( rule__AttributeCS__Alternatives_6 ) )
-            // InternalOCLinEcore.g:7832:1: ( rule__AttributeCS__Alternatives_6 )
+            // InternalOCLinEcore.g:7833:1: ( ( rule__AttributeCS__Alternatives_6 ) )
+            // InternalOCLinEcore.g:7834:1: ( rule__AttributeCS__Alternatives_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getAlternatives_6());
             }
-            // InternalOCLinEcore.g:7833:1: ( rule__AttributeCS__Alternatives_6 )
-            // InternalOCLinEcore.g:7833:2: rule__AttributeCS__Alternatives_6
+            // InternalOCLinEcore.g:7835:1: ( rule__AttributeCS__Alternatives_6 )
+            // InternalOCLinEcore.g:7835:2: rule__AttributeCS__Alternatives_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Alternatives_6();
@@ -26434,14 +26434,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_0__0"
-    // InternalOCLinEcore.g:7857:1: rule__AttributeCS__Group_0_0__0 : rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 ;
+    // InternalOCLinEcore.g:7859:1: rule__AttributeCS__Group_0_0__0 : rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 ;
     public final void rule__AttributeCS__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7861:1: ( rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 )
-            // InternalOCLinEcore.g:7862:2: rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1
+            // InternalOCLinEcore.g:7863:1: ( rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1 )
+            // InternalOCLinEcore.g:7864:2: rule__AttributeCS__Group_0_0__0__Impl rule__AttributeCS__Group_0_0__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__AttributeCS__Group_0_0__0__Impl();
@@ -26472,23 +26472,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_0__0__Impl"
-    // InternalOCLinEcore.g:7869:1: rule__AttributeCS__Group_0_0__0__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) ;
+    // InternalOCLinEcore.g:7871:1: rule__AttributeCS__Group_0_0__0__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) ;
     public final void rule__AttributeCS__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7873:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) )
-            // InternalOCLinEcore.g:7874:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
+            // InternalOCLinEcore.g:7875:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) ) )
+            // InternalOCLinEcore.g:7876:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
             {
-            // InternalOCLinEcore.g:7874:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
-            // InternalOCLinEcore.g:7875:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
+            // InternalOCLinEcore.g:7876:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_0 ) )
+            // InternalOCLinEcore.g:7877:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_0());
             }
-            // InternalOCLinEcore.g:7876:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
-            // InternalOCLinEcore.g:7876:2: rule__AttributeCS__QualifiersAssignment_0_0_0
+            // InternalOCLinEcore.g:7878:1: ( rule__AttributeCS__QualifiersAssignment_0_0_0 )
+            // InternalOCLinEcore.g:7878:2: rule__AttributeCS__QualifiersAssignment_0_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__QualifiersAssignment_0_0_0();
@@ -26523,14 +26523,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_0__1"
-    // InternalOCLinEcore.g:7886:1: rule__AttributeCS__Group_0_0__1 : rule__AttributeCS__Group_0_0__1__Impl ;
+    // InternalOCLinEcore.g:7888:1: rule__AttributeCS__Group_0_0__1 : rule__AttributeCS__Group_0_0__1__Impl ;
     public final void rule__AttributeCS__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7890:1: ( rule__AttributeCS__Group_0_0__1__Impl )
-            // InternalOCLinEcore.g:7891:2: rule__AttributeCS__Group_0_0__1__Impl
+            // InternalOCLinEcore.g:7892:1: ( rule__AttributeCS__Group_0_0__1__Impl )
+            // InternalOCLinEcore.g:7893:2: rule__AttributeCS__Group_0_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_0_0__1__Impl();
@@ -26556,22 +26556,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_0__1__Impl"
-    // InternalOCLinEcore.g:7897:1: rule__AttributeCS__Group_0_0__1__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) ;
+    // InternalOCLinEcore.g:7899:1: rule__AttributeCS__Group_0_0__1__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) ;
     public final void rule__AttributeCS__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7901:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) )
-            // InternalOCLinEcore.g:7902:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
+            // InternalOCLinEcore.g:7903:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? ) )
+            // InternalOCLinEcore.g:7904:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
             {
-            // InternalOCLinEcore.g:7902:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
-            // InternalOCLinEcore.g:7903:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
+            // InternalOCLinEcore.g:7904:1: ( ( rule__AttributeCS__QualifiersAssignment_0_0_1 )? )
+            // InternalOCLinEcore.g:7905:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_0_1());
             }
-            // InternalOCLinEcore.g:7904:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
+            // InternalOCLinEcore.g:7906:1: ( rule__AttributeCS__QualifiersAssignment_0_0_1 )?
             int alt98=2;
             int LA98_0 = input.LA(1);
 
@@ -26580,7 +26580,7 @@
             }
             switch (alt98) {
                 case 1 :
-                    // InternalOCLinEcore.g:7904:2: rule__AttributeCS__QualifiersAssignment_0_0_1
+                    // InternalOCLinEcore.g:7906:2: rule__AttributeCS__QualifiersAssignment_0_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_0_0_1();
@@ -26618,14 +26618,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_1__0"
-    // InternalOCLinEcore.g:7918:1: rule__AttributeCS__Group_0_1__0 : rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 ;
+    // InternalOCLinEcore.g:7920:1: rule__AttributeCS__Group_0_1__0 : rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 ;
     public final void rule__AttributeCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7922:1: ( rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 )
-            // InternalOCLinEcore.g:7923:2: rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1
+            // InternalOCLinEcore.g:7924:1: ( rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1 )
+            // InternalOCLinEcore.g:7925:2: rule__AttributeCS__Group_0_1__0__Impl rule__AttributeCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_27);
             rule__AttributeCS__Group_0_1__0__Impl();
@@ -26656,23 +26656,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_1__0__Impl"
-    // InternalOCLinEcore.g:7930:1: rule__AttributeCS__Group_0_1__0__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) ;
+    // InternalOCLinEcore.g:7932:1: rule__AttributeCS__Group_0_1__0__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) ;
     public final void rule__AttributeCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7934:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) )
-            // InternalOCLinEcore.g:7935:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
+            // InternalOCLinEcore.g:7936:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) ) )
+            // InternalOCLinEcore.g:7937:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
             {
-            // InternalOCLinEcore.g:7935:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
-            // InternalOCLinEcore.g:7936:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
+            // InternalOCLinEcore.g:7937:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_0 ) )
+            // InternalOCLinEcore.g:7938:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_0());
             }
-            // InternalOCLinEcore.g:7937:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
-            // InternalOCLinEcore.g:7937:2: rule__AttributeCS__QualifiersAssignment_0_1_0
+            // InternalOCLinEcore.g:7939:1: ( rule__AttributeCS__QualifiersAssignment_0_1_0 )
+            // InternalOCLinEcore.g:7939:2: rule__AttributeCS__QualifiersAssignment_0_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__QualifiersAssignment_0_1_0();
@@ -26707,14 +26707,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_1__1"
-    // InternalOCLinEcore.g:7947:1: rule__AttributeCS__Group_0_1__1 : rule__AttributeCS__Group_0_1__1__Impl ;
+    // InternalOCLinEcore.g:7949:1: rule__AttributeCS__Group_0_1__1 : rule__AttributeCS__Group_0_1__1__Impl ;
     public final void rule__AttributeCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7951:1: ( rule__AttributeCS__Group_0_1__1__Impl )
-            // InternalOCLinEcore.g:7952:2: rule__AttributeCS__Group_0_1__1__Impl
+            // InternalOCLinEcore.g:7953:1: ( rule__AttributeCS__Group_0_1__1__Impl )
+            // InternalOCLinEcore.g:7954:2: rule__AttributeCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_0_1__1__Impl();
@@ -26740,22 +26740,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_0_1__1__Impl"
-    // InternalOCLinEcore.g:7958:1: rule__AttributeCS__Group_0_1__1__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) ;
+    // InternalOCLinEcore.g:7960:1: rule__AttributeCS__Group_0_1__1__Impl : ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) ;
     public final void rule__AttributeCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7962:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) )
-            // InternalOCLinEcore.g:7963:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
+            // InternalOCLinEcore.g:7964:1: ( ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? ) )
+            // InternalOCLinEcore.g:7965:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
             {
-            // InternalOCLinEcore.g:7963:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
-            // InternalOCLinEcore.g:7964:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
+            // InternalOCLinEcore.g:7965:1: ( ( rule__AttributeCS__QualifiersAssignment_0_1_1 )? )
+            // InternalOCLinEcore.g:7966:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersAssignment_0_1_1());
             }
-            // InternalOCLinEcore.g:7965:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
+            // InternalOCLinEcore.g:7967:1: ( rule__AttributeCS__QualifiersAssignment_0_1_1 )?
             int alt99=2;
             int LA99_0 = input.LA(1);
 
@@ -26764,7 +26764,7 @@
             }
             switch (alt99) {
                 case 1 :
-                    // InternalOCLinEcore.g:7965:2: rule__AttributeCS__QualifiersAssignment_0_1_1
+                    // InternalOCLinEcore.g:7967:2: rule__AttributeCS__QualifiersAssignment_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__QualifiersAssignment_0_1_1();
@@ -26802,14 +26802,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_3__0"
-    // InternalOCLinEcore.g:7979:1: rule__AttributeCS__Group_3__0 : rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 ;
+    // InternalOCLinEcore.g:7981:1: rule__AttributeCS__Group_3__0 : rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 ;
     public final void rule__AttributeCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7983:1: ( rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 )
-            // InternalOCLinEcore.g:7984:2: rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1
+            // InternalOCLinEcore.g:7985:1: ( rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1 )
+            // InternalOCLinEcore.g:7986:2: rule__AttributeCS__Group_3__0__Impl rule__AttributeCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__AttributeCS__Group_3__0__Impl();
@@ -26840,17 +26840,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:7991:1: rule__AttributeCS__Group_3__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:7993:1: rule__AttributeCS__Group_3__0__Impl : ( ':' ) ;
     public final void rule__AttributeCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:7995:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:7996:1: ( ':' )
+            // InternalOCLinEcore.g:7997:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:7998:1: ( ':' )
             {
-            // InternalOCLinEcore.g:7996:1: ( ':' )
-            // InternalOCLinEcore.g:7997:1: ':'
+            // InternalOCLinEcore.g:7998:1: ( ':' )
+            // InternalOCLinEcore.g:7999:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());
@@ -26881,14 +26881,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_3__1"
-    // InternalOCLinEcore.g:8010:1: rule__AttributeCS__Group_3__1 : rule__AttributeCS__Group_3__1__Impl ;
+    // InternalOCLinEcore.g:8012:1: rule__AttributeCS__Group_3__1 : rule__AttributeCS__Group_3__1__Impl ;
     public final void rule__AttributeCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8014:1: ( rule__AttributeCS__Group_3__1__Impl )
-            // InternalOCLinEcore.g:8015:2: rule__AttributeCS__Group_3__1__Impl
+            // InternalOCLinEcore.g:8016:1: ( rule__AttributeCS__Group_3__1__Impl )
+            // InternalOCLinEcore.g:8017:2: rule__AttributeCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_3__1__Impl();
@@ -26914,23 +26914,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:8021:1: rule__AttributeCS__Group_3__1__Impl : ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:8023:1: rule__AttributeCS__Group_3__1__Impl : ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) ;
     public final void rule__AttributeCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8025:1: ( ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:8026:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
+            // InternalOCLinEcore.g:8027:1: ( ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:8028:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:8026:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
-            // InternalOCLinEcore.g:8027:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
+            // InternalOCLinEcore.g:8028:1: ( ( rule__AttributeCS__OwnedTypeAssignment_3_1 ) )
+            // InternalOCLinEcore.g:8029:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedTypeAssignment_3_1());
             }
-            // InternalOCLinEcore.g:8028:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
-            // InternalOCLinEcore.g:8028:2: rule__AttributeCS__OwnedTypeAssignment_3_1
+            // InternalOCLinEcore.g:8030:1: ( rule__AttributeCS__OwnedTypeAssignment_3_1 )
+            // InternalOCLinEcore.g:8030:2: rule__AttributeCS__OwnedTypeAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__OwnedTypeAssignment_3_1();
@@ -26965,14 +26965,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_4__0"
-    // InternalOCLinEcore.g:8042:1: rule__AttributeCS__Group_4__0 : rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 ;
+    // InternalOCLinEcore.g:8044:1: rule__AttributeCS__Group_4__0 : rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 ;
     public final void rule__AttributeCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8046:1: ( rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 )
-            // InternalOCLinEcore.g:8047:2: rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1
+            // InternalOCLinEcore.g:8048:1: ( rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1 )
+            // InternalOCLinEcore.g:8049:2: rule__AttributeCS__Group_4__0__Impl rule__AttributeCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__AttributeCS__Group_4__0__Impl();
@@ -27003,17 +27003,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:8054:1: rule__AttributeCS__Group_4__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:8056:1: rule__AttributeCS__Group_4__0__Impl : ( '=' ) ;
     public final void rule__AttributeCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8058:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:8059:1: ( '=' )
+            // InternalOCLinEcore.g:8060:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:8061:1: ( '=' )
             {
-            // InternalOCLinEcore.g:8059:1: ( '=' )
-            // InternalOCLinEcore.g:8060:1: '='
+            // InternalOCLinEcore.g:8061:1: ( '=' )
+            // InternalOCLinEcore.g:8062:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());
@@ -27044,14 +27044,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_4__1"
-    // InternalOCLinEcore.g:8073:1: rule__AttributeCS__Group_4__1 : rule__AttributeCS__Group_4__1__Impl ;
+    // InternalOCLinEcore.g:8075:1: rule__AttributeCS__Group_4__1 : rule__AttributeCS__Group_4__1__Impl ;
     public final void rule__AttributeCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8077:1: ( rule__AttributeCS__Group_4__1__Impl )
-            // InternalOCLinEcore.g:8078:2: rule__AttributeCS__Group_4__1__Impl
+            // InternalOCLinEcore.g:8079:1: ( rule__AttributeCS__Group_4__1__Impl )
+            // InternalOCLinEcore.g:8080:2: rule__AttributeCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_4__1__Impl();
@@ -27077,23 +27077,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:8084:1: rule__AttributeCS__Group_4__1__Impl : ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) ;
+    // InternalOCLinEcore.g:8086:1: rule__AttributeCS__Group_4__1__Impl : ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) ;
     public final void rule__AttributeCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8088:1: ( ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) )
-            // InternalOCLinEcore.g:8089:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
+            // InternalOCLinEcore.g:8090:1: ( ( ( rule__AttributeCS__DefaultAssignment_4_1 ) ) )
+            // InternalOCLinEcore.g:8091:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
             {
-            // InternalOCLinEcore.g:8089:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
-            // InternalOCLinEcore.g:8090:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
+            // InternalOCLinEcore.g:8091:1: ( ( rule__AttributeCS__DefaultAssignment_4_1 ) )
+            // InternalOCLinEcore.g:8092:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getDefaultAssignment_4_1());
             }
-            // InternalOCLinEcore.g:8091:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
-            // InternalOCLinEcore.g:8091:2: rule__AttributeCS__DefaultAssignment_4_1
+            // InternalOCLinEcore.g:8093:1: ( rule__AttributeCS__DefaultAssignment_4_1 )
+            // InternalOCLinEcore.g:8093:2: rule__AttributeCS__DefaultAssignment_4_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__DefaultAssignment_4_1();
@@ -27128,14 +27128,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5__0"
-    // InternalOCLinEcore.g:8105:1: rule__AttributeCS__Group_5__0 : rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 ;
+    // InternalOCLinEcore.g:8107:1: rule__AttributeCS__Group_5__0 : rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 ;
     public final void rule__AttributeCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8109:1: ( rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 )
-            // InternalOCLinEcore.g:8110:2: rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1
+            // InternalOCLinEcore.g:8111:1: ( rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1 )
+            // InternalOCLinEcore.g:8112:2: rule__AttributeCS__Group_5__0__Impl rule__AttributeCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_30);
             rule__AttributeCS__Group_5__0__Impl();
@@ -27166,17 +27166,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5__0__Impl"
-    // InternalOCLinEcore.g:8117:1: rule__AttributeCS__Group_5__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:8119:1: rule__AttributeCS__Group_5__0__Impl : ( '{' ) ;
     public final void rule__AttributeCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8121:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:8122:1: ( '{' )
+            // InternalOCLinEcore.g:8123:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:8124:1: ( '{' )
             {
-            // InternalOCLinEcore.g:8122:1: ( '{' )
-            // InternalOCLinEcore.g:8123:1: '{'
+            // InternalOCLinEcore.g:8124:1: ( '{' )
+            // InternalOCLinEcore.g:8125:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());
@@ -27207,14 +27207,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5__1"
-    // InternalOCLinEcore.g:8136:1: rule__AttributeCS__Group_5__1 : rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 ;
+    // InternalOCLinEcore.g:8138:1: rule__AttributeCS__Group_5__1 : rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 ;
     public final void rule__AttributeCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8140:1: ( rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 )
-            // InternalOCLinEcore.g:8141:2: rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2
+            // InternalOCLinEcore.g:8142:1: ( rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2 )
+            // InternalOCLinEcore.g:8143:2: rule__AttributeCS__Group_5__1__Impl rule__AttributeCS__Group_5__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__AttributeCS__Group_5__1__Impl();
@@ -27245,26 +27245,26 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5__1__Impl"
-    // InternalOCLinEcore.g:8148:1: rule__AttributeCS__Group_5__1__Impl : ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) ;
+    // InternalOCLinEcore.g:8150:1: rule__AttributeCS__Group_5__1__Impl : ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) ;
     public final void rule__AttributeCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8152:1: ( ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) )
-            // InternalOCLinEcore.g:8153:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
+            // InternalOCLinEcore.g:8154:1: ( ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) ) )
+            // InternalOCLinEcore.g:8155:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
             {
-            // InternalOCLinEcore.g:8153:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
-            // InternalOCLinEcore.g:8154:1: ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* )
+            // InternalOCLinEcore.g:8155:1: ( ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* ) )
+            // InternalOCLinEcore.g:8156:1: ( ( rule__AttributeCS__Group_5_1__0 ) ) ( ( rule__AttributeCS__Group_5_1__0 )* )
             {
-            // InternalOCLinEcore.g:8154:1: ( ( rule__AttributeCS__Group_5_1__0 ) )
-            // InternalOCLinEcore.g:8155:1: ( rule__AttributeCS__Group_5_1__0 )
+            // InternalOCLinEcore.g:8156:1: ( ( rule__AttributeCS__Group_5_1__0 ) )
+            // InternalOCLinEcore.g:8157:1: ( rule__AttributeCS__Group_5_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getGroup_5_1());
             }
-            // InternalOCLinEcore.g:8156:1: ( rule__AttributeCS__Group_5_1__0 )
-            // InternalOCLinEcore.g:8156:2: rule__AttributeCS__Group_5_1__0
+            // InternalOCLinEcore.g:8158:1: ( rule__AttributeCS__Group_5_1__0 )
+            // InternalOCLinEcore.g:8158:2: rule__AttributeCS__Group_5_1__0
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__AttributeCS__Group_5_1__0();
@@ -27280,13 +27280,13 @@
 
             }
 
-            // InternalOCLinEcore.g:8159:1: ( ( rule__AttributeCS__Group_5_1__0 )* )
-            // InternalOCLinEcore.g:8160:1: ( rule__AttributeCS__Group_5_1__0 )*
+            // InternalOCLinEcore.g:8161:1: ( ( rule__AttributeCS__Group_5_1__0 )* )
+            // InternalOCLinEcore.g:8162:1: ( rule__AttributeCS__Group_5_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getGroup_5_1());
             }
-            // InternalOCLinEcore.g:8161:1: ( rule__AttributeCS__Group_5_1__0 )*
+            // InternalOCLinEcore.g:8163:1: ( rule__AttributeCS__Group_5_1__0 )*
             loop100:
             do {
                 int alt100=2;
@@ -27299,7 +27299,7 @@
 
                 switch (alt100) {
             	case 1 :
-            	    // InternalOCLinEcore.g:8161:2: rule__AttributeCS__Group_5_1__0
+            	    // InternalOCLinEcore.g:8163:2: rule__AttributeCS__Group_5_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_31);
             	    rule__AttributeCS__Group_5_1__0();
@@ -27343,14 +27343,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5__2"
-    // InternalOCLinEcore.g:8172:1: rule__AttributeCS__Group_5__2 : rule__AttributeCS__Group_5__2__Impl ;
+    // InternalOCLinEcore.g:8174:1: rule__AttributeCS__Group_5__2 : rule__AttributeCS__Group_5__2__Impl ;
     public final void rule__AttributeCS__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8176:1: ( rule__AttributeCS__Group_5__2__Impl )
-            // InternalOCLinEcore.g:8177:2: rule__AttributeCS__Group_5__2__Impl
+            // InternalOCLinEcore.g:8178:1: ( rule__AttributeCS__Group_5__2__Impl )
+            // InternalOCLinEcore.g:8179:2: rule__AttributeCS__Group_5__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_5__2__Impl();
@@ -27376,17 +27376,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5__2__Impl"
-    // InternalOCLinEcore.g:8183:1: rule__AttributeCS__Group_5__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:8185:1: rule__AttributeCS__Group_5__2__Impl : ( '}' ) ;
     public final void rule__AttributeCS__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8187:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:8188:1: ( '}' )
+            // InternalOCLinEcore.g:8189:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:8190:1: ( '}' )
             {
-            // InternalOCLinEcore.g:8188:1: ( '}' )
-            // InternalOCLinEcore.g:8189:1: '}'
+            // InternalOCLinEcore.g:8190:1: ( '}' )
+            // InternalOCLinEcore.g:8191:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());
@@ -27417,14 +27417,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5_1__0"
-    // InternalOCLinEcore.g:8208:1: rule__AttributeCS__Group_5_1__0 : rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 ;
+    // InternalOCLinEcore.g:8210:1: rule__AttributeCS__Group_5_1__0 : rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 ;
     public final void rule__AttributeCS__Group_5_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8212:1: ( rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 )
-            // InternalOCLinEcore.g:8213:2: rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1
+            // InternalOCLinEcore.g:8214:1: ( rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1 )
+            // InternalOCLinEcore.g:8215:2: rule__AttributeCS__Group_5_1__0__Impl rule__AttributeCS__Group_5_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__AttributeCS__Group_5_1__0__Impl();
@@ -27455,23 +27455,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5_1__0__Impl"
-    // InternalOCLinEcore.g:8220:1: rule__AttributeCS__Group_5_1__0__Impl : ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) ;
+    // InternalOCLinEcore.g:8222:1: rule__AttributeCS__Group_5_1__0__Impl : ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) ;
     public final void rule__AttributeCS__Group_5_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8224:1: ( ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) )
-            // InternalOCLinEcore.g:8225:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
+            // InternalOCLinEcore.g:8226:1: ( ( ( rule__AttributeCS__Alternatives_5_1_0 ) ) )
+            // InternalOCLinEcore.g:8227:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
             {
-            // InternalOCLinEcore.g:8225:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
-            // InternalOCLinEcore.g:8226:1: ( rule__AttributeCS__Alternatives_5_1_0 )
+            // InternalOCLinEcore.g:8227:1: ( ( rule__AttributeCS__Alternatives_5_1_0 ) )
+            // InternalOCLinEcore.g:8228:1: ( rule__AttributeCS__Alternatives_5_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getAlternatives_5_1_0());
             }
-            // InternalOCLinEcore.g:8227:1: ( rule__AttributeCS__Alternatives_5_1_0 )
-            // InternalOCLinEcore.g:8227:2: rule__AttributeCS__Alternatives_5_1_0
+            // InternalOCLinEcore.g:8229:1: ( rule__AttributeCS__Alternatives_5_1_0 )
+            // InternalOCLinEcore.g:8229:2: rule__AttributeCS__Alternatives_5_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Alternatives_5_1_0();
@@ -27506,14 +27506,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5_1__1"
-    // InternalOCLinEcore.g:8237:1: rule__AttributeCS__Group_5_1__1 : rule__AttributeCS__Group_5_1__1__Impl ;
+    // InternalOCLinEcore.g:8239:1: rule__AttributeCS__Group_5_1__1 : rule__AttributeCS__Group_5_1__1__Impl ;
     public final void rule__AttributeCS__Group_5_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8241:1: ( rule__AttributeCS__Group_5_1__1__Impl )
-            // InternalOCLinEcore.g:8242:2: rule__AttributeCS__Group_5_1__1__Impl
+            // InternalOCLinEcore.g:8243:1: ( rule__AttributeCS__Group_5_1__1__Impl )
+            // InternalOCLinEcore.g:8244:2: rule__AttributeCS__Group_5_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_5_1__1__Impl();
@@ -27539,22 +27539,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_5_1__1__Impl"
-    // InternalOCLinEcore.g:8248:1: rule__AttributeCS__Group_5_1__1__Impl : ( ( ',' )? ) ;
+    // InternalOCLinEcore.g:8250:1: rule__AttributeCS__Group_5_1__1__Impl : ( ( ',' )? ) ;
     public final void rule__AttributeCS__Group_5_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8252:1: ( ( ( ',' )? ) )
-            // InternalOCLinEcore.g:8253:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:8254:1: ( ( ( ',' )? ) )
+            // InternalOCLinEcore.g:8255:1: ( ( ',' )? )
             {
-            // InternalOCLinEcore.g:8253:1: ( ( ',' )? )
-            // InternalOCLinEcore.g:8254:1: ( ',' )?
+            // InternalOCLinEcore.g:8255:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:8256:1: ( ',' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());
             }
-            // InternalOCLinEcore.g:8255:1: ( ',' )?
+            // InternalOCLinEcore.g:8257:1: ( ',' )?
             int alt101=2;
             int LA101_0 = input.LA(1);
 
@@ -27563,7 +27563,7 @@
             }
             switch (alt101) {
                 case 1 :
-                    // InternalOCLinEcore.g:8256:2: ','
+                    // InternalOCLinEcore.g:8258:2: ','
                     {
                     match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
 
@@ -27597,14 +27597,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0__0"
-    // InternalOCLinEcore.g:8271:1: rule__AttributeCS__Group_6_0__0 : rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 ;
+    // InternalOCLinEcore.g:8273:1: rule__AttributeCS__Group_6_0__0 : rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 ;
     public final void rule__AttributeCS__Group_6_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8275:1: ( rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 )
-            // InternalOCLinEcore.g:8276:2: rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1
+            // InternalOCLinEcore.g:8277:1: ( rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1 )
+            // InternalOCLinEcore.g:8278:2: rule__AttributeCS__Group_6_0__0__Impl rule__AttributeCS__Group_6_0__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__AttributeCS__Group_6_0__0__Impl();
@@ -27635,17 +27635,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0__0__Impl"
-    // InternalOCLinEcore.g:8283:1: rule__AttributeCS__Group_6_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:8285:1: rule__AttributeCS__Group_6_0__0__Impl : ( '{' ) ;
     public final void rule__AttributeCS__Group_6_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8287:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:8288:1: ( '{' )
+            // InternalOCLinEcore.g:8289:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:8290:1: ( '{' )
             {
-            // InternalOCLinEcore.g:8288:1: ( '{' )
-            // InternalOCLinEcore.g:8289:1: '{'
+            // InternalOCLinEcore.g:8290:1: ( '{' )
+            // InternalOCLinEcore.g:8291:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
@@ -27676,14 +27676,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0__1"
-    // InternalOCLinEcore.g:8302:1: rule__AttributeCS__Group_6_0__1 : rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 ;
+    // InternalOCLinEcore.g:8304:1: rule__AttributeCS__Group_6_0__1 : rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 ;
     public final void rule__AttributeCS__Group_6_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8306:1: ( rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 )
-            // InternalOCLinEcore.g:8307:2: rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2
+            // InternalOCLinEcore.g:8308:1: ( rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2 )
+            // InternalOCLinEcore.g:8309:2: rule__AttributeCS__Group_6_0__1__Impl rule__AttributeCS__Group_6_0__2
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__AttributeCS__Group_6_0__1__Impl();
@@ -27714,22 +27714,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0__1__Impl"
-    // InternalOCLinEcore.g:8314:1: rule__AttributeCS__Group_6_0__1__Impl : ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) ;
+    // InternalOCLinEcore.g:8316:1: rule__AttributeCS__Group_6_0__1__Impl : ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) ;
     public final void rule__AttributeCS__Group_6_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8318:1: ( ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) )
-            // InternalOCLinEcore.g:8319:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
+            // InternalOCLinEcore.g:8320:1: ( ( ( rule__AttributeCS__Alternatives_6_0_1 )* ) )
+            // InternalOCLinEcore.g:8321:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
             {
-            // InternalOCLinEcore.g:8319:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
-            // InternalOCLinEcore.g:8320:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
+            // InternalOCLinEcore.g:8321:1: ( ( rule__AttributeCS__Alternatives_6_0_1 )* )
+            // InternalOCLinEcore.g:8322:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getAlternatives_6_0_1());
             }
-            // InternalOCLinEcore.g:8321:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
+            // InternalOCLinEcore.g:8323:1: ( rule__AttributeCS__Alternatives_6_0_1 )*
             loop102:
             do {
                 int alt102=2;
@@ -27742,7 +27742,7 @@
 
                 switch (alt102) {
             	case 1 :
-            	    // InternalOCLinEcore.g:8321:2: rule__AttributeCS__Alternatives_6_0_1
+            	    // InternalOCLinEcore.g:8323:2: rule__AttributeCS__Alternatives_6_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_34);
             	    rule__AttributeCS__Alternatives_6_0_1();
@@ -27783,14 +27783,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0__2"
-    // InternalOCLinEcore.g:8331:1: rule__AttributeCS__Group_6_0__2 : rule__AttributeCS__Group_6_0__2__Impl ;
+    // InternalOCLinEcore.g:8333:1: rule__AttributeCS__Group_6_0__2 : rule__AttributeCS__Group_6_0__2__Impl ;
     public final void rule__AttributeCS__Group_6_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8335:1: ( rule__AttributeCS__Group_6_0__2__Impl )
-            // InternalOCLinEcore.g:8336:2: rule__AttributeCS__Group_6_0__2__Impl
+            // InternalOCLinEcore.g:8337:1: ( rule__AttributeCS__Group_6_0__2__Impl )
+            // InternalOCLinEcore.g:8338:2: rule__AttributeCS__Group_6_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_6_0__2__Impl();
@@ -27816,17 +27816,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0__2__Impl"
-    // InternalOCLinEcore.g:8342:1: rule__AttributeCS__Group_6_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:8344:1: rule__AttributeCS__Group_6_0__2__Impl : ( '}' ) ;
     public final void rule__AttributeCS__Group_6_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8346:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:8347:1: ( '}' )
+            // InternalOCLinEcore.g:8348:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:8349:1: ( '}' )
             {
-            // InternalOCLinEcore.g:8347:1: ( '}' )
-            // InternalOCLinEcore.g:8348:1: '}'
+            // InternalOCLinEcore.g:8349:1: ( '}' )
+            // InternalOCLinEcore.g:8350:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());
@@ -27857,14 +27857,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__0"
-    // InternalOCLinEcore.g:8367:1: rule__AttributeCS__Group_6_0_1_1__0 : rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 ;
+    // InternalOCLinEcore.g:8369:1: rule__AttributeCS__Group_6_0_1_1__0 : rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 ;
     public final void rule__AttributeCS__Group_6_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8371:1: ( rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 )
-            // InternalOCLinEcore.g:8372:2: rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1
+            // InternalOCLinEcore.g:8373:1: ( rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1 )
+            // InternalOCLinEcore.g:8374:2: rule__AttributeCS__Group_6_0_1_1__0__Impl rule__AttributeCS__Group_6_0_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__AttributeCS__Group_6_0_1_1__0__Impl();
@@ -27895,17 +27895,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__0__Impl"
-    // InternalOCLinEcore.g:8379:1: rule__AttributeCS__Group_6_0_1_1__0__Impl : ( 'initial' ) ;
+    // InternalOCLinEcore.g:8381:1: rule__AttributeCS__Group_6_0_1_1__0__Impl : ( 'initial' ) ;
     public final void rule__AttributeCS__Group_6_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8383:1: ( ( 'initial' ) )
-            // InternalOCLinEcore.g:8384:1: ( 'initial' )
+            // InternalOCLinEcore.g:8385:1: ( ( 'initial' ) )
+            // InternalOCLinEcore.g:8386:1: ( 'initial' )
             {
-            // InternalOCLinEcore.g:8384:1: ( 'initial' )
-            // InternalOCLinEcore.g:8385:1: 'initial'
+            // InternalOCLinEcore.g:8386:1: ( 'initial' )
+            // InternalOCLinEcore.g:8387:1: 'initial'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getInitialKeyword_6_0_1_1_0());
@@ -27936,14 +27936,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__1"
-    // InternalOCLinEcore.g:8398:1: rule__AttributeCS__Group_6_0_1_1__1 : rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 ;
+    // InternalOCLinEcore.g:8400:1: rule__AttributeCS__Group_6_0_1_1__1 : rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 ;
     public final void rule__AttributeCS__Group_6_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8402:1: ( rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 )
-            // InternalOCLinEcore.g:8403:2: rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2
+            // InternalOCLinEcore.g:8404:1: ( rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2 )
+            // InternalOCLinEcore.g:8405:2: rule__AttributeCS__Group_6_0_1_1__1__Impl rule__AttributeCS__Group_6_0_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__AttributeCS__Group_6_0_1_1__1__Impl();
@@ -27974,22 +27974,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__1__Impl"
-    // InternalOCLinEcore.g:8410:1: rule__AttributeCS__Group_6_0_1_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalOCLinEcore.g:8412:1: rule__AttributeCS__Group_6_0_1_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__AttributeCS__Group_6_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8414:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalOCLinEcore.g:8415:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:8416:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalOCLinEcore.g:8417:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalOCLinEcore.g:8415:1: ( ( ruleUnrestrictedName )? )
-            // InternalOCLinEcore.g:8416:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:8417:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:8418:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());
             }
-            // InternalOCLinEcore.g:8417:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:8419:1: ( ruleUnrestrictedName )?
             int alt103=2;
             int LA103_0 = input.LA(1);
 
@@ -27998,7 +27998,7 @@
             }
             switch (alt103) {
                 case 1 :
-                    // InternalOCLinEcore.g:8417:3: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:8419:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -28036,14 +28036,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__2"
-    // InternalOCLinEcore.g:8427:1: rule__AttributeCS__Group_6_0_1_1__2 : rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 ;
+    // InternalOCLinEcore.g:8429:1: rule__AttributeCS__Group_6_0_1_1__2 : rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 ;
     public final void rule__AttributeCS__Group_6_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8431:1: ( rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 )
-            // InternalOCLinEcore.g:8432:2: rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3
+            // InternalOCLinEcore.g:8433:1: ( rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3 )
+            // InternalOCLinEcore.g:8434:2: rule__AttributeCS__Group_6_0_1_1__2__Impl rule__AttributeCS__Group_6_0_1_1__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__AttributeCS__Group_6_0_1_1__2__Impl();
@@ -28074,17 +28074,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__2__Impl"
-    // InternalOCLinEcore.g:8439:1: rule__AttributeCS__Group_6_0_1_1__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:8441:1: rule__AttributeCS__Group_6_0_1_1__2__Impl : ( ':' ) ;
     public final void rule__AttributeCS__Group_6_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8443:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:8444:1: ( ':' )
+            // InternalOCLinEcore.g:8445:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:8446:1: ( ':' )
             {
-            // InternalOCLinEcore.g:8444:1: ( ':' )
-            // InternalOCLinEcore.g:8445:1: ':'
+            // InternalOCLinEcore.g:8446:1: ( ':' )
+            // InternalOCLinEcore.g:8447:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());
@@ -28115,14 +28115,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__3"
-    // InternalOCLinEcore.g:8458:1: rule__AttributeCS__Group_6_0_1_1__3 : rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 ;
+    // InternalOCLinEcore.g:8460:1: rule__AttributeCS__Group_6_0_1_1__3 : rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 ;
     public final void rule__AttributeCS__Group_6_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8462:1: ( rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 )
-            // InternalOCLinEcore.g:8463:2: rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4
+            // InternalOCLinEcore.g:8464:1: ( rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4 )
+            // InternalOCLinEcore.g:8465:2: rule__AttributeCS__Group_6_0_1_1__3__Impl rule__AttributeCS__Group_6_0_1_1__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__AttributeCS__Group_6_0_1_1__3__Impl();
@@ -28153,22 +28153,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__3__Impl"
-    // InternalOCLinEcore.g:8470:1: rule__AttributeCS__Group_6_0_1_1__3__Impl : ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) ;
+    // InternalOCLinEcore.g:8472:1: rule__AttributeCS__Group_6_0_1_1__3__Impl : ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) ;
     public final void rule__AttributeCS__Group_6_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8474:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) )
-            // InternalOCLinEcore.g:8475:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
+            // InternalOCLinEcore.g:8476:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? ) )
+            // InternalOCLinEcore.g:8477:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
             {
-            // InternalOCLinEcore.g:8475:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
-            // InternalOCLinEcore.g:8476:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
+            // InternalOCLinEcore.g:8477:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )? )
+            // InternalOCLinEcore.g:8478:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_1_3());
             }
-            // InternalOCLinEcore.g:8477:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
+            // InternalOCLinEcore.g:8479:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 )?
             int alt104=2;
             int LA104_0 = input.LA(1);
 
@@ -28177,7 +28177,7 @@
             }
             switch (alt104) {
                 case 1 :
-                    // InternalOCLinEcore.g:8477:2: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3
+                    // InternalOCLinEcore.g:8479:2: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3();
@@ -28215,14 +28215,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__4"
-    // InternalOCLinEcore.g:8487:1: rule__AttributeCS__Group_6_0_1_1__4 : rule__AttributeCS__Group_6_0_1_1__4__Impl ;
+    // InternalOCLinEcore.g:8489:1: rule__AttributeCS__Group_6_0_1_1__4 : rule__AttributeCS__Group_6_0_1_1__4__Impl ;
     public final void rule__AttributeCS__Group_6_0_1_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8491:1: ( rule__AttributeCS__Group_6_0_1_1__4__Impl )
-            // InternalOCLinEcore.g:8492:2: rule__AttributeCS__Group_6_0_1_1__4__Impl
+            // InternalOCLinEcore.g:8493:1: ( rule__AttributeCS__Group_6_0_1_1__4__Impl )
+            // InternalOCLinEcore.g:8494:2: rule__AttributeCS__Group_6_0_1_1__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_6_0_1_1__4__Impl();
@@ -28248,17 +28248,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_1__4__Impl"
-    // InternalOCLinEcore.g:8498:1: rule__AttributeCS__Group_6_0_1_1__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:8500:1: rule__AttributeCS__Group_6_0_1_1__4__Impl : ( ';' ) ;
     public final void rule__AttributeCS__Group_6_0_1_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8502:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:8503:1: ( ';' )
+            // InternalOCLinEcore.g:8504:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:8505:1: ( ';' )
             {
-            // InternalOCLinEcore.g:8503:1: ( ';' )
-            // InternalOCLinEcore.g:8504:1: ';'
+            // InternalOCLinEcore.g:8505:1: ( ';' )
+            // InternalOCLinEcore.g:8506:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_1_4());
@@ -28289,14 +28289,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__0"
-    // InternalOCLinEcore.g:8527:1: rule__AttributeCS__Group_6_0_1_2__0 : rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 ;
+    // InternalOCLinEcore.g:8529:1: rule__AttributeCS__Group_6_0_1_2__0 : rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 ;
     public final void rule__AttributeCS__Group_6_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8531:1: ( rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 )
-            // InternalOCLinEcore.g:8532:2: rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1
+            // InternalOCLinEcore.g:8533:1: ( rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1 )
+            // InternalOCLinEcore.g:8534:2: rule__AttributeCS__Group_6_0_1_2__0__Impl rule__AttributeCS__Group_6_0_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__AttributeCS__Group_6_0_1_2__0__Impl();
@@ -28327,17 +28327,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__0__Impl"
-    // InternalOCLinEcore.g:8539:1: rule__AttributeCS__Group_6_0_1_2__0__Impl : ( 'derivation' ) ;
+    // InternalOCLinEcore.g:8541:1: rule__AttributeCS__Group_6_0_1_2__0__Impl : ( 'derivation' ) ;
     public final void rule__AttributeCS__Group_6_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8543:1: ( ( 'derivation' ) )
-            // InternalOCLinEcore.g:8544:1: ( 'derivation' )
+            // InternalOCLinEcore.g:8545:1: ( ( 'derivation' ) )
+            // InternalOCLinEcore.g:8546:1: ( 'derivation' )
             {
-            // InternalOCLinEcore.g:8544:1: ( 'derivation' )
-            // InternalOCLinEcore.g:8545:1: 'derivation'
+            // InternalOCLinEcore.g:8546:1: ( 'derivation' )
+            // InternalOCLinEcore.g:8547:1: 'derivation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getDerivationKeyword_6_0_1_2_0());
@@ -28368,14 +28368,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__1"
-    // InternalOCLinEcore.g:8558:1: rule__AttributeCS__Group_6_0_1_2__1 : rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 ;
+    // InternalOCLinEcore.g:8560:1: rule__AttributeCS__Group_6_0_1_2__1 : rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 ;
     public final void rule__AttributeCS__Group_6_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8562:1: ( rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 )
-            // InternalOCLinEcore.g:8563:2: rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2
+            // InternalOCLinEcore.g:8564:1: ( rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2 )
+            // InternalOCLinEcore.g:8565:2: rule__AttributeCS__Group_6_0_1_2__1__Impl rule__AttributeCS__Group_6_0_1_2__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__AttributeCS__Group_6_0_1_2__1__Impl();
@@ -28406,22 +28406,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__1__Impl"
-    // InternalOCLinEcore.g:8570:1: rule__AttributeCS__Group_6_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalOCLinEcore.g:8572:1: rule__AttributeCS__Group_6_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__AttributeCS__Group_6_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8574:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalOCLinEcore.g:8575:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:8576:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalOCLinEcore.g:8577:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalOCLinEcore.g:8575:1: ( ( ruleUnrestrictedName )? )
-            // InternalOCLinEcore.g:8576:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:8577:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:8578:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_2_1());
             }
-            // InternalOCLinEcore.g:8577:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:8579:1: ( ruleUnrestrictedName )?
             int alt105=2;
             int LA105_0 = input.LA(1);
 
@@ -28430,7 +28430,7 @@
             }
             switch (alt105) {
                 case 1 :
-                    // InternalOCLinEcore.g:8577:3: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:8579:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -28468,14 +28468,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__2"
-    // InternalOCLinEcore.g:8587:1: rule__AttributeCS__Group_6_0_1_2__2 : rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 ;
+    // InternalOCLinEcore.g:8589:1: rule__AttributeCS__Group_6_0_1_2__2 : rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 ;
     public final void rule__AttributeCS__Group_6_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8591:1: ( rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 )
-            // InternalOCLinEcore.g:8592:2: rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3
+            // InternalOCLinEcore.g:8593:1: ( rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3 )
+            // InternalOCLinEcore.g:8594:2: rule__AttributeCS__Group_6_0_1_2__2__Impl rule__AttributeCS__Group_6_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__AttributeCS__Group_6_0_1_2__2__Impl();
@@ -28506,17 +28506,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__2__Impl"
-    // InternalOCLinEcore.g:8599:1: rule__AttributeCS__Group_6_0_1_2__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:8601:1: rule__AttributeCS__Group_6_0_1_2__2__Impl : ( ':' ) ;
     public final void rule__AttributeCS__Group_6_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8603:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:8604:1: ( ':' )
+            // InternalOCLinEcore.g:8605:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:8606:1: ( ':' )
             {
-            // InternalOCLinEcore.g:8604:1: ( ':' )
-            // InternalOCLinEcore.g:8605:1: ':'
+            // InternalOCLinEcore.g:8606:1: ( ':' )
+            // InternalOCLinEcore.g:8607:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_2_2());
@@ -28547,14 +28547,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__3"
-    // InternalOCLinEcore.g:8618:1: rule__AttributeCS__Group_6_0_1_2__3 : rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 ;
+    // InternalOCLinEcore.g:8620:1: rule__AttributeCS__Group_6_0_1_2__3 : rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 ;
     public final void rule__AttributeCS__Group_6_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8622:1: ( rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 )
-            // InternalOCLinEcore.g:8623:2: rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4
+            // InternalOCLinEcore.g:8624:1: ( rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4 )
+            // InternalOCLinEcore.g:8625:2: rule__AttributeCS__Group_6_0_1_2__3__Impl rule__AttributeCS__Group_6_0_1_2__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__AttributeCS__Group_6_0_1_2__3__Impl();
@@ -28585,22 +28585,22 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__3__Impl"
-    // InternalOCLinEcore.g:8630:1: rule__AttributeCS__Group_6_0_1_2__3__Impl : ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) ;
+    // InternalOCLinEcore.g:8632:1: rule__AttributeCS__Group_6_0_1_2__3__Impl : ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) ;
     public final void rule__AttributeCS__Group_6_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8634:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) )
-            // InternalOCLinEcore.g:8635:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
+            // InternalOCLinEcore.g:8636:1: ( ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? ) )
+            // InternalOCLinEcore.g:8637:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
             {
-            // InternalOCLinEcore.g:8635:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
-            // InternalOCLinEcore.g:8636:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
+            // InternalOCLinEcore.g:8637:1: ( ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )? )
+            // InternalOCLinEcore.g:8638:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsAssignment_6_0_1_2_3());
             }
-            // InternalOCLinEcore.g:8637:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
+            // InternalOCLinEcore.g:8639:1: ( rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 )?
             int alt106=2;
             int LA106_0 = input.LA(1);
 
@@ -28609,7 +28609,7 @@
             }
             switch (alt106) {
                 case 1 :
-                    // InternalOCLinEcore.g:8637:2: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3
+                    // InternalOCLinEcore.g:8639:2: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3();
@@ -28647,14 +28647,14 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__4"
-    // InternalOCLinEcore.g:8647:1: rule__AttributeCS__Group_6_0_1_2__4 : rule__AttributeCS__Group_6_0_1_2__4__Impl ;
+    // InternalOCLinEcore.g:8649:1: rule__AttributeCS__Group_6_0_1_2__4 : rule__AttributeCS__Group_6_0_1_2__4__Impl ;
     public final void rule__AttributeCS__Group_6_0_1_2__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8651:1: ( rule__AttributeCS__Group_6_0_1_2__4__Impl )
-            // InternalOCLinEcore.g:8652:2: rule__AttributeCS__Group_6_0_1_2__4__Impl
+            // InternalOCLinEcore.g:8653:1: ( rule__AttributeCS__Group_6_0_1_2__4__Impl )
+            // InternalOCLinEcore.g:8654:2: rule__AttributeCS__Group_6_0_1_2__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AttributeCS__Group_6_0_1_2__4__Impl();
@@ -28680,17 +28680,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__Group_6_0_1_2__4__Impl"
-    // InternalOCLinEcore.g:8658:1: rule__AttributeCS__Group_6_0_1_2__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:8660:1: rule__AttributeCS__Group_6_0_1_2__4__Impl : ( ';' ) ;
     public final void rule__AttributeCS__Group_6_0_1_2__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8662:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:8663:1: ( ';' )
+            // InternalOCLinEcore.g:8664:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:8665:1: ( ';' )
             {
-            // InternalOCLinEcore.g:8663:1: ( ';' )
-            // InternalOCLinEcore.g:8664:1: ';'
+            // InternalOCLinEcore.g:8665:1: ( ';' )
+            // InternalOCLinEcore.g:8666:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_2_4());
@@ -28721,14 +28721,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__0"
-    // InternalOCLinEcore.g:8687:1: rule__DataTypeCS__Group__0 : rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 ;
+    // InternalOCLinEcore.g:8689:1: rule__DataTypeCS__Group__0 : rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 ;
     public final void rule__DataTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8691:1: ( rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 )
-            // InternalOCLinEcore.g:8692:2: rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1
+            // InternalOCLinEcore.g:8693:1: ( rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1 )
+            // InternalOCLinEcore.g:8694:2: rule__DataTypeCS__Group__0__Impl rule__DataTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_35);
             rule__DataTypeCS__Group__0__Impl();
@@ -28759,22 +28759,22 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__0__Impl"
-    // InternalOCLinEcore.g:8699:1: rule__DataTypeCS__Group__0__Impl : ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) ;
+    // InternalOCLinEcore.g:8701:1: rule__DataTypeCS__Group__0__Impl : ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) ;
     public final void rule__DataTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8703:1: ( ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) )
-            // InternalOCLinEcore.g:8704:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
+            // InternalOCLinEcore.g:8705:1: ( ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? ) )
+            // InternalOCLinEcore.g:8706:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
             {
-            // InternalOCLinEcore.g:8704:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
-            // InternalOCLinEcore.g:8705:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
+            // InternalOCLinEcore.g:8706:1: ( ( rule__DataTypeCS__IsPrimitiveAssignment_0 )? )
+            // InternalOCLinEcore.g:8707:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getIsPrimitiveAssignment_0());
             }
-            // InternalOCLinEcore.g:8706:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
+            // InternalOCLinEcore.g:8708:1: ( rule__DataTypeCS__IsPrimitiveAssignment_0 )?
             int alt107=2;
             int LA107_0 = input.LA(1);
 
@@ -28783,7 +28783,7 @@
             }
             switch (alt107) {
                 case 1 :
-                    // InternalOCLinEcore.g:8706:2: rule__DataTypeCS__IsPrimitiveAssignment_0
+                    // InternalOCLinEcore.g:8708:2: rule__DataTypeCS__IsPrimitiveAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__IsPrimitiveAssignment_0();
@@ -28821,14 +28821,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__1"
-    // InternalOCLinEcore.g:8716:1: rule__DataTypeCS__Group__1 : rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 ;
+    // InternalOCLinEcore.g:8718:1: rule__DataTypeCS__Group__1 : rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 ;
     public final void rule__DataTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8720:1: ( rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 )
-            // InternalOCLinEcore.g:8721:2: rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2
+            // InternalOCLinEcore.g:8722:1: ( rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2 )
+            // InternalOCLinEcore.g:8723:2: rule__DataTypeCS__Group__1__Impl rule__DataTypeCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__DataTypeCS__Group__1__Impl();
@@ -28859,17 +28859,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__1__Impl"
-    // InternalOCLinEcore.g:8728:1: rule__DataTypeCS__Group__1__Impl : ( 'datatype' ) ;
+    // InternalOCLinEcore.g:8730:1: rule__DataTypeCS__Group__1__Impl : ( 'datatype' ) ;
     public final void rule__DataTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8732:1: ( ( 'datatype' ) )
-            // InternalOCLinEcore.g:8733:1: ( 'datatype' )
+            // InternalOCLinEcore.g:8734:1: ( ( 'datatype' ) )
+            // InternalOCLinEcore.g:8735:1: ( 'datatype' )
             {
-            // InternalOCLinEcore.g:8733:1: ( 'datatype' )
-            // InternalOCLinEcore.g:8734:1: 'datatype'
+            // InternalOCLinEcore.g:8735:1: ( 'datatype' )
+            // InternalOCLinEcore.g:8736:1: 'datatype'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getDatatypeKeyword_1());
@@ -28900,14 +28900,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__2"
-    // InternalOCLinEcore.g:8747:1: rule__DataTypeCS__Group__2 : rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 ;
+    // InternalOCLinEcore.g:8749:1: rule__DataTypeCS__Group__2 : rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 ;
     public final void rule__DataTypeCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8751:1: ( rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 )
-            // InternalOCLinEcore.g:8752:2: rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3
+            // InternalOCLinEcore.g:8753:1: ( rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3 )
+            // InternalOCLinEcore.g:8754:2: rule__DataTypeCS__Group__2__Impl rule__DataTypeCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__DataTypeCS__Group__2__Impl();
@@ -28938,23 +28938,23 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__2__Impl"
-    // InternalOCLinEcore.g:8759:1: rule__DataTypeCS__Group__2__Impl : ( ( rule__DataTypeCS__NameAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:8761:1: rule__DataTypeCS__Group__2__Impl : ( ( rule__DataTypeCS__NameAssignment_2 ) ) ;
     public final void rule__DataTypeCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8763:1: ( ( ( rule__DataTypeCS__NameAssignment_2 ) ) )
-            // InternalOCLinEcore.g:8764:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:8765:1: ( ( ( rule__DataTypeCS__NameAssignment_2 ) ) )
+            // InternalOCLinEcore.g:8766:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:8764:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
-            // InternalOCLinEcore.g:8765:1: ( rule__DataTypeCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:8766:1: ( ( rule__DataTypeCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:8767:1: ( rule__DataTypeCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getNameAssignment_2());
             }
-            // InternalOCLinEcore.g:8766:1: ( rule__DataTypeCS__NameAssignment_2 )
-            // InternalOCLinEcore.g:8766:2: rule__DataTypeCS__NameAssignment_2
+            // InternalOCLinEcore.g:8768:1: ( rule__DataTypeCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:8768:2: rule__DataTypeCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__NameAssignment_2();
@@ -28989,14 +28989,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__3"
-    // InternalOCLinEcore.g:8776:1: rule__DataTypeCS__Group__3 : rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 ;
+    // InternalOCLinEcore.g:8778:1: rule__DataTypeCS__Group__3 : rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 ;
     public final void rule__DataTypeCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8780:1: ( rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 )
-            // InternalOCLinEcore.g:8781:2: rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4
+            // InternalOCLinEcore.g:8782:1: ( rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4 )
+            // InternalOCLinEcore.g:8783:2: rule__DataTypeCS__Group__3__Impl rule__DataTypeCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__DataTypeCS__Group__3__Impl();
@@ -29027,22 +29027,22 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__3__Impl"
-    // InternalOCLinEcore.g:8788:1: rule__DataTypeCS__Group__3__Impl : ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) ;
+    // InternalOCLinEcore.g:8790:1: rule__DataTypeCS__Group__3__Impl : ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) ;
     public final void rule__DataTypeCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8792:1: ( ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) )
-            // InternalOCLinEcore.g:8793:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLinEcore.g:8794:1: ( ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? ) )
+            // InternalOCLinEcore.g:8795:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
             {
-            // InternalOCLinEcore.g:8793:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
-            // InternalOCLinEcore.g:8794:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLinEcore.g:8795:1: ( ( rule__DataTypeCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLinEcore.g:8796:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getOwnedSignatureAssignment_3());
             }
-            // InternalOCLinEcore.g:8795:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLinEcore.g:8797:1: ( rule__DataTypeCS__OwnedSignatureAssignment_3 )?
             int alt108=2;
             int LA108_0 = input.LA(1);
 
@@ -29051,7 +29051,7 @@
             }
             switch (alt108) {
                 case 1 :
-                    // InternalOCLinEcore.g:8795:2: rule__DataTypeCS__OwnedSignatureAssignment_3
+                    // InternalOCLinEcore.g:8797:2: rule__DataTypeCS__OwnedSignatureAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__OwnedSignatureAssignment_3();
@@ -29089,14 +29089,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__4"
-    // InternalOCLinEcore.g:8805:1: rule__DataTypeCS__Group__4 : rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 ;
+    // InternalOCLinEcore.g:8807:1: rule__DataTypeCS__Group__4 : rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 ;
     public final void rule__DataTypeCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8809:1: ( rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 )
-            // InternalOCLinEcore.g:8810:2: rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5
+            // InternalOCLinEcore.g:8811:1: ( rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5 )
+            // InternalOCLinEcore.g:8812:2: rule__DataTypeCS__Group__4__Impl rule__DataTypeCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__DataTypeCS__Group__4__Impl();
@@ -29127,22 +29127,22 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__4__Impl"
-    // InternalOCLinEcore.g:8817:1: rule__DataTypeCS__Group__4__Impl : ( ( rule__DataTypeCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:8819:1: rule__DataTypeCS__Group__4__Impl : ( ( rule__DataTypeCS__Group_4__0 )? ) ;
     public final void rule__DataTypeCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8821:1: ( ( ( rule__DataTypeCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:8822:1: ( ( rule__DataTypeCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:8823:1: ( ( ( rule__DataTypeCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:8824:1: ( ( rule__DataTypeCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:8822:1: ( ( rule__DataTypeCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:8823:1: ( rule__DataTypeCS__Group_4__0 )?
+            // InternalOCLinEcore.g:8824:1: ( ( rule__DataTypeCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:8825:1: ( rule__DataTypeCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:8824:1: ( rule__DataTypeCS__Group_4__0 )?
+            // InternalOCLinEcore.g:8826:1: ( rule__DataTypeCS__Group_4__0 )?
             int alt109=2;
             int LA109_0 = input.LA(1);
 
@@ -29151,7 +29151,7 @@
             }
             switch (alt109) {
                 case 1 :
-                    // InternalOCLinEcore.g:8824:2: rule__DataTypeCS__Group_4__0
+                    // InternalOCLinEcore.g:8826:2: rule__DataTypeCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__Group_4__0();
@@ -29189,14 +29189,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__5"
-    // InternalOCLinEcore.g:8834:1: rule__DataTypeCS__Group__5 : rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 ;
+    // InternalOCLinEcore.g:8836:1: rule__DataTypeCS__Group__5 : rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 ;
     public final void rule__DataTypeCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8838:1: ( rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 )
-            // InternalOCLinEcore.g:8839:2: rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6
+            // InternalOCLinEcore.g:8840:1: ( rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6 )
+            // InternalOCLinEcore.g:8841:2: rule__DataTypeCS__Group__5__Impl rule__DataTypeCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__DataTypeCS__Group__5__Impl();
@@ -29227,22 +29227,22 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__5__Impl"
-    // InternalOCLinEcore.g:8846:1: rule__DataTypeCS__Group__5__Impl : ( ( rule__DataTypeCS__Group_5__0 )? ) ;
+    // InternalOCLinEcore.g:8848:1: rule__DataTypeCS__Group__5__Impl : ( ( rule__DataTypeCS__Group_5__0 )? ) ;
     public final void rule__DataTypeCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8850:1: ( ( ( rule__DataTypeCS__Group_5__0 )? ) )
-            // InternalOCLinEcore.g:8851:1: ( ( rule__DataTypeCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:8852:1: ( ( ( rule__DataTypeCS__Group_5__0 )? ) )
+            // InternalOCLinEcore.g:8853:1: ( ( rule__DataTypeCS__Group_5__0 )? )
             {
-            // InternalOCLinEcore.g:8851:1: ( ( rule__DataTypeCS__Group_5__0 )? )
-            // InternalOCLinEcore.g:8852:1: ( rule__DataTypeCS__Group_5__0 )?
+            // InternalOCLinEcore.g:8853:1: ( ( rule__DataTypeCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:8854:1: ( rule__DataTypeCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getGroup_5());
             }
-            // InternalOCLinEcore.g:8853:1: ( rule__DataTypeCS__Group_5__0 )?
+            // InternalOCLinEcore.g:8855:1: ( rule__DataTypeCS__Group_5__0 )?
             int alt110=2;
             int LA110_0 = input.LA(1);
 
@@ -29262,7 +29262,7 @@
             }
             switch (alt110) {
                 case 1 :
-                    // InternalOCLinEcore.g:8853:2: rule__DataTypeCS__Group_5__0
+                    // InternalOCLinEcore.g:8855:2: rule__DataTypeCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__Group_5__0();
@@ -29300,14 +29300,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__6"
-    // InternalOCLinEcore.g:8863:1: rule__DataTypeCS__Group__6 : rule__DataTypeCS__Group__6__Impl ;
+    // InternalOCLinEcore.g:8865:1: rule__DataTypeCS__Group__6 : rule__DataTypeCS__Group__6__Impl ;
     public final void rule__DataTypeCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8867:1: ( rule__DataTypeCS__Group__6__Impl )
-            // InternalOCLinEcore.g:8868:2: rule__DataTypeCS__Group__6__Impl
+            // InternalOCLinEcore.g:8869:1: ( rule__DataTypeCS__Group__6__Impl )
+            // InternalOCLinEcore.g:8870:2: rule__DataTypeCS__Group__6__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__Group__6__Impl();
@@ -29333,23 +29333,23 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group__6__Impl"
-    // InternalOCLinEcore.g:8874:1: rule__DataTypeCS__Group__6__Impl : ( ( rule__DataTypeCS__Alternatives_6 ) ) ;
+    // InternalOCLinEcore.g:8876:1: rule__DataTypeCS__Group__6__Impl : ( ( rule__DataTypeCS__Alternatives_6 ) ) ;
     public final void rule__DataTypeCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8878:1: ( ( ( rule__DataTypeCS__Alternatives_6 ) ) )
-            // InternalOCLinEcore.g:8879:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
+            // InternalOCLinEcore.g:8880:1: ( ( ( rule__DataTypeCS__Alternatives_6 ) ) )
+            // InternalOCLinEcore.g:8881:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
             {
-            // InternalOCLinEcore.g:8879:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
-            // InternalOCLinEcore.g:8880:1: ( rule__DataTypeCS__Alternatives_6 )
+            // InternalOCLinEcore.g:8881:1: ( ( rule__DataTypeCS__Alternatives_6 ) )
+            // InternalOCLinEcore.g:8882:1: ( rule__DataTypeCS__Alternatives_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getAlternatives_6());
             }
-            // InternalOCLinEcore.g:8881:1: ( rule__DataTypeCS__Alternatives_6 )
-            // InternalOCLinEcore.g:8881:2: rule__DataTypeCS__Alternatives_6
+            // InternalOCLinEcore.g:8883:1: ( rule__DataTypeCS__Alternatives_6 )
+            // InternalOCLinEcore.g:8883:2: rule__DataTypeCS__Alternatives_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__Alternatives_6();
@@ -29384,14 +29384,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_4__0"
-    // InternalOCLinEcore.g:8905:1: rule__DataTypeCS__Group_4__0 : rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 ;
+    // InternalOCLinEcore.g:8907:1: rule__DataTypeCS__Group_4__0 : rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 ;
     public final void rule__DataTypeCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8909:1: ( rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 )
-            // InternalOCLinEcore.g:8910:2: rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1
+            // InternalOCLinEcore.g:8911:1: ( rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1 )
+            // InternalOCLinEcore.g:8912:2: rule__DataTypeCS__Group_4__0__Impl rule__DataTypeCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__DataTypeCS__Group_4__0__Impl();
@@ -29422,17 +29422,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:8917:1: rule__DataTypeCS__Group_4__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:8919:1: rule__DataTypeCS__Group_4__0__Impl : ( ':' ) ;
     public final void rule__DataTypeCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8921:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:8922:1: ( ':' )
+            // InternalOCLinEcore.g:8923:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:8924:1: ( ':' )
             {
-            // InternalOCLinEcore.g:8922:1: ( ':' )
-            // InternalOCLinEcore.g:8923:1: ':'
+            // InternalOCLinEcore.g:8924:1: ( ':' )
+            // InternalOCLinEcore.g:8925:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());
@@ -29463,14 +29463,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_4__1"
-    // InternalOCLinEcore.g:8936:1: rule__DataTypeCS__Group_4__1 : rule__DataTypeCS__Group_4__1__Impl ;
+    // InternalOCLinEcore.g:8938:1: rule__DataTypeCS__Group_4__1 : rule__DataTypeCS__Group_4__1__Impl ;
     public final void rule__DataTypeCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8940:1: ( rule__DataTypeCS__Group_4__1__Impl )
-            // InternalOCLinEcore.g:8941:2: rule__DataTypeCS__Group_4__1__Impl
+            // InternalOCLinEcore.g:8942:1: ( rule__DataTypeCS__Group_4__1__Impl )
+            // InternalOCLinEcore.g:8943:2: rule__DataTypeCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__Group_4__1__Impl();
@@ -29496,23 +29496,23 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:8947:1: rule__DataTypeCS__Group_4__1__Impl : ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) ;
+    // InternalOCLinEcore.g:8949:1: rule__DataTypeCS__Group_4__1__Impl : ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) ;
     public final void rule__DataTypeCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8951:1: ( ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) )
-            // InternalOCLinEcore.g:8952:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
+            // InternalOCLinEcore.g:8953:1: ( ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) ) )
+            // InternalOCLinEcore.g:8954:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
             {
-            // InternalOCLinEcore.g:8952:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
-            // InternalOCLinEcore.g:8953:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
+            // InternalOCLinEcore.g:8954:1: ( ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 ) )
+            // InternalOCLinEcore.g:8955:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getInstanceClassNameAssignment_4_1());
             }
-            // InternalOCLinEcore.g:8954:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
-            // InternalOCLinEcore.g:8954:2: rule__DataTypeCS__InstanceClassNameAssignment_4_1
+            // InternalOCLinEcore.g:8956:1: ( rule__DataTypeCS__InstanceClassNameAssignment_4_1 )
+            // InternalOCLinEcore.g:8956:2: rule__DataTypeCS__InstanceClassNameAssignment_4_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__InstanceClassNameAssignment_4_1();
@@ -29547,14 +29547,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_5__0"
-    // InternalOCLinEcore.g:8968:1: rule__DataTypeCS__Group_5__0 : rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 ;
+    // InternalOCLinEcore.g:8970:1: rule__DataTypeCS__Group_5__0 : rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 ;
     public final void rule__DataTypeCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8972:1: ( rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 )
-            // InternalOCLinEcore.g:8973:2: rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1
+            // InternalOCLinEcore.g:8974:1: ( rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1 )
+            // InternalOCLinEcore.g:8975:2: rule__DataTypeCS__Group_5__0__Impl rule__DataTypeCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__DataTypeCS__Group_5__0__Impl();
@@ -29585,17 +29585,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_5__0__Impl"
-    // InternalOCLinEcore.g:8980:1: rule__DataTypeCS__Group_5__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:8982:1: rule__DataTypeCS__Group_5__0__Impl : ( '{' ) ;
     public final void rule__DataTypeCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:8984:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:8985:1: ( '{' )
+            // InternalOCLinEcore.g:8986:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:8987:1: ( '{' )
             {
-            // InternalOCLinEcore.g:8985:1: ( '{' )
-            // InternalOCLinEcore.g:8986:1: '{'
+            // InternalOCLinEcore.g:8987:1: ( '{' )
+            // InternalOCLinEcore.g:8988:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());
@@ -29626,14 +29626,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_5__1"
-    // InternalOCLinEcore.g:8999:1: rule__DataTypeCS__Group_5__1 : rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 ;
+    // InternalOCLinEcore.g:9001:1: rule__DataTypeCS__Group_5__1 : rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 ;
     public final void rule__DataTypeCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9003:1: ( rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 )
-            // InternalOCLinEcore.g:9004:2: rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2
+            // InternalOCLinEcore.g:9005:1: ( rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2 )
+            // InternalOCLinEcore.g:9006:2: rule__DataTypeCS__Group_5__1__Impl rule__DataTypeCS__Group_5__2
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__DataTypeCS__Group_5__1__Impl();
@@ -29664,22 +29664,22 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_5__1__Impl"
-    // InternalOCLinEcore.g:9011:1: rule__DataTypeCS__Group_5__1__Impl : ( ( rule__DataTypeCS__Alternatives_5_1 )? ) ;
+    // InternalOCLinEcore.g:9013:1: rule__DataTypeCS__Group_5__1__Impl : ( ( rule__DataTypeCS__Alternatives_5_1 )? ) ;
     public final void rule__DataTypeCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9015:1: ( ( ( rule__DataTypeCS__Alternatives_5_1 )? ) )
-            // InternalOCLinEcore.g:9016:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
+            // InternalOCLinEcore.g:9017:1: ( ( ( rule__DataTypeCS__Alternatives_5_1 )? ) )
+            // InternalOCLinEcore.g:9018:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
             {
-            // InternalOCLinEcore.g:9016:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
-            // InternalOCLinEcore.g:9017:1: ( rule__DataTypeCS__Alternatives_5_1 )?
+            // InternalOCLinEcore.g:9018:1: ( ( rule__DataTypeCS__Alternatives_5_1 )? )
+            // InternalOCLinEcore.g:9019:1: ( rule__DataTypeCS__Alternatives_5_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getAlternatives_5_1());
             }
-            // InternalOCLinEcore.g:9018:1: ( rule__DataTypeCS__Alternatives_5_1 )?
+            // InternalOCLinEcore.g:9020:1: ( rule__DataTypeCS__Alternatives_5_1 )?
             int alt111=2;
             int LA111_0 = input.LA(1);
 
@@ -29688,7 +29688,7 @@
             }
             switch (alt111) {
                 case 1 :
-                    // InternalOCLinEcore.g:9018:2: rule__DataTypeCS__Alternatives_5_1
+                    // InternalOCLinEcore.g:9020:2: rule__DataTypeCS__Alternatives_5_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DataTypeCS__Alternatives_5_1();
@@ -29726,14 +29726,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_5__2"
-    // InternalOCLinEcore.g:9028:1: rule__DataTypeCS__Group_5__2 : rule__DataTypeCS__Group_5__2__Impl ;
+    // InternalOCLinEcore.g:9030:1: rule__DataTypeCS__Group_5__2 : rule__DataTypeCS__Group_5__2__Impl ;
     public final void rule__DataTypeCS__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9032:1: ( rule__DataTypeCS__Group_5__2__Impl )
-            // InternalOCLinEcore.g:9033:2: rule__DataTypeCS__Group_5__2__Impl
+            // InternalOCLinEcore.g:9034:1: ( rule__DataTypeCS__Group_5__2__Impl )
+            // InternalOCLinEcore.g:9035:2: rule__DataTypeCS__Group_5__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__Group_5__2__Impl();
@@ -29759,17 +29759,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_5__2__Impl"
-    // InternalOCLinEcore.g:9039:1: rule__DataTypeCS__Group_5__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:9041:1: rule__DataTypeCS__Group_5__2__Impl : ( '}' ) ;
     public final void rule__DataTypeCS__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9043:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:9044:1: ( '}' )
+            // InternalOCLinEcore.g:9045:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:9046:1: ( '}' )
             {
-            // InternalOCLinEcore.g:9044:1: ( '}' )
-            // InternalOCLinEcore.g:9045:1: '}'
+            // InternalOCLinEcore.g:9046:1: ( '}' )
+            // InternalOCLinEcore.g:9047:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());
@@ -29800,14 +29800,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_6_0__0"
-    // InternalOCLinEcore.g:9064:1: rule__DataTypeCS__Group_6_0__0 : rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 ;
+    // InternalOCLinEcore.g:9066:1: rule__DataTypeCS__Group_6_0__0 : rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 ;
     public final void rule__DataTypeCS__Group_6_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9068:1: ( rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 )
-            // InternalOCLinEcore.g:9069:2: rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1
+            // InternalOCLinEcore.g:9070:1: ( rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1 )
+            // InternalOCLinEcore.g:9071:2: rule__DataTypeCS__Group_6_0__0__Impl rule__DataTypeCS__Group_6_0__1
             {
             pushFollow(FollowSets000.FOLLOW_38);
             rule__DataTypeCS__Group_6_0__0__Impl();
@@ -29838,17 +29838,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_6_0__0__Impl"
-    // InternalOCLinEcore.g:9076:1: rule__DataTypeCS__Group_6_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:9078:1: rule__DataTypeCS__Group_6_0__0__Impl : ( '{' ) ;
     public final void rule__DataTypeCS__Group_6_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9080:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:9081:1: ( '{' )
+            // InternalOCLinEcore.g:9082:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:9083:1: ( '{' )
             {
-            // InternalOCLinEcore.g:9081:1: ( '{' )
-            // InternalOCLinEcore.g:9082:1: '{'
+            // InternalOCLinEcore.g:9083:1: ( '{' )
+            // InternalOCLinEcore.g:9084:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());
@@ -29879,14 +29879,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_6_0__1"
-    // InternalOCLinEcore.g:9095:1: rule__DataTypeCS__Group_6_0__1 : rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 ;
+    // InternalOCLinEcore.g:9097:1: rule__DataTypeCS__Group_6_0__1 : rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 ;
     public final void rule__DataTypeCS__Group_6_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9099:1: ( rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 )
-            // InternalOCLinEcore.g:9100:2: rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2
+            // InternalOCLinEcore.g:9101:1: ( rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2 )
+            // InternalOCLinEcore.g:9102:2: rule__DataTypeCS__Group_6_0__1__Impl rule__DataTypeCS__Group_6_0__2
             {
             pushFollow(FollowSets000.FOLLOW_38);
             rule__DataTypeCS__Group_6_0__1__Impl();
@@ -29917,22 +29917,22 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_6_0__1__Impl"
-    // InternalOCLinEcore.g:9107:1: rule__DataTypeCS__Group_6_0__1__Impl : ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) ;
+    // InternalOCLinEcore.g:9109:1: rule__DataTypeCS__Group_6_0__1__Impl : ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) ;
     public final void rule__DataTypeCS__Group_6_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9111:1: ( ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) )
-            // InternalOCLinEcore.g:9112:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
+            // InternalOCLinEcore.g:9113:1: ( ( ( rule__DataTypeCS__Alternatives_6_0_1 )* ) )
+            // InternalOCLinEcore.g:9114:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
             {
-            // InternalOCLinEcore.g:9112:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
-            // InternalOCLinEcore.g:9113:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
+            // InternalOCLinEcore.g:9114:1: ( ( rule__DataTypeCS__Alternatives_6_0_1 )* )
+            // InternalOCLinEcore.g:9115:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getAlternatives_6_0_1());
             }
-            // InternalOCLinEcore.g:9114:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
+            // InternalOCLinEcore.g:9116:1: ( rule__DataTypeCS__Alternatives_6_0_1 )*
             loop112:
             do {
                 int alt112=2;
@@ -29945,7 +29945,7 @@
 
                 switch (alt112) {
             	case 1 :
-            	    // InternalOCLinEcore.g:9114:2: rule__DataTypeCS__Alternatives_6_0_1
+            	    // InternalOCLinEcore.g:9116:2: rule__DataTypeCS__Alternatives_6_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_39);
             	    rule__DataTypeCS__Alternatives_6_0_1();
@@ -29986,14 +29986,14 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_6_0__2"
-    // InternalOCLinEcore.g:9124:1: rule__DataTypeCS__Group_6_0__2 : rule__DataTypeCS__Group_6_0__2__Impl ;
+    // InternalOCLinEcore.g:9126:1: rule__DataTypeCS__Group_6_0__2 : rule__DataTypeCS__Group_6_0__2__Impl ;
     public final void rule__DataTypeCS__Group_6_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9128:1: ( rule__DataTypeCS__Group_6_0__2__Impl )
-            // InternalOCLinEcore.g:9129:2: rule__DataTypeCS__Group_6_0__2__Impl
+            // InternalOCLinEcore.g:9130:1: ( rule__DataTypeCS__Group_6_0__2__Impl )
+            // InternalOCLinEcore.g:9131:2: rule__DataTypeCS__Group_6_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DataTypeCS__Group_6_0__2__Impl();
@@ -30019,17 +30019,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__Group_6_0__2__Impl"
-    // InternalOCLinEcore.g:9135:1: rule__DataTypeCS__Group_6_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:9137:1: rule__DataTypeCS__Group_6_0__2__Impl : ( '}' ) ;
     public final void rule__DataTypeCS__Group_6_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9139:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:9140:1: ( '}' )
+            // InternalOCLinEcore.g:9141:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:9142:1: ( '}' )
             {
-            // InternalOCLinEcore.g:9140:1: ( '}' )
-            // InternalOCLinEcore.g:9141:1: '}'
+            // InternalOCLinEcore.g:9142:1: ( '}' )
+            // InternalOCLinEcore.g:9143:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_2());
@@ -30060,14 +30060,14 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__0"
-    // InternalOCLinEcore.g:9160:1: rule__DetailCS__Group__0 : rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 ;
+    // InternalOCLinEcore.g:9162:1: rule__DetailCS__Group__0 : rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 ;
     public final void rule__DetailCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9164:1: ( rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 )
-            // InternalOCLinEcore.g:9165:2: rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1
+            // InternalOCLinEcore.g:9166:1: ( rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 )
+            // InternalOCLinEcore.g:9167:2: rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__DetailCS__Group__0__Impl();
@@ -30098,23 +30098,23 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__0__Impl"
-    // InternalOCLinEcore.g:9172:1: rule__DetailCS__Group__0__Impl : ( ( rule__DetailCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:9174:1: rule__DetailCS__Group__0__Impl : ( ( rule__DetailCS__NameAssignment_0 ) ) ;
     public final void rule__DetailCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9176:1: ( ( ( rule__DetailCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:9177:1: ( ( rule__DetailCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:9178:1: ( ( ( rule__DetailCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:9179:1: ( ( rule__DetailCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:9177:1: ( ( rule__DetailCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:9178:1: ( rule__DetailCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:9179:1: ( ( rule__DetailCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:9180:1: ( rule__DetailCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:9179:1: ( rule__DetailCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:9179:2: rule__DetailCS__NameAssignment_0
+            // InternalOCLinEcore.g:9181:1: ( rule__DetailCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:9181:2: rule__DetailCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__NameAssignment_0();
@@ -30149,14 +30149,14 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__1"
-    // InternalOCLinEcore.g:9189:1: rule__DetailCS__Group__1 : rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 ;
+    // InternalOCLinEcore.g:9191:1: rule__DetailCS__Group__1 : rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 ;
     public final void rule__DetailCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9193:1: ( rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 )
-            // InternalOCLinEcore.g:9194:2: rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2
+            // InternalOCLinEcore.g:9195:1: ( rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 )
+            // InternalOCLinEcore.g:9196:2: rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__DetailCS__Group__1__Impl();
@@ -30187,17 +30187,17 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__1__Impl"
-    // InternalOCLinEcore.g:9201:1: rule__DetailCS__Group__1__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:9203:1: rule__DetailCS__Group__1__Impl : ( '=' ) ;
     public final void rule__DetailCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9205:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:9206:1: ( '=' )
+            // InternalOCLinEcore.g:9207:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:9208:1: ( '=' )
             {
-            // InternalOCLinEcore.g:9206:1: ( '=' )
-            // InternalOCLinEcore.g:9207:1: '='
+            // InternalOCLinEcore.g:9208:1: ( '=' )
+            // InternalOCLinEcore.g:9209:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getEqualsSignKeyword_1());
@@ -30228,14 +30228,14 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__2"
-    // InternalOCLinEcore.g:9220:1: rule__DetailCS__Group__2 : rule__DetailCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:9222:1: rule__DetailCS__Group__2 : rule__DetailCS__Group__2__Impl ;
     public final void rule__DetailCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9224:1: ( rule__DetailCS__Group__2__Impl )
-            // InternalOCLinEcore.g:9225:2: rule__DetailCS__Group__2__Impl
+            // InternalOCLinEcore.g:9226:1: ( rule__DetailCS__Group__2__Impl )
+            // InternalOCLinEcore.g:9227:2: rule__DetailCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__Group__2__Impl();
@@ -30261,22 +30261,22 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__2__Impl"
-    // InternalOCLinEcore.g:9231:1: rule__DetailCS__Group__2__Impl : ( ( rule__DetailCS__ValuesAssignment_2 )* ) ;
+    // InternalOCLinEcore.g:9233:1: rule__DetailCS__Group__2__Impl : ( ( rule__DetailCS__ValuesAssignment_2 )* ) ;
     public final void rule__DetailCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9235:1: ( ( ( rule__DetailCS__ValuesAssignment_2 )* ) )
-            // InternalOCLinEcore.g:9236:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
+            // InternalOCLinEcore.g:9237:1: ( ( ( rule__DetailCS__ValuesAssignment_2 )* ) )
+            // InternalOCLinEcore.g:9238:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
             {
-            // InternalOCLinEcore.g:9236:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
-            // InternalOCLinEcore.g:9237:1: ( rule__DetailCS__ValuesAssignment_2 )*
+            // InternalOCLinEcore.g:9238:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
+            // InternalOCLinEcore.g:9239:1: ( rule__DetailCS__ValuesAssignment_2 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getValuesAssignment_2());
             }
-            // InternalOCLinEcore.g:9238:1: ( rule__DetailCS__ValuesAssignment_2 )*
+            // InternalOCLinEcore.g:9240:1: ( rule__DetailCS__ValuesAssignment_2 )*
             loop113:
             do {
                 int alt113=2;
@@ -30289,7 +30289,7 @@
 
                 switch (alt113) {
             	case 1 :
-            	    // InternalOCLinEcore.g:9238:2: rule__DetailCS__ValuesAssignment_2
+            	    // InternalOCLinEcore.g:9240:2: rule__DetailCS__ValuesAssignment_2
             	    {
             	    pushFollow(FollowSets000.FOLLOW_42);
             	    rule__DetailCS__ValuesAssignment_2();
@@ -30330,14 +30330,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__0"
-    // InternalOCLinEcore.g:9254:1: rule__DocumentationCS__Group__0 : rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 ;
+    // InternalOCLinEcore.g:9256:1: rule__DocumentationCS__Group__0 : rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 ;
     public final void rule__DocumentationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9258:1: ( rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 )
-            // InternalOCLinEcore.g:9259:2: rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1
+            // InternalOCLinEcore.g:9260:1: ( rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 )
+            // InternalOCLinEcore.g:9261:2: rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__DocumentationCS__Group__0__Impl();
@@ -30368,23 +30368,23 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__0__Impl"
-    // InternalOCLinEcore.g:9266:1: rule__DocumentationCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:9268:1: rule__DocumentationCS__Group__0__Impl : ( () ) ;
     public final void rule__DocumentationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9270:1: ( ( () ) )
-            // InternalOCLinEcore.g:9271:1: ( () )
+            // InternalOCLinEcore.g:9272:1: ( ( () ) )
+            // InternalOCLinEcore.g:9273:1: ( () )
             {
-            // InternalOCLinEcore.g:9271:1: ( () )
-            // InternalOCLinEcore.g:9272:1: ()
+            // InternalOCLinEcore.g:9273:1: ( () )
+            // InternalOCLinEcore.g:9274:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getDocumentationCSAction_0());
             }
-            // InternalOCLinEcore.g:9273:1: ()
-            // InternalOCLinEcore.g:9275:1:
+            // InternalOCLinEcore.g:9275:1: ()
+            // InternalOCLinEcore.g:9277:1:
             {
             }
 
@@ -30409,14 +30409,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__1"
-    // InternalOCLinEcore.g:9285:1: rule__DocumentationCS__Group__1 : rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 ;
+    // InternalOCLinEcore.g:9287:1: rule__DocumentationCS__Group__1 : rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 ;
     public final void rule__DocumentationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9289:1: ( rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 )
-            // InternalOCLinEcore.g:9290:2: rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2
+            // InternalOCLinEcore.g:9291:1: ( rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 )
+            // InternalOCLinEcore.g:9292:2: rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__DocumentationCS__Group__1__Impl();
@@ -30447,17 +30447,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__1__Impl"
-    // InternalOCLinEcore.g:9297:1: rule__DocumentationCS__Group__1__Impl : ( 'documentation' ) ;
+    // InternalOCLinEcore.g:9299:1: rule__DocumentationCS__Group__1__Impl : ( 'documentation' ) ;
     public final void rule__DocumentationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9301:1: ( ( 'documentation' ) )
-            // InternalOCLinEcore.g:9302:1: ( 'documentation' )
+            // InternalOCLinEcore.g:9303:1: ( ( 'documentation' ) )
+            // InternalOCLinEcore.g:9304:1: ( 'documentation' )
             {
-            // InternalOCLinEcore.g:9302:1: ( 'documentation' )
-            // InternalOCLinEcore.g:9303:1: 'documentation'
+            // InternalOCLinEcore.g:9304:1: ( 'documentation' )
+            // InternalOCLinEcore.g:9305:1: 'documentation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getDocumentationKeyword_1());
@@ -30488,14 +30488,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__2"
-    // InternalOCLinEcore.g:9316:1: rule__DocumentationCS__Group__2 : rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 ;
+    // InternalOCLinEcore.g:9318:1: rule__DocumentationCS__Group__2 : rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 ;
     public final void rule__DocumentationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9320:1: ( rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 )
-            // InternalOCLinEcore.g:9321:2: rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3
+            // InternalOCLinEcore.g:9322:1: ( rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 )
+            // InternalOCLinEcore.g:9323:2: rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__DocumentationCS__Group__2__Impl();
@@ -30526,22 +30526,22 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__2__Impl"
-    // InternalOCLinEcore.g:9328:1: rule__DocumentationCS__Group__2__Impl : ( ( rule__DocumentationCS__ValueAssignment_2 )? ) ;
+    // InternalOCLinEcore.g:9330:1: rule__DocumentationCS__Group__2__Impl : ( ( rule__DocumentationCS__ValueAssignment_2 )? ) ;
     public final void rule__DocumentationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9332:1: ( ( ( rule__DocumentationCS__ValueAssignment_2 )? ) )
-            // InternalOCLinEcore.g:9333:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
+            // InternalOCLinEcore.g:9334:1: ( ( ( rule__DocumentationCS__ValueAssignment_2 )? ) )
+            // InternalOCLinEcore.g:9335:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
             {
-            // InternalOCLinEcore.g:9333:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
-            // InternalOCLinEcore.g:9334:1: ( rule__DocumentationCS__ValueAssignment_2 )?
+            // InternalOCLinEcore.g:9335:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
+            // InternalOCLinEcore.g:9336:1: ( rule__DocumentationCS__ValueAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getValueAssignment_2());
             }
-            // InternalOCLinEcore.g:9335:1: ( rule__DocumentationCS__ValueAssignment_2 )?
+            // InternalOCLinEcore.g:9337:1: ( rule__DocumentationCS__ValueAssignment_2 )?
             int alt114=2;
             int LA114_0 = input.LA(1);
 
@@ -30550,7 +30550,7 @@
             }
             switch (alt114) {
                 case 1 :
-                    // InternalOCLinEcore.g:9335:2: rule__DocumentationCS__ValueAssignment_2
+                    // InternalOCLinEcore.g:9337:2: rule__DocumentationCS__ValueAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DocumentationCS__ValueAssignment_2();
@@ -30588,14 +30588,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__3"
-    // InternalOCLinEcore.g:9345:1: rule__DocumentationCS__Group__3 : rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 ;
+    // InternalOCLinEcore.g:9347:1: rule__DocumentationCS__Group__3 : rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 ;
     public final void rule__DocumentationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9349:1: ( rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 )
-            // InternalOCLinEcore.g:9350:2: rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4
+            // InternalOCLinEcore.g:9351:1: ( rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 )
+            // InternalOCLinEcore.g:9352:2: rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__DocumentationCS__Group__3__Impl();
@@ -30626,22 +30626,22 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__3__Impl"
-    // InternalOCLinEcore.g:9357:1: rule__DocumentationCS__Group__3__Impl : ( ( rule__DocumentationCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:9359:1: rule__DocumentationCS__Group__3__Impl : ( ( rule__DocumentationCS__Group_3__0 )? ) ;
     public final void rule__DocumentationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9361:1: ( ( ( rule__DocumentationCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:9362:1: ( ( rule__DocumentationCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:9363:1: ( ( ( rule__DocumentationCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:9364:1: ( ( rule__DocumentationCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:9362:1: ( ( rule__DocumentationCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:9363:1: ( rule__DocumentationCS__Group_3__0 )?
+            // InternalOCLinEcore.g:9364:1: ( ( rule__DocumentationCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:9365:1: ( rule__DocumentationCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:9364:1: ( rule__DocumentationCS__Group_3__0 )?
+            // InternalOCLinEcore.g:9366:1: ( rule__DocumentationCS__Group_3__0 )?
             int alt115=2;
             int LA115_0 = input.LA(1);
 
@@ -30650,7 +30650,7 @@
             }
             switch (alt115) {
                 case 1 :
-                    // InternalOCLinEcore.g:9364:2: rule__DocumentationCS__Group_3__0
+                    // InternalOCLinEcore.g:9366:2: rule__DocumentationCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DocumentationCS__Group_3__0();
@@ -30688,14 +30688,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__4"
-    // InternalOCLinEcore.g:9374:1: rule__DocumentationCS__Group__4 : rule__DocumentationCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:9376:1: rule__DocumentationCS__Group__4 : rule__DocumentationCS__Group__4__Impl ;
     public final void rule__DocumentationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9378:1: ( rule__DocumentationCS__Group__4__Impl )
-            // InternalOCLinEcore.g:9379:2: rule__DocumentationCS__Group__4__Impl
+            // InternalOCLinEcore.g:9380:1: ( rule__DocumentationCS__Group__4__Impl )
+            // InternalOCLinEcore.g:9381:2: rule__DocumentationCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__Group__4__Impl();
@@ -30721,17 +30721,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__4__Impl"
-    // InternalOCLinEcore.g:9385:1: rule__DocumentationCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:9387:1: rule__DocumentationCS__Group__4__Impl : ( ';' ) ;
     public final void rule__DocumentationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9389:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:9390:1: ( ';' )
+            // InternalOCLinEcore.g:9391:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:9392:1: ( ';' )
             {
-            // InternalOCLinEcore.g:9390:1: ( ';' )
-            // InternalOCLinEcore.g:9391:1: ';'
+            // InternalOCLinEcore.g:9392:1: ( ';' )
+            // InternalOCLinEcore.g:9393:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getSemicolonKeyword_4());
@@ -30762,14 +30762,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__0"
-    // InternalOCLinEcore.g:9414:1: rule__DocumentationCS__Group_3__0 : rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 ;
+    // InternalOCLinEcore.g:9416:1: rule__DocumentationCS__Group_3__0 : rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 ;
     public final void rule__DocumentationCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9418:1: ( rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 )
-            // InternalOCLinEcore.g:9419:2: rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1
+            // InternalOCLinEcore.g:9420:1: ( rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 )
+            // InternalOCLinEcore.g:9421:2: rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__DocumentationCS__Group_3__0__Impl();
@@ -30800,17 +30800,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:9426:1: rule__DocumentationCS__Group_3__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:9428:1: rule__DocumentationCS__Group_3__0__Impl : ( '(' ) ;
     public final void rule__DocumentationCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9430:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:9431:1: ( '(' )
+            // InternalOCLinEcore.g:9432:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:9433:1: ( '(' )
             {
-            // InternalOCLinEcore.g:9431:1: ( '(' )
-            // InternalOCLinEcore.g:9432:1: '('
+            // InternalOCLinEcore.g:9433:1: ( '(' )
+            // InternalOCLinEcore.g:9434:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getLeftParenthesisKeyword_3_0());
@@ -30841,14 +30841,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__1"
-    // InternalOCLinEcore.g:9445:1: rule__DocumentationCS__Group_3__1 : rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 ;
+    // InternalOCLinEcore.g:9447:1: rule__DocumentationCS__Group_3__1 : rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 ;
     public final void rule__DocumentationCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9449:1: ( rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 )
-            // InternalOCLinEcore.g:9450:2: rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2
+            // InternalOCLinEcore.g:9451:1: ( rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 )
+            // InternalOCLinEcore.g:9452:2: rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__DocumentationCS__Group_3__1__Impl();
@@ -30879,23 +30879,23 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:9457:1: rule__DocumentationCS__Group_3__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:9459:1: rule__DocumentationCS__Group_3__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) ;
     public final void rule__DocumentationCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9461:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:9462:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
+            // InternalOCLinEcore.g:9463:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:9464:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:9462:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
-            // InternalOCLinEcore.g:9463:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
+            // InternalOCLinEcore.g:9464:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
+            // InternalOCLinEcore.g:9465:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_1());
             }
-            // InternalOCLinEcore.g:9464:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
-            // InternalOCLinEcore.g:9464:2: rule__DocumentationCS__OwnedDetailsAssignment_3_1
+            // InternalOCLinEcore.g:9466:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
+            // InternalOCLinEcore.g:9466:2: rule__DocumentationCS__OwnedDetailsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__OwnedDetailsAssignment_3_1();
@@ -30930,14 +30930,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__2"
-    // InternalOCLinEcore.g:9474:1: rule__DocumentationCS__Group_3__2 : rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 ;
+    // InternalOCLinEcore.g:9476:1: rule__DocumentationCS__Group_3__2 : rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 ;
     public final void rule__DocumentationCS__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9478:1: ( rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 )
-            // InternalOCLinEcore.g:9479:2: rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3
+            // InternalOCLinEcore.g:9480:1: ( rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 )
+            // InternalOCLinEcore.g:9481:2: rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__DocumentationCS__Group_3__2__Impl();
@@ -30968,22 +30968,22 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__2__Impl"
-    // InternalOCLinEcore.g:9486:1: rule__DocumentationCS__Group_3__2__Impl : ( ( rule__DocumentationCS__Group_3_2__0 )* ) ;
+    // InternalOCLinEcore.g:9488:1: rule__DocumentationCS__Group_3__2__Impl : ( ( rule__DocumentationCS__Group_3_2__0 )* ) ;
     public final void rule__DocumentationCS__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9490:1: ( ( ( rule__DocumentationCS__Group_3_2__0 )* ) )
-            // InternalOCLinEcore.g:9491:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
+            // InternalOCLinEcore.g:9492:1: ( ( ( rule__DocumentationCS__Group_3_2__0 )* ) )
+            // InternalOCLinEcore.g:9493:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
             {
-            // InternalOCLinEcore.g:9491:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
-            // InternalOCLinEcore.g:9492:1: ( rule__DocumentationCS__Group_3_2__0 )*
+            // InternalOCLinEcore.g:9493:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
+            // InternalOCLinEcore.g:9494:1: ( rule__DocumentationCS__Group_3_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getGroup_3_2());
             }
-            // InternalOCLinEcore.g:9493:1: ( rule__DocumentationCS__Group_3_2__0 )*
+            // InternalOCLinEcore.g:9495:1: ( rule__DocumentationCS__Group_3_2__0 )*
             loop116:
             do {
                 int alt116=2;
@@ -30996,7 +30996,7 @@
 
                 switch (alt116) {
             	case 1 :
-            	    // InternalOCLinEcore.g:9493:2: rule__DocumentationCS__Group_3_2__0
+            	    // InternalOCLinEcore.g:9495:2: rule__DocumentationCS__Group_3_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__DocumentationCS__Group_3_2__0();
@@ -31037,14 +31037,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__3"
-    // InternalOCLinEcore.g:9503:1: rule__DocumentationCS__Group_3__3 : rule__DocumentationCS__Group_3__3__Impl ;
+    // InternalOCLinEcore.g:9505:1: rule__DocumentationCS__Group_3__3 : rule__DocumentationCS__Group_3__3__Impl ;
     public final void rule__DocumentationCS__Group_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9507:1: ( rule__DocumentationCS__Group_3__3__Impl )
-            // InternalOCLinEcore.g:9508:2: rule__DocumentationCS__Group_3__3__Impl
+            // InternalOCLinEcore.g:9509:1: ( rule__DocumentationCS__Group_3__3__Impl )
+            // InternalOCLinEcore.g:9510:2: rule__DocumentationCS__Group_3__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__Group_3__3__Impl();
@@ -31070,17 +31070,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__3__Impl"
-    // InternalOCLinEcore.g:9514:1: rule__DocumentationCS__Group_3__3__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:9516:1: rule__DocumentationCS__Group_3__3__Impl : ( ')' ) ;
     public final void rule__DocumentationCS__Group_3__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9518:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:9519:1: ( ')' )
+            // InternalOCLinEcore.g:9520:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:9521:1: ( ')' )
             {
-            // InternalOCLinEcore.g:9519:1: ( ')' )
-            // InternalOCLinEcore.g:9520:1: ')'
+            // InternalOCLinEcore.g:9521:1: ( ')' )
+            // InternalOCLinEcore.g:9522:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getRightParenthesisKeyword_3_3());
@@ -31111,14 +31111,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__0"
-    // InternalOCLinEcore.g:9541:1: rule__DocumentationCS__Group_3_2__0 : rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 ;
+    // InternalOCLinEcore.g:9543:1: rule__DocumentationCS__Group_3_2__0 : rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 ;
     public final void rule__DocumentationCS__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9545:1: ( rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 )
-            // InternalOCLinEcore.g:9546:2: rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1
+            // InternalOCLinEcore.g:9547:1: ( rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 )
+            // InternalOCLinEcore.g:9548:2: rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__DocumentationCS__Group_3_2__0__Impl();
@@ -31149,17 +31149,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__0__Impl"
-    // InternalOCLinEcore.g:9553:1: rule__DocumentationCS__Group_3_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:9555:1: rule__DocumentationCS__Group_3_2__0__Impl : ( ',' ) ;
     public final void rule__DocumentationCS__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9557:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:9558:1: ( ',' )
+            // InternalOCLinEcore.g:9559:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:9560:1: ( ',' )
             {
-            // InternalOCLinEcore.g:9558:1: ( ',' )
-            // InternalOCLinEcore.g:9559:1: ','
+            // InternalOCLinEcore.g:9560:1: ( ',' )
+            // InternalOCLinEcore.g:9561:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getCommaKeyword_3_2_0());
@@ -31190,14 +31190,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__1"
-    // InternalOCLinEcore.g:9572:1: rule__DocumentationCS__Group_3_2__1 : rule__DocumentationCS__Group_3_2__1__Impl ;
+    // InternalOCLinEcore.g:9574:1: rule__DocumentationCS__Group_3_2__1 : rule__DocumentationCS__Group_3_2__1__Impl ;
     public final void rule__DocumentationCS__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9576:1: ( rule__DocumentationCS__Group_3_2__1__Impl )
-            // InternalOCLinEcore.g:9577:2: rule__DocumentationCS__Group_3_2__1__Impl
+            // InternalOCLinEcore.g:9578:1: ( rule__DocumentationCS__Group_3_2__1__Impl )
+            // InternalOCLinEcore.g:9579:2: rule__DocumentationCS__Group_3_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__Group_3_2__1__Impl();
@@ -31223,23 +31223,23 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__1__Impl"
-    // InternalOCLinEcore.g:9583:1: rule__DocumentationCS__Group_3_2__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
+    // InternalOCLinEcore.g:9585:1: rule__DocumentationCS__Group_3_2__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
     public final void rule__DocumentationCS__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9587:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) )
-            // InternalOCLinEcore.g:9588:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
+            // InternalOCLinEcore.g:9589:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) )
+            // InternalOCLinEcore.g:9590:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
             {
-            // InternalOCLinEcore.g:9588:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
-            // InternalOCLinEcore.g:9589:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
+            // InternalOCLinEcore.g:9590:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
+            // InternalOCLinEcore.g:9591:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_2_1());
             }
-            // InternalOCLinEcore.g:9590:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
-            // InternalOCLinEcore.g:9590:2: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1
+            // InternalOCLinEcore.g:9592:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
+            // InternalOCLinEcore.g:9592:2: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__OwnedDetailsAssignment_3_2_1();
@@ -31274,14 +31274,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__0"
-    // InternalOCLinEcore.g:9604:1: rule__EnumerationCS__Group__0 : rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 ;
+    // InternalOCLinEcore.g:9606:1: rule__EnumerationCS__Group__0 : rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 ;
     public final void rule__EnumerationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9608:1: ( rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 )
-            // InternalOCLinEcore.g:9609:2: rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1
+            // InternalOCLinEcore.g:9610:1: ( rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1 )
+            // InternalOCLinEcore.g:9611:2: rule__EnumerationCS__Group__0__Impl rule__EnumerationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__EnumerationCS__Group__0__Impl();
@@ -31312,17 +31312,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__0__Impl"
-    // InternalOCLinEcore.g:9616:1: rule__EnumerationCS__Group__0__Impl : ( 'enum' ) ;
+    // InternalOCLinEcore.g:9618:1: rule__EnumerationCS__Group__0__Impl : ( 'enum' ) ;
     public final void rule__EnumerationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9620:1: ( ( 'enum' ) )
-            // InternalOCLinEcore.g:9621:1: ( 'enum' )
+            // InternalOCLinEcore.g:9622:1: ( ( 'enum' ) )
+            // InternalOCLinEcore.g:9623:1: ( 'enum' )
             {
-            // InternalOCLinEcore.g:9621:1: ( 'enum' )
-            // InternalOCLinEcore.g:9622:1: 'enum'
+            // InternalOCLinEcore.g:9623:1: ( 'enum' )
+            // InternalOCLinEcore.g:9624:1: 'enum'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getEnumKeyword_0());
@@ -31353,14 +31353,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__1"
-    // InternalOCLinEcore.g:9635:1: rule__EnumerationCS__Group__1 : rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 ;
+    // InternalOCLinEcore.g:9637:1: rule__EnumerationCS__Group__1 : rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 ;
     public final void rule__EnumerationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9639:1: ( rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 )
-            // InternalOCLinEcore.g:9640:2: rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2
+            // InternalOCLinEcore.g:9641:1: ( rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2 )
+            // InternalOCLinEcore.g:9642:2: rule__EnumerationCS__Group__1__Impl rule__EnumerationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__EnumerationCS__Group__1__Impl();
@@ -31391,23 +31391,23 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__1__Impl"
-    // InternalOCLinEcore.g:9647:1: rule__EnumerationCS__Group__1__Impl : ( ( rule__EnumerationCS__NameAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:9649:1: rule__EnumerationCS__Group__1__Impl : ( ( rule__EnumerationCS__NameAssignment_1 ) ) ;
     public final void rule__EnumerationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9651:1: ( ( ( rule__EnumerationCS__NameAssignment_1 ) ) )
-            // InternalOCLinEcore.g:9652:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
+            // InternalOCLinEcore.g:9653:1: ( ( ( rule__EnumerationCS__NameAssignment_1 ) ) )
+            // InternalOCLinEcore.g:9654:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:9652:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
-            // InternalOCLinEcore.g:9653:1: ( rule__EnumerationCS__NameAssignment_1 )
+            // InternalOCLinEcore.g:9654:1: ( ( rule__EnumerationCS__NameAssignment_1 ) )
+            // InternalOCLinEcore.g:9655:1: ( rule__EnumerationCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getNameAssignment_1());
             }
-            // InternalOCLinEcore.g:9654:1: ( rule__EnumerationCS__NameAssignment_1 )
-            // InternalOCLinEcore.g:9654:2: rule__EnumerationCS__NameAssignment_1
+            // InternalOCLinEcore.g:9656:1: ( rule__EnumerationCS__NameAssignment_1 )
+            // InternalOCLinEcore.g:9656:2: rule__EnumerationCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__NameAssignment_1();
@@ -31442,14 +31442,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__2"
-    // InternalOCLinEcore.g:9664:1: rule__EnumerationCS__Group__2 : rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 ;
+    // InternalOCLinEcore.g:9666:1: rule__EnumerationCS__Group__2 : rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 ;
     public final void rule__EnumerationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9668:1: ( rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 )
-            // InternalOCLinEcore.g:9669:2: rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3
+            // InternalOCLinEcore.g:9670:1: ( rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3 )
+            // InternalOCLinEcore.g:9671:2: rule__EnumerationCS__Group__2__Impl rule__EnumerationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__EnumerationCS__Group__2__Impl();
@@ -31480,22 +31480,22 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__2__Impl"
-    // InternalOCLinEcore.g:9676:1: rule__EnumerationCS__Group__2__Impl : ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) ;
+    // InternalOCLinEcore.g:9678:1: rule__EnumerationCS__Group__2__Impl : ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) ;
     public final void rule__EnumerationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9680:1: ( ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) )
-            // InternalOCLinEcore.g:9681:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
+            // InternalOCLinEcore.g:9682:1: ( ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? ) )
+            // InternalOCLinEcore.g:9683:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
             {
-            // InternalOCLinEcore.g:9681:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
-            // InternalOCLinEcore.g:9682:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
+            // InternalOCLinEcore.g:9683:1: ( ( rule__EnumerationCS__OwnedSignatureAssignment_2 )? )
+            // InternalOCLinEcore.g:9684:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getOwnedSignatureAssignment_2());
             }
-            // InternalOCLinEcore.g:9683:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
+            // InternalOCLinEcore.g:9685:1: ( rule__EnumerationCS__OwnedSignatureAssignment_2 )?
             int alt117=2;
             int LA117_0 = input.LA(1);
 
@@ -31504,7 +31504,7 @@
             }
             switch (alt117) {
                 case 1 :
-                    // InternalOCLinEcore.g:9683:2: rule__EnumerationCS__OwnedSignatureAssignment_2
+                    // InternalOCLinEcore.g:9685:2: rule__EnumerationCS__OwnedSignatureAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__OwnedSignatureAssignment_2();
@@ -31542,14 +31542,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__3"
-    // InternalOCLinEcore.g:9693:1: rule__EnumerationCS__Group__3 : rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 ;
+    // InternalOCLinEcore.g:9695:1: rule__EnumerationCS__Group__3 : rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 ;
     public final void rule__EnumerationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9697:1: ( rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 )
-            // InternalOCLinEcore.g:9698:2: rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4
+            // InternalOCLinEcore.g:9699:1: ( rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4 )
+            // InternalOCLinEcore.g:9700:2: rule__EnumerationCS__Group__3__Impl rule__EnumerationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__EnumerationCS__Group__3__Impl();
@@ -31580,22 +31580,22 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__3__Impl"
-    // InternalOCLinEcore.g:9705:1: rule__EnumerationCS__Group__3__Impl : ( ( rule__EnumerationCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:9707:1: rule__EnumerationCS__Group__3__Impl : ( ( rule__EnumerationCS__Group_3__0 )? ) ;
     public final void rule__EnumerationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9709:1: ( ( ( rule__EnumerationCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:9710:1: ( ( rule__EnumerationCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:9711:1: ( ( ( rule__EnumerationCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:9712:1: ( ( rule__EnumerationCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:9710:1: ( ( rule__EnumerationCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:9711:1: ( rule__EnumerationCS__Group_3__0 )?
+            // InternalOCLinEcore.g:9712:1: ( ( rule__EnumerationCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:9713:1: ( rule__EnumerationCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:9712:1: ( rule__EnumerationCS__Group_3__0 )?
+            // InternalOCLinEcore.g:9714:1: ( rule__EnumerationCS__Group_3__0 )?
             int alt118=2;
             int LA118_0 = input.LA(1);
 
@@ -31604,7 +31604,7 @@
             }
             switch (alt118) {
                 case 1 :
-                    // InternalOCLinEcore.g:9712:2: rule__EnumerationCS__Group_3__0
+                    // InternalOCLinEcore.g:9714:2: rule__EnumerationCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__Group_3__0();
@@ -31642,14 +31642,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__4"
-    // InternalOCLinEcore.g:9722:1: rule__EnumerationCS__Group__4 : rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 ;
+    // InternalOCLinEcore.g:9724:1: rule__EnumerationCS__Group__4 : rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 ;
     public final void rule__EnumerationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9726:1: ( rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 )
-            // InternalOCLinEcore.g:9727:2: rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5
+            // InternalOCLinEcore.g:9728:1: ( rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5 )
+            // InternalOCLinEcore.g:9729:2: rule__EnumerationCS__Group__4__Impl rule__EnumerationCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__EnumerationCS__Group__4__Impl();
@@ -31680,22 +31680,22 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__4__Impl"
-    // InternalOCLinEcore.g:9734:1: rule__EnumerationCS__Group__4__Impl : ( ( rule__EnumerationCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:9736:1: rule__EnumerationCS__Group__4__Impl : ( ( rule__EnumerationCS__Group_4__0 )? ) ;
     public final void rule__EnumerationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9738:1: ( ( ( rule__EnumerationCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:9739:1: ( ( rule__EnumerationCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:9740:1: ( ( ( rule__EnumerationCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:9741:1: ( ( rule__EnumerationCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:9739:1: ( ( rule__EnumerationCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:9740:1: ( rule__EnumerationCS__Group_4__0 )?
+            // InternalOCLinEcore.g:9741:1: ( ( rule__EnumerationCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:9742:1: ( rule__EnumerationCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:9741:1: ( rule__EnumerationCS__Group_4__0 )?
+            // InternalOCLinEcore.g:9743:1: ( rule__EnumerationCS__Group_4__0 )?
             int alt119=2;
             int LA119_0 = input.LA(1);
 
@@ -31715,7 +31715,7 @@
             }
             switch (alt119) {
                 case 1 :
-                    // InternalOCLinEcore.g:9741:2: rule__EnumerationCS__Group_4__0
+                    // InternalOCLinEcore.g:9743:2: rule__EnumerationCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__Group_4__0();
@@ -31753,14 +31753,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__5"
-    // InternalOCLinEcore.g:9751:1: rule__EnumerationCS__Group__5 : rule__EnumerationCS__Group__5__Impl ;
+    // InternalOCLinEcore.g:9753:1: rule__EnumerationCS__Group__5 : rule__EnumerationCS__Group__5__Impl ;
     public final void rule__EnumerationCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9755:1: ( rule__EnumerationCS__Group__5__Impl )
-            // InternalOCLinEcore.g:9756:2: rule__EnumerationCS__Group__5__Impl
+            // InternalOCLinEcore.g:9757:1: ( rule__EnumerationCS__Group__5__Impl )
+            // InternalOCLinEcore.g:9758:2: rule__EnumerationCS__Group__5__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__Group__5__Impl();
@@ -31786,23 +31786,23 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group__5__Impl"
-    // InternalOCLinEcore.g:9762:1: rule__EnumerationCS__Group__5__Impl : ( ( rule__EnumerationCS__Alternatives_5 ) ) ;
+    // InternalOCLinEcore.g:9764:1: rule__EnumerationCS__Group__5__Impl : ( ( rule__EnumerationCS__Alternatives_5 ) ) ;
     public final void rule__EnumerationCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9766:1: ( ( ( rule__EnumerationCS__Alternatives_5 ) ) )
-            // InternalOCLinEcore.g:9767:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
+            // InternalOCLinEcore.g:9768:1: ( ( ( rule__EnumerationCS__Alternatives_5 ) ) )
+            // InternalOCLinEcore.g:9769:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
             {
-            // InternalOCLinEcore.g:9767:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
-            // InternalOCLinEcore.g:9768:1: ( rule__EnumerationCS__Alternatives_5 )
+            // InternalOCLinEcore.g:9769:1: ( ( rule__EnumerationCS__Alternatives_5 ) )
+            // InternalOCLinEcore.g:9770:1: ( rule__EnumerationCS__Alternatives_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getAlternatives_5());
             }
-            // InternalOCLinEcore.g:9769:1: ( rule__EnumerationCS__Alternatives_5 )
-            // InternalOCLinEcore.g:9769:2: rule__EnumerationCS__Alternatives_5
+            // InternalOCLinEcore.g:9771:1: ( rule__EnumerationCS__Alternatives_5 )
+            // InternalOCLinEcore.g:9771:2: rule__EnumerationCS__Alternatives_5
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__Alternatives_5();
@@ -31837,14 +31837,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_3__0"
-    // InternalOCLinEcore.g:9791:1: rule__EnumerationCS__Group_3__0 : rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 ;
+    // InternalOCLinEcore.g:9793:1: rule__EnumerationCS__Group_3__0 : rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 ;
     public final void rule__EnumerationCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9795:1: ( rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 )
-            // InternalOCLinEcore.g:9796:2: rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1
+            // InternalOCLinEcore.g:9797:1: ( rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1 )
+            // InternalOCLinEcore.g:9798:2: rule__EnumerationCS__Group_3__0__Impl rule__EnumerationCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__EnumerationCS__Group_3__0__Impl();
@@ -31875,17 +31875,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:9803:1: rule__EnumerationCS__Group_3__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:9805:1: rule__EnumerationCS__Group_3__0__Impl : ( ':' ) ;
     public final void rule__EnumerationCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9807:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:9808:1: ( ':' )
+            // InternalOCLinEcore.g:9809:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:9810:1: ( ':' )
             {
-            // InternalOCLinEcore.g:9808:1: ( ':' )
-            // InternalOCLinEcore.g:9809:1: ':'
+            // InternalOCLinEcore.g:9810:1: ( ':' )
+            // InternalOCLinEcore.g:9811:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getColonKeyword_3_0());
@@ -31916,14 +31916,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_3__1"
-    // InternalOCLinEcore.g:9822:1: rule__EnumerationCS__Group_3__1 : rule__EnumerationCS__Group_3__1__Impl ;
+    // InternalOCLinEcore.g:9824:1: rule__EnumerationCS__Group_3__1 : rule__EnumerationCS__Group_3__1__Impl ;
     public final void rule__EnumerationCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9826:1: ( rule__EnumerationCS__Group_3__1__Impl )
-            // InternalOCLinEcore.g:9827:2: rule__EnumerationCS__Group_3__1__Impl
+            // InternalOCLinEcore.g:9828:1: ( rule__EnumerationCS__Group_3__1__Impl )
+            // InternalOCLinEcore.g:9829:2: rule__EnumerationCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__Group_3__1__Impl();
@@ -31949,23 +31949,23 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:9833:1: rule__EnumerationCS__Group_3__1__Impl : ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:9835:1: rule__EnumerationCS__Group_3__1__Impl : ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) ;
     public final void rule__EnumerationCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9837:1: ( ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:9838:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
+            // InternalOCLinEcore.g:9839:1: ( ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:9840:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:9838:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
-            // InternalOCLinEcore.g:9839:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
+            // InternalOCLinEcore.g:9840:1: ( ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 ) )
+            // InternalOCLinEcore.g:9841:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getInstanceClassNameAssignment_3_1());
             }
-            // InternalOCLinEcore.g:9840:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
-            // InternalOCLinEcore.g:9840:2: rule__EnumerationCS__InstanceClassNameAssignment_3_1
+            // InternalOCLinEcore.g:9842:1: ( rule__EnumerationCS__InstanceClassNameAssignment_3_1 )
+            // InternalOCLinEcore.g:9842:2: rule__EnumerationCS__InstanceClassNameAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__InstanceClassNameAssignment_3_1();
@@ -32000,14 +32000,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_4__0"
-    // InternalOCLinEcore.g:9854:1: rule__EnumerationCS__Group_4__0 : rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 ;
+    // InternalOCLinEcore.g:9856:1: rule__EnumerationCS__Group_4__0 : rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 ;
     public final void rule__EnumerationCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9858:1: ( rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 )
-            // InternalOCLinEcore.g:9859:2: rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1
+            // InternalOCLinEcore.g:9860:1: ( rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1 )
+            // InternalOCLinEcore.g:9861:2: rule__EnumerationCS__Group_4__0__Impl rule__EnumerationCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__EnumerationCS__Group_4__0__Impl();
@@ -32038,17 +32038,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:9866:1: rule__EnumerationCS__Group_4__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:9868:1: rule__EnumerationCS__Group_4__0__Impl : ( '{' ) ;
     public final void rule__EnumerationCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9870:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:9871:1: ( '{' )
+            // InternalOCLinEcore.g:9872:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:9873:1: ( '{' )
             {
-            // InternalOCLinEcore.g:9871:1: ( '{' )
-            // InternalOCLinEcore.g:9872:1: '{'
+            // InternalOCLinEcore.g:9873:1: ( '{' )
+            // InternalOCLinEcore.g:9874:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());
@@ -32079,14 +32079,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_4__1"
-    // InternalOCLinEcore.g:9885:1: rule__EnumerationCS__Group_4__1 : rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 ;
+    // InternalOCLinEcore.g:9887:1: rule__EnumerationCS__Group_4__1 : rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 ;
     public final void rule__EnumerationCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9889:1: ( rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 )
-            // InternalOCLinEcore.g:9890:2: rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2
+            // InternalOCLinEcore.g:9891:1: ( rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2 )
+            // InternalOCLinEcore.g:9892:2: rule__EnumerationCS__Group_4__1__Impl rule__EnumerationCS__Group_4__2
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__EnumerationCS__Group_4__1__Impl();
@@ -32117,22 +32117,22 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:9897:1: rule__EnumerationCS__Group_4__1__Impl : ( ( rule__EnumerationCS__Alternatives_4_1 )? ) ;
+    // InternalOCLinEcore.g:9899:1: rule__EnumerationCS__Group_4__1__Impl : ( ( rule__EnumerationCS__Alternatives_4_1 )? ) ;
     public final void rule__EnumerationCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9901:1: ( ( ( rule__EnumerationCS__Alternatives_4_1 )? ) )
-            // InternalOCLinEcore.g:9902:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
+            // InternalOCLinEcore.g:9903:1: ( ( ( rule__EnumerationCS__Alternatives_4_1 )? ) )
+            // InternalOCLinEcore.g:9904:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
             {
-            // InternalOCLinEcore.g:9902:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
-            // InternalOCLinEcore.g:9903:1: ( rule__EnumerationCS__Alternatives_4_1 )?
+            // InternalOCLinEcore.g:9904:1: ( ( rule__EnumerationCS__Alternatives_4_1 )? )
+            // InternalOCLinEcore.g:9905:1: ( rule__EnumerationCS__Alternatives_4_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getAlternatives_4_1());
             }
-            // InternalOCLinEcore.g:9904:1: ( rule__EnumerationCS__Alternatives_4_1 )?
+            // InternalOCLinEcore.g:9906:1: ( rule__EnumerationCS__Alternatives_4_1 )?
             int alt120=2;
             int LA120_0 = input.LA(1);
 
@@ -32141,7 +32141,7 @@
             }
             switch (alt120) {
                 case 1 :
-                    // InternalOCLinEcore.g:9904:2: rule__EnumerationCS__Alternatives_4_1
+                    // InternalOCLinEcore.g:9906:2: rule__EnumerationCS__Alternatives_4_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationCS__Alternatives_4_1();
@@ -32179,14 +32179,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_4__2"
-    // InternalOCLinEcore.g:9914:1: rule__EnumerationCS__Group_4__2 : rule__EnumerationCS__Group_4__2__Impl ;
+    // InternalOCLinEcore.g:9916:1: rule__EnumerationCS__Group_4__2 : rule__EnumerationCS__Group_4__2__Impl ;
     public final void rule__EnumerationCS__Group_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9918:1: ( rule__EnumerationCS__Group_4__2__Impl )
-            // InternalOCLinEcore.g:9919:2: rule__EnumerationCS__Group_4__2__Impl
+            // InternalOCLinEcore.g:9920:1: ( rule__EnumerationCS__Group_4__2__Impl )
+            // InternalOCLinEcore.g:9921:2: rule__EnumerationCS__Group_4__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__Group_4__2__Impl();
@@ -32212,17 +32212,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_4__2__Impl"
-    // InternalOCLinEcore.g:9925:1: rule__EnumerationCS__Group_4__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:9927:1: rule__EnumerationCS__Group_4__2__Impl : ( '}' ) ;
     public final void rule__EnumerationCS__Group_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9929:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:9930:1: ( '}' )
+            // InternalOCLinEcore.g:9931:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:9932:1: ( '}' )
             {
-            // InternalOCLinEcore.g:9930:1: ( '}' )
-            // InternalOCLinEcore.g:9931:1: '}'
+            // InternalOCLinEcore.g:9932:1: ( '}' )
+            // InternalOCLinEcore.g:9933:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());
@@ -32253,14 +32253,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_5_0__0"
-    // InternalOCLinEcore.g:9950:1: rule__EnumerationCS__Group_5_0__0 : rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 ;
+    // InternalOCLinEcore.g:9952:1: rule__EnumerationCS__Group_5_0__0 : rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 ;
     public final void rule__EnumerationCS__Group_5_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9954:1: ( rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 )
-            // InternalOCLinEcore.g:9955:2: rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1
+            // InternalOCLinEcore.g:9956:1: ( rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1 )
+            // InternalOCLinEcore.g:9957:2: rule__EnumerationCS__Group_5_0__0__Impl rule__EnumerationCS__Group_5_0__1
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__EnumerationCS__Group_5_0__0__Impl();
@@ -32291,17 +32291,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_5_0__0__Impl"
-    // InternalOCLinEcore.g:9962:1: rule__EnumerationCS__Group_5_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:9964:1: rule__EnumerationCS__Group_5_0__0__Impl : ( '{' ) ;
     public final void rule__EnumerationCS__Group_5_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9966:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:9967:1: ( '{' )
+            // InternalOCLinEcore.g:9968:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:9969:1: ( '{' )
             {
-            // InternalOCLinEcore.g:9967:1: ( '{' )
-            // InternalOCLinEcore.g:9968:1: '{'
+            // InternalOCLinEcore.g:9969:1: ( '{' )
+            // InternalOCLinEcore.g:9970:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());
@@ -32332,14 +32332,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_5_0__1"
-    // InternalOCLinEcore.g:9981:1: rule__EnumerationCS__Group_5_0__1 : rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 ;
+    // InternalOCLinEcore.g:9983:1: rule__EnumerationCS__Group_5_0__1 : rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 ;
     public final void rule__EnumerationCS__Group_5_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9985:1: ( rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 )
-            // InternalOCLinEcore.g:9986:2: rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2
+            // InternalOCLinEcore.g:9987:1: ( rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2 )
+            // InternalOCLinEcore.g:9988:2: rule__EnumerationCS__Group_5_0__1__Impl rule__EnumerationCS__Group_5_0__2
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__EnumerationCS__Group_5_0__1__Impl();
@@ -32370,22 +32370,22 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_5_0__1__Impl"
-    // InternalOCLinEcore.g:9993:1: rule__EnumerationCS__Group_5_0__1__Impl : ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) ;
+    // InternalOCLinEcore.g:9995:1: rule__EnumerationCS__Group_5_0__1__Impl : ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) ;
     public final void rule__EnumerationCS__Group_5_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:9997:1: ( ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) )
-            // InternalOCLinEcore.g:9998:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
+            // InternalOCLinEcore.g:9999:1: ( ( ( rule__EnumerationCS__Alternatives_5_0_1 )* ) )
+            // InternalOCLinEcore.g:10000:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
             {
-            // InternalOCLinEcore.g:9998:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
-            // InternalOCLinEcore.g:9999:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
+            // InternalOCLinEcore.g:10000:1: ( ( rule__EnumerationCS__Alternatives_5_0_1 )* )
+            // InternalOCLinEcore.g:10001:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getAlternatives_5_0_1());
             }
-            // InternalOCLinEcore.g:10000:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
+            // InternalOCLinEcore.g:10002:1: ( rule__EnumerationCS__Alternatives_5_0_1 )*
             loop121:
             do {
                 int alt121=2;
@@ -32398,7 +32398,7 @@
 
                 switch (alt121) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10000:2: rule__EnumerationCS__Alternatives_5_0_1
+            	    // InternalOCLinEcore.g:10002:2: rule__EnumerationCS__Alternatives_5_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_46);
             	    rule__EnumerationCS__Alternatives_5_0_1();
@@ -32439,14 +32439,14 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_5_0__2"
-    // InternalOCLinEcore.g:10010:1: rule__EnumerationCS__Group_5_0__2 : rule__EnumerationCS__Group_5_0__2__Impl ;
+    // InternalOCLinEcore.g:10012:1: rule__EnumerationCS__Group_5_0__2 : rule__EnumerationCS__Group_5_0__2__Impl ;
     public final void rule__EnumerationCS__Group_5_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10014:1: ( rule__EnumerationCS__Group_5_0__2__Impl )
-            // InternalOCLinEcore.g:10015:2: rule__EnumerationCS__Group_5_0__2__Impl
+            // InternalOCLinEcore.g:10016:1: ( rule__EnumerationCS__Group_5_0__2__Impl )
+            // InternalOCLinEcore.g:10017:2: rule__EnumerationCS__Group_5_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationCS__Group_5_0__2__Impl();
@@ -32472,17 +32472,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__Group_5_0__2__Impl"
-    // InternalOCLinEcore.g:10021:1: rule__EnumerationCS__Group_5_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:10023:1: rule__EnumerationCS__Group_5_0__2__Impl : ( '}' ) ;
     public final void rule__EnumerationCS__Group_5_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10025:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:10026:1: ( '}' )
+            // InternalOCLinEcore.g:10027:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:10028:1: ( '}' )
             {
-            // InternalOCLinEcore.g:10026:1: ( '}' )
-            // InternalOCLinEcore.g:10027:1: '}'
+            // InternalOCLinEcore.g:10028:1: ( '}' )
+            // InternalOCLinEcore.g:10029:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());
@@ -32513,14 +32513,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__0"
-    // InternalOCLinEcore.g:10046:1: rule__EnumerationLiteralCS__Group__0 : rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 ;
+    // InternalOCLinEcore.g:10048:1: rule__EnumerationLiteralCS__Group__0 : rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 ;
     public final void rule__EnumerationLiteralCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10050:1: ( rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 )
-            // InternalOCLinEcore.g:10051:2: rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1
+            // InternalOCLinEcore.g:10052:1: ( rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1 )
+            // InternalOCLinEcore.g:10053:2: rule__EnumerationLiteralCS__Group__0__Impl rule__EnumerationLiteralCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__EnumerationLiteralCS__Group__0__Impl();
@@ -32551,23 +32551,23 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__0__Impl"
-    // InternalOCLinEcore.g:10058:1: rule__EnumerationLiteralCS__Group__0__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) ;
+    // InternalOCLinEcore.g:10060:1: rule__EnumerationLiteralCS__Group__0__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) ;
     public final void rule__EnumerationLiteralCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10062:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) )
-            // InternalOCLinEcore.g:10063:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
+            // InternalOCLinEcore.g:10064:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_0 ) ) )
+            // InternalOCLinEcore.g:10065:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
             {
-            // InternalOCLinEcore.g:10063:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
-            // InternalOCLinEcore.g:10064:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
+            // InternalOCLinEcore.g:10065:1: ( ( rule__EnumerationLiteralCS__Alternatives_0 ) )
+            // InternalOCLinEcore.g:10066:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_0());
             }
-            // InternalOCLinEcore.g:10065:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
-            // InternalOCLinEcore.g:10065:2: rule__EnumerationLiteralCS__Alternatives_0
+            // InternalOCLinEcore.g:10067:1: ( rule__EnumerationLiteralCS__Alternatives_0 )
+            // InternalOCLinEcore.g:10067:2: rule__EnumerationLiteralCS__Alternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Alternatives_0();
@@ -32602,14 +32602,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__1"
-    // InternalOCLinEcore.g:10075:1: rule__EnumerationLiteralCS__Group__1 : rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 ;
+    // InternalOCLinEcore.g:10077:1: rule__EnumerationLiteralCS__Group__1 : rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 ;
     public final void rule__EnumerationLiteralCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10079:1: ( rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 )
-            // InternalOCLinEcore.g:10080:2: rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2
+            // InternalOCLinEcore.g:10081:1: ( rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2 )
+            // InternalOCLinEcore.g:10082:2: rule__EnumerationLiteralCS__Group__1__Impl rule__EnumerationLiteralCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__EnumerationLiteralCS__Group__1__Impl();
@@ -32640,22 +32640,22 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__1__Impl"
-    // InternalOCLinEcore.g:10087:1: rule__EnumerationLiteralCS__Group__1__Impl : ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:10089:1: rule__EnumerationLiteralCS__Group__1__Impl : ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) ;
     public final void rule__EnumerationLiteralCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10091:1: ( ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:10092:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:10093:1: ( ( ( rule__EnumerationLiteralCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:10094:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:10092:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:10093:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
+            // InternalOCLinEcore.g:10094:1: ( ( rule__EnumerationLiteralCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:10095:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:10094:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
+            // InternalOCLinEcore.g:10096:1: ( rule__EnumerationLiteralCS__Group_1__0 )?
             int alt122=2;
             int LA122_0 = input.LA(1);
 
@@ -32664,7 +32664,7 @@
             }
             switch (alt122) {
                 case 1 :
-                    // InternalOCLinEcore.g:10094:2: rule__EnumerationLiteralCS__Group_1__0
+                    // InternalOCLinEcore.g:10096:2: rule__EnumerationLiteralCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationLiteralCS__Group_1__0();
@@ -32702,14 +32702,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__2"
-    // InternalOCLinEcore.g:10104:1: rule__EnumerationLiteralCS__Group__2 : rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3 ;
+    // InternalOCLinEcore.g:10106:1: rule__EnumerationLiteralCS__Group__2 : rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3 ;
     public final void rule__EnumerationLiteralCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10108:1: ( rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3 )
-            // InternalOCLinEcore.g:10109:2: rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3
+            // InternalOCLinEcore.g:10110:1: ( rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3 )
+            // InternalOCLinEcore.g:10111:2: rule__EnumerationLiteralCS__Group__2__Impl rule__EnumerationLiteralCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__EnumerationLiteralCS__Group__2__Impl();
@@ -32740,22 +32740,22 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__2__Impl"
-    // InternalOCLinEcore.g:10116:1: rule__EnumerationLiteralCS__Group__2__Impl : ( ( rule__EnumerationLiteralCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:10118:1: rule__EnumerationLiteralCS__Group__2__Impl : ( ( rule__EnumerationLiteralCS__Group_2__0 )? ) ;
     public final void rule__EnumerationLiteralCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10120:1: ( ( ( rule__EnumerationLiteralCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:10121:1: ( ( rule__EnumerationLiteralCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:10122:1: ( ( ( rule__EnumerationLiteralCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:10123:1: ( ( rule__EnumerationLiteralCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:10121:1: ( ( rule__EnumerationLiteralCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:10122:1: ( rule__EnumerationLiteralCS__Group_2__0 )?
+            // InternalOCLinEcore.g:10123:1: ( ( rule__EnumerationLiteralCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:10124:1: ( rule__EnumerationLiteralCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:10123:1: ( rule__EnumerationLiteralCS__Group_2__0 )?
+            // InternalOCLinEcore.g:10125:1: ( rule__EnumerationLiteralCS__Group_2__0 )?
             int alt123=2;
             int LA123_0 = input.LA(1);
 
@@ -32764,7 +32764,7 @@
             }
             switch (alt123) {
                 case 1 :
-                    // InternalOCLinEcore.g:10123:2: rule__EnumerationLiteralCS__Group_2__0
+                    // InternalOCLinEcore.g:10125:2: rule__EnumerationLiteralCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__EnumerationLiteralCS__Group_2__0();
@@ -32802,14 +32802,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__3"
-    // InternalOCLinEcore.g:10133:1: rule__EnumerationLiteralCS__Group__3 : rule__EnumerationLiteralCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:10135:1: rule__EnumerationLiteralCS__Group__3 : rule__EnumerationLiteralCS__Group__3__Impl ;
     public final void rule__EnumerationLiteralCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10137:1: ( rule__EnumerationLiteralCS__Group__3__Impl )
-            // InternalOCLinEcore.g:10138:2: rule__EnumerationLiteralCS__Group__3__Impl
+            // InternalOCLinEcore.g:10139:1: ( rule__EnumerationLiteralCS__Group__3__Impl )
+            // InternalOCLinEcore.g:10140:2: rule__EnumerationLiteralCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Group__3__Impl();
@@ -32835,23 +32835,23 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group__3__Impl"
-    // InternalOCLinEcore.g:10144:1: rule__EnumerationLiteralCS__Group__3__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_3 ) ) ;
+    // InternalOCLinEcore.g:10146:1: rule__EnumerationLiteralCS__Group__3__Impl : ( ( rule__EnumerationLiteralCS__Alternatives_3 ) ) ;
     public final void rule__EnumerationLiteralCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10148:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_3 ) ) )
-            // InternalOCLinEcore.g:10149:1: ( ( rule__EnumerationLiteralCS__Alternatives_3 ) )
+            // InternalOCLinEcore.g:10150:1: ( ( ( rule__EnumerationLiteralCS__Alternatives_3 ) ) )
+            // InternalOCLinEcore.g:10151:1: ( ( rule__EnumerationLiteralCS__Alternatives_3 ) )
             {
-            // InternalOCLinEcore.g:10149:1: ( ( rule__EnumerationLiteralCS__Alternatives_3 ) )
-            // InternalOCLinEcore.g:10150:1: ( rule__EnumerationLiteralCS__Alternatives_3 )
+            // InternalOCLinEcore.g:10151:1: ( ( rule__EnumerationLiteralCS__Alternatives_3 ) )
+            // InternalOCLinEcore.g:10152:1: ( rule__EnumerationLiteralCS__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getAlternatives_3());
             }
-            // InternalOCLinEcore.g:10151:1: ( rule__EnumerationLiteralCS__Alternatives_3 )
-            // InternalOCLinEcore.g:10151:2: rule__EnumerationLiteralCS__Alternatives_3
+            // InternalOCLinEcore.g:10153:1: ( rule__EnumerationLiteralCS__Alternatives_3 )
+            // InternalOCLinEcore.g:10153:2: rule__EnumerationLiteralCS__Alternatives_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Alternatives_3();
@@ -32886,14 +32886,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__0"
-    // InternalOCLinEcore.g:10169:1: rule__EnumerationLiteralCS__Group_0_0__0 : rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 ;
+    // InternalOCLinEcore.g:10171:1: rule__EnumerationLiteralCS__Group_0_0__0 : rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 ;
     public final void rule__EnumerationLiteralCS__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10173:1: ( rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 )
-            // InternalOCLinEcore.g:10174:2: rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1
+            // InternalOCLinEcore.g:10175:1: ( rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1 )
+            // InternalOCLinEcore.g:10176:2: rule__EnumerationLiteralCS__Group_0_0__0__Impl rule__EnumerationLiteralCS__Group_0_0__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__EnumerationLiteralCS__Group_0_0__0__Impl();
@@ -32924,17 +32924,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__0__Impl"
-    // InternalOCLinEcore.g:10181:1: rule__EnumerationLiteralCS__Group_0_0__0__Impl : ( 'literal' ) ;
+    // InternalOCLinEcore.g:10183:1: rule__EnumerationLiteralCS__Group_0_0__0__Impl : ( 'literal' ) ;
     public final void rule__EnumerationLiteralCS__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10185:1: ( ( 'literal' ) )
-            // InternalOCLinEcore.g:10186:1: ( 'literal' )
+            // InternalOCLinEcore.g:10187:1: ( ( 'literal' ) )
+            // InternalOCLinEcore.g:10188:1: ( 'literal' )
             {
-            // InternalOCLinEcore.g:10186:1: ( 'literal' )
-            // InternalOCLinEcore.g:10187:1: 'literal'
+            // InternalOCLinEcore.g:10188:1: ( 'literal' )
+            // InternalOCLinEcore.g:10189:1: 'literal'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getLiteralKeyword_0_0_0());
@@ -32965,14 +32965,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__1"
-    // InternalOCLinEcore.g:10200:1: rule__EnumerationLiteralCS__Group_0_0__1 : rule__EnumerationLiteralCS__Group_0_0__1__Impl ;
+    // InternalOCLinEcore.g:10202:1: rule__EnumerationLiteralCS__Group_0_0__1 : rule__EnumerationLiteralCS__Group_0_0__1__Impl ;
     public final void rule__EnumerationLiteralCS__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10204:1: ( rule__EnumerationLiteralCS__Group_0_0__1__Impl )
-            // InternalOCLinEcore.g:10205:2: rule__EnumerationLiteralCS__Group_0_0__1__Impl
+            // InternalOCLinEcore.g:10206:1: ( rule__EnumerationLiteralCS__Group_0_0__1__Impl )
+            // InternalOCLinEcore.g:10207:2: rule__EnumerationLiteralCS__Group_0_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Group_0_0__1__Impl();
@@ -32998,23 +32998,23 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_0_0__1__Impl"
-    // InternalOCLinEcore.g:10211:1: rule__EnumerationLiteralCS__Group_0_0__1__Impl : ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) ;
+    // InternalOCLinEcore.g:10213:1: rule__EnumerationLiteralCS__Group_0_0__1__Impl : ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) ;
     public final void rule__EnumerationLiteralCS__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10215:1: ( ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) )
-            // InternalOCLinEcore.g:10216:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
+            // InternalOCLinEcore.g:10217:1: ( ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) ) )
+            // InternalOCLinEcore.g:10218:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
             {
-            // InternalOCLinEcore.g:10216:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
-            // InternalOCLinEcore.g:10217:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
+            // InternalOCLinEcore.g:10218:1: ( ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 ) )
+            // InternalOCLinEcore.g:10219:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getNameAssignment_0_0_1());
             }
-            // InternalOCLinEcore.g:10218:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
-            // InternalOCLinEcore.g:10218:2: rule__EnumerationLiteralCS__NameAssignment_0_0_1
+            // InternalOCLinEcore.g:10220:1: ( rule__EnumerationLiteralCS__NameAssignment_0_0_1 )
+            // InternalOCLinEcore.g:10220:2: rule__EnumerationLiteralCS__NameAssignment_0_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__NameAssignment_0_0_1();
@@ -33049,14 +33049,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_1__0"
-    // InternalOCLinEcore.g:10232:1: rule__EnumerationLiteralCS__Group_1__0 : rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 ;
+    // InternalOCLinEcore.g:10234:1: rule__EnumerationLiteralCS__Group_1__0 : rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 ;
     public final void rule__EnumerationLiteralCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10236:1: ( rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 )
-            // InternalOCLinEcore.g:10237:2: rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1
+            // InternalOCLinEcore.g:10238:1: ( rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1 )
+            // InternalOCLinEcore.g:10239:2: rule__EnumerationLiteralCS__Group_1__0__Impl rule__EnumerationLiteralCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__EnumerationLiteralCS__Group_1__0__Impl();
@@ -33087,17 +33087,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:10244:1: rule__EnumerationLiteralCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:10246:1: rule__EnumerationLiteralCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__EnumerationLiteralCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10248:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:10249:1: ( ':' )
+            // InternalOCLinEcore.g:10250:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:10251:1: ( ':' )
             {
-            // InternalOCLinEcore.g:10249:1: ( ':' )
-            // InternalOCLinEcore.g:10250:1: ':'
+            // InternalOCLinEcore.g:10251:1: ( ':' )
+            // InternalOCLinEcore.g:10252:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getColonKeyword_1_0());
@@ -33128,14 +33128,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_1__1"
-    // InternalOCLinEcore.g:10263:1: rule__EnumerationLiteralCS__Group_1__1 : rule__EnumerationLiteralCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:10265:1: rule__EnumerationLiteralCS__Group_1__1 : rule__EnumerationLiteralCS__Group_1__1__Impl ;
     public final void rule__EnumerationLiteralCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10267:1: ( rule__EnumerationLiteralCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:10268:2: rule__EnumerationLiteralCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:10269:1: ( rule__EnumerationLiteralCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:10270:2: rule__EnumerationLiteralCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Group_1__1__Impl();
@@ -33161,23 +33161,23 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:10274:1: rule__EnumerationLiteralCS__Group_1__1__Impl : ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:10276:1: rule__EnumerationLiteralCS__Group_1__1__Impl : ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) ) ;
     public final void rule__EnumerationLiteralCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10278:1: ( ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:10279:1: ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) )
+            // InternalOCLinEcore.g:10280:1: ( ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:10281:1: ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:10279:1: ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) )
-            // InternalOCLinEcore.g:10280:1: ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 )
+            // InternalOCLinEcore.g:10281:1: ( ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 ) )
+            // InternalOCLinEcore.g:10282:1: ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getLiteralAssignment_1_1());
             }
-            // InternalOCLinEcore.g:10281:1: ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 )
-            // InternalOCLinEcore.g:10281:2: rule__EnumerationLiteralCS__LiteralAssignment_1_1
+            // InternalOCLinEcore.g:10283:1: ( rule__EnumerationLiteralCS__LiteralAssignment_1_1 )
+            // InternalOCLinEcore.g:10283:2: rule__EnumerationLiteralCS__LiteralAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__LiteralAssignment_1_1();
@@ -33212,14 +33212,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_2__0"
-    // InternalOCLinEcore.g:10295:1: rule__EnumerationLiteralCS__Group_2__0 : rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1 ;
+    // InternalOCLinEcore.g:10297:1: rule__EnumerationLiteralCS__Group_2__0 : rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1 ;
     public final void rule__EnumerationLiteralCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10299:1: ( rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1 )
-            // InternalOCLinEcore.g:10300:2: rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1
+            // InternalOCLinEcore.g:10301:1: ( rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1 )
+            // InternalOCLinEcore.g:10302:2: rule__EnumerationLiteralCS__Group_2__0__Impl rule__EnumerationLiteralCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_47);
             rule__EnumerationLiteralCS__Group_2__0__Impl();
@@ -33250,17 +33250,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:10307:1: rule__EnumerationLiteralCS__Group_2__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:10309:1: rule__EnumerationLiteralCS__Group_2__0__Impl : ( '=' ) ;
     public final void rule__EnumerationLiteralCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10311:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:10312:1: ( '=' )
+            // InternalOCLinEcore.g:10313:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:10314:1: ( '=' )
             {
-            // InternalOCLinEcore.g:10312:1: ( '=' )
-            // InternalOCLinEcore.g:10313:1: '='
+            // InternalOCLinEcore.g:10314:1: ( '=' )
+            // InternalOCLinEcore.g:10315:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_2_0());
@@ -33291,14 +33291,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_2__1"
-    // InternalOCLinEcore.g:10326:1: rule__EnumerationLiteralCS__Group_2__1 : rule__EnumerationLiteralCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:10328:1: rule__EnumerationLiteralCS__Group_2__1 : rule__EnumerationLiteralCS__Group_2__1__Impl ;
     public final void rule__EnumerationLiteralCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10330:1: ( rule__EnumerationLiteralCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:10331:2: rule__EnumerationLiteralCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:10332:1: ( rule__EnumerationLiteralCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:10333:2: rule__EnumerationLiteralCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Group_2__1__Impl();
@@ -33324,23 +33324,23 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:10337:1: rule__EnumerationLiteralCS__Group_2__1__Impl : ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:10339:1: rule__EnumerationLiteralCS__Group_2__1__Impl : ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) ) ;
     public final void rule__EnumerationLiteralCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10341:1: ( ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:10342:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) )
+            // InternalOCLinEcore.g:10343:1: ( ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:10344:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:10342:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) )
-            // InternalOCLinEcore.g:10343:1: ( rule__EnumerationLiteralCS__ValueAssignment_2_1 )
+            // InternalOCLinEcore.g:10344:1: ( ( rule__EnumerationLiteralCS__ValueAssignment_2_1 ) )
+            // InternalOCLinEcore.g:10345:1: ( rule__EnumerationLiteralCS__ValueAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getValueAssignment_2_1());
             }
-            // InternalOCLinEcore.g:10344:1: ( rule__EnumerationLiteralCS__ValueAssignment_2_1 )
-            // InternalOCLinEcore.g:10344:2: rule__EnumerationLiteralCS__ValueAssignment_2_1
+            // InternalOCLinEcore.g:10346:1: ( rule__EnumerationLiteralCS__ValueAssignment_2_1 )
+            // InternalOCLinEcore.g:10346:2: rule__EnumerationLiteralCS__ValueAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__ValueAssignment_2_1();
@@ -33375,14 +33375,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__0"
-    // InternalOCLinEcore.g:10358:1: rule__EnumerationLiteralCS__Group_3_0__0 : rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1 ;
+    // InternalOCLinEcore.g:10360:1: rule__EnumerationLiteralCS__Group_3_0__0 : rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1 ;
     public final void rule__EnumerationLiteralCS__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10362:1: ( rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1 )
-            // InternalOCLinEcore.g:10363:2: rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1
+            // InternalOCLinEcore.g:10364:1: ( rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1 )
+            // InternalOCLinEcore.g:10365:2: rule__EnumerationLiteralCS__Group_3_0__0__Impl rule__EnumerationLiteralCS__Group_3_0__1
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__EnumerationLiteralCS__Group_3_0__0__Impl();
@@ -33413,17 +33413,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__0__Impl"
-    // InternalOCLinEcore.g:10370:1: rule__EnumerationLiteralCS__Group_3_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:10372:1: rule__EnumerationLiteralCS__Group_3_0__0__Impl : ( '{' ) ;
     public final void rule__EnumerationLiteralCS__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10374:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:10375:1: ( '{' )
+            // InternalOCLinEcore.g:10376:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:10377:1: ( '{' )
             {
-            // InternalOCLinEcore.g:10375:1: ( '{' )
-            // InternalOCLinEcore.g:10376:1: '{'
+            // InternalOCLinEcore.g:10377:1: ( '{' )
+            // InternalOCLinEcore.g:10378:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_3_0_0());
@@ -33454,14 +33454,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__1"
-    // InternalOCLinEcore.g:10389:1: rule__EnumerationLiteralCS__Group_3_0__1 : rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2 ;
+    // InternalOCLinEcore.g:10391:1: rule__EnumerationLiteralCS__Group_3_0__1 : rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2 ;
     public final void rule__EnumerationLiteralCS__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10393:1: ( rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2 )
-            // InternalOCLinEcore.g:10394:2: rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2
+            // InternalOCLinEcore.g:10395:1: ( rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2 )
+            // InternalOCLinEcore.g:10396:2: rule__EnumerationLiteralCS__Group_3_0__1__Impl rule__EnumerationLiteralCS__Group_3_0__2
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__EnumerationLiteralCS__Group_3_0__1__Impl();
@@ -33492,22 +33492,22 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__1__Impl"
-    // InternalOCLinEcore.g:10401:1: rule__EnumerationLiteralCS__Group_3_0__1__Impl : ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* ) ;
+    // InternalOCLinEcore.g:10403:1: rule__EnumerationLiteralCS__Group_3_0__1__Impl : ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* ) ;
     public final void rule__EnumerationLiteralCS__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10405:1: ( ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* ) )
-            // InternalOCLinEcore.g:10406:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* )
+            // InternalOCLinEcore.g:10407:1: ( ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* ) )
+            // InternalOCLinEcore.g:10408:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* )
             {
-            // InternalOCLinEcore.g:10406:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* )
-            // InternalOCLinEcore.g:10407:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )*
+            // InternalOCLinEcore.g:10408:1: ( ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )* )
+            // InternalOCLinEcore.g:10409:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAssignment_3_0_1());
             }
-            // InternalOCLinEcore.g:10408:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )*
+            // InternalOCLinEcore.g:10410:1: ( rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 )*
             loop124:
             do {
                 int alt124=2;
@@ -33520,7 +33520,7 @@
 
                 switch (alt124) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10408:2: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1
+            	    // InternalOCLinEcore.g:10410:2: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_49);
             	    rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1();
@@ -33561,14 +33561,14 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__2"
-    // InternalOCLinEcore.g:10418:1: rule__EnumerationLiteralCS__Group_3_0__2 : rule__EnumerationLiteralCS__Group_3_0__2__Impl ;
+    // InternalOCLinEcore.g:10420:1: rule__EnumerationLiteralCS__Group_3_0__2 : rule__EnumerationLiteralCS__Group_3_0__2__Impl ;
     public final void rule__EnumerationLiteralCS__Group_3_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10422:1: ( rule__EnumerationLiteralCS__Group_3_0__2__Impl )
-            // InternalOCLinEcore.g:10423:2: rule__EnumerationLiteralCS__Group_3_0__2__Impl
+            // InternalOCLinEcore.g:10424:1: ( rule__EnumerationLiteralCS__Group_3_0__2__Impl )
+            // InternalOCLinEcore.g:10425:2: rule__EnumerationLiteralCS__Group_3_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__EnumerationLiteralCS__Group_3_0__2__Impl();
@@ -33594,17 +33594,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__Group_3_0__2__Impl"
-    // InternalOCLinEcore.g:10429:1: rule__EnumerationLiteralCS__Group_3_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:10431:1: rule__EnumerationLiteralCS__Group_3_0__2__Impl : ( '}' ) ;
     public final void rule__EnumerationLiteralCS__Group_3_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10433:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:10434:1: ( '}' )
+            // InternalOCLinEcore.g:10435:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:10436:1: ( '}' )
             {
-            // InternalOCLinEcore.g:10434:1: ( '}' )
-            // InternalOCLinEcore.g:10435:1: '}'
+            // InternalOCLinEcore.g:10436:1: ( '}' )
+            // InternalOCLinEcore.g:10437:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_3_0_2());
@@ -33635,14 +33635,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__0"
-    // InternalOCLinEcore.g:10454:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
+    // InternalOCLinEcore.g:10456:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
     public final void rule__ImportCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10458:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
-            // InternalOCLinEcore.g:10459:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
+            // InternalOCLinEcore.g:10460:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
+            // InternalOCLinEcore.g:10461:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__ImportCS__Group__0__Impl();
@@ -33673,23 +33673,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__0__Impl"
-    // InternalOCLinEcore.g:10466:1: rule__ImportCS__Group__0__Impl : ( ( rule__ImportCS__Alternatives_0 ) ) ;
+    // InternalOCLinEcore.g:10468:1: rule__ImportCS__Group__0__Impl : ( ( rule__ImportCS__Alternatives_0 ) ) ;
     public final void rule__ImportCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10470:1: ( ( ( rule__ImportCS__Alternatives_0 ) ) )
-            // InternalOCLinEcore.g:10471:1: ( ( rule__ImportCS__Alternatives_0 ) )
+            // InternalOCLinEcore.g:10472:1: ( ( ( rule__ImportCS__Alternatives_0 ) ) )
+            // InternalOCLinEcore.g:10473:1: ( ( rule__ImportCS__Alternatives_0 ) )
             {
-            // InternalOCLinEcore.g:10471:1: ( ( rule__ImportCS__Alternatives_0 ) )
-            // InternalOCLinEcore.g:10472:1: ( rule__ImportCS__Alternatives_0 )
+            // InternalOCLinEcore.g:10473:1: ( ( rule__ImportCS__Alternatives_0 ) )
+            // InternalOCLinEcore.g:10474:1: ( rule__ImportCS__Alternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getAlternatives_0());
             }
-            // InternalOCLinEcore.g:10473:1: ( rule__ImportCS__Alternatives_0 )
-            // InternalOCLinEcore.g:10473:2: rule__ImportCS__Alternatives_0
+            // InternalOCLinEcore.g:10475:1: ( rule__ImportCS__Alternatives_0 )
+            // InternalOCLinEcore.g:10475:2: rule__ImportCS__Alternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Alternatives_0();
@@ -33724,14 +33724,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__1"
-    // InternalOCLinEcore.g:10483:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
+    // InternalOCLinEcore.g:10485:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
     public final void rule__ImportCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10487:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
-            // InternalOCLinEcore.g:10488:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
+            // InternalOCLinEcore.g:10489:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
+            // InternalOCLinEcore.g:10490:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__ImportCS__Group__1__Impl();
@@ -33762,27 +33762,27 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__1__Impl"
-    // InternalOCLinEcore.g:10495:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:10497:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
     public final void rule__ImportCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10499:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:10500:1: ( ( rule__ImportCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:10501:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:10502:1: ( ( rule__ImportCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:10500:1: ( ( rule__ImportCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:10501:1: ( rule__ImportCS__Group_1__0 )?
+            // InternalOCLinEcore.g:10502:1: ( ( rule__ImportCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:10503:1: ( rule__ImportCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:10502:1: ( rule__ImportCS__Group_1__0 )?
+            // InternalOCLinEcore.g:10504:1: ( rule__ImportCS__Group_1__0 )?
             int alt125=2;
             alt125 = dfa125.predict(input);
             switch (alt125) {
                 case 1 :
-                    // InternalOCLinEcore.g:10502:2: rule__ImportCS__Group_1__0
+                    // InternalOCLinEcore.g:10504:2: rule__ImportCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImportCS__Group_1__0();
@@ -33820,14 +33820,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__2"
-    // InternalOCLinEcore.g:10512:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
+    // InternalOCLinEcore.g:10514:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
     public final void rule__ImportCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10516:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
-            // InternalOCLinEcore.g:10517:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
+            // InternalOCLinEcore.g:10518:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
+            // InternalOCLinEcore.g:10519:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__ImportCS__Group__2__Impl();
@@ -33858,23 +33858,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__2__Impl"
-    // InternalOCLinEcore.g:10524:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:10526:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
     public final void rule__ImportCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10528:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
-            // InternalOCLinEcore.g:10529:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
+            // InternalOCLinEcore.g:10530:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
+            // InternalOCLinEcore.g:10531:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:10529:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
-            // InternalOCLinEcore.g:10530:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
+            // InternalOCLinEcore.g:10531:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
+            // InternalOCLinEcore.g:10532:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getOwnedPathNameAssignment_2());
             }
-            // InternalOCLinEcore.g:10531:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
-            // InternalOCLinEcore.g:10531:2: rule__ImportCS__OwnedPathNameAssignment_2
+            // InternalOCLinEcore.g:10533:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
+            // InternalOCLinEcore.g:10533:2: rule__ImportCS__OwnedPathNameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__OwnedPathNameAssignment_2();
@@ -33909,14 +33909,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__3"
-    // InternalOCLinEcore.g:10541:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 ;
+    // InternalOCLinEcore.g:10543:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 ;
     public final void rule__ImportCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10545:1: ( rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 )
-            // InternalOCLinEcore.g:10546:2: rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4
+            // InternalOCLinEcore.g:10547:1: ( rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4 )
+            // InternalOCLinEcore.g:10548:2: rule__ImportCS__Group__3__Impl rule__ImportCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__ImportCS__Group__3__Impl();
@@ -33947,22 +33947,22 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__3__Impl"
-    // InternalOCLinEcore.g:10553:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
+    // InternalOCLinEcore.g:10555:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
     public final void rule__ImportCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10557:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
-            // InternalOCLinEcore.g:10558:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
+            // InternalOCLinEcore.g:10559:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
+            // InternalOCLinEcore.g:10560:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
             {
-            // InternalOCLinEcore.g:10558:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
-            // InternalOCLinEcore.g:10559:1: ( rule__ImportCS__IsAllAssignment_3 )?
+            // InternalOCLinEcore.g:10560:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
+            // InternalOCLinEcore.g:10561:1: ( rule__ImportCS__IsAllAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllAssignment_3());
             }
-            // InternalOCLinEcore.g:10560:1: ( rule__ImportCS__IsAllAssignment_3 )?
+            // InternalOCLinEcore.g:10562:1: ( rule__ImportCS__IsAllAssignment_3 )?
             int alt126=2;
             int LA126_0 = input.LA(1);
 
@@ -33971,7 +33971,7 @@
             }
             switch (alt126) {
                 case 1 :
-                    // InternalOCLinEcore.g:10560:2: rule__ImportCS__IsAllAssignment_3
+                    // InternalOCLinEcore.g:10562:2: rule__ImportCS__IsAllAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImportCS__IsAllAssignment_3();
@@ -34009,14 +34009,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__4"
-    // InternalOCLinEcore.g:10570:1: rule__ImportCS__Group__4 : rule__ImportCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:10572:1: rule__ImportCS__Group__4 : rule__ImportCS__Group__4__Impl ;
     public final void rule__ImportCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10574:1: ( rule__ImportCS__Group__4__Impl )
-            // InternalOCLinEcore.g:10575:2: rule__ImportCS__Group__4__Impl
+            // InternalOCLinEcore.g:10576:1: ( rule__ImportCS__Group__4__Impl )
+            // InternalOCLinEcore.g:10577:2: rule__ImportCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Group__4__Impl();
@@ -34042,17 +34042,17 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__4__Impl"
-    // InternalOCLinEcore.g:10581:1: rule__ImportCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:10583:1: rule__ImportCS__Group__4__Impl : ( ';' ) ;
     public final void rule__ImportCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10585:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:10586:1: ( ';' )
+            // InternalOCLinEcore.g:10587:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:10588:1: ( ';' )
             {
-            // InternalOCLinEcore.g:10586:1: ( ';' )
-            // InternalOCLinEcore.g:10587:1: ';'
+            // InternalOCLinEcore.g:10588:1: ( ';' )
+            // InternalOCLinEcore.g:10589:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getSemicolonKeyword_4());
@@ -34083,14 +34083,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__0"
-    // InternalOCLinEcore.g:10610:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
+    // InternalOCLinEcore.g:10612:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
     public final void rule__ImportCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10614:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
-            // InternalOCLinEcore.g:10615:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
+            // InternalOCLinEcore.g:10616:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
+            // InternalOCLinEcore.g:10617:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__ImportCS__Group_1__0__Impl();
@@ -34121,23 +34121,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:10622:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLinEcore.g:10624:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
     public final void rule__ImportCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10626:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
-            // InternalOCLinEcore.g:10627:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
+            // InternalOCLinEcore.g:10628:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
+            // InternalOCLinEcore.g:10629:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLinEcore.g:10627:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
-            // InternalOCLinEcore.g:10628:1: ( rule__ImportCS__NameAssignment_1_0 )
+            // InternalOCLinEcore.g:10629:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
+            // InternalOCLinEcore.g:10630:1: ( rule__ImportCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLinEcore.g:10629:1: ( rule__ImportCS__NameAssignment_1_0 )
-            // InternalOCLinEcore.g:10629:2: rule__ImportCS__NameAssignment_1_0
+            // InternalOCLinEcore.g:10631:1: ( rule__ImportCS__NameAssignment_1_0 )
+            // InternalOCLinEcore.g:10631:2: rule__ImportCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__NameAssignment_1_0();
@@ -34172,14 +34172,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__1"
-    // InternalOCLinEcore.g:10639:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:10641:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
     public final void rule__ImportCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10643:1: ( rule__ImportCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:10644:2: rule__ImportCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:10645:1: ( rule__ImportCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:10646:2: rule__ImportCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Group_1__1__Impl();
@@ -34205,17 +34205,17 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:10650:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:10652:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
     public final void rule__ImportCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10654:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:10655:1: ( ':' )
+            // InternalOCLinEcore.g:10656:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:10657:1: ( ':' )
             {
-            // InternalOCLinEcore.g:10655:1: ( ':' )
-            // InternalOCLinEcore.g:10656:1: ':'
+            // InternalOCLinEcore.g:10657:1: ( ':' )
+            // InternalOCLinEcore.g:10658:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getColonKeyword_1_1());
@@ -34246,14 +34246,14 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__Group__0"
-    // InternalOCLinEcore.g:10673:1: rule__ModelElementRefCS__Group__0 : rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 ;
+    // InternalOCLinEcore.g:10675:1: rule__ModelElementRefCS__Group__0 : rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 ;
     public final void rule__ModelElementRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10677:1: ( rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 )
-            // InternalOCLinEcore.g:10678:2: rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1
+            // InternalOCLinEcore.g:10679:1: ( rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1 )
+            // InternalOCLinEcore.g:10680:2: rule__ModelElementRefCS__Group__0__Impl rule__ModelElementRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__ModelElementRefCS__Group__0__Impl();
@@ -34284,17 +34284,17 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__Group__0__Impl"
-    // InternalOCLinEcore.g:10685:1: rule__ModelElementRefCS__Group__0__Impl : ( 'reference' ) ;
+    // InternalOCLinEcore.g:10687:1: rule__ModelElementRefCS__Group__0__Impl : ( 'reference' ) ;
     public final void rule__ModelElementRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10689:1: ( ( 'reference' ) )
-            // InternalOCLinEcore.g:10690:1: ( 'reference' )
+            // InternalOCLinEcore.g:10691:1: ( ( 'reference' ) )
+            // InternalOCLinEcore.g:10692:1: ( 'reference' )
             {
-            // InternalOCLinEcore.g:10690:1: ( 'reference' )
-            // InternalOCLinEcore.g:10691:1: 'reference'
+            // InternalOCLinEcore.g:10692:1: ( 'reference' )
+            // InternalOCLinEcore.g:10693:1: 'reference'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getModelElementRefCSAccess().getReferenceKeyword_0());
@@ -34325,14 +34325,14 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__Group__1"
-    // InternalOCLinEcore.g:10704:1: rule__ModelElementRefCS__Group__1 : rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 ;
+    // InternalOCLinEcore.g:10706:1: rule__ModelElementRefCS__Group__1 : rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 ;
     public final void rule__ModelElementRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10708:1: ( rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 )
-            // InternalOCLinEcore.g:10709:2: rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2
+            // InternalOCLinEcore.g:10710:1: ( rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2 )
+            // InternalOCLinEcore.g:10711:2: rule__ModelElementRefCS__Group__1__Impl rule__ModelElementRefCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__ModelElementRefCS__Group__1__Impl();
@@ -34363,23 +34363,23 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__Group__1__Impl"
-    // InternalOCLinEcore.g:10716:1: rule__ModelElementRefCS__Group__1__Impl : ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:10718:1: rule__ModelElementRefCS__Group__1__Impl : ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) ;
     public final void rule__ModelElementRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10720:1: ( ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) )
-            // InternalOCLinEcore.g:10721:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
+            // InternalOCLinEcore.g:10722:1: ( ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) ) )
+            // InternalOCLinEcore.g:10723:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:10721:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
-            // InternalOCLinEcore.g:10722:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
+            // InternalOCLinEcore.g:10723:1: ( ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 ) )
+            // InternalOCLinEcore.g:10724:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getModelElementRefCSAccess().getOwnedPathNameAssignment_1());
             }
-            // InternalOCLinEcore.g:10723:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
-            // InternalOCLinEcore.g:10723:2: rule__ModelElementRefCS__OwnedPathNameAssignment_1
+            // InternalOCLinEcore.g:10725:1: ( rule__ModelElementRefCS__OwnedPathNameAssignment_1 )
+            // InternalOCLinEcore.g:10725:2: rule__ModelElementRefCS__OwnedPathNameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ModelElementRefCS__OwnedPathNameAssignment_1();
@@ -34414,14 +34414,14 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__Group__2"
-    // InternalOCLinEcore.g:10733:1: rule__ModelElementRefCS__Group__2 : rule__ModelElementRefCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:10735:1: rule__ModelElementRefCS__Group__2 : rule__ModelElementRefCS__Group__2__Impl ;
     public final void rule__ModelElementRefCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10737:1: ( rule__ModelElementRefCS__Group__2__Impl )
-            // InternalOCLinEcore.g:10738:2: rule__ModelElementRefCS__Group__2__Impl
+            // InternalOCLinEcore.g:10739:1: ( rule__ModelElementRefCS__Group__2__Impl )
+            // InternalOCLinEcore.g:10740:2: rule__ModelElementRefCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ModelElementRefCS__Group__2__Impl();
@@ -34447,17 +34447,17 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__Group__2__Impl"
-    // InternalOCLinEcore.g:10744:1: rule__ModelElementRefCS__Group__2__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:10746:1: rule__ModelElementRefCS__Group__2__Impl : ( ';' ) ;
     public final void rule__ModelElementRefCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10748:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:10749:1: ( ';' )
+            // InternalOCLinEcore.g:10750:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:10751:1: ( ';' )
             {
-            // InternalOCLinEcore.g:10749:1: ( ';' )
-            // InternalOCLinEcore.g:10750:1: ';'
+            // InternalOCLinEcore.g:10751:1: ( ';' )
+            // InternalOCLinEcore.g:10752:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getModelElementRefCSAccess().getSemicolonKeyword_2());
@@ -34488,14 +34488,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__0"
-    // InternalOCLinEcore.g:10769:1: rule__OperationCS__Group__0 : rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 ;
+    // InternalOCLinEcore.g:10771:1: rule__OperationCS__Group__0 : rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 ;
     public final void rule__OperationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10773:1: ( rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 )
-            // InternalOCLinEcore.g:10774:2: rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1
+            // InternalOCLinEcore.g:10775:1: ( rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1 )
+            // InternalOCLinEcore.g:10776:2: rule__OperationCS__Group__0__Impl rule__OperationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_53);
             rule__OperationCS__Group__0__Impl();
@@ -34526,22 +34526,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__0__Impl"
-    // InternalOCLinEcore.g:10781:1: rule__OperationCS__Group__0__Impl : ( ( rule__OperationCS__Alternatives_0 )? ) ;
+    // InternalOCLinEcore.g:10783:1: rule__OperationCS__Group__0__Impl : ( ( rule__OperationCS__Alternatives_0 )? ) ;
     public final void rule__OperationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10785:1: ( ( ( rule__OperationCS__Alternatives_0 )? ) )
-            // InternalOCLinEcore.g:10786:1: ( ( rule__OperationCS__Alternatives_0 )? )
+            // InternalOCLinEcore.g:10787:1: ( ( ( rule__OperationCS__Alternatives_0 )? ) )
+            // InternalOCLinEcore.g:10788:1: ( ( rule__OperationCS__Alternatives_0 )? )
             {
-            // InternalOCLinEcore.g:10786:1: ( ( rule__OperationCS__Alternatives_0 )? )
-            // InternalOCLinEcore.g:10787:1: ( rule__OperationCS__Alternatives_0 )?
+            // InternalOCLinEcore.g:10788:1: ( ( rule__OperationCS__Alternatives_0 )? )
+            // InternalOCLinEcore.g:10789:1: ( rule__OperationCS__Alternatives_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getAlternatives_0());
             }
-            // InternalOCLinEcore.g:10788:1: ( rule__OperationCS__Alternatives_0 )?
+            // InternalOCLinEcore.g:10790:1: ( rule__OperationCS__Alternatives_0 )?
             int alt127=2;
             int LA127_0 = input.LA(1);
 
@@ -34550,7 +34550,7 @@
             }
             switch (alt127) {
                 case 1 :
-                    // InternalOCLinEcore.g:10788:2: rule__OperationCS__Alternatives_0
+                    // InternalOCLinEcore.g:10790:2: rule__OperationCS__Alternatives_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Alternatives_0();
@@ -34588,14 +34588,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__1"
-    // InternalOCLinEcore.g:10798:1: rule__OperationCS__Group__1 : rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 ;
+    // InternalOCLinEcore.g:10800:1: rule__OperationCS__Group__1 : rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 ;
     public final void rule__OperationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10802:1: ( rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 )
-            // InternalOCLinEcore.g:10803:2: rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2
+            // InternalOCLinEcore.g:10804:1: ( rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2 )
+            // InternalOCLinEcore.g:10805:2: rule__OperationCS__Group__1__Impl rule__OperationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__OperationCS__Group__1__Impl();
@@ -34626,17 +34626,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__1__Impl"
-    // InternalOCLinEcore.g:10810:1: rule__OperationCS__Group__1__Impl : ( 'operation' ) ;
+    // InternalOCLinEcore.g:10812:1: rule__OperationCS__Group__1__Impl : ( 'operation' ) ;
     public final void rule__OperationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10814:1: ( ( 'operation' ) )
-            // InternalOCLinEcore.g:10815:1: ( 'operation' )
+            // InternalOCLinEcore.g:10816:1: ( ( 'operation' ) )
+            // InternalOCLinEcore.g:10817:1: ( 'operation' )
             {
-            // InternalOCLinEcore.g:10815:1: ( 'operation' )
-            // InternalOCLinEcore.g:10816:1: 'operation'
+            // InternalOCLinEcore.g:10817:1: ( 'operation' )
+            // InternalOCLinEcore.g:10818:1: 'operation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOperationKeyword_1());
@@ -34667,14 +34667,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__2"
-    // InternalOCLinEcore.g:10829:1: rule__OperationCS__Group__2 : rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 ;
+    // InternalOCLinEcore.g:10831:1: rule__OperationCS__Group__2 : rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 ;
     public final void rule__OperationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10833:1: ( rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 )
-            // InternalOCLinEcore.g:10834:2: rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3
+            // InternalOCLinEcore.g:10835:1: ( rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3 )
+            // InternalOCLinEcore.g:10836:2: rule__OperationCS__Group__2__Impl rule__OperationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__OperationCS__Group__2__Impl();
@@ -34705,22 +34705,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__2__Impl"
-    // InternalOCLinEcore.g:10841:1: rule__OperationCS__Group__2__Impl : ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) ;
+    // InternalOCLinEcore.g:10843:1: rule__OperationCS__Group__2__Impl : ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) ;
     public final void rule__OperationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10845:1: ( ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) )
-            // InternalOCLinEcore.g:10846:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
+            // InternalOCLinEcore.g:10847:1: ( ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? ) )
+            // InternalOCLinEcore.g:10848:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
             {
-            // InternalOCLinEcore.g:10846:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
-            // InternalOCLinEcore.g:10847:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
+            // InternalOCLinEcore.g:10848:1: ( ( rule__OperationCS__OwnedSignatureAssignment_2 )? )
+            // InternalOCLinEcore.g:10849:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedSignatureAssignment_2());
             }
-            // InternalOCLinEcore.g:10848:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
+            // InternalOCLinEcore.g:10850:1: ( rule__OperationCS__OwnedSignatureAssignment_2 )?
             int alt128=2;
             int LA128_0 = input.LA(1);
 
@@ -34729,7 +34729,7 @@
             }
             switch (alt128) {
                 case 1 :
-                    // InternalOCLinEcore.g:10848:2: rule__OperationCS__OwnedSignatureAssignment_2
+                    // InternalOCLinEcore.g:10850:2: rule__OperationCS__OwnedSignatureAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__OwnedSignatureAssignment_2();
@@ -34767,14 +34767,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__3"
-    // InternalOCLinEcore.g:10858:1: rule__OperationCS__Group__3 : rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 ;
+    // InternalOCLinEcore.g:10860:1: rule__OperationCS__Group__3 : rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 ;
     public final void rule__OperationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10862:1: ( rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 )
-            // InternalOCLinEcore.g:10863:2: rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4
+            // InternalOCLinEcore.g:10864:1: ( rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4 )
+            // InternalOCLinEcore.g:10865:2: rule__OperationCS__Group__3__Impl rule__OperationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__OperationCS__Group__3__Impl();
@@ -34805,23 +34805,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__3__Impl"
-    // InternalOCLinEcore.g:10870:1: rule__OperationCS__Group__3__Impl : ( ( rule__OperationCS__NameAssignment_3 ) ) ;
+    // InternalOCLinEcore.g:10872:1: rule__OperationCS__Group__3__Impl : ( ( rule__OperationCS__NameAssignment_3 ) ) ;
     public final void rule__OperationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10874:1: ( ( ( rule__OperationCS__NameAssignment_3 ) ) )
-            // InternalOCLinEcore.g:10875:1: ( ( rule__OperationCS__NameAssignment_3 ) )
+            // InternalOCLinEcore.g:10876:1: ( ( ( rule__OperationCS__NameAssignment_3 ) ) )
+            // InternalOCLinEcore.g:10877:1: ( ( rule__OperationCS__NameAssignment_3 ) )
             {
-            // InternalOCLinEcore.g:10875:1: ( ( rule__OperationCS__NameAssignment_3 ) )
-            // InternalOCLinEcore.g:10876:1: ( rule__OperationCS__NameAssignment_3 )
+            // InternalOCLinEcore.g:10877:1: ( ( rule__OperationCS__NameAssignment_3 ) )
+            // InternalOCLinEcore.g:10878:1: ( rule__OperationCS__NameAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getNameAssignment_3());
             }
-            // InternalOCLinEcore.g:10877:1: ( rule__OperationCS__NameAssignment_3 )
-            // InternalOCLinEcore.g:10877:2: rule__OperationCS__NameAssignment_3
+            // InternalOCLinEcore.g:10879:1: ( rule__OperationCS__NameAssignment_3 )
+            // InternalOCLinEcore.g:10879:2: rule__OperationCS__NameAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__NameAssignment_3();
@@ -34856,14 +34856,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__4"
-    // InternalOCLinEcore.g:10887:1: rule__OperationCS__Group__4 : rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 ;
+    // InternalOCLinEcore.g:10889:1: rule__OperationCS__Group__4 : rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 ;
     public final void rule__OperationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10891:1: ( rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 )
-            // InternalOCLinEcore.g:10892:2: rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5
+            // InternalOCLinEcore.g:10893:1: ( rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5 )
+            // InternalOCLinEcore.g:10894:2: rule__OperationCS__Group__4__Impl rule__OperationCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_55);
             rule__OperationCS__Group__4__Impl();
@@ -34894,17 +34894,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__4__Impl"
-    // InternalOCLinEcore.g:10899:1: rule__OperationCS__Group__4__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:10901:1: rule__OperationCS__Group__4__Impl : ( '(' ) ;
     public final void rule__OperationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10903:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:10904:1: ( '(' )
+            // InternalOCLinEcore.g:10905:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:10906:1: ( '(' )
             {
-            // InternalOCLinEcore.g:10904:1: ( '(' )
-            // InternalOCLinEcore.g:10905:1: '('
+            // InternalOCLinEcore.g:10906:1: ( '(' )
+            // InternalOCLinEcore.g:10907:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());
@@ -34935,14 +34935,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__5"
-    // InternalOCLinEcore.g:10918:1: rule__OperationCS__Group__5 : rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 ;
+    // InternalOCLinEcore.g:10920:1: rule__OperationCS__Group__5 : rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 ;
     public final void rule__OperationCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10922:1: ( rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 )
-            // InternalOCLinEcore.g:10923:2: rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6
+            // InternalOCLinEcore.g:10924:1: ( rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6 )
+            // InternalOCLinEcore.g:10925:2: rule__OperationCS__Group__5__Impl rule__OperationCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_55);
             rule__OperationCS__Group__5__Impl();
@@ -34973,22 +34973,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__5__Impl"
-    // InternalOCLinEcore.g:10930:1: rule__OperationCS__Group__5__Impl : ( ( rule__OperationCS__Group_5__0 )? ) ;
+    // InternalOCLinEcore.g:10932:1: rule__OperationCS__Group__5__Impl : ( ( rule__OperationCS__Group_5__0 )? ) ;
     public final void rule__OperationCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10934:1: ( ( ( rule__OperationCS__Group_5__0 )? ) )
-            // InternalOCLinEcore.g:10935:1: ( ( rule__OperationCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:10936:1: ( ( ( rule__OperationCS__Group_5__0 )? ) )
+            // InternalOCLinEcore.g:10937:1: ( ( rule__OperationCS__Group_5__0 )? )
             {
-            // InternalOCLinEcore.g:10935:1: ( ( rule__OperationCS__Group_5__0 )? )
-            // InternalOCLinEcore.g:10936:1: ( rule__OperationCS__Group_5__0 )?
+            // InternalOCLinEcore.g:10937:1: ( ( rule__OperationCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:10938:1: ( rule__OperationCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_5());
             }
-            // InternalOCLinEcore.g:10937:1: ( rule__OperationCS__Group_5__0 )?
+            // InternalOCLinEcore.g:10939:1: ( rule__OperationCS__Group_5__0 )?
             int alt129=2;
             int LA129_0 = input.LA(1);
 
@@ -34997,7 +34997,7 @@
             }
             switch (alt129) {
                 case 1 :
-                    // InternalOCLinEcore.g:10937:2: rule__OperationCS__Group_5__0
+                    // InternalOCLinEcore.g:10939:2: rule__OperationCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_5__0();
@@ -35035,14 +35035,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__6"
-    // InternalOCLinEcore.g:10947:1: rule__OperationCS__Group__6 : rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 ;
+    // InternalOCLinEcore.g:10949:1: rule__OperationCS__Group__6 : rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 ;
     public final void rule__OperationCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10951:1: ( rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 )
-            // InternalOCLinEcore.g:10952:2: rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7
+            // InternalOCLinEcore.g:10953:1: ( rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7 )
+            // InternalOCLinEcore.g:10954:2: rule__OperationCS__Group__6__Impl rule__OperationCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__OperationCS__Group__6__Impl();
@@ -35073,17 +35073,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__6__Impl"
-    // InternalOCLinEcore.g:10959:1: rule__OperationCS__Group__6__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:10961:1: rule__OperationCS__Group__6__Impl : ( ')' ) ;
     public final void rule__OperationCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10963:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:10964:1: ( ')' )
+            // InternalOCLinEcore.g:10965:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:10966:1: ( ')' )
             {
-            // InternalOCLinEcore.g:10964:1: ( ')' )
-            // InternalOCLinEcore.g:10965:1: ')'
+            // InternalOCLinEcore.g:10966:1: ( ')' )
+            // InternalOCLinEcore.g:10967:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());
@@ -35114,14 +35114,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__7"
-    // InternalOCLinEcore.g:10978:1: rule__OperationCS__Group__7 : rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 ;
+    // InternalOCLinEcore.g:10980:1: rule__OperationCS__Group__7 : rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 ;
     public final void rule__OperationCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10982:1: ( rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 )
-            // InternalOCLinEcore.g:10983:2: rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8
+            // InternalOCLinEcore.g:10984:1: ( rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8 )
+            // InternalOCLinEcore.g:10985:2: rule__OperationCS__Group__7__Impl rule__OperationCS__Group__8
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__OperationCS__Group__7__Impl();
@@ -35152,22 +35152,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__7__Impl"
-    // InternalOCLinEcore.g:10990:1: rule__OperationCS__Group__7__Impl : ( ( rule__OperationCS__Group_7__0 )? ) ;
+    // InternalOCLinEcore.g:10992:1: rule__OperationCS__Group__7__Impl : ( ( rule__OperationCS__Group_7__0 )? ) ;
     public final void rule__OperationCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:10994:1: ( ( ( rule__OperationCS__Group_7__0 )? ) )
-            // InternalOCLinEcore.g:10995:1: ( ( rule__OperationCS__Group_7__0 )? )
+            // InternalOCLinEcore.g:10996:1: ( ( ( rule__OperationCS__Group_7__0 )? ) )
+            // InternalOCLinEcore.g:10997:1: ( ( rule__OperationCS__Group_7__0 )? )
             {
-            // InternalOCLinEcore.g:10995:1: ( ( rule__OperationCS__Group_7__0 )? )
-            // InternalOCLinEcore.g:10996:1: ( rule__OperationCS__Group_7__0 )?
+            // InternalOCLinEcore.g:10997:1: ( ( rule__OperationCS__Group_7__0 )? )
+            // InternalOCLinEcore.g:10998:1: ( rule__OperationCS__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_7());
             }
-            // InternalOCLinEcore.g:10997:1: ( rule__OperationCS__Group_7__0 )?
+            // InternalOCLinEcore.g:10999:1: ( rule__OperationCS__Group_7__0 )?
             int alt130=2;
             int LA130_0 = input.LA(1);
 
@@ -35176,7 +35176,7 @@
             }
             switch (alt130) {
                 case 1 :
-                    // InternalOCLinEcore.g:10997:2: rule__OperationCS__Group_7__0
+                    // InternalOCLinEcore.g:10999:2: rule__OperationCS__Group_7__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_7__0();
@@ -35214,14 +35214,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__8"
-    // InternalOCLinEcore.g:11007:1: rule__OperationCS__Group__8 : rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 ;
+    // InternalOCLinEcore.g:11009:1: rule__OperationCS__Group__8 : rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 ;
     public final void rule__OperationCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11011:1: ( rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 )
-            // InternalOCLinEcore.g:11012:2: rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9
+            // InternalOCLinEcore.g:11013:1: ( rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9 )
+            // InternalOCLinEcore.g:11014:2: rule__OperationCS__Group__8__Impl rule__OperationCS__Group__9
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__OperationCS__Group__8__Impl();
@@ -35252,22 +35252,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__8__Impl"
-    // InternalOCLinEcore.g:11019:1: rule__OperationCS__Group__8__Impl : ( ( rule__OperationCS__Group_8__0 )? ) ;
+    // InternalOCLinEcore.g:11021:1: rule__OperationCS__Group__8__Impl : ( ( rule__OperationCS__Group_8__0 )? ) ;
     public final void rule__OperationCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11023:1: ( ( ( rule__OperationCS__Group_8__0 )? ) )
-            // InternalOCLinEcore.g:11024:1: ( ( rule__OperationCS__Group_8__0 )? )
+            // InternalOCLinEcore.g:11025:1: ( ( ( rule__OperationCS__Group_8__0 )? ) )
+            // InternalOCLinEcore.g:11026:1: ( ( rule__OperationCS__Group_8__0 )? )
             {
-            // InternalOCLinEcore.g:11024:1: ( ( rule__OperationCS__Group_8__0 )? )
-            // InternalOCLinEcore.g:11025:1: ( rule__OperationCS__Group_8__0 )?
+            // InternalOCLinEcore.g:11026:1: ( ( rule__OperationCS__Group_8__0 )? )
+            // InternalOCLinEcore.g:11027:1: ( rule__OperationCS__Group_8__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_8());
             }
-            // InternalOCLinEcore.g:11026:1: ( rule__OperationCS__Group_8__0 )?
+            // InternalOCLinEcore.g:11028:1: ( rule__OperationCS__Group_8__0 )?
             int alt131=2;
             int LA131_0 = input.LA(1);
 
@@ -35276,7 +35276,7 @@
             }
             switch (alt131) {
                 case 1 :
-                    // InternalOCLinEcore.g:11026:2: rule__OperationCS__Group_8__0
+                    // InternalOCLinEcore.g:11028:2: rule__OperationCS__Group_8__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_8__0();
@@ -35314,14 +35314,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__9"
-    // InternalOCLinEcore.g:11036:1: rule__OperationCS__Group__9 : rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 ;
+    // InternalOCLinEcore.g:11038:1: rule__OperationCS__Group__9 : rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 ;
     public final void rule__OperationCS__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11040:1: ( rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 )
-            // InternalOCLinEcore.g:11041:2: rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10
+            // InternalOCLinEcore.g:11042:1: ( rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10 )
+            // InternalOCLinEcore.g:11043:2: rule__OperationCS__Group__9__Impl rule__OperationCS__Group__10
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__OperationCS__Group__9__Impl();
@@ -35352,22 +35352,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__9__Impl"
-    // InternalOCLinEcore.g:11048:1: rule__OperationCS__Group__9__Impl : ( ( rule__OperationCS__Group_9__0 )? ) ;
+    // InternalOCLinEcore.g:11050:1: rule__OperationCS__Group__9__Impl : ( ( rule__OperationCS__Group_9__0 )? ) ;
     public final void rule__OperationCS__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11052:1: ( ( ( rule__OperationCS__Group_9__0 )? ) )
-            // InternalOCLinEcore.g:11053:1: ( ( rule__OperationCS__Group_9__0 )? )
+            // InternalOCLinEcore.g:11054:1: ( ( ( rule__OperationCS__Group_9__0 )? ) )
+            // InternalOCLinEcore.g:11055:1: ( ( rule__OperationCS__Group_9__0 )? )
             {
-            // InternalOCLinEcore.g:11053:1: ( ( rule__OperationCS__Group_9__0 )? )
-            // InternalOCLinEcore.g:11054:1: ( rule__OperationCS__Group_9__0 )?
+            // InternalOCLinEcore.g:11055:1: ( ( rule__OperationCS__Group_9__0 )? )
+            // InternalOCLinEcore.g:11056:1: ( rule__OperationCS__Group_9__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_9());
             }
-            // InternalOCLinEcore.g:11055:1: ( rule__OperationCS__Group_9__0 )?
+            // InternalOCLinEcore.g:11057:1: ( rule__OperationCS__Group_9__0 )?
             int alt132=2;
             int LA132_0 = input.LA(1);
 
@@ -35380,7 +35380,7 @@
             }
             switch (alt132) {
                 case 1 :
-                    // InternalOCLinEcore.g:11055:2: rule__OperationCS__Group_9__0
+                    // InternalOCLinEcore.g:11057:2: rule__OperationCS__Group_9__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__Group_9__0();
@@ -35418,14 +35418,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__10"
-    // InternalOCLinEcore.g:11065:1: rule__OperationCS__Group__10 : rule__OperationCS__Group__10__Impl ;
+    // InternalOCLinEcore.g:11067:1: rule__OperationCS__Group__10 : rule__OperationCS__Group__10__Impl ;
     public final void rule__OperationCS__Group__10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11069:1: ( rule__OperationCS__Group__10__Impl )
-            // InternalOCLinEcore.g:11070:2: rule__OperationCS__Group__10__Impl
+            // InternalOCLinEcore.g:11071:1: ( rule__OperationCS__Group__10__Impl )
+            // InternalOCLinEcore.g:11072:2: rule__OperationCS__Group__10__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group__10__Impl();
@@ -35451,23 +35451,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group__10__Impl"
-    // InternalOCLinEcore.g:11076:1: rule__OperationCS__Group__10__Impl : ( ( rule__OperationCS__Alternatives_10 ) ) ;
+    // InternalOCLinEcore.g:11078:1: rule__OperationCS__Group__10__Impl : ( ( rule__OperationCS__Alternatives_10 ) ) ;
     public final void rule__OperationCS__Group__10__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11080:1: ( ( ( rule__OperationCS__Alternatives_10 ) ) )
-            // InternalOCLinEcore.g:11081:1: ( ( rule__OperationCS__Alternatives_10 ) )
+            // InternalOCLinEcore.g:11082:1: ( ( ( rule__OperationCS__Alternatives_10 ) ) )
+            // InternalOCLinEcore.g:11083:1: ( ( rule__OperationCS__Alternatives_10 ) )
             {
-            // InternalOCLinEcore.g:11081:1: ( ( rule__OperationCS__Alternatives_10 ) )
-            // InternalOCLinEcore.g:11082:1: ( rule__OperationCS__Alternatives_10 )
+            // InternalOCLinEcore.g:11083:1: ( ( rule__OperationCS__Alternatives_10 ) )
+            // InternalOCLinEcore.g:11084:1: ( rule__OperationCS__Alternatives_10 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getAlternatives_10());
             }
-            // InternalOCLinEcore.g:11083:1: ( rule__OperationCS__Alternatives_10 )
-            // InternalOCLinEcore.g:11083:2: rule__OperationCS__Alternatives_10
+            // InternalOCLinEcore.g:11085:1: ( rule__OperationCS__Alternatives_10 )
+            // InternalOCLinEcore.g:11085:2: rule__OperationCS__Alternatives_10
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Alternatives_10();
@@ -35502,14 +35502,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_0__0"
-    // InternalOCLinEcore.g:11115:1: rule__OperationCS__Group_0_0__0 : rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 ;
+    // InternalOCLinEcore.g:11117:1: rule__OperationCS__Group_0_0__0 : rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 ;
     public final void rule__OperationCS__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11119:1: ( rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 )
-            // InternalOCLinEcore.g:11120:2: rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1
+            // InternalOCLinEcore.g:11121:1: ( rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1 )
+            // InternalOCLinEcore.g:11122:2: rule__OperationCS__Group_0_0__0__Impl rule__OperationCS__Group_0_0__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__OperationCS__Group_0_0__0__Impl();
@@ -35540,23 +35540,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_0__0__Impl"
-    // InternalOCLinEcore.g:11127:1: rule__OperationCS__Group_0_0__0__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) ;
+    // InternalOCLinEcore.g:11129:1: rule__OperationCS__Group_0_0__0__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) ;
     public final void rule__OperationCS__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11131:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) )
-            // InternalOCLinEcore.g:11132:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
+            // InternalOCLinEcore.g:11133:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) ) )
+            // InternalOCLinEcore.g:11134:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
             {
-            // InternalOCLinEcore.g:11132:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
-            // InternalOCLinEcore.g:11133:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
+            // InternalOCLinEcore.g:11134:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_0 ) )
+            // InternalOCLinEcore.g:11135:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_0());
             }
-            // InternalOCLinEcore.g:11134:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
-            // InternalOCLinEcore.g:11134:2: rule__OperationCS__QualifiersAssignment_0_0_0
+            // InternalOCLinEcore.g:11136:1: ( rule__OperationCS__QualifiersAssignment_0_0_0 )
+            // InternalOCLinEcore.g:11136:2: rule__OperationCS__QualifiersAssignment_0_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__QualifiersAssignment_0_0_0();
@@ -35591,14 +35591,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_0__1"
-    // InternalOCLinEcore.g:11144:1: rule__OperationCS__Group_0_0__1 : rule__OperationCS__Group_0_0__1__Impl ;
+    // InternalOCLinEcore.g:11146:1: rule__OperationCS__Group_0_0__1 : rule__OperationCS__Group_0_0__1__Impl ;
     public final void rule__OperationCS__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11148:1: ( rule__OperationCS__Group_0_0__1__Impl )
-            // InternalOCLinEcore.g:11149:2: rule__OperationCS__Group_0_0__1__Impl
+            // InternalOCLinEcore.g:11150:1: ( rule__OperationCS__Group_0_0__1__Impl )
+            // InternalOCLinEcore.g:11151:2: rule__OperationCS__Group_0_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_0_0__1__Impl();
@@ -35624,22 +35624,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_0__1__Impl"
-    // InternalOCLinEcore.g:11155:1: rule__OperationCS__Group_0_0__1__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) ;
+    // InternalOCLinEcore.g:11157:1: rule__OperationCS__Group_0_0__1__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) ;
     public final void rule__OperationCS__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11159:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) )
-            // InternalOCLinEcore.g:11160:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
+            // InternalOCLinEcore.g:11161:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? ) )
+            // InternalOCLinEcore.g:11162:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
             {
-            // InternalOCLinEcore.g:11160:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
-            // InternalOCLinEcore.g:11161:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
+            // InternalOCLinEcore.g:11162:1: ( ( rule__OperationCS__QualifiersAssignment_0_0_1 )? )
+            // InternalOCLinEcore.g:11163:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_0_1());
             }
-            // InternalOCLinEcore.g:11162:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
+            // InternalOCLinEcore.g:11164:1: ( rule__OperationCS__QualifiersAssignment_0_0_1 )?
             int alt133=2;
             int LA133_0 = input.LA(1);
 
@@ -35648,7 +35648,7 @@
             }
             switch (alt133) {
                 case 1 :
-                    // InternalOCLinEcore.g:11162:2: rule__OperationCS__QualifiersAssignment_0_0_1
+                    // InternalOCLinEcore.g:11164:2: rule__OperationCS__QualifiersAssignment_0_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_0_0_1();
@@ -35686,14 +35686,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_1__0"
-    // InternalOCLinEcore.g:11176:1: rule__OperationCS__Group_0_1__0 : rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 ;
+    // InternalOCLinEcore.g:11178:1: rule__OperationCS__Group_0_1__0 : rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 ;
     public final void rule__OperationCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11180:1: ( rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 )
-            // InternalOCLinEcore.g:11181:2: rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1
+            // InternalOCLinEcore.g:11182:1: ( rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1 )
+            // InternalOCLinEcore.g:11183:2: rule__OperationCS__Group_0_1__0__Impl rule__OperationCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_27);
             rule__OperationCS__Group_0_1__0__Impl();
@@ -35724,23 +35724,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_1__0__Impl"
-    // InternalOCLinEcore.g:11188:1: rule__OperationCS__Group_0_1__0__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) ;
+    // InternalOCLinEcore.g:11190:1: rule__OperationCS__Group_0_1__0__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) ;
     public final void rule__OperationCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11192:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) )
-            // InternalOCLinEcore.g:11193:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
+            // InternalOCLinEcore.g:11194:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) ) )
+            // InternalOCLinEcore.g:11195:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
             {
-            // InternalOCLinEcore.g:11193:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
-            // InternalOCLinEcore.g:11194:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
+            // InternalOCLinEcore.g:11195:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_0 ) )
+            // InternalOCLinEcore.g:11196:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_0());
             }
-            // InternalOCLinEcore.g:11195:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
-            // InternalOCLinEcore.g:11195:2: rule__OperationCS__QualifiersAssignment_0_1_0
+            // InternalOCLinEcore.g:11197:1: ( rule__OperationCS__QualifiersAssignment_0_1_0 )
+            // InternalOCLinEcore.g:11197:2: rule__OperationCS__QualifiersAssignment_0_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__QualifiersAssignment_0_1_0();
@@ -35775,14 +35775,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_1__1"
-    // InternalOCLinEcore.g:11205:1: rule__OperationCS__Group_0_1__1 : rule__OperationCS__Group_0_1__1__Impl ;
+    // InternalOCLinEcore.g:11207:1: rule__OperationCS__Group_0_1__1 : rule__OperationCS__Group_0_1__1__Impl ;
     public final void rule__OperationCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11209:1: ( rule__OperationCS__Group_0_1__1__Impl )
-            // InternalOCLinEcore.g:11210:2: rule__OperationCS__Group_0_1__1__Impl
+            // InternalOCLinEcore.g:11211:1: ( rule__OperationCS__Group_0_1__1__Impl )
+            // InternalOCLinEcore.g:11212:2: rule__OperationCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_0_1__1__Impl();
@@ -35808,22 +35808,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_0_1__1__Impl"
-    // InternalOCLinEcore.g:11216:1: rule__OperationCS__Group_0_1__1__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) ;
+    // InternalOCLinEcore.g:11218:1: rule__OperationCS__Group_0_1__1__Impl : ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) ;
     public final void rule__OperationCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11220:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) )
-            // InternalOCLinEcore.g:11221:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
+            // InternalOCLinEcore.g:11222:1: ( ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? ) )
+            // InternalOCLinEcore.g:11223:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
             {
-            // InternalOCLinEcore.g:11221:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
-            // InternalOCLinEcore.g:11222:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
+            // InternalOCLinEcore.g:11223:1: ( ( rule__OperationCS__QualifiersAssignment_0_1_1 )? )
+            // InternalOCLinEcore.g:11224:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersAssignment_0_1_1());
             }
-            // InternalOCLinEcore.g:11223:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
+            // InternalOCLinEcore.g:11225:1: ( rule__OperationCS__QualifiersAssignment_0_1_1 )?
             int alt134=2;
             int LA134_0 = input.LA(1);
 
@@ -35832,7 +35832,7 @@
             }
             switch (alt134) {
                 case 1 :
-                    // InternalOCLinEcore.g:11223:2: rule__OperationCS__QualifiersAssignment_0_1_1
+                    // InternalOCLinEcore.g:11225:2: rule__OperationCS__QualifiersAssignment_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__QualifiersAssignment_0_1_1();
@@ -35870,14 +35870,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5__0"
-    // InternalOCLinEcore.g:11237:1: rule__OperationCS__Group_5__0 : rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 ;
+    // InternalOCLinEcore.g:11239:1: rule__OperationCS__Group_5__0 : rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 ;
     public final void rule__OperationCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11241:1: ( rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 )
-            // InternalOCLinEcore.g:11242:2: rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1
+            // InternalOCLinEcore.g:11243:1: ( rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1 )
+            // InternalOCLinEcore.g:11244:2: rule__OperationCS__Group_5__0__Impl rule__OperationCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__OperationCS__Group_5__0__Impl();
@@ -35908,23 +35908,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5__0__Impl"
-    // InternalOCLinEcore.g:11249:1: rule__OperationCS__Group_5__0__Impl : ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) ;
+    // InternalOCLinEcore.g:11251:1: rule__OperationCS__Group_5__0__Impl : ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) ;
     public final void rule__OperationCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11253:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) )
-            // InternalOCLinEcore.g:11254:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
+            // InternalOCLinEcore.g:11255:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) ) )
+            // InternalOCLinEcore.g:11256:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
             {
-            // InternalOCLinEcore.g:11254:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
-            // InternalOCLinEcore.g:11255:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
+            // InternalOCLinEcore.g:11256:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_0 ) )
+            // InternalOCLinEcore.g:11257:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_0());
             }
-            // InternalOCLinEcore.g:11256:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
-            // InternalOCLinEcore.g:11256:2: rule__OperationCS__OwnedParametersAssignment_5_0
+            // InternalOCLinEcore.g:11258:1: ( rule__OperationCS__OwnedParametersAssignment_5_0 )
+            // InternalOCLinEcore.g:11258:2: rule__OperationCS__OwnedParametersAssignment_5_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__OwnedParametersAssignment_5_0();
@@ -35959,14 +35959,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5__1"
-    // InternalOCLinEcore.g:11266:1: rule__OperationCS__Group_5__1 : rule__OperationCS__Group_5__1__Impl ;
+    // InternalOCLinEcore.g:11268:1: rule__OperationCS__Group_5__1 : rule__OperationCS__Group_5__1__Impl ;
     public final void rule__OperationCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11270:1: ( rule__OperationCS__Group_5__1__Impl )
-            // InternalOCLinEcore.g:11271:2: rule__OperationCS__Group_5__1__Impl
+            // InternalOCLinEcore.g:11272:1: ( rule__OperationCS__Group_5__1__Impl )
+            // InternalOCLinEcore.g:11273:2: rule__OperationCS__Group_5__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_5__1__Impl();
@@ -35992,22 +35992,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5__1__Impl"
-    // InternalOCLinEcore.g:11277:1: rule__OperationCS__Group_5__1__Impl : ( ( rule__OperationCS__Group_5_1__0 )* ) ;
+    // InternalOCLinEcore.g:11279:1: rule__OperationCS__Group_5__1__Impl : ( ( rule__OperationCS__Group_5_1__0 )* ) ;
     public final void rule__OperationCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11281:1: ( ( ( rule__OperationCS__Group_5_1__0 )* ) )
-            // InternalOCLinEcore.g:11282:1: ( ( rule__OperationCS__Group_5_1__0 )* )
+            // InternalOCLinEcore.g:11283:1: ( ( ( rule__OperationCS__Group_5_1__0 )* ) )
+            // InternalOCLinEcore.g:11284:1: ( ( rule__OperationCS__Group_5_1__0 )* )
             {
-            // InternalOCLinEcore.g:11282:1: ( ( rule__OperationCS__Group_5_1__0 )* )
-            // InternalOCLinEcore.g:11283:1: ( rule__OperationCS__Group_5_1__0 )*
+            // InternalOCLinEcore.g:11284:1: ( ( rule__OperationCS__Group_5_1__0 )* )
+            // InternalOCLinEcore.g:11285:1: ( rule__OperationCS__Group_5_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_5_1());
             }
-            // InternalOCLinEcore.g:11284:1: ( rule__OperationCS__Group_5_1__0 )*
+            // InternalOCLinEcore.g:11286:1: ( rule__OperationCS__Group_5_1__0 )*
             loop135:
             do {
                 int alt135=2;
@@ -36020,7 +36020,7 @@
 
                 switch (alt135) {
             	case 1 :
-            	    // InternalOCLinEcore.g:11284:2: rule__OperationCS__Group_5_1__0
+            	    // InternalOCLinEcore.g:11286:2: rule__OperationCS__Group_5_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__OperationCS__Group_5_1__0();
@@ -36061,14 +36061,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5_1__0"
-    // InternalOCLinEcore.g:11298:1: rule__OperationCS__Group_5_1__0 : rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 ;
+    // InternalOCLinEcore.g:11300:1: rule__OperationCS__Group_5_1__0 : rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 ;
     public final void rule__OperationCS__Group_5_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11302:1: ( rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 )
-            // InternalOCLinEcore.g:11303:2: rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1
+            // InternalOCLinEcore.g:11304:1: ( rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1 )
+            // InternalOCLinEcore.g:11305:2: rule__OperationCS__Group_5_1__0__Impl rule__OperationCS__Group_5_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__OperationCS__Group_5_1__0__Impl();
@@ -36099,17 +36099,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5_1__0__Impl"
-    // InternalOCLinEcore.g:11310:1: rule__OperationCS__Group_5_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:11312:1: rule__OperationCS__Group_5_1__0__Impl : ( ',' ) ;
     public final void rule__OperationCS__Group_5_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11314:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:11315:1: ( ',' )
+            // InternalOCLinEcore.g:11316:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:11317:1: ( ',' )
             {
-            // InternalOCLinEcore.g:11315:1: ( ',' )
-            // InternalOCLinEcore.g:11316:1: ','
+            // InternalOCLinEcore.g:11317:1: ( ',' )
+            // InternalOCLinEcore.g:11318:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());
@@ -36140,14 +36140,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5_1__1"
-    // InternalOCLinEcore.g:11329:1: rule__OperationCS__Group_5_1__1 : rule__OperationCS__Group_5_1__1__Impl ;
+    // InternalOCLinEcore.g:11331:1: rule__OperationCS__Group_5_1__1 : rule__OperationCS__Group_5_1__1__Impl ;
     public final void rule__OperationCS__Group_5_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11333:1: ( rule__OperationCS__Group_5_1__1__Impl )
-            // InternalOCLinEcore.g:11334:2: rule__OperationCS__Group_5_1__1__Impl
+            // InternalOCLinEcore.g:11335:1: ( rule__OperationCS__Group_5_1__1__Impl )
+            // InternalOCLinEcore.g:11336:2: rule__OperationCS__Group_5_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_5_1__1__Impl();
@@ -36173,23 +36173,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_5_1__1__Impl"
-    // InternalOCLinEcore.g:11340:1: rule__OperationCS__Group_5_1__1__Impl : ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) ;
+    // InternalOCLinEcore.g:11342:1: rule__OperationCS__Group_5_1__1__Impl : ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) ;
     public final void rule__OperationCS__Group_5_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11344:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) )
-            // InternalOCLinEcore.g:11345:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
+            // InternalOCLinEcore.g:11346:1: ( ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) ) )
+            // InternalOCLinEcore.g:11347:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
             {
-            // InternalOCLinEcore.g:11345:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
-            // InternalOCLinEcore.g:11346:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
+            // InternalOCLinEcore.g:11347:1: ( ( rule__OperationCS__OwnedParametersAssignment_5_1_1 ) )
+            // InternalOCLinEcore.g:11348:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedParametersAssignment_5_1_1());
             }
-            // InternalOCLinEcore.g:11347:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
-            // InternalOCLinEcore.g:11347:2: rule__OperationCS__OwnedParametersAssignment_5_1_1
+            // InternalOCLinEcore.g:11349:1: ( rule__OperationCS__OwnedParametersAssignment_5_1_1 )
+            // InternalOCLinEcore.g:11349:2: rule__OperationCS__OwnedParametersAssignment_5_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__OwnedParametersAssignment_5_1_1();
@@ -36224,14 +36224,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_7__0"
-    // InternalOCLinEcore.g:11361:1: rule__OperationCS__Group_7__0 : rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 ;
+    // InternalOCLinEcore.g:11363:1: rule__OperationCS__Group_7__0 : rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 ;
     public final void rule__OperationCS__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11365:1: ( rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 )
-            // InternalOCLinEcore.g:11366:2: rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1
+            // InternalOCLinEcore.g:11367:1: ( rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1 )
+            // InternalOCLinEcore.g:11368:2: rule__OperationCS__Group_7__0__Impl rule__OperationCS__Group_7__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__OperationCS__Group_7__0__Impl();
@@ -36262,17 +36262,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_7__0__Impl"
-    // InternalOCLinEcore.g:11373:1: rule__OperationCS__Group_7__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:11375:1: rule__OperationCS__Group_7__0__Impl : ( ':' ) ;
     public final void rule__OperationCS__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11377:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:11378:1: ( ':' )
+            // InternalOCLinEcore.g:11379:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:11380:1: ( ':' )
             {
-            // InternalOCLinEcore.g:11378:1: ( ':' )
-            // InternalOCLinEcore.g:11379:1: ':'
+            // InternalOCLinEcore.g:11380:1: ( ':' )
+            // InternalOCLinEcore.g:11381:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getColonKeyword_7_0());
@@ -36303,14 +36303,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_7__1"
-    // InternalOCLinEcore.g:11392:1: rule__OperationCS__Group_7__1 : rule__OperationCS__Group_7__1__Impl ;
+    // InternalOCLinEcore.g:11394:1: rule__OperationCS__Group_7__1 : rule__OperationCS__Group_7__1__Impl ;
     public final void rule__OperationCS__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11396:1: ( rule__OperationCS__Group_7__1__Impl )
-            // InternalOCLinEcore.g:11397:2: rule__OperationCS__Group_7__1__Impl
+            // InternalOCLinEcore.g:11398:1: ( rule__OperationCS__Group_7__1__Impl )
+            // InternalOCLinEcore.g:11399:2: rule__OperationCS__Group_7__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_7__1__Impl();
@@ -36336,23 +36336,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_7__1__Impl"
-    // InternalOCLinEcore.g:11403:1: rule__OperationCS__Group_7__1__Impl : ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) ;
+    // InternalOCLinEcore.g:11405:1: rule__OperationCS__Group_7__1__Impl : ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) ;
     public final void rule__OperationCS__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11407:1: ( ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) )
-            // InternalOCLinEcore.g:11408:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
+            // InternalOCLinEcore.g:11409:1: ( ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) ) )
+            // InternalOCLinEcore.g:11410:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
             {
-            // InternalOCLinEcore.g:11408:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
-            // InternalOCLinEcore.g:11409:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
+            // InternalOCLinEcore.g:11410:1: ( ( rule__OperationCS__OwnedTypeAssignment_7_1 ) )
+            // InternalOCLinEcore.g:11411:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedTypeAssignment_7_1());
             }
-            // InternalOCLinEcore.g:11410:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
-            // InternalOCLinEcore.g:11410:2: rule__OperationCS__OwnedTypeAssignment_7_1
+            // InternalOCLinEcore.g:11412:1: ( rule__OperationCS__OwnedTypeAssignment_7_1 )
+            // InternalOCLinEcore.g:11412:2: rule__OperationCS__OwnedTypeAssignment_7_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__OwnedTypeAssignment_7_1();
@@ -36387,14 +36387,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8__0"
-    // InternalOCLinEcore.g:11424:1: rule__OperationCS__Group_8__0 : rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 ;
+    // InternalOCLinEcore.g:11426:1: rule__OperationCS__Group_8__0 : rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 ;
     public final void rule__OperationCS__Group_8__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11428:1: ( rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 )
-            // InternalOCLinEcore.g:11429:2: rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1
+            // InternalOCLinEcore.g:11430:1: ( rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1 )
+            // InternalOCLinEcore.g:11431:2: rule__OperationCS__Group_8__0__Impl rule__OperationCS__Group_8__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__OperationCS__Group_8__0__Impl();
@@ -36425,17 +36425,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8__0__Impl"
-    // InternalOCLinEcore.g:11436:1: rule__OperationCS__Group_8__0__Impl : ( 'throws' ) ;
+    // InternalOCLinEcore.g:11438:1: rule__OperationCS__Group_8__0__Impl : ( 'throws' ) ;
     public final void rule__OperationCS__Group_8__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11440:1: ( ( 'throws' ) )
-            // InternalOCLinEcore.g:11441:1: ( 'throws' )
+            // InternalOCLinEcore.g:11442:1: ( ( 'throws' ) )
+            // InternalOCLinEcore.g:11443:1: ( 'throws' )
             {
-            // InternalOCLinEcore.g:11441:1: ( 'throws' )
-            // InternalOCLinEcore.g:11442:1: 'throws'
+            // InternalOCLinEcore.g:11443:1: ( 'throws' )
+            // InternalOCLinEcore.g:11444:1: 'throws'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getThrowsKeyword_8_0());
@@ -36466,14 +36466,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8__1"
-    // InternalOCLinEcore.g:11455:1: rule__OperationCS__Group_8__1 : rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 ;
+    // InternalOCLinEcore.g:11457:1: rule__OperationCS__Group_8__1 : rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 ;
     public final void rule__OperationCS__Group_8__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11459:1: ( rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 )
-            // InternalOCLinEcore.g:11460:2: rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2
+            // InternalOCLinEcore.g:11461:1: ( rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2 )
+            // InternalOCLinEcore.g:11462:2: rule__OperationCS__Group_8__1__Impl rule__OperationCS__Group_8__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__OperationCS__Group_8__1__Impl();
@@ -36504,23 +36504,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8__1__Impl"
-    // InternalOCLinEcore.g:11467:1: rule__OperationCS__Group_8__1__Impl : ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) ;
+    // InternalOCLinEcore.g:11469:1: rule__OperationCS__Group_8__1__Impl : ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) ;
     public final void rule__OperationCS__Group_8__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11471:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) )
-            // InternalOCLinEcore.g:11472:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
+            // InternalOCLinEcore.g:11473:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) ) )
+            // InternalOCLinEcore.g:11474:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
             {
-            // InternalOCLinEcore.g:11472:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
-            // InternalOCLinEcore.g:11473:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
+            // InternalOCLinEcore.g:11474:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_1 ) )
+            // InternalOCLinEcore.g:11475:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_1());
             }
-            // InternalOCLinEcore.g:11474:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
-            // InternalOCLinEcore.g:11474:2: rule__OperationCS__OwnedExceptionsAssignment_8_1
+            // InternalOCLinEcore.g:11476:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_1 )
+            // InternalOCLinEcore.g:11476:2: rule__OperationCS__OwnedExceptionsAssignment_8_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__OwnedExceptionsAssignment_8_1();
@@ -36555,14 +36555,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8__2"
-    // InternalOCLinEcore.g:11484:1: rule__OperationCS__Group_8__2 : rule__OperationCS__Group_8__2__Impl ;
+    // InternalOCLinEcore.g:11486:1: rule__OperationCS__Group_8__2 : rule__OperationCS__Group_8__2__Impl ;
     public final void rule__OperationCS__Group_8__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11488:1: ( rule__OperationCS__Group_8__2__Impl )
-            // InternalOCLinEcore.g:11489:2: rule__OperationCS__Group_8__2__Impl
+            // InternalOCLinEcore.g:11490:1: ( rule__OperationCS__Group_8__2__Impl )
+            // InternalOCLinEcore.g:11491:2: rule__OperationCS__Group_8__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_8__2__Impl();
@@ -36588,22 +36588,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8__2__Impl"
-    // InternalOCLinEcore.g:11495:1: rule__OperationCS__Group_8__2__Impl : ( ( rule__OperationCS__Group_8_2__0 )* ) ;
+    // InternalOCLinEcore.g:11497:1: rule__OperationCS__Group_8__2__Impl : ( ( rule__OperationCS__Group_8_2__0 )* ) ;
     public final void rule__OperationCS__Group_8__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11499:1: ( ( ( rule__OperationCS__Group_8_2__0 )* ) )
-            // InternalOCLinEcore.g:11500:1: ( ( rule__OperationCS__Group_8_2__0 )* )
+            // InternalOCLinEcore.g:11501:1: ( ( ( rule__OperationCS__Group_8_2__0 )* ) )
+            // InternalOCLinEcore.g:11502:1: ( ( rule__OperationCS__Group_8_2__0 )* )
             {
-            // InternalOCLinEcore.g:11500:1: ( ( rule__OperationCS__Group_8_2__0 )* )
-            // InternalOCLinEcore.g:11501:1: ( rule__OperationCS__Group_8_2__0 )*
+            // InternalOCLinEcore.g:11502:1: ( ( rule__OperationCS__Group_8_2__0 )* )
+            // InternalOCLinEcore.g:11503:1: ( rule__OperationCS__Group_8_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_8_2());
             }
-            // InternalOCLinEcore.g:11502:1: ( rule__OperationCS__Group_8_2__0 )*
+            // InternalOCLinEcore.g:11504:1: ( rule__OperationCS__Group_8_2__0 )*
             loop136:
             do {
                 int alt136=2;
@@ -36616,7 +36616,7 @@
 
                 switch (alt136) {
             	case 1 :
-            	    // InternalOCLinEcore.g:11502:2: rule__OperationCS__Group_8_2__0
+            	    // InternalOCLinEcore.g:11504:2: rule__OperationCS__Group_8_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__OperationCS__Group_8_2__0();
@@ -36657,14 +36657,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8_2__0"
-    // InternalOCLinEcore.g:11518:1: rule__OperationCS__Group_8_2__0 : rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 ;
+    // InternalOCLinEcore.g:11520:1: rule__OperationCS__Group_8_2__0 : rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 ;
     public final void rule__OperationCS__Group_8_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11522:1: ( rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 )
-            // InternalOCLinEcore.g:11523:2: rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1
+            // InternalOCLinEcore.g:11524:1: ( rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1 )
+            // InternalOCLinEcore.g:11525:2: rule__OperationCS__Group_8_2__0__Impl rule__OperationCS__Group_8_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__OperationCS__Group_8_2__0__Impl();
@@ -36695,17 +36695,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8_2__0__Impl"
-    // InternalOCLinEcore.g:11530:1: rule__OperationCS__Group_8_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:11532:1: rule__OperationCS__Group_8_2__0__Impl : ( ',' ) ;
     public final void rule__OperationCS__Group_8_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11534:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:11535:1: ( ',' )
+            // InternalOCLinEcore.g:11536:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:11537:1: ( ',' )
             {
-            // InternalOCLinEcore.g:11535:1: ( ',' )
-            // InternalOCLinEcore.g:11536:1: ','
+            // InternalOCLinEcore.g:11537:1: ( ',' )
+            // InternalOCLinEcore.g:11538:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());
@@ -36736,14 +36736,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8_2__1"
-    // InternalOCLinEcore.g:11549:1: rule__OperationCS__Group_8_2__1 : rule__OperationCS__Group_8_2__1__Impl ;
+    // InternalOCLinEcore.g:11551:1: rule__OperationCS__Group_8_2__1 : rule__OperationCS__Group_8_2__1__Impl ;
     public final void rule__OperationCS__Group_8_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11553:1: ( rule__OperationCS__Group_8_2__1__Impl )
-            // InternalOCLinEcore.g:11554:2: rule__OperationCS__Group_8_2__1__Impl
+            // InternalOCLinEcore.g:11555:1: ( rule__OperationCS__Group_8_2__1__Impl )
+            // InternalOCLinEcore.g:11556:2: rule__OperationCS__Group_8_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_8_2__1__Impl();
@@ -36769,23 +36769,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_8_2__1__Impl"
-    // InternalOCLinEcore.g:11560:1: rule__OperationCS__Group_8_2__1__Impl : ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) ;
+    // InternalOCLinEcore.g:11562:1: rule__OperationCS__Group_8_2__1__Impl : ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) ;
     public final void rule__OperationCS__Group_8_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11564:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) )
-            // InternalOCLinEcore.g:11565:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
+            // InternalOCLinEcore.g:11566:1: ( ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) ) )
+            // InternalOCLinEcore.g:11567:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
             {
-            // InternalOCLinEcore.g:11565:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
-            // InternalOCLinEcore.g:11566:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
+            // InternalOCLinEcore.g:11567:1: ( ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 ) )
+            // InternalOCLinEcore.g:11568:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedExceptionsAssignment_8_2_1());
             }
-            // InternalOCLinEcore.g:11567:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
-            // InternalOCLinEcore.g:11567:2: rule__OperationCS__OwnedExceptionsAssignment_8_2_1
+            // InternalOCLinEcore.g:11569:1: ( rule__OperationCS__OwnedExceptionsAssignment_8_2_1 )
+            // InternalOCLinEcore.g:11569:2: rule__OperationCS__OwnedExceptionsAssignment_8_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__OwnedExceptionsAssignment_8_2_1();
@@ -36820,14 +36820,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9__0"
-    // InternalOCLinEcore.g:11581:1: rule__OperationCS__Group_9__0 : rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 ;
+    // InternalOCLinEcore.g:11583:1: rule__OperationCS__Group_9__0 : rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 ;
     public final void rule__OperationCS__Group_9__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11585:1: ( rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 )
-            // InternalOCLinEcore.g:11586:2: rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1
+            // InternalOCLinEcore.g:11587:1: ( rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1 )
+            // InternalOCLinEcore.g:11588:2: rule__OperationCS__Group_9__0__Impl rule__OperationCS__Group_9__1
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__OperationCS__Group_9__0__Impl();
@@ -36858,17 +36858,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9__0__Impl"
-    // InternalOCLinEcore.g:11593:1: rule__OperationCS__Group_9__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:11595:1: rule__OperationCS__Group_9__0__Impl : ( '{' ) ;
     public final void rule__OperationCS__Group_9__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11597:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:11598:1: ( '{' )
+            // InternalOCLinEcore.g:11599:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:11600:1: ( '{' )
             {
-            // InternalOCLinEcore.g:11598:1: ( '{' )
-            // InternalOCLinEcore.g:11599:1: '{'
+            // InternalOCLinEcore.g:11600:1: ( '{' )
+            // InternalOCLinEcore.g:11601:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());
@@ -36899,14 +36899,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9__1"
-    // InternalOCLinEcore.g:11612:1: rule__OperationCS__Group_9__1 : rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 ;
+    // InternalOCLinEcore.g:11614:1: rule__OperationCS__Group_9__1 : rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 ;
     public final void rule__OperationCS__Group_9__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11616:1: ( rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 )
-            // InternalOCLinEcore.g:11617:2: rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2
+            // InternalOCLinEcore.g:11618:1: ( rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2 )
+            // InternalOCLinEcore.g:11619:2: rule__OperationCS__Group_9__1__Impl rule__OperationCS__Group_9__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__OperationCS__Group_9__1__Impl();
@@ -36937,26 +36937,26 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9__1__Impl"
-    // InternalOCLinEcore.g:11624:1: rule__OperationCS__Group_9__1__Impl : ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) ;
+    // InternalOCLinEcore.g:11626:1: rule__OperationCS__Group_9__1__Impl : ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) ;
     public final void rule__OperationCS__Group_9__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11628:1: ( ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) )
-            // InternalOCLinEcore.g:11629:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
+            // InternalOCLinEcore.g:11630:1: ( ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) ) )
+            // InternalOCLinEcore.g:11631:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
             {
-            // InternalOCLinEcore.g:11629:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
-            // InternalOCLinEcore.g:11630:1: ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* )
+            // InternalOCLinEcore.g:11631:1: ( ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* ) )
+            // InternalOCLinEcore.g:11632:1: ( ( rule__OperationCS__Group_9_1__0 ) ) ( ( rule__OperationCS__Group_9_1__0 )* )
             {
-            // InternalOCLinEcore.g:11630:1: ( ( rule__OperationCS__Group_9_1__0 ) )
-            // InternalOCLinEcore.g:11631:1: ( rule__OperationCS__Group_9_1__0 )
+            // InternalOCLinEcore.g:11632:1: ( ( rule__OperationCS__Group_9_1__0 ) )
+            // InternalOCLinEcore.g:11633:1: ( rule__OperationCS__Group_9_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_9_1());
             }
-            // InternalOCLinEcore.g:11632:1: ( rule__OperationCS__Group_9_1__0 )
-            // InternalOCLinEcore.g:11632:2: rule__OperationCS__Group_9_1__0
+            // InternalOCLinEcore.g:11634:1: ( rule__OperationCS__Group_9_1__0 )
+            // InternalOCLinEcore.g:11634:2: rule__OperationCS__Group_9_1__0
             {
             pushFollow(FollowSets000.FOLLOW_58);
             rule__OperationCS__Group_9_1__0();
@@ -36972,13 +36972,13 @@
 
             }
 
-            // InternalOCLinEcore.g:11635:1: ( ( rule__OperationCS__Group_9_1__0 )* )
-            // InternalOCLinEcore.g:11636:1: ( rule__OperationCS__Group_9_1__0 )*
+            // InternalOCLinEcore.g:11637:1: ( ( rule__OperationCS__Group_9_1__0 )* )
+            // InternalOCLinEcore.g:11638:1: ( rule__OperationCS__Group_9_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getGroup_9_1());
             }
-            // InternalOCLinEcore.g:11637:1: ( rule__OperationCS__Group_9_1__0 )*
+            // InternalOCLinEcore.g:11639:1: ( rule__OperationCS__Group_9_1__0 )*
             loop137:
             do {
                 int alt137=2;
@@ -36991,7 +36991,7 @@
 
                 switch (alt137) {
             	case 1 :
-            	    // InternalOCLinEcore.g:11637:2: rule__OperationCS__Group_9_1__0
+            	    // InternalOCLinEcore.g:11639:2: rule__OperationCS__Group_9_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_58);
             	    rule__OperationCS__Group_9_1__0();
@@ -37035,14 +37035,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9__2"
-    // InternalOCLinEcore.g:11648:1: rule__OperationCS__Group_9__2 : rule__OperationCS__Group_9__2__Impl ;
+    // InternalOCLinEcore.g:11650:1: rule__OperationCS__Group_9__2 : rule__OperationCS__Group_9__2__Impl ;
     public final void rule__OperationCS__Group_9__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11652:1: ( rule__OperationCS__Group_9__2__Impl )
-            // InternalOCLinEcore.g:11653:2: rule__OperationCS__Group_9__2__Impl
+            // InternalOCLinEcore.g:11654:1: ( rule__OperationCS__Group_9__2__Impl )
+            // InternalOCLinEcore.g:11655:2: rule__OperationCS__Group_9__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_9__2__Impl();
@@ -37068,17 +37068,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9__2__Impl"
-    // InternalOCLinEcore.g:11659:1: rule__OperationCS__Group_9__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:11661:1: rule__OperationCS__Group_9__2__Impl : ( '}' ) ;
     public final void rule__OperationCS__Group_9__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11663:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:11664:1: ( '}' )
+            // InternalOCLinEcore.g:11665:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:11666:1: ( '}' )
             {
-            // InternalOCLinEcore.g:11664:1: ( '}' )
-            // InternalOCLinEcore.g:11665:1: '}'
+            // InternalOCLinEcore.g:11666:1: ( '}' )
+            // InternalOCLinEcore.g:11667:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());
@@ -37109,14 +37109,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9_1__0"
-    // InternalOCLinEcore.g:11684:1: rule__OperationCS__Group_9_1__0 : rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 ;
+    // InternalOCLinEcore.g:11686:1: rule__OperationCS__Group_9_1__0 : rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 ;
     public final void rule__OperationCS__Group_9_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11688:1: ( rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 )
-            // InternalOCLinEcore.g:11689:2: rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1
+            // InternalOCLinEcore.g:11690:1: ( rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1 )
+            // InternalOCLinEcore.g:11691:2: rule__OperationCS__Group_9_1__0__Impl rule__OperationCS__Group_9_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__OperationCS__Group_9_1__0__Impl();
@@ -37147,23 +37147,23 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9_1__0__Impl"
-    // InternalOCLinEcore.g:11696:1: rule__OperationCS__Group_9_1__0__Impl : ( ( rule__OperationCS__Alternatives_9_1_0 ) ) ;
+    // InternalOCLinEcore.g:11698:1: rule__OperationCS__Group_9_1__0__Impl : ( ( rule__OperationCS__Alternatives_9_1_0 ) ) ;
     public final void rule__OperationCS__Group_9_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11700:1: ( ( ( rule__OperationCS__Alternatives_9_1_0 ) ) )
-            // InternalOCLinEcore.g:11701:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
+            // InternalOCLinEcore.g:11702:1: ( ( ( rule__OperationCS__Alternatives_9_1_0 ) ) )
+            // InternalOCLinEcore.g:11703:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
             {
-            // InternalOCLinEcore.g:11701:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
-            // InternalOCLinEcore.g:11702:1: ( rule__OperationCS__Alternatives_9_1_0 )
+            // InternalOCLinEcore.g:11703:1: ( ( rule__OperationCS__Alternatives_9_1_0 ) )
+            // InternalOCLinEcore.g:11704:1: ( rule__OperationCS__Alternatives_9_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getAlternatives_9_1_0());
             }
-            // InternalOCLinEcore.g:11703:1: ( rule__OperationCS__Alternatives_9_1_0 )
-            // InternalOCLinEcore.g:11703:2: rule__OperationCS__Alternatives_9_1_0
+            // InternalOCLinEcore.g:11705:1: ( rule__OperationCS__Alternatives_9_1_0 )
+            // InternalOCLinEcore.g:11705:2: rule__OperationCS__Alternatives_9_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Alternatives_9_1_0();
@@ -37198,14 +37198,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9_1__1"
-    // InternalOCLinEcore.g:11713:1: rule__OperationCS__Group_9_1__1 : rule__OperationCS__Group_9_1__1__Impl ;
+    // InternalOCLinEcore.g:11715:1: rule__OperationCS__Group_9_1__1 : rule__OperationCS__Group_9_1__1__Impl ;
     public final void rule__OperationCS__Group_9_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11717:1: ( rule__OperationCS__Group_9_1__1__Impl )
-            // InternalOCLinEcore.g:11718:2: rule__OperationCS__Group_9_1__1__Impl
+            // InternalOCLinEcore.g:11719:1: ( rule__OperationCS__Group_9_1__1__Impl )
+            // InternalOCLinEcore.g:11720:2: rule__OperationCS__Group_9_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_9_1__1__Impl();
@@ -37231,22 +37231,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_9_1__1__Impl"
-    // InternalOCLinEcore.g:11724:1: rule__OperationCS__Group_9_1__1__Impl : ( ( ',' )? ) ;
+    // InternalOCLinEcore.g:11726:1: rule__OperationCS__Group_9_1__1__Impl : ( ( ',' )? ) ;
     public final void rule__OperationCS__Group_9_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11728:1: ( ( ( ',' )? ) )
-            // InternalOCLinEcore.g:11729:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:11730:1: ( ( ( ',' )? ) )
+            // InternalOCLinEcore.g:11731:1: ( ( ',' )? )
             {
-            // InternalOCLinEcore.g:11729:1: ( ( ',' )? )
-            // InternalOCLinEcore.g:11730:1: ( ',' )?
+            // InternalOCLinEcore.g:11731:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:11732:1: ( ',' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());
             }
-            // InternalOCLinEcore.g:11731:1: ( ',' )?
+            // InternalOCLinEcore.g:11733:1: ( ',' )?
             int alt138=2;
             int LA138_0 = input.LA(1);
 
@@ -37255,7 +37255,7 @@
             }
             switch (alt138) {
                 case 1 :
-                    // InternalOCLinEcore.g:11732:2: ','
+                    // InternalOCLinEcore.g:11734:2: ','
                     {
                     match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
 
@@ -37289,14 +37289,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0__0"
-    // InternalOCLinEcore.g:11747:1: rule__OperationCS__Group_10_0__0 : rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 ;
+    // InternalOCLinEcore.g:11749:1: rule__OperationCS__Group_10_0__0 : rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 ;
     public final void rule__OperationCS__Group_10_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11751:1: ( rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 )
-            // InternalOCLinEcore.g:11752:2: rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1
+            // InternalOCLinEcore.g:11753:1: ( rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1 )
+            // InternalOCLinEcore.g:11754:2: rule__OperationCS__Group_10_0__0__Impl rule__OperationCS__Group_10_0__1
             {
             pushFollow(FollowSets000.FOLLOW_59);
             rule__OperationCS__Group_10_0__0__Impl();
@@ -37327,17 +37327,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0__0__Impl"
-    // InternalOCLinEcore.g:11759:1: rule__OperationCS__Group_10_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:11761:1: rule__OperationCS__Group_10_0__0__Impl : ( '{' ) ;
     public final void rule__OperationCS__Group_10_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11763:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:11764:1: ( '{' )
+            // InternalOCLinEcore.g:11765:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:11766:1: ( '{' )
             {
-            // InternalOCLinEcore.g:11764:1: ( '{' )
-            // InternalOCLinEcore.g:11765:1: '{'
+            // InternalOCLinEcore.g:11766:1: ( '{' )
+            // InternalOCLinEcore.g:11767:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());
@@ -37368,14 +37368,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0__1"
-    // InternalOCLinEcore.g:11778:1: rule__OperationCS__Group_10_0__1 : rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 ;
+    // InternalOCLinEcore.g:11780:1: rule__OperationCS__Group_10_0__1 : rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 ;
     public final void rule__OperationCS__Group_10_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11782:1: ( rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 )
-            // InternalOCLinEcore.g:11783:2: rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2
+            // InternalOCLinEcore.g:11784:1: ( rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2 )
+            // InternalOCLinEcore.g:11785:2: rule__OperationCS__Group_10_0__1__Impl rule__OperationCS__Group_10_0__2
             {
             pushFollow(FollowSets000.FOLLOW_59);
             rule__OperationCS__Group_10_0__1__Impl();
@@ -37406,22 +37406,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0__1__Impl"
-    // InternalOCLinEcore.g:11790:1: rule__OperationCS__Group_10_0__1__Impl : ( ( rule__OperationCS__Alternatives_10_0_1 )* ) ;
+    // InternalOCLinEcore.g:11792:1: rule__OperationCS__Group_10_0__1__Impl : ( ( rule__OperationCS__Alternatives_10_0_1 )* ) ;
     public final void rule__OperationCS__Group_10_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11794:1: ( ( ( rule__OperationCS__Alternatives_10_0_1 )* ) )
-            // InternalOCLinEcore.g:11795:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
+            // InternalOCLinEcore.g:11796:1: ( ( ( rule__OperationCS__Alternatives_10_0_1 )* ) )
+            // InternalOCLinEcore.g:11797:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
             {
-            // InternalOCLinEcore.g:11795:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
-            // InternalOCLinEcore.g:11796:1: ( rule__OperationCS__Alternatives_10_0_1 )*
+            // InternalOCLinEcore.g:11797:1: ( ( rule__OperationCS__Alternatives_10_0_1 )* )
+            // InternalOCLinEcore.g:11798:1: ( rule__OperationCS__Alternatives_10_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getAlternatives_10_0_1());
             }
-            // InternalOCLinEcore.g:11797:1: ( rule__OperationCS__Alternatives_10_0_1 )*
+            // InternalOCLinEcore.g:11799:1: ( rule__OperationCS__Alternatives_10_0_1 )*
             loop139:
             do {
                 int alt139=2;
@@ -37434,7 +37434,7 @@
 
                 switch (alt139) {
             	case 1 :
-            	    // InternalOCLinEcore.g:11797:2: rule__OperationCS__Alternatives_10_0_1
+            	    // InternalOCLinEcore.g:11799:2: rule__OperationCS__Alternatives_10_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_60);
             	    rule__OperationCS__Alternatives_10_0_1();
@@ -37475,14 +37475,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0__2"
-    // InternalOCLinEcore.g:11807:1: rule__OperationCS__Group_10_0__2 : rule__OperationCS__Group_10_0__2__Impl ;
+    // InternalOCLinEcore.g:11809:1: rule__OperationCS__Group_10_0__2 : rule__OperationCS__Group_10_0__2__Impl ;
     public final void rule__OperationCS__Group_10_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11811:1: ( rule__OperationCS__Group_10_0__2__Impl )
-            // InternalOCLinEcore.g:11812:2: rule__OperationCS__Group_10_0__2__Impl
+            // InternalOCLinEcore.g:11813:1: ( rule__OperationCS__Group_10_0__2__Impl )
+            // InternalOCLinEcore.g:11814:2: rule__OperationCS__Group_10_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_10_0__2__Impl();
@@ -37508,17 +37508,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0__2__Impl"
-    // InternalOCLinEcore.g:11818:1: rule__OperationCS__Group_10_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:11820:1: rule__OperationCS__Group_10_0__2__Impl : ( '}' ) ;
     public final void rule__OperationCS__Group_10_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11822:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:11823:1: ( '}' )
+            // InternalOCLinEcore.g:11824:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:11825:1: ( '}' )
             {
-            // InternalOCLinEcore.g:11823:1: ( '}' )
-            // InternalOCLinEcore.g:11824:1: '}'
+            // InternalOCLinEcore.g:11825:1: ( '}' )
+            // InternalOCLinEcore.g:11826:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());
@@ -37549,14 +37549,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__0"
-    // InternalOCLinEcore.g:11843:1: rule__OperationCS__Group_10_0_1_2__0 : rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 ;
+    // InternalOCLinEcore.g:11845:1: rule__OperationCS__Group_10_0_1_2__0 : rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 ;
     public final void rule__OperationCS__Group_10_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11847:1: ( rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 )
-            // InternalOCLinEcore.g:11848:2: rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1
+            // InternalOCLinEcore.g:11849:1: ( rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1 )
+            // InternalOCLinEcore.g:11850:2: rule__OperationCS__Group_10_0_1_2__0__Impl rule__OperationCS__Group_10_0_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__OperationCS__Group_10_0_1_2__0__Impl();
@@ -37587,17 +37587,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__0__Impl"
-    // InternalOCLinEcore.g:11855:1: rule__OperationCS__Group_10_0_1_2__0__Impl : ( 'body' ) ;
+    // InternalOCLinEcore.g:11857:1: rule__OperationCS__Group_10_0_1_2__0__Impl : ( 'body' ) ;
     public final void rule__OperationCS__Group_10_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11859:1: ( ( 'body' ) )
-            // InternalOCLinEcore.g:11860:1: ( 'body' )
+            // InternalOCLinEcore.g:11861:1: ( ( 'body' ) )
+            // InternalOCLinEcore.g:11862:1: ( 'body' )
             {
-            // InternalOCLinEcore.g:11860:1: ( 'body' )
-            // InternalOCLinEcore.g:11861:1: 'body'
+            // InternalOCLinEcore.g:11862:1: ( 'body' )
+            // InternalOCLinEcore.g:11863:1: 'body'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getBodyKeyword_10_0_1_2_0());
@@ -37628,14 +37628,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__1"
-    // InternalOCLinEcore.g:11874:1: rule__OperationCS__Group_10_0_1_2__1 : rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 ;
+    // InternalOCLinEcore.g:11876:1: rule__OperationCS__Group_10_0_1_2__1 : rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 ;
     public final void rule__OperationCS__Group_10_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11878:1: ( rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 )
-            // InternalOCLinEcore.g:11879:2: rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2
+            // InternalOCLinEcore.g:11880:1: ( rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2 )
+            // InternalOCLinEcore.g:11881:2: rule__OperationCS__Group_10_0_1_2__1__Impl rule__OperationCS__Group_10_0_1_2__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__OperationCS__Group_10_0_1_2__1__Impl();
@@ -37666,22 +37666,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__1__Impl"
-    // InternalOCLinEcore.g:11886:1: rule__OperationCS__Group_10_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalOCLinEcore.g:11888:1: rule__OperationCS__Group_10_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__OperationCS__Group_10_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11890:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalOCLinEcore.g:11891:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:11892:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalOCLinEcore.g:11893:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalOCLinEcore.g:11891:1: ( ( ruleUnrestrictedName )? )
-            // InternalOCLinEcore.g:11892:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:11893:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:11894:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_2_1());
             }
-            // InternalOCLinEcore.g:11893:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:11895:1: ( ruleUnrestrictedName )?
             int alt140=2;
             int LA140_0 = input.LA(1);
 
@@ -37690,7 +37690,7 @@
             }
             switch (alt140) {
                 case 1 :
-                    // InternalOCLinEcore.g:11893:3: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:11895:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -37728,14 +37728,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__2"
-    // InternalOCLinEcore.g:11903:1: rule__OperationCS__Group_10_0_1_2__2 : rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 ;
+    // InternalOCLinEcore.g:11905:1: rule__OperationCS__Group_10_0_1_2__2 : rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 ;
     public final void rule__OperationCS__Group_10_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11907:1: ( rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 )
-            // InternalOCLinEcore.g:11908:2: rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3
+            // InternalOCLinEcore.g:11909:1: ( rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3 )
+            // InternalOCLinEcore.g:11910:2: rule__OperationCS__Group_10_0_1_2__2__Impl rule__OperationCS__Group_10_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__OperationCS__Group_10_0_1_2__2__Impl();
@@ -37766,17 +37766,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__2__Impl"
-    // InternalOCLinEcore.g:11915:1: rule__OperationCS__Group_10_0_1_2__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:11917:1: rule__OperationCS__Group_10_0_1_2__2__Impl : ( ':' ) ;
     public final void rule__OperationCS__Group_10_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11919:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:11920:1: ( ':' )
+            // InternalOCLinEcore.g:11921:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:11922:1: ( ':' )
             {
-            // InternalOCLinEcore.g:11920:1: ( ':' )
-            // InternalOCLinEcore.g:11921:1: ':'
+            // InternalOCLinEcore.g:11922:1: ( ':' )
+            // InternalOCLinEcore.g:11923:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2_2());
@@ -37807,14 +37807,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__3"
-    // InternalOCLinEcore.g:11934:1: rule__OperationCS__Group_10_0_1_2__3 : rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 ;
+    // InternalOCLinEcore.g:11936:1: rule__OperationCS__Group_10_0_1_2__3 : rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 ;
     public final void rule__OperationCS__Group_10_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11938:1: ( rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 )
-            // InternalOCLinEcore.g:11939:2: rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4
+            // InternalOCLinEcore.g:11940:1: ( rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4 )
+            // InternalOCLinEcore.g:11941:2: rule__OperationCS__Group_10_0_1_2__3__Impl rule__OperationCS__Group_10_0_1_2__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__OperationCS__Group_10_0_1_2__3__Impl();
@@ -37845,22 +37845,22 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__3__Impl"
-    // InternalOCLinEcore.g:11946:1: rule__OperationCS__Group_10_0_1_2__3__Impl : ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) ;
+    // InternalOCLinEcore.g:11948:1: rule__OperationCS__Group_10_0_1_2__3__Impl : ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) ;
     public final void rule__OperationCS__Group_10_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11950:1: ( ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) )
-            // InternalOCLinEcore.g:11951:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
+            // InternalOCLinEcore.g:11952:1: ( ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? ) )
+            // InternalOCLinEcore.g:11953:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
             {
-            // InternalOCLinEcore.g:11951:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
-            // InternalOCLinEcore.g:11952:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
+            // InternalOCLinEcore.g:11953:1: ( ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )? )
+            // InternalOCLinEcore.g:11954:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsAssignment_10_0_1_2_3());
             }
-            // InternalOCLinEcore.g:11953:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
+            // InternalOCLinEcore.g:11955:1: ( rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 )?
             int alt141=2;
             int LA141_0 = input.LA(1);
 
@@ -37869,7 +37869,7 @@
             }
             switch (alt141) {
                 case 1 :
-                    // InternalOCLinEcore.g:11953:2: rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3
+                    // InternalOCLinEcore.g:11955:2: rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3();
@@ -37907,14 +37907,14 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__4"
-    // InternalOCLinEcore.g:11963:1: rule__OperationCS__Group_10_0_1_2__4 : rule__OperationCS__Group_10_0_1_2__4__Impl ;
+    // InternalOCLinEcore.g:11965:1: rule__OperationCS__Group_10_0_1_2__4 : rule__OperationCS__Group_10_0_1_2__4__Impl ;
     public final void rule__OperationCS__Group_10_0_1_2__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11967:1: ( rule__OperationCS__Group_10_0_1_2__4__Impl )
-            // InternalOCLinEcore.g:11968:2: rule__OperationCS__Group_10_0_1_2__4__Impl
+            // InternalOCLinEcore.g:11969:1: ( rule__OperationCS__Group_10_0_1_2__4__Impl )
+            // InternalOCLinEcore.g:11970:2: rule__OperationCS__Group_10_0_1_2__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__OperationCS__Group_10_0_1_2__4__Impl();
@@ -37940,17 +37940,17 @@
 
 
     // $ANTLR start "rule__OperationCS__Group_10_0_1_2__4__Impl"
-    // InternalOCLinEcore.g:11974:1: rule__OperationCS__Group_10_0_1_2__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:11976:1: rule__OperationCS__Group_10_0_1_2__4__Impl : ( ';' ) ;
     public final void rule__OperationCS__Group_10_0_1_2__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:11978:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:11979:1: ( ';' )
+            // InternalOCLinEcore.g:11980:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:11981:1: ( ';' )
             {
-            // InternalOCLinEcore.g:11979:1: ( ';' )
-            // InternalOCLinEcore.g:11980:1: ';'
+            // InternalOCLinEcore.g:11981:1: ( ';' )
+            // InternalOCLinEcore.g:11982:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_0_1_2_4());
@@ -37981,14 +37981,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__0"
-    // InternalOCLinEcore.g:12003:1: rule__PackageCS__Group__0 : rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 ;
+    // InternalOCLinEcore.g:12005:1: rule__PackageCS__Group__0 : rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 ;
     public final void rule__PackageCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12007:1: ( rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 )
-            // InternalOCLinEcore.g:12008:2: rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1
+            // InternalOCLinEcore.g:12009:1: ( rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 )
+            // InternalOCLinEcore.g:12010:2: rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PackageCS__Group__0__Impl();
@@ -38019,17 +38019,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__0__Impl"
-    // InternalOCLinEcore.g:12015:1: rule__PackageCS__Group__0__Impl : ( 'package' ) ;
+    // InternalOCLinEcore.g:12017:1: rule__PackageCS__Group__0__Impl : ( 'package' ) ;
     public final void rule__PackageCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12019:1: ( ( 'package' ) )
-            // InternalOCLinEcore.g:12020:1: ( 'package' )
+            // InternalOCLinEcore.g:12021:1: ( ( 'package' ) )
+            // InternalOCLinEcore.g:12022:1: ( 'package' )
             {
-            // InternalOCLinEcore.g:12020:1: ( 'package' )
-            // InternalOCLinEcore.g:12021:1: 'package'
+            // InternalOCLinEcore.g:12022:1: ( 'package' )
+            // InternalOCLinEcore.g:12023:1: 'package'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getPackageKeyword_0());
@@ -38060,14 +38060,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__1"
-    // InternalOCLinEcore.g:12034:1: rule__PackageCS__Group__1 : rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 ;
+    // InternalOCLinEcore.g:12036:1: rule__PackageCS__Group__1 : rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 ;
     public final void rule__PackageCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12038:1: ( rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 )
-            // InternalOCLinEcore.g:12039:2: rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2
+            // InternalOCLinEcore.g:12040:1: ( rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 )
+            // InternalOCLinEcore.g:12041:2: rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__PackageCS__Group__1__Impl();
@@ -38098,23 +38098,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__1__Impl"
-    // InternalOCLinEcore.g:12046:1: rule__PackageCS__Group__1__Impl : ( ( rule__PackageCS__NameAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:12048:1: rule__PackageCS__Group__1__Impl : ( ( rule__PackageCS__NameAssignment_1 ) ) ;
     public final void rule__PackageCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12050:1: ( ( ( rule__PackageCS__NameAssignment_1 ) ) )
-            // InternalOCLinEcore.g:12051:1: ( ( rule__PackageCS__NameAssignment_1 ) )
+            // InternalOCLinEcore.g:12052:1: ( ( ( rule__PackageCS__NameAssignment_1 ) ) )
+            // InternalOCLinEcore.g:12053:1: ( ( rule__PackageCS__NameAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:12051:1: ( ( rule__PackageCS__NameAssignment_1 ) )
-            // InternalOCLinEcore.g:12052:1: ( rule__PackageCS__NameAssignment_1 )
+            // InternalOCLinEcore.g:12053:1: ( ( rule__PackageCS__NameAssignment_1 ) )
+            // InternalOCLinEcore.g:12054:1: ( rule__PackageCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNameAssignment_1());
             }
-            // InternalOCLinEcore.g:12053:1: ( rule__PackageCS__NameAssignment_1 )
-            // InternalOCLinEcore.g:12053:2: rule__PackageCS__NameAssignment_1
+            // InternalOCLinEcore.g:12055:1: ( rule__PackageCS__NameAssignment_1 )
+            // InternalOCLinEcore.g:12055:2: rule__PackageCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__NameAssignment_1();
@@ -38149,14 +38149,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__2"
-    // InternalOCLinEcore.g:12063:1: rule__PackageCS__Group__2 : rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 ;
+    // InternalOCLinEcore.g:12065:1: rule__PackageCS__Group__2 : rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 ;
     public final void rule__PackageCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12067:1: ( rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 )
-            // InternalOCLinEcore.g:12068:2: rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3
+            // InternalOCLinEcore.g:12069:1: ( rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 )
+            // InternalOCLinEcore.g:12070:2: rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__PackageCS__Group__2__Impl();
@@ -38187,22 +38187,22 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__2__Impl"
-    // InternalOCLinEcore.g:12075:1: rule__PackageCS__Group__2__Impl : ( ( rule__PackageCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:12077:1: rule__PackageCS__Group__2__Impl : ( ( rule__PackageCS__Group_2__0 )? ) ;
     public final void rule__PackageCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12079:1: ( ( ( rule__PackageCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:12080:1: ( ( rule__PackageCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:12081:1: ( ( ( rule__PackageCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:12082:1: ( ( rule__PackageCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:12080:1: ( ( rule__PackageCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:12081:1: ( rule__PackageCS__Group_2__0 )?
+            // InternalOCLinEcore.g:12082:1: ( ( rule__PackageCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:12083:1: ( rule__PackageCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:12082:1: ( rule__PackageCS__Group_2__0 )?
+            // InternalOCLinEcore.g:12084:1: ( rule__PackageCS__Group_2__0 )?
             int alt142=2;
             int LA142_0 = input.LA(1);
 
@@ -38211,7 +38211,7 @@
             }
             switch (alt142) {
                 case 1 :
-                    // InternalOCLinEcore.g:12082:2: rule__PackageCS__Group_2__0
+                    // InternalOCLinEcore.g:12084:2: rule__PackageCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__Group_2__0();
@@ -38249,14 +38249,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__3"
-    // InternalOCLinEcore.g:12092:1: rule__PackageCS__Group__3 : rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 ;
+    // InternalOCLinEcore.g:12094:1: rule__PackageCS__Group__3 : rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 ;
     public final void rule__PackageCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12096:1: ( rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 )
-            // InternalOCLinEcore.g:12097:2: rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4
+            // InternalOCLinEcore.g:12098:1: ( rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 )
+            // InternalOCLinEcore.g:12099:2: rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__PackageCS__Group__3__Impl();
@@ -38287,22 +38287,22 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__3__Impl"
-    // InternalOCLinEcore.g:12104:1: rule__PackageCS__Group__3__Impl : ( ( rule__PackageCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:12106:1: rule__PackageCS__Group__3__Impl : ( ( rule__PackageCS__Group_3__0 )? ) ;
     public final void rule__PackageCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12108:1: ( ( ( rule__PackageCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:12109:1: ( ( rule__PackageCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:12110:1: ( ( ( rule__PackageCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:12111:1: ( ( rule__PackageCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:12109:1: ( ( rule__PackageCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:12110:1: ( rule__PackageCS__Group_3__0 )?
+            // InternalOCLinEcore.g:12111:1: ( ( rule__PackageCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:12112:1: ( rule__PackageCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:12111:1: ( rule__PackageCS__Group_3__0 )?
+            // InternalOCLinEcore.g:12113:1: ( rule__PackageCS__Group_3__0 )?
             int alt143=2;
             int LA143_0 = input.LA(1);
 
@@ -38311,7 +38311,7 @@
             }
             switch (alt143) {
                 case 1 :
-                    // InternalOCLinEcore.g:12111:2: rule__PackageCS__Group_3__0
+                    // InternalOCLinEcore.g:12113:2: rule__PackageCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__Group_3__0();
@@ -38349,14 +38349,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__4"
-    // InternalOCLinEcore.g:12121:1: rule__PackageCS__Group__4 : rule__PackageCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:12123:1: rule__PackageCS__Group__4 : rule__PackageCS__Group__4__Impl ;
     public final void rule__PackageCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12125:1: ( rule__PackageCS__Group__4__Impl )
-            // InternalOCLinEcore.g:12126:2: rule__PackageCS__Group__4__Impl
+            // InternalOCLinEcore.g:12127:1: ( rule__PackageCS__Group__4__Impl )
+            // InternalOCLinEcore.g:12128:2: rule__PackageCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Group__4__Impl();
@@ -38382,23 +38382,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__4__Impl"
-    // InternalOCLinEcore.g:12132:1: rule__PackageCS__Group__4__Impl : ( ( rule__PackageCS__Alternatives_4 ) ) ;
+    // InternalOCLinEcore.g:12134:1: rule__PackageCS__Group__4__Impl : ( ( rule__PackageCS__Alternatives_4 ) ) ;
     public final void rule__PackageCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12136:1: ( ( ( rule__PackageCS__Alternatives_4 ) ) )
-            // InternalOCLinEcore.g:12137:1: ( ( rule__PackageCS__Alternatives_4 ) )
+            // InternalOCLinEcore.g:12138:1: ( ( ( rule__PackageCS__Alternatives_4 ) ) )
+            // InternalOCLinEcore.g:12139:1: ( ( rule__PackageCS__Alternatives_4 ) )
             {
-            // InternalOCLinEcore.g:12137:1: ( ( rule__PackageCS__Alternatives_4 ) )
-            // InternalOCLinEcore.g:12138:1: ( rule__PackageCS__Alternatives_4 )
+            // InternalOCLinEcore.g:12139:1: ( ( rule__PackageCS__Alternatives_4 ) )
+            // InternalOCLinEcore.g:12140:1: ( rule__PackageCS__Alternatives_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getAlternatives_4());
             }
-            // InternalOCLinEcore.g:12139:1: ( rule__PackageCS__Alternatives_4 )
-            // InternalOCLinEcore.g:12139:2: rule__PackageCS__Alternatives_4
+            // InternalOCLinEcore.g:12141:1: ( rule__PackageCS__Alternatives_4 )
+            // InternalOCLinEcore.g:12141:2: rule__PackageCS__Alternatives_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Alternatives_4();
@@ -38433,14 +38433,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__0"
-    // InternalOCLinEcore.g:12159:1: rule__PackageCS__Group_2__0 : rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 ;
+    // InternalOCLinEcore.g:12161:1: rule__PackageCS__Group_2__0 : rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 ;
     public final void rule__PackageCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12163:1: ( rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 )
-            // InternalOCLinEcore.g:12164:2: rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1
+            // InternalOCLinEcore.g:12165:1: ( rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 )
+            // InternalOCLinEcore.g:12166:2: rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PackageCS__Group_2__0__Impl();
@@ -38471,17 +38471,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:12171:1: rule__PackageCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:12173:1: rule__PackageCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__PackageCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12175:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:12176:1: ( ':' )
+            // InternalOCLinEcore.g:12177:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:12178:1: ( ':' )
             {
-            // InternalOCLinEcore.g:12176:1: ( ':' )
-            // InternalOCLinEcore.g:12177:1: ':'
+            // InternalOCLinEcore.g:12178:1: ( ':' )
+            // InternalOCLinEcore.g:12179:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getColonKeyword_2_0());
@@ -38512,14 +38512,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__1"
-    // InternalOCLinEcore.g:12190:1: rule__PackageCS__Group_2__1 : rule__PackageCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:12192:1: rule__PackageCS__Group_2__1 : rule__PackageCS__Group_2__1__Impl ;
     public final void rule__PackageCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12194:1: ( rule__PackageCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:12195:2: rule__PackageCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:12196:1: ( rule__PackageCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:12197:2: rule__PackageCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Group_2__1__Impl();
@@ -38545,23 +38545,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:12201:1: rule__PackageCS__Group_2__1__Impl : ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:12203:1: rule__PackageCS__Group_2__1__Impl : ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) ;
     public final void rule__PackageCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12205:1: ( ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:12206:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
+            // InternalOCLinEcore.g:12207:1: ( ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:12208:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:12206:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
-            // InternalOCLinEcore.g:12207:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
+            // InternalOCLinEcore.g:12208:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
+            // InternalOCLinEcore.g:12209:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsPrefixAssignment_2_1());
             }
-            // InternalOCLinEcore.g:12208:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
-            // InternalOCLinEcore.g:12208:2: rule__PackageCS__NsPrefixAssignment_2_1
+            // InternalOCLinEcore.g:12210:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
+            // InternalOCLinEcore.g:12210:2: rule__PackageCS__NsPrefixAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__NsPrefixAssignment_2_1();
@@ -38596,14 +38596,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_3__0"
-    // InternalOCLinEcore.g:12222:1: rule__PackageCS__Group_3__0 : rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 ;
+    // InternalOCLinEcore.g:12224:1: rule__PackageCS__Group_3__0 : rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 ;
     public final void rule__PackageCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12226:1: ( rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 )
-            // InternalOCLinEcore.g:12227:2: rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1
+            // InternalOCLinEcore.g:12228:1: ( rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1 )
+            // InternalOCLinEcore.g:12229:2: rule__PackageCS__Group_3__0__Impl rule__PackageCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__PackageCS__Group_3__0__Impl();
@@ -38634,17 +38634,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:12234:1: rule__PackageCS__Group_3__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:12236:1: rule__PackageCS__Group_3__0__Impl : ( '=' ) ;
     public final void rule__PackageCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12238:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:12239:1: ( '=' )
+            // InternalOCLinEcore.g:12240:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:12241:1: ( '=' )
             {
-            // InternalOCLinEcore.g:12239:1: ( '=' )
-            // InternalOCLinEcore.g:12240:1: '='
+            // InternalOCLinEcore.g:12241:1: ( '=' )
+            // InternalOCLinEcore.g:12242:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getEqualsSignKeyword_3_0());
@@ -38675,14 +38675,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_3__1"
-    // InternalOCLinEcore.g:12253:1: rule__PackageCS__Group_3__1 : rule__PackageCS__Group_3__1__Impl ;
+    // InternalOCLinEcore.g:12255:1: rule__PackageCS__Group_3__1 : rule__PackageCS__Group_3__1__Impl ;
     public final void rule__PackageCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12257:1: ( rule__PackageCS__Group_3__1__Impl )
-            // InternalOCLinEcore.g:12258:2: rule__PackageCS__Group_3__1__Impl
+            // InternalOCLinEcore.g:12259:1: ( rule__PackageCS__Group_3__1__Impl )
+            // InternalOCLinEcore.g:12260:2: rule__PackageCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Group_3__1__Impl();
@@ -38708,23 +38708,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:12264:1: rule__PackageCS__Group_3__1__Impl : ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:12266:1: rule__PackageCS__Group_3__1__Impl : ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) ;
     public final void rule__PackageCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12268:1: ( ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:12269:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
+            // InternalOCLinEcore.g:12270:1: ( ( ( rule__PackageCS__NsURIAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:12271:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:12269:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
-            // InternalOCLinEcore.g:12270:1: ( rule__PackageCS__NsURIAssignment_3_1 )
+            // InternalOCLinEcore.g:12271:1: ( ( rule__PackageCS__NsURIAssignment_3_1 ) )
+            // InternalOCLinEcore.g:12272:1: ( rule__PackageCS__NsURIAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsURIAssignment_3_1());
             }
-            // InternalOCLinEcore.g:12271:1: ( rule__PackageCS__NsURIAssignment_3_1 )
-            // InternalOCLinEcore.g:12271:2: rule__PackageCS__NsURIAssignment_3_1
+            // InternalOCLinEcore.g:12273:1: ( rule__PackageCS__NsURIAssignment_3_1 )
+            // InternalOCLinEcore.g:12273:2: rule__PackageCS__NsURIAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__NsURIAssignment_3_1();
@@ -38759,14 +38759,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_4_0__0"
-    // InternalOCLinEcore.g:12285:1: rule__PackageCS__Group_4_0__0 : rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 ;
+    // InternalOCLinEcore.g:12287:1: rule__PackageCS__Group_4_0__0 : rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 ;
     public final void rule__PackageCS__Group_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12289:1: ( rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 )
-            // InternalOCLinEcore.g:12290:2: rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1
+            // InternalOCLinEcore.g:12291:1: ( rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1 )
+            // InternalOCLinEcore.g:12292:2: rule__PackageCS__Group_4_0__0__Impl rule__PackageCS__Group_4_0__1
             {
             pushFollow(FollowSets000.FOLLOW_61);
             rule__PackageCS__Group_4_0__0__Impl();
@@ -38797,17 +38797,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_4_0__0__Impl"
-    // InternalOCLinEcore.g:12297:1: rule__PackageCS__Group_4_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:12299:1: rule__PackageCS__Group_4_0__0__Impl : ( '{' ) ;
     public final void rule__PackageCS__Group_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12301:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:12302:1: ( '{' )
+            // InternalOCLinEcore.g:12303:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:12304:1: ( '{' )
             {
-            // InternalOCLinEcore.g:12302:1: ( '{' )
-            // InternalOCLinEcore.g:12303:1: '{'
+            // InternalOCLinEcore.g:12304:1: ( '{' )
+            // InternalOCLinEcore.g:12305:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_4_0_0());
@@ -38838,14 +38838,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_4_0__1"
-    // InternalOCLinEcore.g:12316:1: rule__PackageCS__Group_4_0__1 : rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 ;
+    // InternalOCLinEcore.g:12318:1: rule__PackageCS__Group_4_0__1 : rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 ;
     public final void rule__PackageCS__Group_4_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12320:1: ( rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 )
-            // InternalOCLinEcore.g:12321:2: rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2
+            // InternalOCLinEcore.g:12322:1: ( rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2 )
+            // InternalOCLinEcore.g:12323:2: rule__PackageCS__Group_4_0__1__Impl rule__PackageCS__Group_4_0__2
             {
             pushFollow(FollowSets000.FOLLOW_61);
             rule__PackageCS__Group_4_0__1__Impl();
@@ -38876,22 +38876,22 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_4_0__1__Impl"
-    // InternalOCLinEcore.g:12328:1: rule__PackageCS__Group_4_0__1__Impl : ( ( rule__PackageCS__Alternatives_4_0_1 )* ) ;
+    // InternalOCLinEcore.g:12330:1: rule__PackageCS__Group_4_0__1__Impl : ( ( rule__PackageCS__Alternatives_4_0_1 )* ) ;
     public final void rule__PackageCS__Group_4_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12332:1: ( ( ( rule__PackageCS__Alternatives_4_0_1 )* ) )
-            // InternalOCLinEcore.g:12333:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
+            // InternalOCLinEcore.g:12334:1: ( ( ( rule__PackageCS__Alternatives_4_0_1 )* ) )
+            // InternalOCLinEcore.g:12335:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
             {
-            // InternalOCLinEcore.g:12333:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
-            // InternalOCLinEcore.g:12334:1: ( rule__PackageCS__Alternatives_4_0_1 )*
+            // InternalOCLinEcore.g:12335:1: ( ( rule__PackageCS__Alternatives_4_0_1 )* )
+            // InternalOCLinEcore.g:12336:1: ( rule__PackageCS__Alternatives_4_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getAlternatives_4_0_1());
             }
-            // InternalOCLinEcore.g:12335:1: ( rule__PackageCS__Alternatives_4_0_1 )*
+            // InternalOCLinEcore.g:12337:1: ( rule__PackageCS__Alternatives_4_0_1 )*
             loop144:
             do {
                 int alt144=2;
@@ -38904,7 +38904,7 @@
 
                 switch (alt144) {
             	case 1 :
-            	    // InternalOCLinEcore.g:12335:2: rule__PackageCS__Alternatives_4_0_1
+            	    // InternalOCLinEcore.g:12337:2: rule__PackageCS__Alternatives_4_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_62);
             	    rule__PackageCS__Alternatives_4_0_1();
@@ -38945,14 +38945,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_4_0__2"
-    // InternalOCLinEcore.g:12345:1: rule__PackageCS__Group_4_0__2 : rule__PackageCS__Group_4_0__2__Impl ;
+    // InternalOCLinEcore.g:12347:1: rule__PackageCS__Group_4_0__2 : rule__PackageCS__Group_4_0__2__Impl ;
     public final void rule__PackageCS__Group_4_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12349:1: ( rule__PackageCS__Group_4_0__2__Impl )
-            // InternalOCLinEcore.g:12350:2: rule__PackageCS__Group_4_0__2__Impl
+            // InternalOCLinEcore.g:12351:1: ( rule__PackageCS__Group_4_0__2__Impl )
+            // InternalOCLinEcore.g:12352:2: rule__PackageCS__Group_4_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Group_4_0__2__Impl();
@@ -38978,17 +38978,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_4_0__2__Impl"
-    // InternalOCLinEcore.g:12356:1: rule__PackageCS__Group_4_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:12358:1: rule__PackageCS__Group_4_0__2__Impl : ( '}' ) ;
     public final void rule__PackageCS__Group_4_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12360:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:12361:1: ( '}' )
+            // InternalOCLinEcore.g:12362:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:12363:1: ( '}' )
             {
-            // InternalOCLinEcore.g:12361:1: ( '}' )
-            // InternalOCLinEcore.g:12362:1: '}'
+            // InternalOCLinEcore.g:12363:1: ( '}' )
+            // InternalOCLinEcore.g:12364:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_4_0_2());
@@ -39019,14 +39019,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__0"
-    // InternalOCLinEcore.g:12381:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
+    // InternalOCLinEcore.g:12383:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
     public final void rule__ParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12385:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
-            // InternalOCLinEcore.g:12386:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
+            // InternalOCLinEcore.g:12387:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
+            // InternalOCLinEcore.g:12388:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_63);
             rule__ParameterCS__Group__0__Impl();
@@ -39057,23 +39057,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__0__Impl"
-    // InternalOCLinEcore.g:12393:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:12395:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__NameAssignment_0 ) ) ;
     public final void rule__ParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12397:1: ( ( ( rule__ParameterCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:12398:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:12399:1: ( ( ( rule__ParameterCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:12400:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:12398:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:12399:1: ( rule__ParameterCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:12400:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:12401:1: ( rule__ParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:12400:1: ( rule__ParameterCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:12400:2: rule__ParameterCS__NameAssignment_0
+            // InternalOCLinEcore.g:12402:1: ( rule__ParameterCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:12402:2: rule__ParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__NameAssignment_0();
@@ -39108,14 +39108,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__1"
-    // InternalOCLinEcore.g:12410:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 ;
+    // InternalOCLinEcore.g:12412:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 ;
     public final void rule__ParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12414:1: ( rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 )
-            // InternalOCLinEcore.g:12415:2: rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2
+            // InternalOCLinEcore.g:12416:1: ( rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 )
+            // InternalOCLinEcore.g:12417:2: rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_63);
             rule__ParameterCS__Group__1__Impl();
@@ -39146,22 +39146,22 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__1__Impl"
-    // InternalOCLinEcore.g:12422:1: rule__ParameterCS__Group__1__Impl : ( ( rule__ParameterCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:12424:1: rule__ParameterCS__Group__1__Impl : ( ( rule__ParameterCS__Group_1__0 )? ) ;
     public final void rule__ParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12426:1: ( ( ( rule__ParameterCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:12427:1: ( ( rule__ParameterCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:12428:1: ( ( ( rule__ParameterCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:12429:1: ( ( rule__ParameterCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:12427:1: ( ( rule__ParameterCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:12428:1: ( rule__ParameterCS__Group_1__0 )?
+            // InternalOCLinEcore.g:12429:1: ( ( rule__ParameterCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:12430:1: ( rule__ParameterCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:12429:1: ( rule__ParameterCS__Group_1__0 )?
+            // InternalOCLinEcore.g:12431:1: ( rule__ParameterCS__Group_1__0 )?
             int alt145=2;
             int LA145_0 = input.LA(1);
 
@@ -39170,7 +39170,7 @@
             }
             switch (alt145) {
                 case 1 :
-                    // InternalOCLinEcore.g:12429:2: rule__ParameterCS__Group_1__0
+                    // InternalOCLinEcore.g:12431:2: rule__ParameterCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__Group_1__0();
@@ -39208,14 +39208,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__2"
-    // InternalOCLinEcore.g:12439:1: rule__ParameterCS__Group__2 : rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 ;
+    // InternalOCLinEcore.g:12441:1: rule__ParameterCS__Group__2 : rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 ;
     public final void rule__ParameterCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12443:1: ( rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 )
-            // InternalOCLinEcore.g:12444:2: rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3
+            // InternalOCLinEcore.g:12445:1: ( rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3 )
+            // InternalOCLinEcore.g:12446:2: rule__ParameterCS__Group__2__Impl rule__ParameterCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_63);
             rule__ParameterCS__Group__2__Impl();
@@ -39246,22 +39246,22 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__2__Impl"
-    // InternalOCLinEcore.g:12451:1: rule__ParameterCS__Group__2__Impl : ( ( rule__ParameterCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:12453:1: rule__ParameterCS__Group__2__Impl : ( ( rule__ParameterCS__Group_2__0 )? ) ;
     public final void rule__ParameterCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12455:1: ( ( ( rule__ParameterCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:12456:1: ( ( rule__ParameterCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:12457:1: ( ( ( rule__ParameterCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:12458:1: ( ( rule__ParameterCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:12456:1: ( ( rule__ParameterCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:12457:1: ( rule__ParameterCS__Group_2__0 )?
+            // InternalOCLinEcore.g:12458:1: ( ( rule__ParameterCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:12459:1: ( rule__ParameterCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:12458:1: ( rule__ParameterCS__Group_2__0 )?
+            // InternalOCLinEcore.g:12460:1: ( rule__ParameterCS__Group_2__0 )?
             int alt146=2;
             int LA146_0 = input.LA(1);
 
@@ -39274,7 +39274,7 @@
             }
             switch (alt146) {
                 case 1 :
-                    // InternalOCLinEcore.g:12458:2: rule__ParameterCS__Group_2__0
+                    // InternalOCLinEcore.g:12460:2: rule__ParameterCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__Group_2__0();
@@ -39312,14 +39312,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__3"
-    // InternalOCLinEcore.g:12468:1: rule__ParameterCS__Group__3 : rule__ParameterCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:12470:1: rule__ParameterCS__Group__3 : rule__ParameterCS__Group__3__Impl ;
     public final void rule__ParameterCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12472:1: ( rule__ParameterCS__Group__3__Impl )
-            // InternalOCLinEcore.g:12473:2: rule__ParameterCS__Group__3__Impl
+            // InternalOCLinEcore.g:12474:1: ( rule__ParameterCS__Group__3__Impl )
+            // InternalOCLinEcore.g:12475:2: rule__ParameterCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group__3__Impl();
@@ -39345,22 +39345,22 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__3__Impl"
-    // InternalOCLinEcore.g:12479:1: rule__ParameterCS__Group__3__Impl : ( ( rule__ParameterCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:12481:1: rule__ParameterCS__Group__3__Impl : ( ( rule__ParameterCS__Group_3__0 )? ) ;
     public final void rule__ParameterCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12483:1: ( ( ( rule__ParameterCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:12484:1: ( ( rule__ParameterCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:12485:1: ( ( ( rule__ParameterCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:12486:1: ( ( rule__ParameterCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:12484:1: ( ( rule__ParameterCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:12485:1: ( rule__ParameterCS__Group_3__0 )?
+            // InternalOCLinEcore.g:12486:1: ( ( rule__ParameterCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:12487:1: ( rule__ParameterCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:12486:1: ( rule__ParameterCS__Group_3__0 )?
+            // InternalOCLinEcore.g:12488:1: ( rule__ParameterCS__Group_3__0 )?
             int alt147=2;
             int LA147_0 = input.LA(1);
 
@@ -39369,7 +39369,7 @@
             }
             switch (alt147) {
                 case 1 :
-                    // InternalOCLinEcore.g:12486:2: rule__ParameterCS__Group_3__0
+                    // InternalOCLinEcore.g:12488:2: rule__ParameterCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ParameterCS__Group_3__0();
@@ -39407,14 +39407,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_1__0"
-    // InternalOCLinEcore.g:12504:1: rule__ParameterCS__Group_1__0 : rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 ;
+    // InternalOCLinEcore.g:12506:1: rule__ParameterCS__Group_1__0 : rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 ;
     public final void rule__ParameterCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12508:1: ( rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 )
-            // InternalOCLinEcore.g:12509:2: rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1
+            // InternalOCLinEcore.g:12510:1: ( rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1 )
+            // InternalOCLinEcore.g:12511:2: rule__ParameterCS__Group_1__0__Impl rule__ParameterCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__ParameterCS__Group_1__0__Impl();
@@ -39445,17 +39445,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:12516:1: rule__ParameterCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:12518:1: rule__ParameterCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__ParameterCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12520:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:12521:1: ( ':' )
+            // InternalOCLinEcore.g:12522:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:12523:1: ( ':' )
             {
-            // InternalOCLinEcore.g:12521:1: ( ':' )
-            // InternalOCLinEcore.g:12522:1: ':'
+            // InternalOCLinEcore.g:12523:1: ( ':' )
+            // InternalOCLinEcore.g:12524:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getColonKeyword_1_0());
@@ -39486,14 +39486,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_1__1"
-    // InternalOCLinEcore.g:12535:1: rule__ParameterCS__Group_1__1 : rule__ParameterCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:12537:1: rule__ParameterCS__Group_1__1 : rule__ParameterCS__Group_1__1__Impl ;
     public final void rule__ParameterCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12539:1: ( rule__ParameterCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:12540:2: rule__ParameterCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:12541:1: ( rule__ParameterCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:12542:2: rule__ParameterCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group_1__1__Impl();
@@ -39519,23 +39519,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:12546:1: rule__ParameterCS__Group_1__1__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:12548:1: rule__ParameterCS__Group_1__1__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__ParameterCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12550:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:12551:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:12552:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:12553:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:12551:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLinEcore.g:12552:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:12553:1: ( ( rule__ParameterCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:12554:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLinEcore.g:12553:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLinEcore.g:12553:2: rule__ParameterCS__OwnedTypeAssignment_1_1
+            // InternalOCLinEcore.g:12555:1: ( rule__ParameterCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:12555:2: rule__ParameterCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__OwnedTypeAssignment_1_1();
@@ -39570,14 +39570,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2__0"
-    // InternalOCLinEcore.g:12567:1: rule__ParameterCS__Group_2__0 : rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 ;
+    // InternalOCLinEcore.g:12569:1: rule__ParameterCS__Group_2__0 : rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 ;
     public final void rule__ParameterCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12571:1: ( rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 )
-            // InternalOCLinEcore.g:12572:2: rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1
+            // InternalOCLinEcore.g:12573:1: ( rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1 )
+            // InternalOCLinEcore.g:12574:2: rule__ParameterCS__Group_2__0__Impl rule__ParameterCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_64);
             rule__ParameterCS__Group_2__0__Impl();
@@ -39608,17 +39608,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:12579:1: rule__ParameterCS__Group_2__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:12581:1: rule__ParameterCS__Group_2__0__Impl : ( '{' ) ;
     public final void rule__ParameterCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12583:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:12584:1: ( '{' )
+            // InternalOCLinEcore.g:12585:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:12586:1: ( '{' )
             {
-            // InternalOCLinEcore.g:12584:1: ( '{' )
-            // InternalOCLinEcore.g:12585:1: '{'
+            // InternalOCLinEcore.g:12586:1: ( '{' )
+            // InternalOCLinEcore.g:12587:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());
@@ -39649,14 +39649,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2__1"
-    // InternalOCLinEcore.g:12598:1: rule__ParameterCS__Group_2__1 : rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 ;
+    // InternalOCLinEcore.g:12600:1: rule__ParameterCS__Group_2__1 : rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 ;
     public final void rule__ParameterCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12602:1: ( rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 )
-            // InternalOCLinEcore.g:12603:2: rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2
+            // InternalOCLinEcore.g:12604:1: ( rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2 )
+            // InternalOCLinEcore.g:12605:2: rule__ParameterCS__Group_2__1__Impl rule__ParameterCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__ParameterCS__Group_2__1__Impl();
@@ -39687,26 +39687,26 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:12610:1: rule__ParameterCS__Group_2__1__Impl : ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) ;
+    // InternalOCLinEcore.g:12612:1: rule__ParameterCS__Group_2__1__Impl : ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) ;
     public final void rule__ParameterCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12614:1: ( ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) )
-            // InternalOCLinEcore.g:12615:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
+            // InternalOCLinEcore.g:12616:1: ( ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) ) )
+            // InternalOCLinEcore.g:12617:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
             {
-            // InternalOCLinEcore.g:12615:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
-            // InternalOCLinEcore.g:12616:1: ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:12617:1: ( ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* ) )
+            // InternalOCLinEcore.g:12618:1: ( ( rule__ParameterCS__Group_2_1__0 ) ) ( ( rule__ParameterCS__Group_2_1__0 )* )
             {
-            // InternalOCLinEcore.g:12616:1: ( ( rule__ParameterCS__Group_2_1__0 ) )
-            // InternalOCLinEcore.g:12617:1: ( rule__ParameterCS__Group_2_1__0 )
+            // InternalOCLinEcore.g:12618:1: ( ( rule__ParameterCS__Group_2_1__0 ) )
+            // InternalOCLinEcore.g:12619:1: ( rule__ParameterCS__Group_2_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:12618:1: ( rule__ParameterCS__Group_2_1__0 )
-            // InternalOCLinEcore.g:12618:2: rule__ParameterCS__Group_2_1__0
+            // InternalOCLinEcore.g:12620:1: ( rule__ParameterCS__Group_2_1__0 )
+            // InternalOCLinEcore.g:12620:2: rule__ParameterCS__Group_2_1__0
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__ParameterCS__Group_2_1__0();
@@ -39722,13 +39722,13 @@
 
             }
 
-            // InternalOCLinEcore.g:12621:1: ( ( rule__ParameterCS__Group_2_1__0 )* )
-            // InternalOCLinEcore.g:12622:1: ( rule__ParameterCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:12623:1: ( ( rule__ParameterCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:12624:1: ( rule__ParameterCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:12623:1: ( rule__ParameterCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:12625:1: ( rule__ParameterCS__Group_2_1__0 )*
             loop148:
             do {
                 int alt148=2;
@@ -39741,7 +39741,7 @@
 
                 switch (alt148) {
             	case 1 :
-            	    // InternalOCLinEcore.g:12623:2: rule__ParameterCS__Group_2_1__0
+            	    // InternalOCLinEcore.g:12625:2: rule__ParameterCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_65);
             	    rule__ParameterCS__Group_2_1__0();
@@ -39785,14 +39785,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2__2"
-    // InternalOCLinEcore.g:12634:1: rule__ParameterCS__Group_2__2 : rule__ParameterCS__Group_2__2__Impl ;
+    // InternalOCLinEcore.g:12636:1: rule__ParameterCS__Group_2__2 : rule__ParameterCS__Group_2__2__Impl ;
     public final void rule__ParameterCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12638:1: ( rule__ParameterCS__Group_2__2__Impl )
-            // InternalOCLinEcore.g:12639:2: rule__ParameterCS__Group_2__2__Impl
+            // InternalOCLinEcore.g:12640:1: ( rule__ParameterCS__Group_2__2__Impl )
+            // InternalOCLinEcore.g:12641:2: rule__ParameterCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group_2__2__Impl();
@@ -39818,17 +39818,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2__2__Impl"
-    // InternalOCLinEcore.g:12645:1: rule__ParameterCS__Group_2__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:12647:1: rule__ParameterCS__Group_2__2__Impl : ( '}' ) ;
     public final void rule__ParameterCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12649:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:12650:1: ( '}' )
+            // InternalOCLinEcore.g:12651:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:12652:1: ( '}' )
             {
-            // InternalOCLinEcore.g:12650:1: ( '}' )
-            // InternalOCLinEcore.g:12651:1: '}'
+            // InternalOCLinEcore.g:12652:1: ( '}' )
+            // InternalOCLinEcore.g:12653:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());
@@ -39859,14 +39859,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2_1__0"
-    // InternalOCLinEcore.g:12670:1: rule__ParameterCS__Group_2_1__0 : rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:12672:1: rule__ParameterCS__Group_2_1__0 : rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 ;
     public final void rule__ParameterCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12674:1: ( rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:12675:2: rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1
+            // InternalOCLinEcore.g:12676:1: ( rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:12677:2: rule__ParameterCS__Group_2_1__0__Impl rule__ParameterCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__ParameterCS__Group_2_1__0__Impl();
@@ -39897,23 +39897,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:12682:1: rule__ParameterCS__Group_2_1__0__Impl : ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) ;
+    // InternalOCLinEcore.g:12684:1: rule__ParameterCS__Group_2_1__0__Impl : ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) ;
     public final void rule__ParameterCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12686:1: ( ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) )
-            // InternalOCLinEcore.g:12687:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
+            // InternalOCLinEcore.g:12688:1: ( ( ( rule__ParameterCS__Alternatives_2_1_0 ) ) )
+            // InternalOCLinEcore.g:12689:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
             {
-            // InternalOCLinEcore.g:12687:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
-            // InternalOCLinEcore.g:12688:1: ( rule__ParameterCS__Alternatives_2_1_0 )
+            // InternalOCLinEcore.g:12689:1: ( ( rule__ParameterCS__Alternatives_2_1_0 ) )
+            // InternalOCLinEcore.g:12690:1: ( rule__ParameterCS__Alternatives_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getAlternatives_2_1_0());
             }
-            // InternalOCLinEcore.g:12689:1: ( rule__ParameterCS__Alternatives_2_1_0 )
-            // InternalOCLinEcore.g:12689:2: rule__ParameterCS__Alternatives_2_1_0
+            // InternalOCLinEcore.g:12691:1: ( rule__ParameterCS__Alternatives_2_1_0 )
+            // InternalOCLinEcore.g:12691:2: rule__ParameterCS__Alternatives_2_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Alternatives_2_1_0();
@@ -39948,14 +39948,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2_1__1"
-    // InternalOCLinEcore.g:12699:1: rule__ParameterCS__Group_2_1__1 : rule__ParameterCS__Group_2_1__1__Impl ;
+    // InternalOCLinEcore.g:12701:1: rule__ParameterCS__Group_2_1__1 : rule__ParameterCS__Group_2_1__1__Impl ;
     public final void rule__ParameterCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12703:1: ( rule__ParameterCS__Group_2_1__1__Impl )
-            // InternalOCLinEcore.g:12704:2: rule__ParameterCS__Group_2_1__1__Impl
+            // InternalOCLinEcore.g:12705:1: ( rule__ParameterCS__Group_2_1__1__Impl )
+            // InternalOCLinEcore.g:12706:2: rule__ParameterCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group_2_1__1__Impl();
@@ -39981,22 +39981,22 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:12710:1: rule__ParameterCS__Group_2_1__1__Impl : ( ( ',' )? ) ;
+    // InternalOCLinEcore.g:12712:1: rule__ParameterCS__Group_2_1__1__Impl : ( ( ',' )? ) ;
     public final void rule__ParameterCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12714:1: ( ( ( ',' )? ) )
-            // InternalOCLinEcore.g:12715:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:12716:1: ( ( ( ',' )? ) )
+            // InternalOCLinEcore.g:12717:1: ( ( ',' )? )
             {
-            // InternalOCLinEcore.g:12715:1: ( ( ',' )? )
-            // InternalOCLinEcore.g:12716:1: ( ',' )?
+            // InternalOCLinEcore.g:12717:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:12718:1: ( ',' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());
             }
-            // InternalOCLinEcore.g:12717:1: ( ',' )?
+            // InternalOCLinEcore.g:12719:1: ( ',' )?
             int alt149=2;
             int LA149_0 = input.LA(1);
 
@@ -40005,7 +40005,7 @@
             }
             switch (alt149) {
                 case 1 :
-                    // InternalOCLinEcore.g:12718:2: ','
+                    // InternalOCLinEcore.g:12720:2: ','
                     {
                     match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
 
@@ -40039,14 +40039,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_3__0"
-    // InternalOCLinEcore.g:12733:1: rule__ParameterCS__Group_3__0 : rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 ;
+    // InternalOCLinEcore.g:12735:1: rule__ParameterCS__Group_3__0 : rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 ;
     public final void rule__ParameterCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12737:1: ( rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 )
-            // InternalOCLinEcore.g:12738:2: rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1
+            // InternalOCLinEcore.g:12739:1: ( rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1 )
+            // InternalOCLinEcore.g:12740:2: rule__ParameterCS__Group_3__0__Impl rule__ParameterCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__ParameterCS__Group_3__0__Impl();
@@ -40077,17 +40077,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:12745:1: rule__ParameterCS__Group_3__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:12747:1: rule__ParameterCS__Group_3__0__Impl : ( '{' ) ;
     public final void rule__ParameterCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12749:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:12750:1: ( '{' )
+            // InternalOCLinEcore.g:12751:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:12752:1: ( '{' )
             {
-            // InternalOCLinEcore.g:12750:1: ( '{' )
-            // InternalOCLinEcore.g:12751:1: '{'
+            // InternalOCLinEcore.g:12752:1: ( '{' )
+            // InternalOCLinEcore.g:12753:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());
@@ -40118,14 +40118,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_3__1"
-    // InternalOCLinEcore.g:12764:1: rule__ParameterCS__Group_3__1 : rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 ;
+    // InternalOCLinEcore.g:12766:1: rule__ParameterCS__Group_3__1 : rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 ;
     public final void rule__ParameterCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12768:1: ( rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 )
-            // InternalOCLinEcore.g:12769:2: rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2
+            // InternalOCLinEcore.g:12770:1: ( rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2 )
+            // InternalOCLinEcore.g:12771:2: rule__ParameterCS__Group_3__1__Impl rule__ParameterCS__Group_3__2
             {
             pushFollow(FollowSets000.FOLLOW_48);
             rule__ParameterCS__Group_3__1__Impl();
@@ -40156,22 +40156,22 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:12776:1: rule__ParameterCS__Group_3__1__Impl : ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) ;
+    // InternalOCLinEcore.g:12778:1: rule__ParameterCS__Group_3__1__Impl : ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) ;
     public final void rule__ParameterCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12780:1: ( ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) )
-            // InternalOCLinEcore.g:12781:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
+            // InternalOCLinEcore.g:12782:1: ( ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* ) )
+            // InternalOCLinEcore.g:12783:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
             {
-            // InternalOCLinEcore.g:12781:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
-            // InternalOCLinEcore.g:12782:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
+            // InternalOCLinEcore.g:12783:1: ( ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )* )
+            // InternalOCLinEcore.g:12784:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAssignment_3_1());
             }
-            // InternalOCLinEcore.g:12783:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
+            // InternalOCLinEcore.g:12785:1: ( rule__ParameterCS__OwnedAnnotationsAssignment_3_1 )*
             loop150:
             do {
                 int alt150=2;
@@ -40184,7 +40184,7 @@
 
                 switch (alt150) {
             	case 1 :
-            	    // InternalOCLinEcore.g:12783:2: rule__ParameterCS__OwnedAnnotationsAssignment_3_1
+            	    // InternalOCLinEcore.g:12785:2: rule__ParameterCS__OwnedAnnotationsAssignment_3_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_49);
             	    rule__ParameterCS__OwnedAnnotationsAssignment_3_1();
@@ -40225,14 +40225,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_3__2"
-    // InternalOCLinEcore.g:12793:1: rule__ParameterCS__Group_3__2 : rule__ParameterCS__Group_3__2__Impl ;
+    // InternalOCLinEcore.g:12795:1: rule__ParameterCS__Group_3__2 : rule__ParameterCS__Group_3__2__Impl ;
     public final void rule__ParameterCS__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12797:1: ( rule__ParameterCS__Group_3__2__Impl )
-            // InternalOCLinEcore.g:12798:2: rule__ParameterCS__Group_3__2__Impl
+            // InternalOCLinEcore.g:12799:1: ( rule__ParameterCS__Group_3__2__Impl )
+            // InternalOCLinEcore.g:12800:2: rule__ParameterCS__Group_3__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group_3__2__Impl();
@@ -40258,17 +40258,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group_3__2__Impl"
-    // InternalOCLinEcore.g:12804:1: rule__ParameterCS__Group_3__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:12806:1: rule__ParameterCS__Group_3__2__Impl : ( '}' ) ;
     public final void rule__ParameterCS__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12808:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:12809:1: ( '}' )
+            // InternalOCLinEcore.g:12810:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:12811:1: ( '}' )
             {
-            // InternalOCLinEcore.g:12809:1: ( '}' )
-            // InternalOCLinEcore.g:12810:1: '}'
+            // InternalOCLinEcore.g:12811:1: ( '}' )
+            // InternalOCLinEcore.g:12812:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_2());
@@ -40299,14 +40299,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__0"
-    // InternalOCLinEcore.g:12829:1: rule__ImplicitOppositeCS__Group__0 : rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1 ;
+    // InternalOCLinEcore.g:12831:1: rule__ImplicitOppositeCS__Group__0 : rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1 ;
     public final void rule__ImplicitOppositeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12833:1: ( rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1 )
-            // InternalOCLinEcore.g:12834:2: rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1
+            // InternalOCLinEcore.g:12835:1: ( rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1 )
+            // InternalOCLinEcore.g:12836:2: rule__ImplicitOppositeCS__Group__0__Impl rule__ImplicitOppositeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ImplicitOppositeCS__Group__0__Impl();
@@ -40337,17 +40337,17 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__0__Impl"
-    // InternalOCLinEcore.g:12841:1: rule__ImplicitOppositeCS__Group__0__Impl : ( 'opposite' ) ;
+    // InternalOCLinEcore.g:12843:1: rule__ImplicitOppositeCS__Group__0__Impl : ( 'opposite' ) ;
     public final void rule__ImplicitOppositeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12845:1: ( ( 'opposite' ) )
-            // InternalOCLinEcore.g:12846:1: ( 'opposite' )
+            // InternalOCLinEcore.g:12847:1: ( ( 'opposite' ) )
+            // InternalOCLinEcore.g:12848:1: ( 'opposite' )
             {
-            // InternalOCLinEcore.g:12846:1: ( 'opposite' )
-            // InternalOCLinEcore.g:12847:1: 'opposite'
+            // InternalOCLinEcore.g:12848:1: ( 'opposite' )
+            // InternalOCLinEcore.g:12849:1: 'opposite'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getOppositeKeyword_0());
@@ -40378,14 +40378,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__1"
-    // InternalOCLinEcore.g:12860:1: rule__ImplicitOppositeCS__Group__1 : rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2 ;
+    // InternalOCLinEcore.g:12862:1: rule__ImplicitOppositeCS__Group__1 : rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2 ;
     public final void rule__ImplicitOppositeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12864:1: ( rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2 )
-            // InternalOCLinEcore.g:12865:2: rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2
+            // InternalOCLinEcore.g:12866:1: ( rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2 )
+            // InternalOCLinEcore.g:12867:2: rule__ImplicitOppositeCS__Group__1__Impl rule__ImplicitOppositeCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__ImplicitOppositeCS__Group__1__Impl();
@@ -40416,23 +40416,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__1__Impl"
-    // InternalOCLinEcore.g:12872:1: rule__ImplicitOppositeCS__Group__1__Impl : ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:12874:1: rule__ImplicitOppositeCS__Group__1__Impl : ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) ) ;
     public final void rule__ImplicitOppositeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12876:1: ( ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) ) )
-            // InternalOCLinEcore.g:12877:1: ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) )
+            // InternalOCLinEcore.g:12878:1: ( ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) ) )
+            // InternalOCLinEcore.g:12879:1: ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:12877:1: ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) )
-            // InternalOCLinEcore.g:12878:1: ( rule__ImplicitOppositeCS__NameAssignment_1 )
+            // InternalOCLinEcore.g:12879:1: ( ( rule__ImplicitOppositeCS__NameAssignment_1 ) )
+            // InternalOCLinEcore.g:12880:1: ( rule__ImplicitOppositeCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getNameAssignment_1());
             }
-            // InternalOCLinEcore.g:12879:1: ( rule__ImplicitOppositeCS__NameAssignment_1 )
-            // InternalOCLinEcore.g:12879:2: rule__ImplicitOppositeCS__NameAssignment_1
+            // InternalOCLinEcore.g:12881:1: ( rule__ImplicitOppositeCS__NameAssignment_1 )
+            // InternalOCLinEcore.g:12881:2: rule__ImplicitOppositeCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImplicitOppositeCS__NameAssignment_1();
@@ -40467,14 +40467,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__2"
-    // InternalOCLinEcore.g:12889:1: rule__ImplicitOppositeCS__Group__2 : rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3 ;
+    // InternalOCLinEcore.g:12891:1: rule__ImplicitOppositeCS__Group__2 : rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3 ;
     public final void rule__ImplicitOppositeCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12893:1: ( rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3 )
-            // InternalOCLinEcore.g:12894:2: rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3
+            // InternalOCLinEcore.g:12895:1: ( rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3 )
+            // InternalOCLinEcore.g:12896:2: rule__ImplicitOppositeCS__Group__2__Impl rule__ImplicitOppositeCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__ImplicitOppositeCS__Group__2__Impl();
@@ -40505,17 +40505,17 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__2__Impl"
-    // InternalOCLinEcore.g:12901:1: rule__ImplicitOppositeCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:12903:1: rule__ImplicitOppositeCS__Group__2__Impl : ( ':' ) ;
     public final void rule__ImplicitOppositeCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12905:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:12906:1: ( ':' )
+            // InternalOCLinEcore.g:12907:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:12908:1: ( ':' )
             {
-            // InternalOCLinEcore.g:12906:1: ( ':' )
-            // InternalOCLinEcore.g:12907:1: ':'
+            // InternalOCLinEcore.g:12908:1: ( ':' )
+            // InternalOCLinEcore.g:12909:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getColonKeyword_2());
@@ -40546,14 +40546,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__3"
-    // InternalOCLinEcore.g:12920:1: rule__ImplicitOppositeCS__Group__3 : rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4 ;
+    // InternalOCLinEcore.g:12922:1: rule__ImplicitOppositeCS__Group__3 : rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4 ;
     public final void rule__ImplicitOppositeCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12924:1: ( rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4 )
-            // InternalOCLinEcore.g:12925:2: rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4
+            // InternalOCLinEcore.g:12926:1: ( rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4 )
+            // InternalOCLinEcore.g:12927:2: rule__ImplicitOppositeCS__Group__3__Impl rule__ImplicitOppositeCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__ImplicitOppositeCS__Group__3__Impl();
@@ -40584,23 +40584,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__3__Impl"
-    // InternalOCLinEcore.g:12932:1: rule__ImplicitOppositeCS__Group__3__Impl : ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) ) ;
+    // InternalOCLinEcore.g:12934:1: rule__ImplicitOppositeCS__Group__3__Impl : ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) ) ;
     public final void rule__ImplicitOppositeCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12936:1: ( ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) ) )
-            // InternalOCLinEcore.g:12937:1: ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) )
+            // InternalOCLinEcore.g:12938:1: ( ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) ) )
+            // InternalOCLinEcore.g:12939:1: ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) )
             {
-            // InternalOCLinEcore.g:12937:1: ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) )
-            // InternalOCLinEcore.g:12938:1: ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 )
+            // InternalOCLinEcore.g:12939:1: ( ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 ) )
+            // InternalOCLinEcore.g:12940:1: ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeAssignment_3());
             }
-            // InternalOCLinEcore.g:12939:1: ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 )
-            // InternalOCLinEcore.g:12939:2: rule__ImplicitOppositeCS__OwnedTypeAssignment_3
+            // InternalOCLinEcore.g:12941:1: ( rule__ImplicitOppositeCS__OwnedTypeAssignment_3 )
+            // InternalOCLinEcore.g:12941:2: rule__ImplicitOppositeCS__OwnedTypeAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImplicitOppositeCS__OwnedTypeAssignment_3();
@@ -40635,14 +40635,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__4"
-    // InternalOCLinEcore.g:12949:1: rule__ImplicitOppositeCS__Group__4 : rule__ImplicitOppositeCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:12951:1: rule__ImplicitOppositeCS__Group__4 : rule__ImplicitOppositeCS__Group__4__Impl ;
     public final void rule__ImplicitOppositeCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12953:1: ( rule__ImplicitOppositeCS__Group__4__Impl )
-            // InternalOCLinEcore.g:12954:2: rule__ImplicitOppositeCS__Group__4__Impl
+            // InternalOCLinEcore.g:12955:1: ( rule__ImplicitOppositeCS__Group__4__Impl )
+            // InternalOCLinEcore.g:12956:2: rule__ImplicitOppositeCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImplicitOppositeCS__Group__4__Impl();
@@ -40668,22 +40668,22 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group__4__Impl"
-    // InternalOCLinEcore.g:12960:1: rule__ImplicitOppositeCS__Group__4__Impl : ( ( rule__ImplicitOppositeCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:12962:1: rule__ImplicitOppositeCS__Group__4__Impl : ( ( rule__ImplicitOppositeCS__Group_4__0 )? ) ;
     public final void rule__ImplicitOppositeCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12964:1: ( ( ( rule__ImplicitOppositeCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:12965:1: ( ( rule__ImplicitOppositeCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:12966:1: ( ( ( rule__ImplicitOppositeCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:12967:1: ( ( rule__ImplicitOppositeCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:12965:1: ( ( rule__ImplicitOppositeCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:12966:1: ( rule__ImplicitOppositeCS__Group_4__0 )?
+            // InternalOCLinEcore.g:12967:1: ( ( rule__ImplicitOppositeCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:12968:1: ( rule__ImplicitOppositeCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:12967:1: ( rule__ImplicitOppositeCS__Group_4__0 )?
+            // InternalOCLinEcore.g:12969:1: ( rule__ImplicitOppositeCS__Group_4__0 )?
             int alt151=2;
             int LA151_0 = input.LA(1);
 
@@ -40692,7 +40692,7 @@
             }
             switch (alt151) {
                 case 1 :
-                    // InternalOCLinEcore.g:12967:2: rule__ImplicitOppositeCS__Group_4__0
+                    // InternalOCLinEcore.g:12969:2: rule__ImplicitOppositeCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImplicitOppositeCS__Group_4__0();
@@ -40730,14 +40730,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4__0"
-    // InternalOCLinEcore.g:12987:1: rule__ImplicitOppositeCS__Group_4__0 : rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1 ;
+    // InternalOCLinEcore.g:12989:1: rule__ImplicitOppositeCS__Group_4__0 : rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1 ;
     public final void rule__ImplicitOppositeCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:12991:1: ( rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1 )
-            // InternalOCLinEcore.g:12992:2: rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1
+            // InternalOCLinEcore.g:12993:1: ( rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1 )
+            // InternalOCLinEcore.g:12994:2: rule__ImplicitOppositeCS__Group_4__0__Impl rule__ImplicitOppositeCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_64);
             rule__ImplicitOppositeCS__Group_4__0__Impl();
@@ -40768,17 +40768,17 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:12999:1: rule__ImplicitOppositeCS__Group_4__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:13001:1: rule__ImplicitOppositeCS__Group_4__0__Impl : ( '{' ) ;
     public final void rule__ImplicitOppositeCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13003:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:13004:1: ( '{' )
+            // InternalOCLinEcore.g:13005:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:13006:1: ( '{' )
             {
-            // InternalOCLinEcore.g:13004:1: ( '{' )
-            // InternalOCLinEcore.g:13005:1: '{'
+            // InternalOCLinEcore.g:13006:1: ( '{' )
+            // InternalOCLinEcore.g:13007:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getLeftCurlyBracketKeyword_4_0());
@@ -40809,14 +40809,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4__1"
-    // InternalOCLinEcore.g:13018:1: rule__ImplicitOppositeCS__Group_4__1 : rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2 ;
+    // InternalOCLinEcore.g:13020:1: rule__ImplicitOppositeCS__Group_4__1 : rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2 ;
     public final void rule__ImplicitOppositeCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13022:1: ( rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2 )
-            // InternalOCLinEcore.g:13023:2: rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2
+            // InternalOCLinEcore.g:13024:1: ( rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2 )
+            // InternalOCLinEcore.g:13025:2: rule__ImplicitOppositeCS__Group_4__1__Impl rule__ImplicitOppositeCS__Group_4__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__ImplicitOppositeCS__Group_4__1__Impl();
@@ -40847,26 +40847,26 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:13030:1: rule__ImplicitOppositeCS__Group_4__1__Impl : ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) ) ;
+    // InternalOCLinEcore.g:13032:1: rule__ImplicitOppositeCS__Group_4__1__Impl : ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) ) ;
     public final void rule__ImplicitOppositeCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13034:1: ( ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) ) )
-            // InternalOCLinEcore.g:13035:1: ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) )
+            // InternalOCLinEcore.g:13036:1: ( ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) ) )
+            // InternalOCLinEcore.g:13037:1: ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) )
             {
-            // InternalOCLinEcore.g:13035:1: ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) )
-            // InternalOCLinEcore.g:13036:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* )
+            // InternalOCLinEcore.g:13037:1: ( ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* ) )
+            // InternalOCLinEcore.g:13038:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) ) ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* )
             {
-            // InternalOCLinEcore.g:13036:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) )
-            // InternalOCLinEcore.g:13037:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )
+            // InternalOCLinEcore.g:13038:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 ) )
+            // InternalOCLinEcore.g:13039:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getGroup_4_1());
             }
-            // InternalOCLinEcore.g:13038:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )
-            // InternalOCLinEcore.g:13038:2: rule__ImplicitOppositeCS__Group_4_1__0
+            // InternalOCLinEcore.g:13040:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )
+            // InternalOCLinEcore.g:13040:2: rule__ImplicitOppositeCS__Group_4_1__0
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__ImplicitOppositeCS__Group_4_1__0();
@@ -40882,13 +40882,13 @@
 
             }
 
-            // InternalOCLinEcore.g:13041:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* )
-            // InternalOCLinEcore.g:13042:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )*
+            // InternalOCLinEcore.g:13043:1: ( ( rule__ImplicitOppositeCS__Group_4_1__0 )* )
+            // InternalOCLinEcore.g:13044:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getGroup_4_1());
             }
-            // InternalOCLinEcore.g:13043:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )*
+            // InternalOCLinEcore.g:13045:1: ( rule__ImplicitOppositeCS__Group_4_1__0 )*
             loop152:
             do {
                 int alt152=2;
@@ -40901,7 +40901,7 @@
 
                 switch (alt152) {
             	case 1 :
-            	    // InternalOCLinEcore.g:13043:2: rule__ImplicitOppositeCS__Group_4_1__0
+            	    // InternalOCLinEcore.g:13045:2: rule__ImplicitOppositeCS__Group_4_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_65);
             	    rule__ImplicitOppositeCS__Group_4_1__0();
@@ -40945,14 +40945,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4__2"
-    // InternalOCLinEcore.g:13054:1: rule__ImplicitOppositeCS__Group_4__2 : rule__ImplicitOppositeCS__Group_4__2__Impl ;
+    // InternalOCLinEcore.g:13056:1: rule__ImplicitOppositeCS__Group_4__2 : rule__ImplicitOppositeCS__Group_4__2__Impl ;
     public final void rule__ImplicitOppositeCS__Group_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13058:1: ( rule__ImplicitOppositeCS__Group_4__2__Impl )
-            // InternalOCLinEcore.g:13059:2: rule__ImplicitOppositeCS__Group_4__2__Impl
+            // InternalOCLinEcore.g:13060:1: ( rule__ImplicitOppositeCS__Group_4__2__Impl )
+            // InternalOCLinEcore.g:13061:2: rule__ImplicitOppositeCS__Group_4__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImplicitOppositeCS__Group_4__2__Impl();
@@ -40978,17 +40978,17 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4__2__Impl"
-    // InternalOCLinEcore.g:13065:1: rule__ImplicitOppositeCS__Group_4__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:13067:1: rule__ImplicitOppositeCS__Group_4__2__Impl : ( '}' ) ;
     public final void rule__ImplicitOppositeCS__Group_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13069:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:13070:1: ( '}' )
+            // InternalOCLinEcore.g:13071:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:13072:1: ( '}' )
             {
-            // InternalOCLinEcore.g:13070:1: ( '}' )
-            // InternalOCLinEcore.g:13071:1: '}'
+            // InternalOCLinEcore.g:13072:1: ( '}' )
+            // InternalOCLinEcore.g:13073:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getRightCurlyBracketKeyword_4_2());
@@ -41019,14 +41019,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__0"
-    // InternalOCLinEcore.g:13090:1: rule__ImplicitOppositeCS__Group_4_1__0 : rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1 ;
+    // InternalOCLinEcore.g:13092:1: rule__ImplicitOppositeCS__Group_4_1__0 : rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1 ;
     public final void rule__ImplicitOppositeCS__Group_4_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13094:1: ( rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1 )
-            // InternalOCLinEcore.g:13095:2: rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1
+            // InternalOCLinEcore.g:13096:1: ( rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1 )
+            // InternalOCLinEcore.g:13097:2: rule__ImplicitOppositeCS__Group_4_1__0__Impl rule__ImplicitOppositeCS__Group_4_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__ImplicitOppositeCS__Group_4_1__0__Impl();
@@ -41057,23 +41057,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__0__Impl"
-    // InternalOCLinEcore.g:13102:1: rule__ImplicitOppositeCS__Group_4_1__0__Impl : ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) ) ;
+    // InternalOCLinEcore.g:13104:1: rule__ImplicitOppositeCS__Group_4_1__0__Impl : ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) ) ;
     public final void rule__ImplicitOppositeCS__Group_4_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13106:1: ( ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) ) )
-            // InternalOCLinEcore.g:13107:1: ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) )
+            // InternalOCLinEcore.g:13108:1: ( ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) ) )
+            // InternalOCLinEcore.g:13109:1: ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) )
             {
-            // InternalOCLinEcore.g:13107:1: ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) )
-            // InternalOCLinEcore.g:13108:1: ( rule__ImplicitOppositeCS__Alternatives_4_1_0 )
+            // InternalOCLinEcore.g:13109:1: ( ( rule__ImplicitOppositeCS__Alternatives_4_1_0 ) )
+            // InternalOCLinEcore.g:13110:1: ( rule__ImplicitOppositeCS__Alternatives_4_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getAlternatives_4_1_0());
             }
-            // InternalOCLinEcore.g:13109:1: ( rule__ImplicitOppositeCS__Alternatives_4_1_0 )
-            // InternalOCLinEcore.g:13109:2: rule__ImplicitOppositeCS__Alternatives_4_1_0
+            // InternalOCLinEcore.g:13111:1: ( rule__ImplicitOppositeCS__Alternatives_4_1_0 )
+            // InternalOCLinEcore.g:13111:2: rule__ImplicitOppositeCS__Alternatives_4_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImplicitOppositeCS__Alternatives_4_1_0();
@@ -41108,14 +41108,14 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__1"
-    // InternalOCLinEcore.g:13119:1: rule__ImplicitOppositeCS__Group_4_1__1 : rule__ImplicitOppositeCS__Group_4_1__1__Impl ;
+    // InternalOCLinEcore.g:13121:1: rule__ImplicitOppositeCS__Group_4_1__1 : rule__ImplicitOppositeCS__Group_4_1__1__Impl ;
     public final void rule__ImplicitOppositeCS__Group_4_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13123:1: ( rule__ImplicitOppositeCS__Group_4_1__1__Impl )
-            // InternalOCLinEcore.g:13124:2: rule__ImplicitOppositeCS__Group_4_1__1__Impl
+            // InternalOCLinEcore.g:13125:1: ( rule__ImplicitOppositeCS__Group_4_1__1__Impl )
+            // InternalOCLinEcore.g:13126:2: rule__ImplicitOppositeCS__Group_4_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImplicitOppositeCS__Group_4_1__1__Impl();
@@ -41141,22 +41141,22 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__Group_4_1__1__Impl"
-    // InternalOCLinEcore.g:13130:1: rule__ImplicitOppositeCS__Group_4_1__1__Impl : ( ( ',' )? ) ;
+    // InternalOCLinEcore.g:13132:1: rule__ImplicitOppositeCS__Group_4_1__1__Impl : ( ( ',' )? ) ;
     public final void rule__ImplicitOppositeCS__Group_4_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13134:1: ( ( ( ',' )? ) )
-            // InternalOCLinEcore.g:13135:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:13136:1: ( ( ( ',' )? ) )
+            // InternalOCLinEcore.g:13137:1: ( ( ',' )? )
             {
-            // InternalOCLinEcore.g:13135:1: ( ( ',' )? )
-            // InternalOCLinEcore.g:13136:1: ( ',' )?
+            // InternalOCLinEcore.g:13137:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:13138:1: ( ',' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getCommaKeyword_4_1_1());
             }
-            // InternalOCLinEcore.g:13137:1: ( ',' )?
+            // InternalOCLinEcore.g:13139:1: ( ',' )?
             int alt153=2;
             int LA153_0 = input.LA(1);
 
@@ -41165,7 +41165,7 @@
             }
             switch (alt153) {
                 case 1 :
-                    // InternalOCLinEcore.g:13138:2: ','
+                    // InternalOCLinEcore.g:13140:2: ','
                     {
                     match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
 
@@ -41199,14 +41199,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__0"
-    // InternalOCLinEcore.g:13153:1: rule__ReferenceCS__Group__0 : rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 ;
+    // InternalOCLinEcore.g:13155:1: rule__ReferenceCS__Group__0 : rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 ;
     public final void rule__ReferenceCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13157:1: ( rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 )
-            // InternalOCLinEcore.g:13158:2: rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1
+            // InternalOCLinEcore.g:13159:1: ( rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1 )
+            // InternalOCLinEcore.g:13160:2: rule__ReferenceCS__Group__0__Impl rule__ReferenceCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_67);
             rule__ReferenceCS__Group__0__Impl();
@@ -41237,22 +41237,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__0__Impl"
-    // InternalOCLinEcore.g:13165:1: rule__ReferenceCS__Group__0__Impl : ( ( rule__ReferenceCS__Alternatives_0 )? ) ;
+    // InternalOCLinEcore.g:13167:1: rule__ReferenceCS__Group__0__Impl : ( ( rule__ReferenceCS__Alternatives_0 )? ) ;
     public final void rule__ReferenceCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13169:1: ( ( ( rule__ReferenceCS__Alternatives_0 )? ) )
-            // InternalOCLinEcore.g:13170:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
+            // InternalOCLinEcore.g:13171:1: ( ( ( rule__ReferenceCS__Alternatives_0 )? ) )
+            // InternalOCLinEcore.g:13172:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
             {
-            // InternalOCLinEcore.g:13170:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
-            // InternalOCLinEcore.g:13171:1: ( rule__ReferenceCS__Alternatives_0 )?
+            // InternalOCLinEcore.g:13172:1: ( ( rule__ReferenceCS__Alternatives_0 )? )
+            // InternalOCLinEcore.g:13173:1: ( rule__ReferenceCS__Alternatives_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getAlternatives_0());
             }
-            // InternalOCLinEcore.g:13172:1: ( rule__ReferenceCS__Alternatives_0 )?
+            // InternalOCLinEcore.g:13174:1: ( rule__ReferenceCS__Alternatives_0 )?
             int alt154=2;
             int LA154_0 = input.LA(1);
 
@@ -41261,7 +41261,7 @@
             }
             switch (alt154) {
                 case 1 :
-                    // InternalOCLinEcore.g:13172:2: rule__ReferenceCS__Alternatives_0
+                    // InternalOCLinEcore.g:13174:2: rule__ReferenceCS__Alternatives_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Alternatives_0();
@@ -41299,14 +41299,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__1"
-    // InternalOCLinEcore.g:13182:1: rule__ReferenceCS__Group__1 : rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 ;
+    // InternalOCLinEcore.g:13184:1: rule__ReferenceCS__Group__1 : rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 ;
     public final void rule__ReferenceCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13186:1: ( rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 )
-            // InternalOCLinEcore.g:13187:2: rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2
+            // InternalOCLinEcore.g:13188:1: ( rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2 )
+            // InternalOCLinEcore.g:13189:2: rule__ReferenceCS__Group__1__Impl rule__ReferenceCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ReferenceCS__Group__1__Impl();
@@ -41337,17 +41337,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__1__Impl"
-    // InternalOCLinEcore.g:13194:1: rule__ReferenceCS__Group__1__Impl : ( 'property' ) ;
+    // InternalOCLinEcore.g:13196:1: rule__ReferenceCS__Group__1__Impl : ( 'property' ) ;
     public final void rule__ReferenceCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13198:1: ( ( 'property' ) )
-            // InternalOCLinEcore.g:13199:1: ( 'property' )
+            // InternalOCLinEcore.g:13200:1: ( ( 'property' ) )
+            // InternalOCLinEcore.g:13201:1: ( 'property' )
             {
-            // InternalOCLinEcore.g:13199:1: ( 'property' )
-            // InternalOCLinEcore.g:13200:1: 'property'
+            // InternalOCLinEcore.g:13201:1: ( 'property' )
+            // InternalOCLinEcore.g:13202:1: 'property'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getPropertyKeyword_1());
@@ -41378,14 +41378,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__2"
-    // InternalOCLinEcore.g:13213:1: rule__ReferenceCS__Group__2 : rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 ;
+    // InternalOCLinEcore.g:13215:1: rule__ReferenceCS__Group__2 : rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 ;
     public final void rule__ReferenceCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13217:1: ( rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 )
-            // InternalOCLinEcore.g:13218:2: rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3
+            // InternalOCLinEcore.g:13219:1: ( rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3 )
+            // InternalOCLinEcore.g:13220:2: rule__ReferenceCS__Group__2__Impl rule__ReferenceCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__ReferenceCS__Group__2__Impl();
@@ -41416,23 +41416,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__2__Impl"
-    // InternalOCLinEcore.g:13225:1: rule__ReferenceCS__Group__2__Impl : ( ( rule__ReferenceCS__NameAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:13227:1: rule__ReferenceCS__Group__2__Impl : ( ( rule__ReferenceCS__NameAssignment_2 ) ) ;
     public final void rule__ReferenceCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13229:1: ( ( ( rule__ReferenceCS__NameAssignment_2 ) ) )
-            // InternalOCLinEcore.g:13230:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:13231:1: ( ( ( rule__ReferenceCS__NameAssignment_2 ) ) )
+            // InternalOCLinEcore.g:13232:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:13230:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
-            // InternalOCLinEcore.g:13231:1: ( rule__ReferenceCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:13232:1: ( ( rule__ReferenceCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:13233:1: ( rule__ReferenceCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getNameAssignment_2());
             }
-            // InternalOCLinEcore.g:13232:1: ( rule__ReferenceCS__NameAssignment_2 )
-            // InternalOCLinEcore.g:13232:2: rule__ReferenceCS__NameAssignment_2
+            // InternalOCLinEcore.g:13234:1: ( rule__ReferenceCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:13234:2: rule__ReferenceCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__NameAssignment_2();
@@ -41467,14 +41467,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__3"
-    // InternalOCLinEcore.g:13242:1: rule__ReferenceCS__Group__3 : rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 ;
+    // InternalOCLinEcore.g:13244:1: rule__ReferenceCS__Group__3 : rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 ;
     public final void rule__ReferenceCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13246:1: ( rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 )
-            // InternalOCLinEcore.g:13247:2: rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4
+            // InternalOCLinEcore.g:13248:1: ( rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4 )
+            // InternalOCLinEcore.g:13249:2: rule__ReferenceCS__Group__3__Impl rule__ReferenceCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__ReferenceCS__Group__3__Impl();
@@ -41505,22 +41505,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__3__Impl"
-    // InternalOCLinEcore.g:13254:1: rule__ReferenceCS__Group__3__Impl : ( ( rule__ReferenceCS__Group_3__0 )? ) ;
+    // InternalOCLinEcore.g:13256:1: rule__ReferenceCS__Group__3__Impl : ( ( rule__ReferenceCS__Group_3__0 )? ) ;
     public final void rule__ReferenceCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13258:1: ( ( ( rule__ReferenceCS__Group_3__0 )? ) )
-            // InternalOCLinEcore.g:13259:1: ( ( rule__ReferenceCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:13260:1: ( ( ( rule__ReferenceCS__Group_3__0 )? ) )
+            // InternalOCLinEcore.g:13261:1: ( ( rule__ReferenceCS__Group_3__0 )? )
             {
-            // InternalOCLinEcore.g:13259:1: ( ( rule__ReferenceCS__Group_3__0 )? )
-            // InternalOCLinEcore.g:13260:1: ( rule__ReferenceCS__Group_3__0 )?
+            // InternalOCLinEcore.g:13261:1: ( ( rule__ReferenceCS__Group_3__0 )? )
+            // InternalOCLinEcore.g:13262:1: ( rule__ReferenceCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:13261:1: ( rule__ReferenceCS__Group_3__0 )?
+            // InternalOCLinEcore.g:13263:1: ( rule__ReferenceCS__Group_3__0 )?
             int alt155=2;
             int LA155_0 = input.LA(1);
 
@@ -41529,7 +41529,7 @@
             }
             switch (alt155) {
                 case 1 :
-                    // InternalOCLinEcore.g:13261:2: rule__ReferenceCS__Group_3__0
+                    // InternalOCLinEcore.g:13263:2: rule__ReferenceCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_3__0();
@@ -41567,14 +41567,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__4"
-    // InternalOCLinEcore.g:13271:1: rule__ReferenceCS__Group__4 : rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 ;
+    // InternalOCLinEcore.g:13273:1: rule__ReferenceCS__Group__4 : rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 ;
     public final void rule__ReferenceCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13275:1: ( rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 )
-            // InternalOCLinEcore.g:13276:2: rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5
+            // InternalOCLinEcore.g:13277:1: ( rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5 )
+            // InternalOCLinEcore.g:13278:2: rule__ReferenceCS__Group__4__Impl rule__ReferenceCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__ReferenceCS__Group__4__Impl();
@@ -41605,22 +41605,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__4__Impl"
-    // InternalOCLinEcore.g:13283:1: rule__ReferenceCS__Group__4__Impl : ( ( rule__ReferenceCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:13285:1: rule__ReferenceCS__Group__4__Impl : ( ( rule__ReferenceCS__Group_4__0 )? ) ;
     public final void rule__ReferenceCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13287:1: ( ( ( rule__ReferenceCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:13288:1: ( ( rule__ReferenceCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:13289:1: ( ( ( rule__ReferenceCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:13290:1: ( ( rule__ReferenceCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:13288:1: ( ( rule__ReferenceCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:13289:1: ( rule__ReferenceCS__Group_4__0 )?
+            // InternalOCLinEcore.g:13290:1: ( ( rule__ReferenceCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:13291:1: ( rule__ReferenceCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:13290:1: ( rule__ReferenceCS__Group_4__0 )?
+            // InternalOCLinEcore.g:13292:1: ( rule__ReferenceCS__Group_4__0 )?
             int alt156=2;
             int LA156_0 = input.LA(1);
 
@@ -41629,7 +41629,7 @@
             }
             switch (alt156) {
                 case 1 :
-                    // InternalOCLinEcore.g:13290:2: rule__ReferenceCS__Group_4__0
+                    // InternalOCLinEcore.g:13292:2: rule__ReferenceCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_4__0();
@@ -41667,14 +41667,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__5"
-    // InternalOCLinEcore.g:13300:1: rule__ReferenceCS__Group__5 : rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 ;
+    // InternalOCLinEcore.g:13302:1: rule__ReferenceCS__Group__5 : rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 ;
     public final void rule__ReferenceCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13304:1: ( rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 )
-            // InternalOCLinEcore.g:13305:2: rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6
+            // InternalOCLinEcore.g:13306:1: ( rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6 )
+            // InternalOCLinEcore.g:13307:2: rule__ReferenceCS__Group__5__Impl rule__ReferenceCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__ReferenceCS__Group__5__Impl();
@@ -41705,22 +41705,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__5__Impl"
-    // InternalOCLinEcore.g:13312:1: rule__ReferenceCS__Group__5__Impl : ( ( rule__ReferenceCS__Group_5__0 )? ) ;
+    // InternalOCLinEcore.g:13314:1: rule__ReferenceCS__Group__5__Impl : ( ( rule__ReferenceCS__Group_5__0 )? ) ;
     public final void rule__ReferenceCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13316:1: ( ( ( rule__ReferenceCS__Group_5__0 )? ) )
-            // InternalOCLinEcore.g:13317:1: ( ( rule__ReferenceCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:13318:1: ( ( ( rule__ReferenceCS__Group_5__0 )? ) )
+            // InternalOCLinEcore.g:13319:1: ( ( rule__ReferenceCS__Group_5__0 )? )
             {
-            // InternalOCLinEcore.g:13317:1: ( ( rule__ReferenceCS__Group_5__0 )? )
-            // InternalOCLinEcore.g:13318:1: ( rule__ReferenceCS__Group_5__0 )?
+            // InternalOCLinEcore.g:13319:1: ( ( rule__ReferenceCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:13320:1: ( rule__ReferenceCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_5());
             }
-            // InternalOCLinEcore.g:13319:1: ( rule__ReferenceCS__Group_5__0 )?
+            // InternalOCLinEcore.g:13321:1: ( rule__ReferenceCS__Group_5__0 )?
             int alt157=2;
             int LA157_0 = input.LA(1);
 
@@ -41729,7 +41729,7 @@
             }
             switch (alt157) {
                 case 1 :
-                    // InternalOCLinEcore.g:13319:2: rule__ReferenceCS__Group_5__0
+                    // InternalOCLinEcore.g:13321:2: rule__ReferenceCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_5__0();
@@ -41767,14 +41767,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__6"
-    // InternalOCLinEcore.g:13329:1: rule__ReferenceCS__Group__6 : rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 ;
+    // InternalOCLinEcore.g:13331:1: rule__ReferenceCS__Group__6 : rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 ;
     public final void rule__ReferenceCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13333:1: ( rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 )
-            // InternalOCLinEcore.g:13334:2: rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7
+            // InternalOCLinEcore.g:13335:1: ( rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7 )
+            // InternalOCLinEcore.g:13336:2: rule__ReferenceCS__Group__6__Impl rule__ReferenceCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__ReferenceCS__Group__6__Impl();
@@ -41805,22 +41805,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__6__Impl"
-    // InternalOCLinEcore.g:13341:1: rule__ReferenceCS__Group__6__Impl : ( ( rule__ReferenceCS__Group_6__0 )? ) ;
+    // InternalOCLinEcore.g:13343:1: rule__ReferenceCS__Group__6__Impl : ( ( rule__ReferenceCS__Group_6__0 )? ) ;
     public final void rule__ReferenceCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13345:1: ( ( ( rule__ReferenceCS__Group_6__0 )? ) )
-            // InternalOCLinEcore.g:13346:1: ( ( rule__ReferenceCS__Group_6__0 )? )
+            // InternalOCLinEcore.g:13347:1: ( ( ( rule__ReferenceCS__Group_6__0 )? ) )
+            // InternalOCLinEcore.g:13348:1: ( ( rule__ReferenceCS__Group_6__0 )? )
             {
-            // InternalOCLinEcore.g:13346:1: ( ( rule__ReferenceCS__Group_6__0 )? )
-            // InternalOCLinEcore.g:13347:1: ( rule__ReferenceCS__Group_6__0 )?
+            // InternalOCLinEcore.g:13348:1: ( ( rule__ReferenceCS__Group_6__0 )? )
+            // InternalOCLinEcore.g:13349:1: ( rule__ReferenceCS__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_6());
             }
-            // InternalOCLinEcore.g:13348:1: ( rule__ReferenceCS__Group_6__0 )?
+            // InternalOCLinEcore.g:13350:1: ( rule__ReferenceCS__Group_6__0 )?
             int alt158=2;
             int LA158_0 = input.LA(1);
 
@@ -41833,7 +41833,7 @@
             }
             switch (alt158) {
                 case 1 :
-                    // InternalOCLinEcore.g:13348:2: rule__ReferenceCS__Group_6__0
+                    // InternalOCLinEcore.g:13350:2: rule__ReferenceCS__Group_6__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__Group_6__0();
@@ -41871,14 +41871,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__7"
-    // InternalOCLinEcore.g:13358:1: rule__ReferenceCS__Group__7 : rule__ReferenceCS__Group__7__Impl ;
+    // InternalOCLinEcore.g:13360:1: rule__ReferenceCS__Group__7 : rule__ReferenceCS__Group__7__Impl ;
     public final void rule__ReferenceCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13362:1: ( rule__ReferenceCS__Group__7__Impl )
-            // InternalOCLinEcore.g:13363:2: rule__ReferenceCS__Group__7__Impl
+            // InternalOCLinEcore.g:13364:1: ( rule__ReferenceCS__Group__7__Impl )
+            // InternalOCLinEcore.g:13365:2: rule__ReferenceCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group__7__Impl();
@@ -41904,23 +41904,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group__7__Impl"
-    // InternalOCLinEcore.g:13369:1: rule__ReferenceCS__Group__7__Impl : ( ( rule__ReferenceCS__Alternatives_7 ) ) ;
+    // InternalOCLinEcore.g:13371:1: rule__ReferenceCS__Group__7__Impl : ( ( rule__ReferenceCS__Alternatives_7 ) ) ;
     public final void rule__ReferenceCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13373:1: ( ( ( rule__ReferenceCS__Alternatives_7 ) ) )
-            // InternalOCLinEcore.g:13374:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
+            // InternalOCLinEcore.g:13375:1: ( ( ( rule__ReferenceCS__Alternatives_7 ) ) )
+            // InternalOCLinEcore.g:13376:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
             {
-            // InternalOCLinEcore.g:13374:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
-            // InternalOCLinEcore.g:13375:1: ( rule__ReferenceCS__Alternatives_7 )
+            // InternalOCLinEcore.g:13376:1: ( ( rule__ReferenceCS__Alternatives_7 ) )
+            // InternalOCLinEcore.g:13377:1: ( rule__ReferenceCS__Alternatives_7 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getAlternatives_7());
             }
-            // InternalOCLinEcore.g:13376:1: ( rule__ReferenceCS__Alternatives_7 )
-            // InternalOCLinEcore.g:13376:2: rule__ReferenceCS__Alternatives_7
+            // InternalOCLinEcore.g:13378:1: ( rule__ReferenceCS__Alternatives_7 )
+            // InternalOCLinEcore.g:13378:2: rule__ReferenceCS__Alternatives_7
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Alternatives_7();
@@ -41955,14 +41955,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_0__0"
-    // InternalOCLinEcore.g:13402:1: rule__ReferenceCS__Group_0_0__0 : rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 ;
+    // InternalOCLinEcore.g:13404:1: rule__ReferenceCS__Group_0_0__0 : rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 ;
     public final void rule__ReferenceCS__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13406:1: ( rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 )
-            // InternalOCLinEcore.g:13407:2: rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1
+            // InternalOCLinEcore.g:13408:1: ( rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1 )
+            // InternalOCLinEcore.g:13409:2: rule__ReferenceCS__Group_0_0__0__Impl rule__ReferenceCS__Group_0_0__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__ReferenceCS__Group_0_0__0__Impl();
@@ -41993,23 +41993,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_0__0__Impl"
-    // InternalOCLinEcore.g:13414:1: rule__ReferenceCS__Group_0_0__0__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) ;
+    // InternalOCLinEcore.g:13416:1: rule__ReferenceCS__Group_0_0__0__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) ;
     public final void rule__ReferenceCS__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13418:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) )
-            // InternalOCLinEcore.g:13419:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
+            // InternalOCLinEcore.g:13420:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) ) )
+            // InternalOCLinEcore.g:13421:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
             {
-            // InternalOCLinEcore.g:13419:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
-            // InternalOCLinEcore.g:13420:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
+            // InternalOCLinEcore.g:13421:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_0 ) )
+            // InternalOCLinEcore.g:13422:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_0());
             }
-            // InternalOCLinEcore.g:13421:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
-            // InternalOCLinEcore.g:13421:2: rule__ReferenceCS__QualifiersAssignment_0_0_0
+            // InternalOCLinEcore.g:13423:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_0 )
+            // InternalOCLinEcore.g:13423:2: rule__ReferenceCS__QualifiersAssignment_0_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__QualifiersAssignment_0_0_0();
@@ -42044,14 +42044,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_0__1"
-    // InternalOCLinEcore.g:13431:1: rule__ReferenceCS__Group_0_0__1 : rule__ReferenceCS__Group_0_0__1__Impl ;
+    // InternalOCLinEcore.g:13433:1: rule__ReferenceCS__Group_0_0__1 : rule__ReferenceCS__Group_0_0__1__Impl ;
     public final void rule__ReferenceCS__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13435:1: ( rule__ReferenceCS__Group_0_0__1__Impl )
-            // InternalOCLinEcore.g:13436:2: rule__ReferenceCS__Group_0_0__1__Impl
+            // InternalOCLinEcore.g:13437:1: ( rule__ReferenceCS__Group_0_0__1__Impl )
+            // InternalOCLinEcore.g:13438:2: rule__ReferenceCS__Group_0_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_0_0__1__Impl();
@@ -42077,22 +42077,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_0__1__Impl"
-    // InternalOCLinEcore.g:13442:1: rule__ReferenceCS__Group_0_0__1__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) ;
+    // InternalOCLinEcore.g:13444:1: rule__ReferenceCS__Group_0_0__1__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) ;
     public final void rule__ReferenceCS__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13446:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) )
-            // InternalOCLinEcore.g:13447:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
+            // InternalOCLinEcore.g:13448:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? ) )
+            // InternalOCLinEcore.g:13449:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
             {
-            // InternalOCLinEcore.g:13447:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
-            // InternalOCLinEcore.g:13448:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
+            // InternalOCLinEcore.g:13449:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )? )
+            // InternalOCLinEcore.g:13450:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_0_1());
             }
-            // InternalOCLinEcore.g:13449:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
+            // InternalOCLinEcore.g:13451:1: ( rule__ReferenceCS__QualifiersAssignment_0_0_1 )?
             int alt159=2;
             int LA159_0 = input.LA(1);
 
@@ -42101,7 +42101,7 @@
             }
             switch (alt159) {
                 case 1 :
-                    // InternalOCLinEcore.g:13449:2: rule__ReferenceCS__QualifiersAssignment_0_0_1
+                    // InternalOCLinEcore.g:13451:2: rule__ReferenceCS__QualifiersAssignment_0_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_0_0_1();
@@ -42139,14 +42139,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_1__0"
-    // InternalOCLinEcore.g:13463:1: rule__ReferenceCS__Group_0_1__0 : rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 ;
+    // InternalOCLinEcore.g:13465:1: rule__ReferenceCS__Group_0_1__0 : rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 ;
     public final void rule__ReferenceCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13467:1: ( rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 )
-            // InternalOCLinEcore.g:13468:2: rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1
+            // InternalOCLinEcore.g:13469:1: ( rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1 )
+            // InternalOCLinEcore.g:13470:2: rule__ReferenceCS__Group_0_1__0__Impl rule__ReferenceCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_27);
             rule__ReferenceCS__Group_0_1__0__Impl();
@@ -42177,23 +42177,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_1__0__Impl"
-    // InternalOCLinEcore.g:13475:1: rule__ReferenceCS__Group_0_1__0__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) ;
+    // InternalOCLinEcore.g:13477:1: rule__ReferenceCS__Group_0_1__0__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) ;
     public final void rule__ReferenceCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13479:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) )
-            // InternalOCLinEcore.g:13480:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
+            // InternalOCLinEcore.g:13481:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) ) )
+            // InternalOCLinEcore.g:13482:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
             {
-            // InternalOCLinEcore.g:13480:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
-            // InternalOCLinEcore.g:13481:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
+            // InternalOCLinEcore.g:13482:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_0 ) )
+            // InternalOCLinEcore.g:13483:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_0());
             }
-            // InternalOCLinEcore.g:13482:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
-            // InternalOCLinEcore.g:13482:2: rule__ReferenceCS__QualifiersAssignment_0_1_0
+            // InternalOCLinEcore.g:13484:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_0 )
+            // InternalOCLinEcore.g:13484:2: rule__ReferenceCS__QualifiersAssignment_0_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__QualifiersAssignment_0_1_0();
@@ -42228,14 +42228,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_1__1"
-    // InternalOCLinEcore.g:13492:1: rule__ReferenceCS__Group_0_1__1 : rule__ReferenceCS__Group_0_1__1__Impl ;
+    // InternalOCLinEcore.g:13494:1: rule__ReferenceCS__Group_0_1__1 : rule__ReferenceCS__Group_0_1__1__Impl ;
     public final void rule__ReferenceCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13496:1: ( rule__ReferenceCS__Group_0_1__1__Impl )
-            // InternalOCLinEcore.g:13497:2: rule__ReferenceCS__Group_0_1__1__Impl
+            // InternalOCLinEcore.g:13498:1: ( rule__ReferenceCS__Group_0_1__1__Impl )
+            // InternalOCLinEcore.g:13499:2: rule__ReferenceCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_0_1__1__Impl();
@@ -42261,22 +42261,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_0_1__1__Impl"
-    // InternalOCLinEcore.g:13503:1: rule__ReferenceCS__Group_0_1__1__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) ;
+    // InternalOCLinEcore.g:13505:1: rule__ReferenceCS__Group_0_1__1__Impl : ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) ;
     public final void rule__ReferenceCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13507:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) )
-            // InternalOCLinEcore.g:13508:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
+            // InternalOCLinEcore.g:13509:1: ( ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? ) )
+            // InternalOCLinEcore.g:13510:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
             {
-            // InternalOCLinEcore.g:13508:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
-            // InternalOCLinEcore.g:13509:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
+            // InternalOCLinEcore.g:13510:1: ( ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )? )
+            // InternalOCLinEcore.g:13511:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersAssignment_0_1_1());
             }
-            // InternalOCLinEcore.g:13510:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
+            // InternalOCLinEcore.g:13512:1: ( rule__ReferenceCS__QualifiersAssignment_0_1_1 )?
             int alt160=2;
             int LA160_0 = input.LA(1);
 
@@ -42285,7 +42285,7 @@
             }
             switch (alt160) {
                 case 1 :
-                    // InternalOCLinEcore.g:13510:2: rule__ReferenceCS__QualifiersAssignment_0_1_1
+                    // InternalOCLinEcore.g:13512:2: rule__ReferenceCS__QualifiersAssignment_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__QualifiersAssignment_0_1_1();
@@ -42323,14 +42323,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_3__0"
-    // InternalOCLinEcore.g:13524:1: rule__ReferenceCS__Group_3__0 : rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 ;
+    // InternalOCLinEcore.g:13526:1: rule__ReferenceCS__Group_3__0 : rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 ;
     public final void rule__ReferenceCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13528:1: ( rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 )
-            // InternalOCLinEcore.g:13529:2: rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1
+            // InternalOCLinEcore.g:13530:1: ( rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1 )
+            // InternalOCLinEcore.g:13531:2: rule__ReferenceCS__Group_3__0__Impl rule__ReferenceCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ReferenceCS__Group_3__0__Impl();
@@ -42361,17 +42361,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:13536:1: rule__ReferenceCS__Group_3__0__Impl : ( '#' ) ;
+    // InternalOCLinEcore.g:13538:1: rule__ReferenceCS__Group_3__0__Impl : ( '#' ) ;
     public final void rule__ReferenceCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13540:1: ( ( '#' ) )
-            // InternalOCLinEcore.g:13541:1: ( '#' )
+            // InternalOCLinEcore.g:13542:1: ( ( '#' ) )
+            // InternalOCLinEcore.g:13543:1: ( '#' )
             {
-            // InternalOCLinEcore.g:13541:1: ( '#' )
-            // InternalOCLinEcore.g:13542:1: '#'
+            // InternalOCLinEcore.g:13543:1: ( '#' )
+            // InternalOCLinEcore.g:13544:1: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());
@@ -42402,14 +42402,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_3__1"
-    // InternalOCLinEcore.g:13555:1: rule__ReferenceCS__Group_3__1 : rule__ReferenceCS__Group_3__1__Impl ;
+    // InternalOCLinEcore.g:13557:1: rule__ReferenceCS__Group_3__1 : rule__ReferenceCS__Group_3__1__Impl ;
     public final void rule__ReferenceCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13559:1: ( rule__ReferenceCS__Group_3__1__Impl )
-            // InternalOCLinEcore.g:13560:2: rule__ReferenceCS__Group_3__1__Impl
+            // InternalOCLinEcore.g:13561:1: ( rule__ReferenceCS__Group_3__1__Impl )
+            // InternalOCLinEcore.g:13562:2: rule__ReferenceCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_3__1__Impl();
@@ -42435,23 +42435,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:13566:1: rule__ReferenceCS__Group_3__1__Impl : ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:13568:1: rule__ReferenceCS__Group_3__1__Impl : ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) ;
     public final void rule__ReferenceCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13570:1: ( ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:13571:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
+            // InternalOCLinEcore.g:13572:1: ( ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:13573:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:13571:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
-            // InternalOCLinEcore.g:13572:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
+            // InternalOCLinEcore.g:13573:1: ( ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 ) )
+            // InternalOCLinEcore.g:13574:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredOppositeAssignment_3_1());
             }
-            // InternalOCLinEcore.g:13573:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
-            // InternalOCLinEcore.g:13573:2: rule__ReferenceCS__ReferredOppositeAssignment_3_1
+            // InternalOCLinEcore.g:13575:1: ( rule__ReferenceCS__ReferredOppositeAssignment_3_1 )
+            // InternalOCLinEcore.g:13575:2: rule__ReferenceCS__ReferredOppositeAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__ReferredOppositeAssignment_3_1();
@@ -42486,14 +42486,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_4__0"
-    // InternalOCLinEcore.g:13587:1: rule__ReferenceCS__Group_4__0 : rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 ;
+    // InternalOCLinEcore.g:13589:1: rule__ReferenceCS__Group_4__0 : rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 ;
     public final void rule__ReferenceCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13591:1: ( rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 )
-            // InternalOCLinEcore.g:13592:2: rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1
+            // InternalOCLinEcore.g:13593:1: ( rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1 )
+            // InternalOCLinEcore.g:13594:2: rule__ReferenceCS__Group_4__0__Impl rule__ReferenceCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__ReferenceCS__Group_4__0__Impl();
@@ -42524,17 +42524,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:13599:1: rule__ReferenceCS__Group_4__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:13601:1: rule__ReferenceCS__Group_4__0__Impl : ( ':' ) ;
     public final void rule__ReferenceCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13603:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:13604:1: ( ':' )
+            // InternalOCLinEcore.g:13605:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:13606:1: ( ':' )
             {
-            // InternalOCLinEcore.g:13604:1: ( ':' )
-            // InternalOCLinEcore.g:13605:1: ':'
+            // InternalOCLinEcore.g:13606:1: ( ':' )
+            // InternalOCLinEcore.g:13607:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());
@@ -42565,14 +42565,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_4__1"
-    // InternalOCLinEcore.g:13618:1: rule__ReferenceCS__Group_4__1 : rule__ReferenceCS__Group_4__1__Impl ;
+    // InternalOCLinEcore.g:13620:1: rule__ReferenceCS__Group_4__1 : rule__ReferenceCS__Group_4__1__Impl ;
     public final void rule__ReferenceCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13622:1: ( rule__ReferenceCS__Group_4__1__Impl )
-            // InternalOCLinEcore.g:13623:2: rule__ReferenceCS__Group_4__1__Impl
+            // InternalOCLinEcore.g:13624:1: ( rule__ReferenceCS__Group_4__1__Impl )
+            // InternalOCLinEcore.g:13625:2: rule__ReferenceCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_4__1__Impl();
@@ -42598,23 +42598,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:13629:1: rule__ReferenceCS__Group_4__1__Impl : ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) ;
+    // InternalOCLinEcore.g:13631:1: rule__ReferenceCS__Group_4__1__Impl : ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) ;
     public final void rule__ReferenceCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13633:1: ( ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) )
-            // InternalOCLinEcore.g:13634:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
+            // InternalOCLinEcore.g:13635:1: ( ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) ) )
+            // InternalOCLinEcore.g:13636:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
             {
-            // InternalOCLinEcore.g:13634:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
-            // InternalOCLinEcore.g:13635:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
+            // InternalOCLinEcore.g:13636:1: ( ( rule__ReferenceCS__OwnedTypeAssignment_4_1 ) )
+            // InternalOCLinEcore.g:13637:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedTypeAssignment_4_1());
             }
-            // InternalOCLinEcore.g:13636:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
-            // InternalOCLinEcore.g:13636:2: rule__ReferenceCS__OwnedTypeAssignment_4_1
+            // InternalOCLinEcore.g:13638:1: ( rule__ReferenceCS__OwnedTypeAssignment_4_1 )
+            // InternalOCLinEcore.g:13638:2: rule__ReferenceCS__OwnedTypeAssignment_4_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__OwnedTypeAssignment_4_1();
@@ -42649,14 +42649,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_5__0"
-    // InternalOCLinEcore.g:13650:1: rule__ReferenceCS__Group_5__0 : rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 ;
+    // InternalOCLinEcore.g:13652:1: rule__ReferenceCS__Group_5__0 : rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 ;
     public final void rule__ReferenceCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13654:1: ( rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 )
-            // InternalOCLinEcore.g:13655:2: rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1
+            // InternalOCLinEcore.g:13656:1: ( rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1 )
+            // InternalOCLinEcore.g:13657:2: rule__ReferenceCS__Group_5__0__Impl rule__ReferenceCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__ReferenceCS__Group_5__0__Impl();
@@ -42687,17 +42687,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_5__0__Impl"
-    // InternalOCLinEcore.g:13662:1: rule__ReferenceCS__Group_5__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:13664:1: rule__ReferenceCS__Group_5__0__Impl : ( '=' ) ;
     public final void rule__ReferenceCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13666:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:13667:1: ( '=' )
+            // InternalOCLinEcore.g:13668:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:13669:1: ( '=' )
             {
-            // InternalOCLinEcore.g:13667:1: ( '=' )
-            // InternalOCLinEcore.g:13668:1: '='
+            // InternalOCLinEcore.g:13669:1: ( '=' )
+            // InternalOCLinEcore.g:13670:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());
@@ -42728,14 +42728,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_5__1"
-    // InternalOCLinEcore.g:13681:1: rule__ReferenceCS__Group_5__1 : rule__ReferenceCS__Group_5__1__Impl ;
+    // InternalOCLinEcore.g:13683:1: rule__ReferenceCS__Group_5__1 : rule__ReferenceCS__Group_5__1__Impl ;
     public final void rule__ReferenceCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13685:1: ( rule__ReferenceCS__Group_5__1__Impl )
-            // InternalOCLinEcore.g:13686:2: rule__ReferenceCS__Group_5__1__Impl
+            // InternalOCLinEcore.g:13687:1: ( rule__ReferenceCS__Group_5__1__Impl )
+            // InternalOCLinEcore.g:13688:2: rule__ReferenceCS__Group_5__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_5__1__Impl();
@@ -42761,23 +42761,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_5__1__Impl"
-    // InternalOCLinEcore.g:13692:1: rule__ReferenceCS__Group_5__1__Impl : ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) ;
+    // InternalOCLinEcore.g:13694:1: rule__ReferenceCS__Group_5__1__Impl : ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) ;
     public final void rule__ReferenceCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13696:1: ( ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) )
-            // InternalOCLinEcore.g:13697:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
+            // InternalOCLinEcore.g:13698:1: ( ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) ) )
+            // InternalOCLinEcore.g:13699:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
             {
-            // InternalOCLinEcore.g:13697:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
-            // InternalOCLinEcore.g:13698:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
+            // InternalOCLinEcore.g:13699:1: ( ( rule__ReferenceCS__DefaultAssignment_5_1 ) )
+            // InternalOCLinEcore.g:13700:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getDefaultAssignment_5_1());
             }
-            // InternalOCLinEcore.g:13699:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
-            // InternalOCLinEcore.g:13699:2: rule__ReferenceCS__DefaultAssignment_5_1
+            // InternalOCLinEcore.g:13701:1: ( rule__ReferenceCS__DefaultAssignment_5_1 )
+            // InternalOCLinEcore.g:13701:2: rule__ReferenceCS__DefaultAssignment_5_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__DefaultAssignment_5_1();
@@ -42812,14 +42812,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6__0"
-    // InternalOCLinEcore.g:13713:1: rule__ReferenceCS__Group_6__0 : rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 ;
+    // InternalOCLinEcore.g:13715:1: rule__ReferenceCS__Group_6__0 : rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 ;
     public final void rule__ReferenceCS__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13717:1: ( rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 )
-            // InternalOCLinEcore.g:13718:2: rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1
+            // InternalOCLinEcore.g:13719:1: ( rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1 )
+            // InternalOCLinEcore.g:13720:2: rule__ReferenceCS__Group_6__0__Impl rule__ReferenceCS__Group_6__1
             {
             pushFollow(FollowSets000.FOLLOW_69);
             rule__ReferenceCS__Group_6__0__Impl();
@@ -42850,17 +42850,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6__0__Impl"
-    // InternalOCLinEcore.g:13725:1: rule__ReferenceCS__Group_6__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:13727:1: rule__ReferenceCS__Group_6__0__Impl : ( '{' ) ;
     public final void rule__ReferenceCS__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13729:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:13730:1: ( '{' )
+            // InternalOCLinEcore.g:13731:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:13732:1: ( '{' )
             {
-            // InternalOCLinEcore.g:13730:1: ( '{' )
-            // InternalOCLinEcore.g:13731:1: '{'
+            // InternalOCLinEcore.g:13732:1: ( '{' )
+            // InternalOCLinEcore.g:13733:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());
@@ -42891,14 +42891,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6__1"
-    // InternalOCLinEcore.g:13744:1: rule__ReferenceCS__Group_6__1 : rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 ;
+    // InternalOCLinEcore.g:13746:1: rule__ReferenceCS__Group_6__1 : rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 ;
     public final void rule__ReferenceCS__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13748:1: ( rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 )
-            // InternalOCLinEcore.g:13749:2: rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2
+            // InternalOCLinEcore.g:13750:1: ( rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2 )
+            // InternalOCLinEcore.g:13751:2: rule__ReferenceCS__Group_6__1__Impl rule__ReferenceCS__Group_6__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__ReferenceCS__Group_6__1__Impl();
@@ -42929,26 +42929,26 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6__1__Impl"
-    // InternalOCLinEcore.g:13756:1: rule__ReferenceCS__Group_6__1__Impl : ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) ;
+    // InternalOCLinEcore.g:13758:1: rule__ReferenceCS__Group_6__1__Impl : ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) ;
     public final void rule__ReferenceCS__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13760:1: ( ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) )
-            // InternalOCLinEcore.g:13761:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
+            // InternalOCLinEcore.g:13762:1: ( ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) ) )
+            // InternalOCLinEcore.g:13763:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
             {
-            // InternalOCLinEcore.g:13761:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
-            // InternalOCLinEcore.g:13762:1: ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* )
+            // InternalOCLinEcore.g:13763:1: ( ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* ) )
+            // InternalOCLinEcore.g:13764:1: ( ( rule__ReferenceCS__Group_6_1__0 ) ) ( ( rule__ReferenceCS__Group_6_1__0 )* )
             {
-            // InternalOCLinEcore.g:13762:1: ( ( rule__ReferenceCS__Group_6_1__0 ) )
-            // InternalOCLinEcore.g:13763:1: ( rule__ReferenceCS__Group_6_1__0 )
+            // InternalOCLinEcore.g:13764:1: ( ( rule__ReferenceCS__Group_6_1__0 ) )
+            // InternalOCLinEcore.g:13765:1: ( rule__ReferenceCS__Group_6_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_6_1());
             }
-            // InternalOCLinEcore.g:13764:1: ( rule__ReferenceCS__Group_6_1__0 )
-            // InternalOCLinEcore.g:13764:2: rule__ReferenceCS__Group_6_1__0
+            // InternalOCLinEcore.g:13766:1: ( rule__ReferenceCS__Group_6_1__0 )
+            // InternalOCLinEcore.g:13766:2: rule__ReferenceCS__Group_6_1__0
             {
             pushFollow(FollowSets000.FOLLOW_70);
             rule__ReferenceCS__Group_6_1__0();
@@ -42964,13 +42964,13 @@
 
             }
 
-            // InternalOCLinEcore.g:13767:1: ( ( rule__ReferenceCS__Group_6_1__0 )* )
-            // InternalOCLinEcore.g:13768:1: ( rule__ReferenceCS__Group_6_1__0 )*
+            // InternalOCLinEcore.g:13769:1: ( ( rule__ReferenceCS__Group_6_1__0 )* )
+            // InternalOCLinEcore.g:13770:1: ( rule__ReferenceCS__Group_6_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_6_1());
             }
-            // InternalOCLinEcore.g:13769:1: ( rule__ReferenceCS__Group_6_1__0 )*
+            // InternalOCLinEcore.g:13771:1: ( rule__ReferenceCS__Group_6_1__0 )*
             loop161:
             do {
                 int alt161=2;
@@ -42983,7 +42983,7 @@
 
                 switch (alt161) {
             	case 1 :
-            	    // InternalOCLinEcore.g:13769:2: rule__ReferenceCS__Group_6_1__0
+            	    // InternalOCLinEcore.g:13771:2: rule__ReferenceCS__Group_6_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_70);
             	    rule__ReferenceCS__Group_6_1__0();
@@ -43027,14 +43027,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6__2"
-    // InternalOCLinEcore.g:13780:1: rule__ReferenceCS__Group_6__2 : rule__ReferenceCS__Group_6__2__Impl ;
+    // InternalOCLinEcore.g:13782:1: rule__ReferenceCS__Group_6__2 : rule__ReferenceCS__Group_6__2__Impl ;
     public final void rule__ReferenceCS__Group_6__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13784:1: ( rule__ReferenceCS__Group_6__2__Impl )
-            // InternalOCLinEcore.g:13785:2: rule__ReferenceCS__Group_6__2__Impl
+            // InternalOCLinEcore.g:13786:1: ( rule__ReferenceCS__Group_6__2__Impl )
+            // InternalOCLinEcore.g:13787:2: rule__ReferenceCS__Group_6__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_6__2__Impl();
@@ -43060,17 +43060,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6__2__Impl"
-    // InternalOCLinEcore.g:13791:1: rule__ReferenceCS__Group_6__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:13793:1: rule__ReferenceCS__Group_6__2__Impl : ( '}' ) ;
     public final void rule__ReferenceCS__Group_6__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13795:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:13796:1: ( '}' )
+            // InternalOCLinEcore.g:13797:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:13798:1: ( '}' )
             {
-            // InternalOCLinEcore.g:13796:1: ( '}' )
-            // InternalOCLinEcore.g:13797:1: '}'
+            // InternalOCLinEcore.g:13798:1: ( '}' )
+            // InternalOCLinEcore.g:13799:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());
@@ -43101,14 +43101,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6_1__0"
-    // InternalOCLinEcore.g:13816:1: rule__ReferenceCS__Group_6_1__0 : rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 ;
+    // InternalOCLinEcore.g:13818:1: rule__ReferenceCS__Group_6_1__0 : rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 ;
     public final void rule__ReferenceCS__Group_6_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13820:1: ( rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 )
-            // InternalOCLinEcore.g:13821:2: rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1
+            // InternalOCLinEcore.g:13822:1: ( rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1 )
+            // InternalOCLinEcore.g:13823:2: rule__ReferenceCS__Group_6_1__0__Impl rule__ReferenceCS__Group_6_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__ReferenceCS__Group_6_1__0__Impl();
@@ -43139,23 +43139,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6_1__0__Impl"
-    // InternalOCLinEcore.g:13828:1: rule__ReferenceCS__Group_6_1__0__Impl : ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) ;
+    // InternalOCLinEcore.g:13830:1: rule__ReferenceCS__Group_6_1__0__Impl : ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) ;
     public final void rule__ReferenceCS__Group_6_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13832:1: ( ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) )
-            // InternalOCLinEcore.g:13833:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
+            // InternalOCLinEcore.g:13834:1: ( ( ( rule__ReferenceCS__Alternatives_6_1_0 ) ) )
+            // InternalOCLinEcore.g:13835:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
             {
-            // InternalOCLinEcore.g:13833:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
-            // InternalOCLinEcore.g:13834:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
+            // InternalOCLinEcore.g:13835:1: ( ( rule__ReferenceCS__Alternatives_6_1_0 ) )
+            // InternalOCLinEcore.g:13836:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getAlternatives_6_1_0());
             }
-            // InternalOCLinEcore.g:13835:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
-            // InternalOCLinEcore.g:13835:2: rule__ReferenceCS__Alternatives_6_1_0
+            // InternalOCLinEcore.g:13837:1: ( rule__ReferenceCS__Alternatives_6_1_0 )
+            // InternalOCLinEcore.g:13837:2: rule__ReferenceCS__Alternatives_6_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Alternatives_6_1_0();
@@ -43190,14 +43190,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6_1__1"
-    // InternalOCLinEcore.g:13845:1: rule__ReferenceCS__Group_6_1__1 : rule__ReferenceCS__Group_6_1__1__Impl ;
+    // InternalOCLinEcore.g:13847:1: rule__ReferenceCS__Group_6_1__1 : rule__ReferenceCS__Group_6_1__1__Impl ;
     public final void rule__ReferenceCS__Group_6_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13849:1: ( rule__ReferenceCS__Group_6_1__1__Impl )
-            // InternalOCLinEcore.g:13850:2: rule__ReferenceCS__Group_6_1__1__Impl
+            // InternalOCLinEcore.g:13851:1: ( rule__ReferenceCS__Group_6_1__1__Impl )
+            // InternalOCLinEcore.g:13852:2: rule__ReferenceCS__Group_6_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_6_1__1__Impl();
@@ -43223,22 +43223,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_6_1__1__Impl"
-    // InternalOCLinEcore.g:13856:1: rule__ReferenceCS__Group_6_1__1__Impl : ( ( ',' )? ) ;
+    // InternalOCLinEcore.g:13858:1: rule__ReferenceCS__Group_6_1__1__Impl : ( ( ',' )? ) ;
     public final void rule__ReferenceCS__Group_6_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13860:1: ( ( ( ',' )? ) )
-            // InternalOCLinEcore.g:13861:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:13862:1: ( ( ( ',' )? ) )
+            // InternalOCLinEcore.g:13863:1: ( ( ',' )? )
             {
-            // InternalOCLinEcore.g:13861:1: ( ( ',' )? )
-            // InternalOCLinEcore.g:13862:1: ( ',' )?
+            // InternalOCLinEcore.g:13863:1: ( ( ',' )? )
+            // InternalOCLinEcore.g:13864:1: ( ',' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());
             }
-            // InternalOCLinEcore.g:13863:1: ( ',' )?
+            // InternalOCLinEcore.g:13865:1: ( ',' )?
             int alt162=2;
             int LA162_0 = input.LA(1);
 
@@ -43247,7 +43247,7 @@
             }
             switch (alt162) {
                 case 1 :
-                    // InternalOCLinEcore.g:13864:2: ','
+                    // InternalOCLinEcore.g:13866:2: ','
                     {
                     match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
 
@@ -43281,14 +43281,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0__0"
-    // InternalOCLinEcore.g:13879:1: rule__ReferenceCS__Group_7_0__0 : rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 ;
+    // InternalOCLinEcore.g:13881:1: rule__ReferenceCS__Group_7_0__0 : rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 ;
     public final void rule__ReferenceCS__Group_7_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13883:1: ( rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 )
-            // InternalOCLinEcore.g:13884:2: rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1
+            // InternalOCLinEcore.g:13885:1: ( rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1 )
+            // InternalOCLinEcore.g:13886:2: rule__ReferenceCS__Group_7_0__0__Impl rule__ReferenceCS__Group_7_0__1
             {
             pushFollow(FollowSets000.FOLLOW_71);
             rule__ReferenceCS__Group_7_0__0__Impl();
@@ -43319,17 +43319,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0__0__Impl"
-    // InternalOCLinEcore.g:13891:1: rule__ReferenceCS__Group_7_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:13893:1: rule__ReferenceCS__Group_7_0__0__Impl : ( '{' ) ;
     public final void rule__ReferenceCS__Group_7_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13895:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:13896:1: ( '{' )
+            // InternalOCLinEcore.g:13897:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:13898:1: ( '{' )
             {
-            // InternalOCLinEcore.g:13896:1: ( '{' )
-            // InternalOCLinEcore.g:13897:1: '{'
+            // InternalOCLinEcore.g:13898:1: ( '{' )
+            // InternalOCLinEcore.g:13899:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());
@@ -43360,14 +43360,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0__1"
-    // InternalOCLinEcore.g:13910:1: rule__ReferenceCS__Group_7_0__1 : rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 ;
+    // InternalOCLinEcore.g:13912:1: rule__ReferenceCS__Group_7_0__1 : rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 ;
     public final void rule__ReferenceCS__Group_7_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13914:1: ( rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 )
-            // InternalOCLinEcore.g:13915:2: rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2
+            // InternalOCLinEcore.g:13916:1: ( rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2 )
+            // InternalOCLinEcore.g:13917:2: rule__ReferenceCS__Group_7_0__1__Impl rule__ReferenceCS__Group_7_0__2
             {
             pushFollow(FollowSets000.FOLLOW_71);
             rule__ReferenceCS__Group_7_0__1__Impl();
@@ -43398,22 +43398,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0__1__Impl"
-    // InternalOCLinEcore.g:13922:1: rule__ReferenceCS__Group_7_0__1__Impl : ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) ;
+    // InternalOCLinEcore.g:13924:1: rule__ReferenceCS__Group_7_0__1__Impl : ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) ;
     public final void rule__ReferenceCS__Group_7_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13926:1: ( ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) )
-            // InternalOCLinEcore.g:13927:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
+            // InternalOCLinEcore.g:13928:1: ( ( ( rule__ReferenceCS__Alternatives_7_0_1 )* ) )
+            // InternalOCLinEcore.g:13929:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
             {
-            // InternalOCLinEcore.g:13927:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
-            // InternalOCLinEcore.g:13928:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
+            // InternalOCLinEcore.g:13929:1: ( ( rule__ReferenceCS__Alternatives_7_0_1 )* )
+            // InternalOCLinEcore.g:13930:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getAlternatives_7_0_1());
             }
-            // InternalOCLinEcore.g:13929:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
+            // InternalOCLinEcore.g:13931:1: ( rule__ReferenceCS__Alternatives_7_0_1 )*
             loop163:
             do {
                 int alt163=2;
@@ -43426,7 +43426,7 @@
 
                 switch (alt163) {
             	case 1 :
-            	    // InternalOCLinEcore.g:13929:2: rule__ReferenceCS__Alternatives_7_0_1
+            	    // InternalOCLinEcore.g:13931:2: rule__ReferenceCS__Alternatives_7_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_72);
             	    rule__ReferenceCS__Alternatives_7_0_1();
@@ -43467,14 +43467,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0__2"
-    // InternalOCLinEcore.g:13939:1: rule__ReferenceCS__Group_7_0__2 : rule__ReferenceCS__Group_7_0__2__Impl ;
+    // InternalOCLinEcore.g:13941:1: rule__ReferenceCS__Group_7_0__2 : rule__ReferenceCS__Group_7_0__2__Impl ;
     public final void rule__ReferenceCS__Group_7_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13943:1: ( rule__ReferenceCS__Group_7_0__2__Impl )
-            // InternalOCLinEcore.g:13944:2: rule__ReferenceCS__Group_7_0__2__Impl
+            // InternalOCLinEcore.g:13945:1: ( rule__ReferenceCS__Group_7_0__2__Impl )
+            // InternalOCLinEcore.g:13946:2: rule__ReferenceCS__Group_7_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_7_0__2__Impl();
@@ -43500,17 +43500,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0__2__Impl"
-    // InternalOCLinEcore.g:13950:1: rule__ReferenceCS__Group_7_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:13952:1: rule__ReferenceCS__Group_7_0__2__Impl : ( '}' ) ;
     public final void rule__ReferenceCS__Group_7_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13954:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:13955:1: ( '}' )
+            // InternalOCLinEcore.g:13956:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:13957:1: ( '}' )
             {
-            // InternalOCLinEcore.g:13955:1: ( '}' )
-            // InternalOCLinEcore.g:13956:1: '}'
+            // InternalOCLinEcore.g:13957:1: ( '}' )
+            // InternalOCLinEcore.g:13958:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());
@@ -43541,14 +43541,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__0"
-    // InternalOCLinEcore.g:13975:1: rule__ReferenceCS__Group_7_0_1_1__0 : rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 ;
+    // InternalOCLinEcore.g:13977:1: rule__ReferenceCS__Group_7_0_1_1__0 : rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 ;
     public final void rule__ReferenceCS__Group_7_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13979:1: ( rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 )
-            // InternalOCLinEcore.g:13980:2: rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1
+            // InternalOCLinEcore.g:13981:1: ( rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1 )
+            // InternalOCLinEcore.g:13982:2: rule__ReferenceCS__Group_7_0_1_1__0__Impl rule__ReferenceCS__Group_7_0_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ReferenceCS__Group_7_0_1_1__0__Impl();
@@ -43579,17 +43579,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__0__Impl"
-    // InternalOCLinEcore.g:13987:1: rule__ReferenceCS__Group_7_0_1_1__0__Impl : ( 'key' ) ;
+    // InternalOCLinEcore.g:13989:1: rule__ReferenceCS__Group_7_0_1_1__0__Impl : ( 'key' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:13991:1: ( ( 'key' ) )
-            // InternalOCLinEcore.g:13992:1: ( 'key' )
+            // InternalOCLinEcore.g:13993:1: ( ( 'key' ) )
+            // InternalOCLinEcore.g:13994:1: ( 'key' )
             {
-            // InternalOCLinEcore.g:13992:1: ( 'key' )
-            // InternalOCLinEcore.g:13993:1: 'key'
+            // InternalOCLinEcore.g:13994:1: ( 'key' )
+            // InternalOCLinEcore.g:13995:1: 'key'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getKeyKeyword_7_0_1_1_0());
@@ -43620,14 +43620,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__1"
-    // InternalOCLinEcore.g:14006:1: rule__ReferenceCS__Group_7_0_1_1__1 : rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 ;
+    // InternalOCLinEcore.g:14008:1: rule__ReferenceCS__Group_7_0_1_1__1 : rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 ;
     public final void rule__ReferenceCS__Group_7_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14010:1: ( rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 )
-            // InternalOCLinEcore.g:14011:2: rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2
+            // InternalOCLinEcore.g:14012:1: ( rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2 )
+            // InternalOCLinEcore.g:14013:2: rule__ReferenceCS__Group_7_0_1_1__1__Impl rule__ReferenceCS__Group_7_0_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_73);
             rule__ReferenceCS__Group_7_0_1_1__1__Impl();
@@ -43658,23 +43658,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__1__Impl"
-    // InternalOCLinEcore.g:14018:1: rule__ReferenceCS__Group_7_0_1_1__1__Impl : ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:14020:1: rule__ReferenceCS__Group_7_0_1_1__1__Impl : ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) ;
     public final void rule__ReferenceCS__Group_7_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14022:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) )
-            // InternalOCLinEcore.g:14023:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
+            // InternalOCLinEcore.g:14024:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) ) )
+            // InternalOCLinEcore.g:14025:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:14023:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
-            // InternalOCLinEcore.g:14024:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
+            // InternalOCLinEcore.g:14025:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 ) )
+            // InternalOCLinEcore.g:14026:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_1());
             }
-            // InternalOCLinEcore.g:14025:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
-            // InternalOCLinEcore.g:14025:2: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1
+            // InternalOCLinEcore.g:14027:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 )
+            // InternalOCLinEcore.g:14027:2: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1();
@@ -43709,14 +43709,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__2"
-    // InternalOCLinEcore.g:14035:1: rule__ReferenceCS__Group_7_0_1_1__2 : rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 ;
+    // InternalOCLinEcore.g:14037:1: rule__ReferenceCS__Group_7_0_1_1__2 : rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 ;
     public final void rule__ReferenceCS__Group_7_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14039:1: ( rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 )
-            // InternalOCLinEcore.g:14040:2: rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3
+            // InternalOCLinEcore.g:14041:1: ( rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3 )
+            // InternalOCLinEcore.g:14042:2: rule__ReferenceCS__Group_7_0_1_1__2__Impl rule__ReferenceCS__Group_7_0_1_1__3
             {
             pushFollow(FollowSets000.FOLLOW_73);
             rule__ReferenceCS__Group_7_0_1_1__2__Impl();
@@ -43747,22 +43747,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__2__Impl"
-    // InternalOCLinEcore.g:14047:1: rule__ReferenceCS__Group_7_0_1_1__2__Impl : ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) ;
+    // InternalOCLinEcore.g:14049:1: rule__ReferenceCS__Group_7_0_1_1__2__Impl : ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) ;
     public final void rule__ReferenceCS__Group_7_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14051:1: ( ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) )
-            // InternalOCLinEcore.g:14052:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
+            // InternalOCLinEcore.g:14053:1: ( ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* ) )
+            // InternalOCLinEcore.g:14054:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
             {
-            // InternalOCLinEcore.g:14052:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
-            // InternalOCLinEcore.g:14053:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
+            // InternalOCLinEcore.g:14054:1: ( ( rule__ReferenceCS__Group_7_0_1_1_2__0 )* )
+            // InternalOCLinEcore.g:14055:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getGroup_7_0_1_1_2());
             }
-            // InternalOCLinEcore.g:14054:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
+            // InternalOCLinEcore.g:14056:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0 )*
             loop164:
             do {
                 int alt164=2;
@@ -43775,7 +43775,7 @@
 
                 switch (alt164) {
             	case 1 :
-            	    // InternalOCLinEcore.g:14054:2: rule__ReferenceCS__Group_7_0_1_1_2__0
+            	    // InternalOCLinEcore.g:14056:2: rule__ReferenceCS__Group_7_0_1_1_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__ReferenceCS__Group_7_0_1_1_2__0();
@@ -43816,14 +43816,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__3"
-    // InternalOCLinEcore.g:14064:1: rule__ReferenceCS__Group_7_0_1_1__3 : rule__ReferenceCS__Group_7_0_1_1__3__Impl ;
+    // InternalOCLinEcore.g:14066:1: rule__ReferenceCS__Group_7_0_1_1__3 : rule__ReferenceCS__Group_7_0_1_1__3__Impl ;
     public final void rule__ReferenceCS__Group_7_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14068:1: ( rule__ReferenceCS__Group_7_0_1_1__3__Impl )
-            // InternalOCLinEcore.g:14069:2: rule__ReferenceCS__Group_7_0_1_1__3__Impl
+            // InternalOCLinEcore.g:14070:1: ( rule__ReferenceCS__Group_7_0_1_1__3__Impl )
+            // InternalOCLinEcore.g:14071:2: rule__ReferenceCS__Group_7_0_1_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_7_0_1_1__3__Impl();
@@ -43849,17 +43849,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1__3__Impl"
-    // InternalOCLinEcore.g:14075:1: rule__ReferenceCS__Group_7_0_1_1__3__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:14077:1: rule__ReferenceCS__Group_7_0_1_1__3__Impl : ( ';' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14079:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:14080:1: ( ';' )
+            // InternalOCLinEcore.g:14081:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:14082:1: ( ';' )
             {
-            // InternalOCLinEcore.g:14080:1: ( ';' )
-            // InternalOCLinEcore.g:14081:1: ';'
+            // InternalOCLinEcore.g:14082:1: ( ';' )
+            // InternalOCLinEcore.g:14083:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_1_3());
@@ -43890,14 +43890,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__0"
-    // InternalOCLinEcore.g:14102:1: rule__ReferenceCS__Group_7_0_1_1_2__0 : rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 ;
+    // InternalOCLinEcore.g:14104:1: rule__ReferenceCS__Group_7_0_1_1_2__0 : rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 ;
     public final void rule__ReferenceCS__Group_7_0_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14106:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 )
-            // InternalOCLinEcore.g:14107:2: rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1
+            // InternalOCLinEcore.g:14108:1: ( rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1 )
+            // InternalOCLinEcore.g:14109:2: rule__ReferenceCS__Group_7_0_1_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__ReferenceCS__Group_7_0_1_1_2__0__Impl();
@@ -43928,17 +43928,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__0__Impl"
-    // InternalOCLinEcore.g:14114:1: rule__ReferenceCS__Group_7_0_1_1_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:14116:1: rule__ReferenceCS__Group_7_0_1_1_2__0__Impl : ( ',' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14118:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:14119:1: ( ',' )
+            // InternalOCLinEcore.g:14120:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:14121:1: ( ',' )
             {
-            // InternalOCLinEcore.g:14119:1: ( ',' )
-            // InternalOCLinEcore.g:14120:1: ','
+            // InternalOCLinEcore.g:14121:1: ( ',' )
+            // InternalOCLinEcore.g:14122:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getCommaKeyword_7_0_1_1_2_0());
@@ -43969,14 +43969,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__1"
-    // InternalOCLinEcore.g:14133:1: rule__ReferenceCS__Group_7_0_1_1_2__1 : rule__ReferenceCS__Group_7_0_1_1_2__1__Impl ;
+    // InternalOCLinEcore.g:14135:1: rule__ReferenceCS__Group_7_0_1_1_2__1 : rule__ReferenceCS__Group_7_0_1_1_2__1__Impl ;
     public final void rule__ReferenceCS__Group_7_0_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14137:1: ( rule__ReferenceCS__Group_7_0_1_1_2__1__Impl )
-            // InternalOCLinEcore.g:14138:2: rule__ReferenceCS__Group_7_0_1_1_2__1__Impl
+            // InternalOCLinEcore.g:14139:1: ( rule__ReferenceCS__Group_7_0_1_1_2__1__Impl )
+            // InternalOCLinEcore.g:14140:2: rule__ReferenceCS__Group_7_0_1_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_7_0_1_1_2__1__Impl();
@@ -44002,23 +44002,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_1_2__1__Impl"
-    // InternalOCLinEcore.g:14144:1: rule__ReferenceCS__Group_7_0_1_1_2__1__Impl : ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) ;
+    // InternalOCLinEcore.g:14146:1: rule__ReferenceCS__Group_7_0_1_1_2__1__Impl : ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) ;
     public final void rule__ReferenceCS__Group_7_0_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14148:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) )
-            // InternalOCLinEcore.g:14149:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
+            // InternalOCLinEcore.g:14150:1: ( ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) ) )
+            // InternalOCLinEcore.g:14151:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
             {
-            // InternalOCLinEcore.g:14149:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
-            // InternalOCLinEcore.g:14150:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
+            // InternalOCLinEcore.g:14151:1: ( ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 ) )
+            // InternalOCLinEcore.g:14152:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredKeysAssignment_7_0_1_1_2_1());
             }
-            // InternalOCLinEcore.g:14151:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
-            // InternalOCLinEcore.g:14151:2: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1
+            // InternalOCLinEcore.g:14153:1: ( rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 )
+            // InternalOCLinEcore.g:14153:2: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1();
@@ -44053,14 +44053,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__0"
-    // InternalOCLinEcore.g:14165:1: rule__ReferenceCS__Group_7_0_1_2__0 : rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 ;
+    // InternalOCLinEcore.g:14167:1: rule__ReferenceCS__Group_7_0_1_2__0 : rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 ;
     public final void rule__ReferenceCS__Group_7_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14169:1: ( rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 )
-            // InternalOCLinEcore.g:14170:2: rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1
+            // InternalOCLinEcore.g:14171:1: ( rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1 )
+            // InternalOCLinEcore.g:14172:2: rule__ReferenceCS__Group_7_0_1_2__0__Impl rule__ReferenceCS__Group_7_0_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__ReferenceCS__Group_7_0_1_2__0__Impl();
@@ -44091,17 +44091,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__0__Impl"
-    // InternalOCLinEcore.g:14177:1: rule__ReferenceCS__Group_7_0_1_2__0__Impl : ( 'initial' ) ;
+    // InternalOCLinEcore.g:14179:1: rule__ReferenceCS__Group_7_0_1_2__0__Impl : ( 'initial' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14181:1: ( ( 'initial' ) )
-            // InternalOCLinEcore.g:14182:1: ( 'initial' )
+            // InternalOCLinEcore.g:14183:1: ( ( 'initial' ) )
+            // InternalOCLinEcore.g:14184:1: ( 'initial' )
             {
-            // InternalOCLinEcore.g:14182:1: ( 'initial' )
-            // InternalOCLinEcore.g:14183:1: 'initial'
+            // InternalOCLinEcore.g:14184:1: ( 'initial' )
+            // InternalOCLinEcore.g:14185:1: 'initial'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getInitialKeyword_7_0_1_2_0());
@@ -44132,14 +44132,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__1"
-    // InternalOCLinEcore.g:14196:1: rule__ReferenceCS__Group_7_0_1_2__1 : rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 ;
+    // InternalOCLinEcore.g:14198:1: rule__ReferenceCS__Group_7_0_1_2__1 : rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 ;
     public final void rule__ReferenceCS__Group_7_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14200:1: ( rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 )
-            // InternalOCLinEcore.g:14201:2: rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2
+            // InternalOCLinEcore.g:14202:1: ( rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2 )
+            // InternalOCLinEcore.g:14203:2: rule__ReferenceCS__Group_7_0_1_2__1__Impl rule__ReferenceCS__Group_7_0_1_2__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__ReferenceCS__Group_7_0_1_2__1__Impl();
@@ -44170,22 +44170,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__1__Impl"
-    // InternalOCLinEcore.g:14208:1: rule__ReferenceCS__Group_7_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalOCLinEcore.g:14210:1: rule__ReferenceCS__Group_7_0_1_2__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__ReferenceCS__Group_7_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14212:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalOCLinEcore.g:14213:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:14214:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalOCLinEcore.g:14215:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalOCLinEcore.g:14213:1: ( ( ruleUnrestrictedName )? )
-            // InternalOCLinEcore.g:14214:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:14215:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:14216:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_2_1());
             }
-            // InternalOCLinEcore.g:14215:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:14217:1: ( ruleUnrestrictedName )?
             int alt165=2;
             int LA165_0 = input.LA(1);
 
@@ -44194,7 +44194,7 @@
             }
             switch (alt165) {
                 case 1 :
-                    // InternalOCLinEcore.g:14215:3: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:14217:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -44232,14 +44232,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__2"
-    // InternalOCLinEcore.g:14225:1: rule__ReferenceCS__Group_7_0_1_2__2 : rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 ;
+    // InternalOCLinEcore.g:14227:1: rule__ReferenceCS__Group_7_0_1_2__2 : rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 ;
     public final void rule__ReferenceCS__Group_7_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14229:1: ( rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 )
-            // InternalOCLinEcore.g:14230:2: rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3
+            // InternalOCLinEcore.g:14231:1: ( rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3 )
+            // InternalOCLinEcore.g:14232:2: rule__ReferenceCS__Group_7_0_1_2__2__Impl rule__ReferenceCS__Group_7_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__ReferenceCS__Group_7_0_1_2__2__Impl();
@@ -44270,17 +44270,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__2__Impl"
-    // InternalOCLinEcore.g:14237:1: rule__ReferenceCS__Group_7_0_1_2__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:14239:1: rule__ReferenceCS__Group_7_0_1_2__2__Impl : ( ':' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14241:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:14242:1: ( ':' )
+            // InternalOCLinEcore.g:14243:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:14244:1: ( ':' )
             {
-            // InternalOCLinEcore.g:14242:1: ( ':' )
-            // InternalOCLinEcore.g:14243:1: ':'
+            // InternalOCLinEcore.g:14244:1: ( ':' )
+            // InternalOCLinEcore.g:14245:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_2_2());
@@ -44311,14 +44311,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__3"
-    // InternalOCLinEcore.g:14256:1: rule__ReferenceCS__Group_7_0_1_2__3 : rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 ;
+    // InternalOCLinEcore.g:14258:1: rule__ReferenceCS__Group_7_0_1_2__3 : rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 ;
     public final void rule__ReferenceCS__Group_7_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14260:1: ( rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 )
-            // InternalOCLinEcore.g:14261:2: rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4
+            // InternalOCLinEcore.g:14262:1: ( rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4 )
+            // InternalOCLinEcore.g:14263:2: rule__ReferenceCS__Group_7_0_1_2__3__Impl rule__ReferenceCS__Group_7_0_1_2__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__ReferenceCS__Group_7_0_1_2__3__Impl();
@@ -44349,22 +44349,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__3__Impl"
-    // InternalOCLinEcore.g:14268:1: rule__ReferenceCS__Group_7_0_1_2__3__Impl : ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) ;
+    // InternalOCLinEcore.g:14270:1: rule__ReferenceCS__Group_7_0_1_2__3__Impl : ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) ;
     public final void rule__ReferenceCS__Group_7_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14272:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) )
-            // InternalOCLinEcore.g:14273:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
+            // InternalOCLinEcore.g:14274:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? ) )
+            // InternalOCLinEcore.g:14275:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
             {
-            // InternalOCLinEcore.g:14273:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
-            // InternalOCLinEcore.g:14274:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
+            // InternalOCLinEcore.g:14275:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )? )
+            // InternalOCLinEcore.g:14276:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_2_3());
             }
-            // InternalOCLinEcore.g:14275:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
+            // InternalOCLinEcore.g:14277:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 )?
             int alt166=2;
             int LA166_0 = input.LA(1);
 
@@ -44373,7 +44373,7 @@
             }
             switch (alt166) {
                 case 1 :
-                    // InternalOCLinEcore.g:14275:2: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3
+                    // InternalOCLinEcore.g:14277:2: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3();
@@ -44411,14 +44411,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__4"
-    // InternalOCLinEcore.g:14285:1: rule__ReferenceCS__Group_7_0_1_2__4 : rule__ReferenceCS__Group_7_0_1_2__4__Impl ;
+    // InternalOCLinEcore.g:14287:1: rule__ReferenceCS__Group_7_0_1_2__4 : rule__ReferenceCS__Group_7_0_1_2__4__Impl ;
     public final void rule__ReferenceCS__Group_7_0_1_2__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14289:1: ( rule__ReferenceCS__Group_7_0_1_2__4__Impl )
-            // InternalOCLinEcore.g:14290:2: rule__ReferenceCS__Group_7_0_1_2__4__Impl
+            // InternalOCLinEcore.g:14291:1: ( rule__ReferenceCS__Group_7_0_1_2__4__Impl )
+            // InternalOCLinEcore.g:14292:2: rule__ReferenceCS__Group_7_0_1_2__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_7_0_1_2__4__Impl();
@@ -44444,17 +44444,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_2__4__Impl"
-    // InternalOCLinEcore.g:14296:1: rule__ReferenceCS__Group_7_0_1_2__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:14298:1: rule__ReferenceCS__Group_7_0_1_2__4__Impl : ( ';' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_2__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14300:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:14301:1: ( ';' )
+            // InternalOCLinEcore.g:14302:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:14303:1: ( ';' )
             {
-            // InternalOCLinEcore.g:14301:1: ( ';' )
-            // InternalOCLinEcore.g:14302:1: ';'
+            // InternalOCLinEcore.g:14303:1: ( ';' )
+            // InternalOCLinEcore.g:14304:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_2_4());
@@ -44485,14 +44485,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__0"
-    // InternalOCLinEcore.g:14325:1: rule__ReferenceCS__Group_7_0_1_3__0 : rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 ;
+    // InternalOCLinEcore.g:14327:1: rule__ReferenceCS__Group_7_0_1_3__0 : rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 ;
     public final void rule__ReferenceCS__Group_7_0_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14329:1: ( rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 )
-            // InternalOCLinEcore.g:14330:2: rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1
+            // InternalOCLinEcore.g:14331:1: ( rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1 )
+            // InternalOCLinEcore.g:14332:2: rule__ReferenceCS__Group_7_0_1_3__0__Impl rule__ReferenceCS__Group_7_0_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__ReferenceCS__Group_7_0_1_3__0__Impl();
@@ -44523,17 +44523,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__0__Impl"
-    // InternalOCLinEcore.g:14337:1: rule__ReferenceCS__Group_7_0_1_3__0__Impl : ( 'derivation' ) ;
+    // InternalOCLinEcore.g:14339:1: rule__ReferenceCS__Group_7_0_1_3__0__Impl : ( 'derivation' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14341:1: ( ( 'derivation' ) )
-            // InternalOCLinEcore.g:14342:1: ( 'derivation' )
+            // InternalOCLinEcore.g:14343:1: ( ( 'derivation' ) )
+            // InternalOCLinEcore.g:14344:1: ( 'derivation' )
             {
-            // InternalOCLinEcore.g:14342:1: ( 'derivation' )
-            // InternalOCLinEcore.g:14343:1: 'derivation'
+            // InternalOCLinEcore.g:14344:1: ( 'derivation' )
+            // InternalOCLinEcore.g:14345:1: 'derivation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getDerivationKeyword_7_0_1_3_0());
@@ -44564,14 +44564,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__1"
-    // InternalOCLinEcore.g:14356:1: rule__ReferenceCS__Group_7_0_1_3__1 : rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 ;
+    // InternalOCLinEcore.g:14358:1: rule__ReferenceCS__Group_7_0_1_3__1 : rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 ;
     public final void rule__ReferenceCS__Group_7_0_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14360:1: ( rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 )
-            // InternalOCLinEcore.g:14361:2: rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2
+            // InternalOCLinEcore.g:14362:1: ( rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2 )
+            // InternalOCLinEcore.g:14363:2: rule__ReferenceCS__Group_7_0_1_3__1__Impl rule__ReferenceCS__Group_7_0_1_3__2
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__ReferenceCS__Group_7_0_1_3__1__Impl();
@@ -44602,22 +44602,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__1__Impl"
-    // InternalOCLinEcore.g:14368:1: rule__ReferenceCS__Group_7_0_1_3__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalOCLinEcore.g:14370:1: rule__ReferenceCS__Group_7_0_1_3__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__ReferenceCS__Group_7_0_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14372:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalOCLinEcore.g:14373:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:14374:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalOCLinEcore.g:14375:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalOCLinEcore.g:14373:1: ( ( ruleUnrestrictedName )? )
-            // InternalOCLinEcore.g:14374:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:14375:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLinEcore.g:14376:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_3_1());
             }
-            // InternalOCLinEcore.g:14375:1: ( ruleUnrestrictedName )?
+            // InternalOCLinEcore.g:14377:1: ( ruleUnrestrictedName )?
             int alt167=2;
             int LA167_0 = input.LA(1);
 
@@ -44626,7 +44626,7 @@
             }
             switch (alt167) {
                 case 1 :
-                    // InternalOCLinEcore.g:14375:3: ruleUnrestrictedName
+                    // InternalOCLinEcore.g:14377:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -44664,14 +44664,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__2"
-    // InternalOCLinEcore.g:14385:1: rule__ReferenceCS__Group_7_0_1_3__2 : rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 ;
+    // InternalOCLinEcore.g:14387:1: rule__ReferenceCS__Group_7_0_1_3__2 : rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 ;
     public final void rule__ReferenceCS__Group_7_0_1_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14389:1: ( rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 )
-            // InternalOCLinEcore.g:14390:2: rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3
+            // InternalOCLinEcore.g:14391:1: ( rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3 )
+            // InternalOCLinEcore.g:14392:2: rule__ReferenceCS__Group_7_0_1_3__2__Impl rule__ReferenceCS__Group_7_0_1_3__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__ReferenceCS__Group_7_0_1_3__2__Impl();
@@ -44702,17 +44702,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__2__Impl"
-    // InternalOCLinEcore.g:14397:1: rule__ReferenceCS__Group_7_0_1_3__2__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:14399:1: rule__ReferenceCS__Group_7_0_1_3__2__Impl : ( ':' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14401:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:14402:1: ( ':' )
+            // InternalOCLinEcore.g:14403:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:14404:1: ( ':' )
             {
-            // InternalOCLinEcore.g:14402:1: ( ':' )
-            // InternalOCLinEcore.g:14403:1: ':'
+            // InternalOCLinEcore.g:14404:1: ( ':' )
+            // InternalOCLinEcore.g:14405:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_3_2());
@@ -44743,14 +44743,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__3"
-    // InternalOCLinEcore.g:14416:1: rule__ReferenceCS__Group_7_0_1_3__3 : rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 ;
+    // InternalOCLinEcore.g:14418:1: rule__ReferenceCS__Group_7_0_1_3__3 : rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 ;
     public final void rule__ReferenceCS__Group_7_0_1_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14420:1: ( rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 )
-            // InternalOCLinEcore.g:14421:2: rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4
+            // InternalOCLinEcore.g:14422:1: ( rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4 )
+            // InternalOCLinEcore.g:14423:2: rule__ReferenceCS__Group_7_0_1_3__3__Impl rule__ReferenceCS__Group_7_0_1_3__4
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__ReferenceCS__Group_7_0_1_3__3__Impl();
@@ -44781,22 +44781,22 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__3__Impl"
-    // InternalOCLinEcore.g:14428:1: rule__ReferenceCS__Group_7_0_1_3__3__Impl : ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) ;
+    // InternalOCLinEcore.g:14430:1: rule__ReferenceCS__Group_7_0_1_3__3__Impl : ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) ;
     public final void rule__ReferenceCS__Group_7_0_1_3__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14432:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) )
-            // InternalOCLinEcore.g:14433:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
+            // InternalOCLinEcore.g:14434:1: ( ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? ) )
+            // InternalOCLinEcore.g:14435:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
             {
-            // InternalOCLinEcore.g:14433:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
-            // InternalOCLinEcore.g:14434:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
+            // InternalOCLinEcore.g:14435:1: ( ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )? )
+            // InternalOCLinEcore.g:14436:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsAssignment_7_0_1_3_3());
             }
-            // InternalOCLinEcore.g:14435:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
+            // InternalOCLinEcore.g:14437:1: ( rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 )?
             int alt168=2;
             int LA168_0 = input.LA(1);
 
@@ -44805,7 +44805,7 @@
             }
             switch (alt168) {
                 case 1 :
-                    // InternalOCLinEcore.g:14435:2: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3
+                    // InternalOCLinEcore.g:14437:2: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3();
@@ -44843,14 +44843,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__4"
-    // InternalOCLinEcore.g:14445:1: rule__ReferenceCS__Group_7_0_1_3__4 : rule__ReferenceCS__Group_7_0_1_3__4__Impl ;
+    // InternalOCLinEcore.g:14447:1: rule__ReferenceCS__Group_7_0_1_3__4 : rule__ReferenceCS__Group_7_0_1_3__4__Impl ;
     public final void rule__ReferenceCS__Group_7_0_1_3__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14449:1: ( rule__ReferenceCS__Group_7_0_1_3__4__Impl )
-            // InternalOCLinEcore.g:14450:2: rule__ReferenceCS__Group_7_0_1_3__4__Impl
+            // InternalOCLinEcore.g:14451:1: ( rule__ReferenceCS__Group_7_0_1_3__4__Impl )
+            // InternalOCLinEcore.g:14452:2: rule__ReferenceCS__Group_7_0_1_3__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_7_0_1_3__4__Impl();
@@ -44876,17 +44876,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_3__4__Impl"
-    // InternalOCLinEcore.g:14456:1: rule__ReferenceCS__Group_7_0_1_3__4__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:14458:1: rule__ReferenceCS__Group_7_0_1_3__4__Impl : ( ';' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_3__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14460:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:14461:1: ( ';' )
+            // InternalOCLinEcore.g:14462:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:14463:1: ( ';' )
             {
-            // InternalOCLinEcore.g:14461:1: ( ';' )
-            // InternalOCLinEcore.g:14462:1: ';'
+            // InternalOCLinEcore.g:14463:1: ( ';' )
+            // InternalOCLinEcore.g:14464:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_3_4());
@@ -44917,14 +44917,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__0"
-    // InternalOCLinEcore.g:14485:1: rule__ReferenceCS__Group_7_0_1_4__0 : rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1 ;
+    // InternalOCLinEcore.g:14487:1: rule__ReferenceCS__Group_7_0_1_4__0 : rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1 ;
     public final void rule__ReferenceCS__Group_7_0_1_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14489:1: ( rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1 )
-            // InternalOCLinEcore.g:14490:2: rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1
+            // InternalOCLinEcore.g:14491:1: ( rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1 )
+            // InternalOCLinEcore.g:14492:2: rule__ReferenceCS__Group_7_0_1_4__0__Impl rule__ReferenceCS__Group_7_0_1_4__1
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__ReferenceCS__Group_7_0_1_4__0__Impl();
@@ -44955,23 +44955,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__0__Impl"
-    // InternalOCLinEcore.g:14497:1: rule__ReferenceCS__Group_7_0_1_4__0__Impl : ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) ) ;
+    // InternalOCLinEcore.g:14499:1: rule__ReferenceCS__Group_7_0_1_4__0__Impl : ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) ) ;
     public final void rule__ReferenceCS__Group_7_0_1_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14501:1: ( ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) ) )
-            // InternalOCLinEcore.g:14502:1: ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) )
+            // InternalOCLinEcore.g:14503:1: ( ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) ) )
+            // InternalOCLinEcore.g:14504:1: ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) )
             {
-            // InternalOCLinEcore.g:14502:1: ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) )
-            // InternalOCLinEcore.g:14503:1: ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 )
+            // InternalOCLinEcore.g:14504:1: ( ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 ) )
+            // InternalOCLinEcore.g:14505:1: ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesAssignment_7_0_1_4_0());
             }
-            // InternalOCLinEcore.g:14504:1: ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 )
-            // InternalOCLinEcore.g:14504:2: rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0
+            // InternalOCLinEcore.g:14506:1: ( rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 )
+            // InternalOCLinEcore.g:14506:2: rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0();
@@ -45006,14 +45006,14 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__1"
-    // InternalOCLinEcore.g:14514:1: rule__ReferenceCS__Group_7_0_1_4__1 : rule__ReferenceCS__Group_7_0_1_4__1__Impl ;
+    // InternalOCLinEcore.g:14516:1: rule__ReferenceCS__Group_7_0_1_4__1 : rule__ReferenceCS__Group_7_0_1_4__1__Impl ;
     public final void rule__ReferenceCS__Group_7_0_1_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14518:1: ( rule__ReferenceCS__Group_7_0_1_4__1__Impl )
-            // InternalOCLinEcore.g:14519:2: rule__ReferenceCS__Group_7_0_1_4__1__Impl
+            // InternalOCLinEcore.g:14520:1: ( rule__ReferenceCS__Group_7_0_1_4__1__Impl )
+            // InternalOCLinEcore.g:14521:2: rule__ReferenceCS__Group_7_0_1_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ReferenceCS__Group_7_0_1_4__1__Impl();
@@ -45039,17 +45039,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__Group_7_0_1_4__1__Impl"
-    // InternalOCLinEcore.g:14525:1: rule__ReferenceCS__Group_7_0_1_4__1__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:14527:1: rule__ReferenceCS__Group_7_0_1_4__1__Impl : ( ';' ) ;
     public final void rule__ReferenceCS__Group_7_0_1_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14529:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:14530:1: ( ';' )
+            // InternalOCLinEcore.g:14531:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:14532:1: ( ';' )
             {
-            // InternalOCLinEcore.g:14530:1: ( ';' )
-            // InternalOCLinEcore.g:14531:1: ';'
+            // InternalOCLinEcore.g:14532:1: ( ';' )
+            // InternalOCLinEcore.g:14533:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_4_1());
@@ -45080,14 +45080,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__0"
-    // InternalOCLinEcore.g:14548:1: rule__StructuredClassCS__Group__0 : rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 ;
+    // InternalOCLinEcore.g:14550:1: rule__StructuredClassCS__Group__0 : rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 ;
     public final void rule__StructuredClassCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14552:1: ( rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 )
-            // InternalOCLinEcore.g:14553:2: rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1
+            // InternalOCLinEcore.g:14554:1: ( rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1 )
+            // InternalOCLinEcore.g:14555:2: rule__StructuredClassCS__Group__0__Impl rule__StructuredClassCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_74);
             rule__StructuredClassCS__Group__0__Impl();
@@ -45118,22 +45118,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__0__Impl"
-    // InternalOCLinEcore.g:14560:1: rule__StructuredClassCS__Group__0__Impl : ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) ;
+    // InternalOCLinEcore.g:14562:1: rule__StructuredClassCS__Group__0__Impl : ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) ;
     public final void rule__StructuredClassCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14564:1: ( ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) )
-            // InternalOCLinEcore.g:14565:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
+            // InternalOCLinEcore.g:14566:1: ( ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? ) )
+            // InternalOCLinEcore.g:14567:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
             {
-            // InternalOCLinEcore.g:14565:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
-            // InternalOCLinEcore.g:14566:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
+            // InternalOCLinEcore.g:14567:1: ( ( rule__StructuredClassCS__IsAbstractAssignment_0 )? )
+            // InternalOCLinEcore.g:14568:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAssignment_0());
             }
-            // InternalOCLinEcore.g:14567:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
+            // InternalOCLinEcore.g:14569:1: ( rule__StructuredClassCS__IsAbstractAssignment_0 )?
             int alt169=2;
             int LA169_0 = input.LA(1);
 
@@ -45142,7 +45142,7 @@
             }
             switch (alt169) {
                 case 1 :
-                    // InternalOCLinEcore.g:14567:2: rule__StructuredClassCS__IsAbstractAssignment_0
+                    // InternalOCLinEcore.g:14569:2: rule__StructuredClassCS__IsAbstractAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__IsAbstractAssignment_0();
@@ -45180,14 +45180,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__1"
-    // InternalOCLinEcore.g:14577:1: rule__StructuredClassCS__Group__1 : rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 ;
+    // InternalOCLinEcore.g:14579:1: rule__StructuredClassCS__Group__1 : rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 ;
     public final void rule__StructuredClassCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14581:1: ( rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 )
-            // InternalOCLinEcore.g:14582:2: rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2
+            // InternalOCLinEcore.g:14583:1: ( rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2 )
+            // InternalOCLinEcore.g:14584:2: rule__StructuredClassCS__Group__1__Impl rule__StructuredClassCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__StructuredClassCS__Group__1__Impl();
@@ -45218,17 +45218,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__1__Impl"
-    // InternalOCLinEcore.g:14589:1: rule__StructuredClassCS__Group__1__Impl : ( 'class' ) ;
+    // InternalOCLinEcore.g:14591:1: rule__StructuredClassCS__Group__1__Impl : ( 'class' ) ;
     public final void rule__StructuredClassCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14593:1: ( ( 'class' ) )
-            // InternalOCLinEcore.g:14594:1: ( 'class' )
+            // InternalOCLinEcore.g:14595:1: ( ( 'class' ) )
+            // InternalOCLinEcore.g:14596:1: ( 'class' )
             {
-            // InternalOCLinEcore.g:14594:1: ( 'class' )
-            // InternalOCLinEcore.g:14595:1: 'class'
+            // InternalOCLinEcore.g:14596:1: ( 'class' )
+            // InternalOCLinEcore.g:14597:1: 'class'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getClassKeyword_1());
@@ -45259,14 +45259,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__2"
-    // InternalOCLinEcore.g:14608:1: rule__StructuredClassCS__Group__2 : rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 ;
+    // InternalOCLinEcore.g:14610:1: rule__StructuredClassCS__Group__2 : rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 ;
     public final void rule__StructuredClassCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14612:1: ( rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 )
-            // InternalOCLinEcore.g:14613:2: rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3
+            // InternalOCLinEcore.g:14614:1: ( rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3 )
+            // InternalOCLinEcore.g:14615:2: rule__StructuredClassCS__Group__2__Impl rule__StructuredClassCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_75);
             rule__StructuredClassCS__Group__2__Impl();
@@ -45297,23 +45297,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__2__Impl"
-    // InternalOCLinEcore.g:14620:1: rule__StructuredClassCS__Group__2__Impl : ( ( rule__StructuredClassCS__NameAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:14622:1: rule__StructuredClassCS__Group__2__Impl : ( ( rule__StructuredClassCS__NameAssignment_2 ) ) ;
     public final void rule__StructuredClassCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14624:1: ( ( ( rule__StructuredClassCS__NameAssignment_2 ) ) )
-            // InternalOCLinEcore.g:14625:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:14626:1: ( ( ( rule__StructuredClassCS__NameAssignment_2 ) ) )
+            // InternalOCLinEcore.g:14627:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:14625:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
-            // InternalOCLinEcore.g:14626:1: ( rule__StructuredClassCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:14627:1: ( ( rule__StructuredClassCS__NameAssignment_2 ) )
+            // InternalOCLinEcore.g:14628:1: ( rule__StructuredClassCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getNameAssignment_2());
             }
-            // InternalOCLinEcore.g:14627:1: ( rule__StructuredClassCS__NameAssignment_2 )
-            // InternalOCLinEcore.g:14627:2: rule__StructuredClassCS__NameAssignment_2
+            // InternalOCLinEcore.g:14629:1: ( rule__StructuredClassCS__NameAssignment_2 )
+            // InternalOCLinEcore.g:14629:2: rule__StructuredClassCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__NameAssignment_2();
@@ -45348,14 +45348,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__3"
-    // InternalOCLinEcore.g:14637:1: rule__StructuredClassCS__Group__3 : rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 ;
+    // InternalOCLinEcore.g:14639:1: rule__StructuredClassCS__Group__3 : rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 ;
     public final void rule__StructuredClassCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14641:1: ( rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 )
-            // InternalOCLinEcore.g:14642:2: rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4
+            // InternalOCLinEcore.g:14643:1: ( rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4 )
+            // InternalOCLinEcore.g:14644:2: rule__StructuredClassCS__Group__3__Impl rule__StructuredClassCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_75);
             rule__StructuredClassCS__Group__3__Impl();
@@ -45386,22 +45386,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__3__Impl"
-    // InternalOCLinEcore.g:14649:1: rule__StructuredClassCS__Group__3__Impl : ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) ;
+    // InternalOCLinEcore.g:14651:1: rule__StructuredClassCS__Group__3__Impl : ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) ;
     public final void rule__StructuredClassCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14653:1: ( ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) )
-            // InternalOCLinEcore.g:14654:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLinEcore.g:14655:1: ( ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? ) )
+            // InternalOCLinEcore.g:14656:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
             {
-            // InternalOCLinEcore.g:14654:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
-            // InternalOCLinEcore.g:14655:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLinEcore.g:14656:1: ( ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLinEcore.g:14657:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureAssignment_3());
             }
-            // InternalOCLinEcore.g:14656:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLinEcore.g:14658:1: ( rule__StructuredClassCS__OwnedSignatureAssignment_3 )?
             int alt170=2;
             int LA170_0 = input.LA(1);
 
@@ -45410,7 +45410,7 @@
             }
             switch (alt170) {
                 case 1 :
-                    // InternalOCLinEcore.g:14656:2: rule__StructuredClassCS__OwnedSignatureAssignment_3
+                    // InternalOCLinEcore.g:14658:2: rule__StructuredClassCS__OwnedSignatureAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__OwnedSignatureAssignment_3();
@@ -45448,14 +45448,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__4"
-    // InternalOCLinEcore.g:14666:1: rule__StructuredClassCS__Group__4 : rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 ;
+    // InternalOCLinEcore.g:14668:1: rule__StructuredClassCS__Group__4 : rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 ;
     public final void rule__StructuredClassCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14670:1: ( rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 )
-            // InternalOCLinEcore.g:14671:2: rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5
+            // InternalOCLinEcore.g:14672:1: ( rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5 )
+            // InternalOCLinEcore.g:14673:2: rule__StructuredClassCS__Group__4__Impl rule__StructuredClassCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_75);
             rule__StructuredClassCS__Group__4__Impl();
@@ -45486,22 +45486,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__4__Impl"
-    // InternalOCLinEcore.g:14678:1: rule__StructuredClassCS__Group__4__Impl : ( ( rule__StructuredClassCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:14680:1: rule__StructuredClassCS__Group__4__Impl : ( ( rule__StructuredClassCS__Group_4__0 )? ) ;
     public final void rule__StructuredClassCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14682:1: ( ( ( rule__StructuredClassCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:14683:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:14684:1: ( ( ( rule__StructuredClassCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:14685:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:14683:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:14684:1: ( rule__StructuredClassCS__Group_4__0 )?
+            // InternalOCLinEcore.g:14685:1: ( ( rule__StructuredClassCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:14686:1: ( rule__StructuredClassCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:14685:1: ( rule__StructuredClassCS__Group_4__0 )?
+            // InternalOCLinEcore.g:14687:1: ( rule__StructuredClassCS__Group_4__0 )?
             int alt171=2;
             int LA171_0 = input.LA(1);
 
@@ -45510,7 +45510,7 @@
             }
             switch (alt171) {
                 case 1 :
-                    // InternalOCLinEcore.g:14685:2: rule__StructuredClassCS__Group_4__0
+                    // InternalOCLinEcore.g:14687:2: rule__StructuredClassCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__Group_4__0();
@@ -45548,14 +45548,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__5"
-    // InternalOCLinEcore.g:14695:1: rule__StructuredClassCS__Group__5 : rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 ;
+    // InternalOCLinEcore.g:14697:1: rule__StructuredClassCS__Group__5 : rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 ;
     public final void rule__StructuredClassCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14699:1: ( rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 )
-            // InternalOCLinEcore.g:14700:2: rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6
+            // InternalOCLinEcore.g:14701:1: ( rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6 )
+            // InternalOCLinEcore.g:14702:2: rule__StructuredClassCS__Group__5__Impl rule__StructuredClassCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_75);
             rule__StructuredClassCS__Group__5__Impl();
@@ -45586,22 +45586,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__5__Impl"
-    // InternalOCLinEcore.g:14707:1: rule__StructuredClassCS__Group__5__Impl : ( ( rule__StructuredClassCS__Group_5__0 )? ) ;
+    // InternalOCLinEcore.g:14709:1: rule__StructuredClassCS__Group__5__Impl : ( ( rule__StructuredClassCS__Group_5__0 )? ) ;
     public final void rule__StructuredClassCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14711:1: ( ( ( rule__StructuredClassCS__Group_5__0 )? ) )
-            // InternalOCLinEcore.g:14712:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:14713:1: ( ( ( rule__StructuredClassCS__Group_5__0 )? ) )
+            // InternalOCLinEcore.g:14714:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
             {
-            // InternalOCLinEcore.g:14712:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
-            // InternalOCLinEcore.g:14713:1: ( rule__StructuredClassCS__Group_5__0 )?
+            // InternalOCLinEcore.g:14714:1: ( ( rule__StructuredClassCS__Group_5__0 )? )
+            // InternalOCLinEcore.g:14715:1: ( rule__StructuredClassCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getGroup_5());
             }
-            // InternalOCLinEcore.g:14714:1: ( rule__StructuredClassCS__Group_5__0 )?
+            // InternalOCLinEcore.g:14716:1: ( rule__StructuredClassCS__Group_5__0 )?
             int alt172=2;
             int LA172_0 = input.LA(1);
 
@@ -45610,7 +45610,7 @@
             }
             switch (alt172) {
                 case 1 :
-                    // InternalOCLinEcore.g:14714:2: rule__StructuredClassCS__Group_5__0
+                    // InternalOCLinEcore.g:14716:2: rule__StructuredClassCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__Group_5__0();
@@ -45648,14 +45648,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__6"
-    // InternalOCLinEcore.g:14724:1: rule__StructuredClassCS__Group__6 : rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 ;
+    // InternalOCLinEcore.g:14726:1: rule__StructuredClassCS__Group__6 : rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 ;
     public final void rule__StructuredClassCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14728:1: ( rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 )
-            // InternalOCLinEcore.g:14729:2: rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7
+            // InternalOCLinEcore.g:14730:1: ( rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7 )
+            // InternalOCLinEcore.g:14731:2: rule__StructuredClassCS__Group__6__Impl rule__StructuredClassCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_75);
             rule__StructuredClassCS__Group__6__Impl();
@@ -45686,22 +45686,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__6__Impl"
-    // InternalOCLinEcore.g:14736:1: rule__StructuredClassCS__Group__6__Impl : ( ( rule__StructuredClassCS__Group_6__0 )? ) ;
+    // InternalOCLinEcore.g:14738:1: rule__StructuredClassCS__Group__6__Impl : ( ( rule__StructuredClassCS__Group_6__0 )? ) ;
     public final void rule__StructuredClassCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14740:1: ( ( ( rule__StructuredClassCS__Group_6__0 )? ) )
-            // InternalOCLinEcore.g:14741:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
+            // InternalOCLinEcore.g:14742:1: ( ( ( rule__StructuredClassCS__Group_6__0 )? ) )
+            // InternalOCLinEcore.g:14743:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
             {
-            // InternalOCLinEcore.g:14741:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
-            // InternalOCLinEcore.g:14742:1: ( rule__StructuredClassCS__Group_6__0 )?
+            // InternalOCLinEcore.g:14743:1: ( ( rule__StructuredClassCS__Group_6__0 )? )
+            // InternalOCLinEcore.g:14744:1: ( rule__StructuredClassCS__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getGroup_6());
             }
-            // InternalOCLinEcore.g:14743:1: ( rule__StructuredClassCS__Group_6__0 )?
+            // InternalOCLinEcore.g:14745:1: ( rule__StructuredClassCS__Group_6__0 )?
             int alt173=2;
             int LA173_0 = input.LA(1);
 
@@ -45721,7 +45721,7 @@
             }
             switch (alt173) {
                 case 1 :
-                    // InternalOCLinEcore.g:14743:2: rule__StructuredClassCS__Group_6__0
+                    // InternalOCLinEcore.g:14745:2: rule__StructuredClassCS__Group_6__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__Group_6__0();
@@ -45759,14 +45759,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__7"
-    // InternalOCLinEcore.g:14753:1: rule__StructuredClassCS__Group__7 : rule__StructuredClassCS__Group__7__Impl ;
+    // InternalOCLinEcore.g:14755:1: rule__StructuredClassCS__Group__7 : rule__StructuredClassCS__Group__7__Impl ;
     public final void rule__StructuredClassCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14757:1: ( rule__StructuredClassCS__Group__7__Impl )
-            // InternalOCLinEcore.g:14758:2: rule__StructuredClassCS__Group__7__Impl
+            // InternalOCLinEcore.g:14759:1: ( rule__StructuredClassCS__Group__7__Impl )
+            // InternalOCLinEcore.g:14760:2: rule__StructuredClassCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Group__7__Impl();
@@ -45792,23 +45792,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group__7__Impl"
-    // InternalOCLinEcore.g:14764:1: rule__StructuredClassCS__Group__7__Impl : ( ( rule__StructuredClassCS__Alternatives_7 ) ) ;
+    // InternalOCLinEcore.g:14766:1: rule__StructuredClassCS__Group__7__Impl : ( ( rule__StructuredClassCS__Alternatives_7 ) ) ;
     public final void rule__StructuredClassCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14768:1: ( ( ( rule__StructuredClassCS__Alternatives_7 ) ) )
-            // InternalOCLinEcore.g:14769:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
+            // InternalOCLinEcore.g:14770:1: ( ( ( rule__StructuredClassCS__Alternatives_7 ) ) )
+            // InternalOCLinEcore.g:14771:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
             {
-            // InternalOCLinEcore.g:14769:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
-            // InternalOCLinEcore.g:14770:1: ( rule__StructuredClassCS__Alternatives_7 )
+            // InternalOCLinEcore.g:14771:1: ( ( rule__StructuredClassCS__Alternatives_7 ) )
+            // InternalOCLinEcore.g:14772:1: ( rule__StructuredClassCS__Alternatives_7 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getAlternatives_7());
             }
-            // InternalOCLinEcore.g:14771:1: ( rule__StructuredClassCS__Alternatives_7 )
-            // InternalOCLinEcore.g:14771:2: rule__StructuredClassCS__Alternatives_7
+            // InternalOCLinEcore.g:14773:1: ( rule__StructuredClassCS__Alternatives_7 )
+            // InternalOCLinEcore.g:14773:2: rule__StructuredClassCS__Alternatives_7
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Alternatives_7();
@@ -45843,14 +45843,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4__0"
-    // InternalOCLinEcore.g:14797:1: rule__StructuredClassCS__Group_4__0 : rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 ;
+    // InternalOCLinEcore.g:14799:1: rule__StructuredClassCS__Group_4__0 : rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 ;
     public final void rule__StructuredClassCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14801:1: ( rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 )
-            // InternalOCLinEcore.g:14802:2: rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1
+            // InternalOCLinEcore.g:14803:1: ( rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1 )
+            // InternalOCLinEcore.g:14804:2: rule__StructuredClassCS__Group_4__0__Impl rule__StructuredClassCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__StructuredClassCS__Group_4__0__Impl();
@@ -45881,17 +45881,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:14809:1: rule__StructuredClassCS__Group_4__0__Impl : ( 'extends' ) ;
+    // InternalOCLinEcore.g:14811:1: rule__StructuredClassCS__Group_4__0__Impl : ( 'extends' ) ;
     public final void rule__StructuredClassCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14813:1: ( ( 'extends' ) )
-            // InternalOCLinEcore.g:14814:1: ( 'extends' )
+            // InternalOCLinEcore.g:14815:1: ( ( 'extends' ) )
+            // InternalOCLinEcore.g:14816:1: ( 'extends' )
             {
-            // InternalOCLinEcore.g:14814:1: ( 'extends' )
-            // InternalOCLinEcore.g:14815:1: 'extends'
+            // InternalOCLinEcore.g:14816:1: ( 'extends' )
+            // InternalOCLinEcore.g:14817:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getExtendsKeyword_4_0());
@@ -45922,14 +45922,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4__1"
-    // InternalOCLinEcore.g:14828:1: rule__StructuredClassCS__Group_4__1 : rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 ;
+    // InternalOCLinEcore.g:14830:1: rule__StructuredClassCS__Group_4__1 : rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 ;
     public final void rule__StructuredClassCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14832:1: ( rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 )
-            // InternalOCLinEcore.g:14833:2: rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2
+            // InternalOCLinEcore.g:14834:1: ( rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2 )
+            // InternalOCLinEcore.g:14835:2: rule__StructuredClassCS__Group_4__1__Impl rule__StructuredClassCS__Group_4__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__StructuredClassCS__Group_4__1__Impl();
@@ -45960,23 +45960,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:14840:1: rule__StructuredClassCS__Group_4__1__Impl : ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) ;
+    // InternalOCLinEcore.g:14842:1: rule__StructuredClassCS__Group_4__1__Impl : ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) ;
     public final void rule__StructuredClassCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14844:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) )
-            // InternalOCLinEcore.g:14845:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
+            // InternalOCLinEcore.g:14846:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) ) )
+            // InternalOCLinEcore.g:14847:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
             {
-            // InternalOCLinEcore.g:14845:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
-            // InternalOCLinEcore.g:14846:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
+            // InternalOCLinEcore.g:14847:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 ) )
+            // InternalOCLinEcore.g:14848:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_1());
             }
-            // InternalOCLinEcore.g:14847:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
-            // InternalOCLinEcore.g:14847:2: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1
+            // InternalOCLinEcore.g:14849:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 )
+            // InternalOCLinEcore.g:14849:2: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1();
@@ -46011,14 +46011,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4__2"
-    // InternalOCLinEcore.g:14857:1: rule__StructuredClassCS__Group_4__2 : rule__StructuredClassCS__Group_4__2__Impl ;
+    // InternalOCLinEcore.g:14859:1: rule__StructuredClassCS__Group_4__2 : rule__StructuredClassCS__Group_4__2__Impl ;
     public final void rule__StructuredClassCS__Group_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14861:1: ( rule__StructuredClassCS__Group_4__2__Impl )
-            // InternalOCLinEcore.g:14862:2: rule__StructuredClassCS__Group_4__2__Impl
+            // InternalOCLinEcore.g:14863:1: ( rule__StructuredClassCS__Group_4__2__Impl )
+            // InternalOCLinEcore.g:14864:2: rule__StructuredClassCS__Group_4__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Group_4__2__Impl();
@@ -46044,22 +46044,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4__2__Impl"
-    // InternalOCLinEcore.g:14868:1: rule__StructuredClassCS__Group_4__2__Impl : ( ( rule__StructuredClassCS__Group_4_2__0 )* ) ;
+    // InternalOCLinEcore.g:14870:1: rule__StructuredClassCS__Group_4__2__Impl : ( ( rule__StructuredClassCS__Group_4_2__0 )* ) ;
     public final void rule__StructuredClassCS__Group_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14872:1: ( ( ( rule__StructuredClassCS__Group_4_2__0 )* ) )
-            // InternalOCLinEcore.g:14873:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
+            // InternalOCLinEcore.g:14874:1: ( ( ( rule__StructuredClassCS__Group_4_2__0 )* ) )
+            // InternalOCLinEcore.g:14875:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
             {
-            // InternalOCLinEcore.g:14873:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
-            // InternalOCLinEcore.g:14874:1: ( rule__StructuredClassCS__Group_4_2__0 )*
+            // InternalOCLinEcore.g:14875:1: ( ( rule__StructuredClassCS__Group_4_2__0 )* )
+            // InternalOCLinEcore.g:14876:1: ( rule__StructuredClassCS__Group_4_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getGroup_4_2());
             }
-            // InternalOCLinEcore.g:14875:1: ( rule__StructuredClassCS__Group_4_2__0 )*
+            // InternalOCLinEcore.g:14877:1: ( rule__StructuredClassCS__Group_4_2__0 )*
             loop174:
             do {
                 int alt174=2;
@@ -46072,7 +46072,7 @@
 
                 switch (alt174) {
             	case 1 :
-            	    // InternalOCLinEcore.g:14875:2: rule__StructuredClassCS__Group_4_2__0
+            	    // InternalOCLinEcore.g:14877:2: rule__StructuredClassCS__Group_4_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__StructuredClassCS__Group_4_2__0();
@@ -46113,14 +46113,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4_2__0"
-    // InternalOCLinEcore.g:14891:1: rule__StructuredClassCS__Group_4_2__0 : rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 ;
+    // InternalOCLinEcore.g:14893:1: rule__StructuredClassCS__Group_4_2__0 : rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 ;
     public final void rule__StructuredClassCS__Group_4_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14895:1: ( rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 )
-            // InternalOCLinEcore.g:14896:2: rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1
+            // InternalOCLinEcore.g:14897:1: ( rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1 )
+            // InternalOCLinEcore.g:14898:2: rule__StructuredClassCS__Group_4_2__0__Impl rule__StructuredClassCS__Group_4_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__StructuredClassCS__Group_4_2__0__Impl();
@@ -46151,17 +46151,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4_2__0__Impl"
-    // InternalOCLinEcore.g:14903:1: rule__StructuredClassCS__Group_4_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:14905:1: rule__StructuredClassCS__Group_4_2__0__Impl : ( ',' ) ;
     public final void rule__StructuredClassCS__Group_4_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14907:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:14908:1: ( ',' )
+            // InternalOCLinEcore.g:14909:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:14910:1: ( ',' )
             {
-            // InternalOCLinEcore.g:14908:1: ( ',' )
-            // InternalOCLinEcore.g:14909:1: ','
+            // InternalOCLinEcore.g:14910:1: ( ',' )
+            // InternalOCLinEcore.g:14911:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());
@@ -46192,14 +46192,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4_2__1"
-    // InternalOCLinEcore.g:14922:1: rule__StructuredClassCS__Group_4_2__1 : rule__StructuredClassCS__Group_4_2__1__Impl ;
+    // InternalOCLinEcore.g:14924:1: rule__StructuredClassCS__Group_4_2__1 : rule__StructuredClassCS__Group_4_2__1__Impl ;
     public final void rule__StructuredClassCS__Group_4_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14926:1: ( rule__StructuredClassCS__Group_4_2__1__Impl )
-            // InternalOCLinEcore.g:14927:2: rule__StructuredClassCS__Group_4_2__1__Impl
+            // InternalOCLinEcore.g:14928:1: ( rule__StructuredClassCS__Group_4_2__1__Impl )
+            // InternalOCLinEcore.g:14929:2: rule__StructuredClassCS__Group_4_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Group_4_2__1__Impl();
@@ -46225,23 +46225,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_4_2__1__Impl"
-    // InternalOCLinEcore.g:14933:1: rule__StructuredClassCS__Group_4_2__1__Impl : ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) ;
+    // InternalOCLinEcore.g:14935:1: rule__StructuredClassCS__Group_4_2__1__Impl : ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) ;
     public final void rule__StructuredClassCS__Group_4_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14937:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) )
-            // InternalOCLinEcore.g:14938:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
+            // InternalOCLinEcore.g:14939:1: ( ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) ) )
+            // InternalOCLinEcore.g:14940:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
             {
-            // InternalOCLinEcore.g:14938:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
-            // InternalOCLinEcore.g:14939:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
+            // InternalOCLinEcore.g:14940:1: ( ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 ) )
+            // InternalOCLinEcore.g:14941:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesAssignment_4_2_1());
             }
-            // InternalOCLinEcore.g:14940:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
-            // InternalOCLinEcore.g:14940:2: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1
+            // InternalOCLinEcore.g:14942:1: ( rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 )
+            // InternalOCLinEcore.g:14942:2: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1();
@@ -46276,14 +46276,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_5__0"
-    // InternalOCLinEcore.g:14954:1: rule__StructuredClassCS__Group_5__0 : rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 ;
+    // InternalOCLinEcore.g:14956:1: rule__StructuredClassCS__Group_5__0 : rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 ;
     public final void rule__StructuredClassCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14958:1: ( rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 )
-            // InternalOCLinEcore.g:14959:2: rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1
+            // InternalOCLinEcore.g:14960:1: ( rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1 )
+            // InternalOCLinEcore.g:14961:2: rule__StructuredClassCS__Group_5__0__Impl rule__StructuredClassCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__StructuredClassCS__Group_5__0__Impl();
@@ -46314,17 +46314,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_5__0__Impl"
-    // InternalOCLinEcore.g:14966:1: rule__StructuredClassCS__Group_5__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:14968:1: rule__StructuredClassCS__Group_5__0__Impl : ( ':' ) ;
     public final void rule__StructuredClassCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14970:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:14971:1: ( ':' )
+            // InternalOCLinEcore.g:14972:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:14973:1: ( ':' )
             {
-            // InternalOCLinEcore.g:14971:1: ( ':' )
-            // InternalOCLinEcore.g:14972:1: ':'
+            // InternalOCLinEcore.g:14973:1: ( ':' )
+            // InternalOCLinEcore.g:14974:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());
@@ -46355,14 +46355,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_5__1"
-    // InternalOCLinEcore.g:14985:1: rule__StructuredClassCS__Group_5__1 : rule__StructuredClassCS__Group_5__1__Impl ;
+    // InternalOCLinEcore.g:14987:1: rule__StructuredClassCS__Group_5__1 : rule__StructuredClassCS__Group_5__1__Impl ;
     public final void rule__StructuredClassCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:14989:1: ( rule__StructuredClassCS__Group_5__1__Impl )
-            // InternalOCLinEcore.g:14990:2: rule__StructuredClassCS__Group_5__1__Impl
+            // InternalOCLinEcore.g:14991:1: ( rule__StructuredClassCS__Group_5__1__Impl )
+            // InternalOCLinEcore.g:14992:2: rule__StructuredClassCS__Group_5__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Group_5__1__Impl();
@@ -46388,23 +46388,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_5__1__Impl"
-    // InternalOCLinEcore.g:14996:1: rule__StructuredClassCS__Group_5__1__Impl : ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) ;
+    // InternalOCLinEcore.g:14998:1: rule__StructuredClassCS__Group_5__1__Impl : ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) ;
     public final void rule__StructuredClassCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15000:1: ( ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) )
-            // InternalOCLinEcore.g:15001:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
+            // InternalOCLinEcore.g:15002:1: ( ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) ) )
+            // InternalOCLinEcore.g:15003:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
             {
-            // InternalOCLinEcore.g:15001:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
-            // InternalOCLinEcore.g:15002:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
+            // InternalOCLinEcore.g:15003:1: ( ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 ) )
+            // InternalOCLinEcore.g:15004:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameAssignment_5_1());
             }
-            // InternalOCLinEcore.g:15003:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
-            // InternalOCLinEcore.g:15003:2: rule__StructuredClassCS__InstanceClassNameAssignment_5_1
+            // InternalOCLinEcore.g:15005:1: ( rule__StructuredClassCS__InstanceClassNameAssignment_5_1 )
+            // InternalOCLinEcore.g:15005:2: rule__StructuredClassCS__InstanceClassNameAssignment_5_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__InstanceClassNameAssignment_5_1();
@@ -46439,14 +46439,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_6__0"
-    // InternalOCLinEcore.g:15017:1: rule__StructuredClassCS__Group_6__0 : rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 ;
+    // InternalOCLinEcore.g:15019:1: rule__StructuredClassCS__Group_6__0 : rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 ;
     public final void rule__StructuredClassCS__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15021:1: ( rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 )
-            // InternalOCLinEcore.g:15022:2: rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1
+            // InternalOCLinEcore.g:15023:1: ( rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1 )
+            // InternalOCLinEcore.g:15024:2: rule__StructuredClassCS__Group_6__0__Impl rule__StructuredClassCS__Group_6__1
             {
             pushFollow(FollowSets000.FOLLOW_76);
             rule__StructuredClassCS__Group_6__0__Impl();
@@ -46477,17 +46477,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_6__0__Impl"
-    // InternalOCLinEcore.g:15029:1: rule__StructuredClassCS__Group_6__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:15031:1: rule__StructuredClassCS__Group_6__0__Impl : ( '{' ) ;
     public final void rule__StructuredClassCS__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15033:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:15034:1: ( '{' )
+            // InternalOCLinEcore.g:15035:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:15036:1: ( '{' )
             {
-            // InternalOCLinEcore.g:15034:1: ( '{' )
-            // InternalOCLinEcore.g:15035:1: '{'
+            // InternalOCLinEcore.g:15036:1: ( '{' )
+            // InternalOCLinEcore.g:15037:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());
@@ -46518,14 +46518,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_6__1"
-    // InternalOCLinEcore.g:15048:1: rule__StructuredClassCS__Group_6__1 : rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 ;
+    // InternalOCLinEcore.g:15050:1: rule__StructuredClassCS__Group_6__1 : rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 ;
     public final void rule__StructuredClassCS__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15052:1: ( rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 )
-            // InternalOCLinEcore.g:15053:2: rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2
+            // InternalOCLinEcore.g:15054:1: ( rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2 )
+            // InternalOCLinEcore.g:15055:2: rule__StructuredClassCS__Group_6__1__Impl rule__StructuredClassCS__Group_6__2
             {
             pushFollow(FollowSets000.FOLLOW_76);
             rule__StructuredClassCS__Group_6__1__Impl();
@@ -46556,22 +46556,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_6__1__Impl"
-    // InternalOCLinEcore.g:15060:1: rule__StructuredClassCS__Group_6__1__Impl : ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) ;
+    // InternalOCLinEcore.g:15062:1: rule__StructuredClassCS__Group_6__1__Impl : ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) ;
     public final void rule__StructuredClassCS__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15064:1: ( ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) )
-            // InternalOCLinEcore.g:15065:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
+            // InternalOCLinEcore.g:15066:1: ( ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? ) )
+            // InternalOCLinEcore.g:15067:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
             {
-            // InternalOCLinEcore.g:15065:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
-            // InternalOCLinEcore.g:15066:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
+            // InternalOCLinEcore.g:15067:1: ( ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )? )
+            // InternalOCLinEcore.g:15068:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceAssignment_6_1());
             }
-            // InternalOCLinEcore.g:15067:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
+            // InternalOCLinEcore.g:15069:1: ( rule__StructuredClassCS__IsInterfaceAssignment_6_1 )?
             int alt175=2;
             int LA175_0 = input.LA(1);
 
@@ -46580,7 +46580,7 @@
             }
             switch (alt175) {
                 case 1 :
-                    // InternalOCLinEcore.g:15067:2: rule__StructuredClassCS__IsInterfaceAssignment_6_1
+                    // InternalOCLinEcore.g:15069:2: rule__StructuredClassCS__IsInterfaceAssignment_6_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__StructuredClassCS__IsInterfaceAssignment_6_1();
@@ -46618,14 +46618,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_6__2"
-    // InternalOCLinEcore.g:15077:1: rule__StructuredClassCS__Group_6__2 : rule__StructuredClassCS__Group_6__2__Impl ;
+    // InternalOCLinEcore.g:15079:1: rule__StructuredClassCS__Group_6__2 : rule__StructuredClassCS__Group_6__2__Impl ;
     public final void rule__StructuredClassCS__Group_6__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15081:1: ( rule__StructuredClassCS__Group_6__2__Impl )
-            // InternalOCLinEcore.g:15082:2: rule__StructuredClassCS__Group_6__2__Impl
+            // InternalOCLinEcore.g:15083:1: ( rule__StructuredClassCS__Group_6__2__Impl )
+            // InternalOCLinEcore.g:15084:2: rule__StructuredClassCS__Group_6__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Group_6__2__Impl();
@@ -46651,17 +46651,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_6__2__Impl"
-    // InternalOCLinEcore.g:15088:1: rule__StructuredClassCS__Group_6__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:15090:1: rule__StructuredClassCS__Group_6__2__Impl : ( '}' ) ;
     public final void rule__StructuredClassCS__Group_6__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15092:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:15093:1: ( '}' )
+            // InternalOCLinEcore.g:15094:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:15095:1: ( '}' )
             {
-            // InternalOCLinEcore.g:15093:1: ( '}' )
-            // InternalOCLinEcore.g:15094:1: '}'
+            // InternalOCLinEcore.g:15095:1: ( '}' )
+            // InternalOCLinEcore.g:15096:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());
@@ -46692,14 +46692,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_7_0__0"
-    // InternalOCLinEcore.g:15113:1: rule__StructuredClassCS__Group_7_0__0 : rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 ;
+    // InternalOCLinEcore.g:15115:1: rule__StructuredClassCS__Group_7_0__0 : rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 ;
     public final void rule__StructuredClassCS__Group_7_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15117:1: ( rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 )
-            // InternalOCLinEcore.g:15118:2: rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1
+            // InternalOCLinEcore.g:15119:1: ( rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1 )
+            // InternalOCLinEcore.g:15120:2: rule__StructuredClassCS__Group_7_0__0__Impl rule__StructuredClassCS__Group_7_0__1
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__StructuredClassCS__Group_7_0__0__Impl();
@@ -46730,17 +46730,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_7_0__0__Impl"
-    // InternalOCLinEcore.g:15125:1: rule__StructuredClassCS__Group_7_0__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:15127:1: rule__StructuredClassCS__Group_7_0__0__Impl : ( '{' ) ;
     public final void rule__StructuredClassCS__Group_7_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15129:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:15130:1: ( '{' )
+            // InternalOCLinEcore.g:15131:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:15132:1: ( '{' )
             {
-            // InternalOCLinEcore.g:15130:1: ( '{' )
-            // InternalOCLinEcore.g:15131:1: '{'
+            // InternalOCLinEcore.g:15132:1: ( '{' )
+            // InternalOCLinEcore.g:15133:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());
@@ -46771,14 +46771,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_7_0__1"
-    // InternalOCLinEcore.g:15144:1: rule__StructuredClassCS__Group_7_0__1 : rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 ;
+    // InternalOCLinEcore.g:15146:1: rule__StructuredClassCS__Group_7_0__1 : rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 ;
     public final void rule__StructuredClassCS__Group_7_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15148:1: ( rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 )
-            // InternalOCLinEcore.g:15149:2: rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2
+            // InternalOCLinEcore.g:15150:1: ( rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2 )
+            // InternalOCLinEcore.g:15151:2: rule__StructuredClassCS__Group_7_0__1__Impl rule__StructuredClassCS__Group_7_0__2
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__StructuredClassCS__Group_7_0__1__Impl();
@@ -46809,22 +46809,22 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_7_0__1__Impl"
-    // InternalOCLinEcore.g:15156:1: rule__StructuredClassCS__Group_7_0__1__Impl : ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) ;
+    // InternalOCLinEcore.g:15158:1: rule__StructuredClassCS__Group_7_0__1__Impl : ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) ;
     public final void rule__StructuredClassCS__Group_7_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15160:1: ( ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) )
-            // InternalOCLinEcore.g:15161:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
+            // InternalOCLinEcore.g:15162:1: ( ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* ) )
+            // InternalOCLinEcore.g:15163:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
             {
-            // InternalOCLinEcore.g:15161:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
-            // InternalOCLinEcore.g:15162:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
+            // InternalOCLinEcore.g:15163:1: ( ( rule__StructuredClassCS__Alternatives_7_0_1 )* )
+            // InternalOCLinEcore.g:15164:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getAlternatives_7_0_1());
             }
-            // InternalOCLinEcore.g:15163:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
+            // InternalOCLinEcore.g:15165:1: ( rule__StructuredClassCS__Alternatives_7_0_1 )*
             loop176:
             do {
                 int alt176=2;
@@ -46837,7 +46837,7 @@
 
                 switch (alt176) {
             	case 1 :
-            	    // InternalOCLinEcore.g:15163:2: rule__StructuredClassCS__Alternatives_7_0_1
+            	    // InternalOCLinEcore.g:15165:2: rule__StructuredClassCS__Alternatives_7_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_46);
             	    rule__StructuredClassCS__Alternatives_7_0_1();
@@ -46878,14 +46878,14 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_7_0__2"
-    // InternalOCLinEcore.g:15173:1: rule__StructuredClassCS__Group_7_0__2 : rule__StructuredClassCS__Group_7_0__2__Impl ;
+    // InternalOCLinEcore.g:15175:1: rule__StructuredClassCS__Group_7_0__2 : rule__StructuredClassCS__Group_7_0__2__Impl ;
     public final void rule__StructuredClassCS__Group_7_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15177:1: ( rule__StructuredClassCS__Group_7_0__2__Impl )
-            // InternalOCLinEcore.g:15178:2: rule__StructuredClassCS__Group_7_0__2__Impl
+            // InternalOCLinEcore.g:15179:1: ( rule__StructuredClassCS__Group_7_0__2__Impl )
+            // InternalOCLinEcore.g:15180:2: rule__StructuredClassCS__Group_7_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__StructuredClassCS__Group_7_0__2__Impl();
@@ -46911,17 +46911,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__Group_7_0__2__Impl"
-    // InternalOCLinEcore.g:15184:1: rule__StructuredClassCS__Group_7_0__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:15186:1: rule__StructuredClassCS__Group_7_0__2__Impl : ( '}' ) ;
     public final void rule__StructuredClassCS__Group_7_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15188:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:15189:1: ( '}' )
+            // InternalOCLinEcore.g:15190:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:15191:1: ( '}' )
             {
-            // InternalOCLinEcore.g:15189:1: ( '}' )
-            // InternalOCLinEcore.g:15190:1: '}'
+            // InternalOCLinEcore.g:15191:1: ( '}' )
+            // InternalOCLinEcore.g:15192:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());
@@ -46952,14 +46952,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group__0"
-    // InternalOCLinEcore.g:15209:1: rule__SysMLCS__Group__0 : rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 ;
+    // InternalOCLinEcore.g:15211:1: rule__SysMLCS__Group__0 : rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 ;
     public final void rule__SysMLCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15213:1: ( rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 )
-            // InternalOCLinEcore.g:15214:2: rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1
+            // InternalOCLinEcore.g:15215:1: ( rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1 )
+            // InternalOCLinEcore.g:15216:2: rule__SysMLCS__Group__0__Impl rule__SysMLCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_77);
             rule__SysMLCS__Group__0__Impl();
@@ -46990,23 +46990,23 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group__0__Impl"
-    // InternalOCLinEcore.g:15221:1: rule__SysMLCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:15223:1: rule__SysMLCS__Group__0__Impl : ( () ) ;
     public final void rule__SysMLCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15225:1: ( ( () ) )
-            // InternalOCLinEcore.g:15226:1: ( () )
+            // InternalOCLinEcore.g:15227:1: ( ( () ) )
+            // InternalOCLinEcore.g:15228:1: ( () )
             {
-            // InternalOCLinEcore.g:15226:1: ( () )
-            // InternalOCLinEcore.g:15227:1: ()
+            // InternalOCLinEcore.g:15228:1: ( () )
+            // InternalOCLinEcore.g:15229:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getSysMLCSAction_0());
             }
-            // InternalOCLinEcore.g:15228:1: ()
-            // InternalOCLinEcore.g:15230:1:
+            // InternalOCLinEcore.g:15230:1: ()
+            // InternalOCLinEcore.g:15232:1:
             {
             }
 
@@ -47031,14 +47031,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group__1"
-    // InternalOCLinEcore.g:15240:1: rule__SysMLCS__Group__1 : rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 ;
+    // InternalOCLinEcore.g:15242:1: rule__SysMLCS__Group__1 : rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 ;
     public final void rule__SysMLCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15244:1: ( rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 )
-            // InternalOCLinEcore.g:15245:2: rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2
+            // InternalOCLinEcore.g:15246:1: ( rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2 )
+            // InternalOCLinEcore.g:15247:2: rule__SysMLCS__Group__1__Impl rule__SysMLCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_78);
             rule__SysMLCS__Group__1__Impl();
@@ -47069,17 +47069,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group__1__Impl"
-    // InternalOCLinEcore.g:15252:1: rule__SysMLCS__Group__1__Impl : ( 'sysml' ) ;
+    // InternalOCLinEcore.g:15254:1: rule__SysMLCS__Group__1__Impl : ( 'sysml' ) ;
     public final void rule__SysMLCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15256:1: ( ( 'sysml' ) )
-            // InternalOCLinEcore.g:15257:1: ( 'sysml' )
+            // InternalOCLinEcore.g:15258:1: ( ( 'sysml' ) )
+            // InternalOCLinEcore.g:15259:1: ( 'sysml' )
             {
-            // InternalOCLinEcore.g:15257:1: ( 'sysml' )
-            // InternalOCLinEcore.g:15258:1: 'sysml'
+            // InternalOCLinEcore.g:15259:1: ( 'sysml' )
+            // InternalOCLinEcore.g:15260:1: 'sysml'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getSysmlKeyword_1());
@@ -47110,14 +47110,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group__2"
-    // InternalOCLinEcore.g:15271:1: rule__SysMLCS__Group__2 : rule__SysMLCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:15273:1: rule__SysMLCS__Group__2 : rule__SysMLCS__Group__2__Impl ;
     public final void rule__SysMLCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15275:1: ( rule__SysMLCS__Group__2__Impl )
-            // InternalOCLinEcore.g:15276:2: rule__SysMLCS__Group__2__Impl
+            // InternalOCLinEcore.g:15277:1: ( rule__SysMLCS__Group__2__Impl )
+            // InternalOCLinEcore.g:15278:2: rule__SysMLCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__Group__2__Impl();
@@ -47143,23 +47143,23 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group__2__Impl"
-    // InternalOCLinEcore.g:15282:1: rule__SysMLCS__Group__2__Impl : ( ( rule__SysMLCS__Alternatives_2 ) ) ;
+    // InternalOCLinEcore.g:15284:1: rule__SysMLCS__Group__2__Impl : ( ( rule__SysMLCS__Alternatives_2 ) ) ;
     public final void rule__SysMLCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15286:1: ( ( ( rule__SysMLCS__Alternatives_2 ) ) )
-            // InternalOCLinEcore.g:15287:1: ( ( rule__SysMLCS__Alternatives_2 ) )
+            // InternalOCLinEcore.g:15288:1: ( ( ( rule__SysMLCS__Alternatives_2 ) ) )
+            // InternalOCLinEcore.g:15289:1: ( ( rule__SysMLCS__Alternatives_2 ) )
             {
-            // InternalOCLinEcore.g:15287:1: ( ( rule__SysMLCS__Alternatives_2 ) )
-            // InternalOCLinEcore.g:15288:1: ( rule__SysMLCS__Alternatives_2 )
+            // InternalOCLinEcore.g:15289:1: ( ( rule__SysMLCS__Alternatives_2 ) )
+            // InternalOCLinEcore.g:15290:1: ( rule__SysMLCS__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getAlternatives_2());
             }
-            // InternalOCLinEcore.g:15289:1: ( rule__SysMLCS__Alternatives_2 )
-            // InternalOCLinEcore.g:15289:2: rule__SysMLCS__Alternatives_2
+            // InternalOCLinEcore.g:15291:1: ( rule__SysMLCS__Alternatives_2 )
+            // InternalOCLinEcore.g:15291:2: rule__SysMLCS__Alternatives_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__Alternatives_2();
@@ -47194,14 +47194,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_0__0"
-    // InternalOCLinEcore.g:15305:1: rule__SysMLCS__Group_2_0__0 : rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 ;
+    // InternalOCLinEcore.g:15307:1: rule__SysMLCS__Group_2_0__0 : rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 ;
     public final void rule__SysMLCS__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15309:1: ( rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 )
-            // InternalOCLinEcore.g:15310:2: rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1
+            // InternalOCLinEcore.g:15311:1: ( rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1 )
+            // InternalOCLinEcore.g:15312:2: rule__SysMLCS__Group_2_0__0__Impl rule__SysMLCS__Group_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__SysMLCS__Group_2_0__0__Impl();
@@ -47232,23 +47232,23 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_0__0__Impl"
-    // InternalOCLinEcore.g:15317:1: rule__SysMLCS__Group_2_0__0__Impl : ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) ;
+    // InternalOCLinEcore.g:15319:1: rule__SysMLCS__Group_2_0__0__Impl : ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) ;
     public final void rule__SysMLCS__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15321:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) )
-            // InternalOCLinEcore.g:15322:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
+            // InternalOCLinEcore.g:15323:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) ) )
+            // InternalOCLinEcore.g:15324:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
             {
-            // InternalOCLinEcore.g:15322:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
-            // InternalOCLinEcore.g:15323:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
+            // InternalOCLinEcore.g:15324:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 ) )
+            // InternalOCLinEcore.g:15325:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_0_0());
             }
-            // InternalOCLinEcore.g:15324:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
-            // InternalOCLinEcore.g:15324:2: rule__SysMLCS__OwnedDetailsAssignment_2_0_0
+            // InternalOCLinEcore.g:15326:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_0_0 )
+            // InternalOCLinEcore.g:15326:2: rule__SysMLCS__OwnedDetailsAssignment_2_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__OwnedDetailsAssignment_2_0_0();
@@ -47283,14 +47283,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_0__1"
-    // InternalOCLinEcore.g:15334:1: rule__SysMLCS__Group_2_0__1 : rule__SysMLCS__Group_2_0__1__Impl ;
+    // InternalOCLinEcore.g:15336:1: rule__SysMLCS__Group_2_0__1 : rule__SysMLCS__Group_2_0__1__Impl ;
     public final void rule__SysMLCS__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15338:1: ( rule__SysMLCS__Group_2_0__1__Impl )
-            // InternalOCLinEcore.g:15339:2: rule__SysMLCS__Group_2_0__1__Impl
+            // InternalOCLinEcore.g:15340:1: ( rule__SysMLCS__Group_2_0__1__Impl )
+            // InternalOCLinEcore.g:15341:2: rule__SysMLCS__Group_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__Group_2_0__1__Impl();
@@ -47316,17 +47316,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_0__1__Impl"
-    // InternalOCLinEcore.g:15345:1: rule__SysMLCS__Group_2_0__1__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:15347:1: rule__SysMLCS__Group_2_0__1__Impl : ( ';' ) ;
     public final void rule__SysMLCS__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15349:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:15350:1: ( ';' )
+            // InternalOCLinEcore.g:15351:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:15352:1: ( ';' )
             {
-            // InternalOCLinEcore.g:15350:1: ( ';' )
-            // InternalOCLinEcore.g:15351:1: ';'
+            // InternalOCLinEcore.g:15352:1: ( ';' )
+            // InternalOCLinEcore.g:15353:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_0_1());
@@ -47357,14 +47357,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1__0"
-    // InternalOCLinEcore.g:15368:1: rule__SysMLCS__Group_2_1__0 : rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:15370:1: rule__SysMLCS__Group_2_1__0 : rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 ;
     public final void rule__SysMLCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15372:1: ( rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:15373:2: rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1
+            // InternalOCLinEcore.g:15374:1: ( rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:15375:2: rule__SysMLCS__Group_2_1__0__Impl rule__SysMLCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__SysMLCS__Group_2_1__0__Impl();
@@ -47395,17 +47395,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:15380:1: rule__SysMLCS__Group_2_1__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:15382:1: rule__SysMLCS__Group_2_1__0__Impl : ( '{' ) ;
     public final void rule__SysMLCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15384:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:15385:1: ( '{' )
+            // InternalOCLinEcore.g:15386:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:15387:1: ( '{' )
             {
-            // InternalOCLinEcore.g:15385:1: ( '{' )
-            // InternalOCLinEcore.g:15386:1: '{'
+            // InternalOCLinEcore.g:15387:1: ( '{' )
+            // InternalOCLinEcore.g:15388:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getLeftCurlyBracketKeyword_2_1_0());
@@ -47436,14 +47436,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1__1"
-    // InternalOCLinEcore.g:15399:1: rule__SysMLCS__Group_2_1__1 : rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 ;
+    // InternalOCLinEcore.g:15401:1: rule__SysMLCS__Group_2_1__1 : rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 ;
     public final void rule__SysMLCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15403:1: ( rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 )
-            // InternalOCLinEcore.g:15404:2: rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2
+            // InternalOCLinEcore.g:15405:1: ( rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2 )
+            // InternalOCLinEcore.g:15406:2: rule__SysMLCS__Group_2_1__1__Impl rule__SysMLCS__Group_2_1__2
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__SysMLCS__Group_2_1__1__Impl();
@@ -47474,22 +47474,22 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:15411:1: rule__SysMLCS__Group_2_1__1__Impl : ( ( rule__SysMLCS__Group_2_1_1__0 )* ) ;
+    // InternalOCLinEcore.g:15413:1: rule__SysMLCS__Group_2_1__1__Impl : ( ( rule__SysMLCS__Group_2_1_1__0 )* ) ;
     public final void rule__SysMLCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15415:1: ( ( ( rule__SysMLCS__Group_2_1_1__0 )* ) )
-            // InternalOCLinEcore.g:15416:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
+            // InternalOCLinEcore.g:15417:1: ( ( ( rule__SysMLCS__Group_2_1_1__0 )* ) )
+            // InternalOCLinEcore.g:15418:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
             {
-            // InternalOCLinEcore.g:15416:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
-            // InternalOCLinEcore.g:15417:1: ( rule__SysMLCS__Group_2_1_1__0 )*
+            // InternalOCLinEcore.g:15418:1: ( ( rule__SysMLCS__Group_2_1_1__0 )* )
+            // InternalOCLinEcore.g:15419:1: ( rule__SysMLCS__Group_2_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getGroup_2_1_1());
             }
-            // InternalOCLinEcore.g:15418:1: ( rule__SysMLCS__Group_2_1_1__0 )*
+            // InternalOCLinEcore.g:15420:1: ( rule__SysMLCS__Group_2_1_1__0 )*
             loop177:
             do {
                 int alt177=2;
@@ -47502,7 +47502,7 @@
 
                 switch (alt177) {
             	case 1 :
-            	    // InternalOCLinEcore.g:15418:2: rule__SysMLCS__Group_2_1_1__0
+            	    // InternalOCLinEcore.g:15420:2: rule__SysMLCS__Group_2_1_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_80);
             	    rule__SysMLCS__Group_2_1_1__0();
@@ -47543,14 +47543,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1__2"
-    // InternalOCLinEcore.g:15428:1: rule__SysMLCS__Group_2_1__2 : rule__SysMLCS__Group_2_1__2__Impl ;
+    // InternalOCLinEcore.g:15430:1: rule__SysMLCS__Group_2_1__2 : rule__SysMLCS__Group_2_1__2__Impl ;
     public final void rule__SysMLCS__Group_2_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15432:1: ( rule__SysMLCS__Group_2_1__2__Impl )
-            // InternalOCLinEcore.g:15433:2: rule__SysMLCS__Group_2_1__2__Impl
+            // InternalOCLinEcore.g:15434:1: ( rule__SysMLCS__Group_2_1__2__Impl )
+            // InternalOCLinEcore.g:15435:2: rule__SysMLCS__Group_2_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__Group_2_1__2__Impl();
@@ -47576,17 +47576,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1__2__Impl"
-    // InternalOCLinEcore.g:15439:1: rule__SysMLCS__Group_2_1__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:15441:1: rule__SysMLCS__Group_2_1__2__Impl : ( '}' ) ;
     public final void rule__SysMLCS__Group_2_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15443:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:15444:1: ( '}' )
+            // InternalOCLinEcore.g:15445:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:15446:1: ( '}' )
             {
-            // InternalOCLinEcore.g:15444:1: ( '}' )
-            // InternalOCLinEcore.g:15445:1: '}'
+            // InternalOCLinEcore.g:15446:1: ( '}' )
+            // InternalOCLinEcore.g:15447:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getRightCurlyBracketKeyword_2_1_2());
@@ -47617,14 +47617,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1_1__0"
-    // InternalOCLinEcore.g:15464:1: rule__SysMLCS__Group_2_1_1__0 : rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 ;
+    // InternalOCLinEcore.g:15466:1: rule__SysMLCS__Group_2_1_1__0 : rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 ;
     public final void rule__SysMLCS__Group_2_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15468:1: ( rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 )
-            // InternalOCLinEcore.g:15469:2: rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1
+            // InternalOCLinEcore.g:15470:1: ( rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1 )
+            // InternalOCLinEcore.g:15471:2: rule__SysMLCS__Group_2_1_1__0__Impl rule__SysMLCS__Group_2_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__SysMLCS__Group_2_1_1__0__Impl();
@@ -47655,23 +47655,23 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1_1__0__Impl"
-    // InternalOCLinEcore.g:15476:1: rule__SysMLCS__Group_2_1_1__0__Impl : ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) ;
+    // InternalOCLinEcore.g:15478:1: rule__SysMLCS__Group_2_1_1__0__Impl : ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) ;
     public final void rule__SysMLCS__Group_2_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15480:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) )
-            // InternalOCLinEcore.g:15481:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
+            // InternalOCLinEcore.g:15482:1: ( ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) ) )
+            // InternalOCLinEcore.g:15483:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
             {
-            // InternalOCLinEcore.g:15481:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
-            // InternalOCLinEcore.g:15482:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
+            // InternalOCLinEcore.g:15483:1: ( ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 ) )
+            // InternalOCLinEcore.g:15484:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getOwnedDetailsAssignment_2_1_1_0());
             }
-            // InternalOCLinEcore.g:15483:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
-            // InternalOCLinEcore.g:15483:2: rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0
+            // InternalOCLinEcore.g:15485:1: ( rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 )
+            // InternalOCLinEcore.g:15485:2: rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0();
@@ -47706,14 +47706,14 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1_1__1"
-    // InternalOCLinEcore.g:15493:1: rule__SysMLCS__Group_2_1_1__1 : rule__SysMLCS__Group_2_1_1__1__Impl ;
+    // InternalOCLinEcore.g:15495:1: rule__SysMLCS__Group_2_1_1__1 : rule__SysMLCS__Group_2_1_1__1__Impl ;
     public final void rule__SysMLCS__Group_2_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15497:1: ( rule__SysMLCS__Group_2_1_1__1__Impl )
-            // InternalOCLinEcore.g:15498:2: rule__SysMLCS__Group_2_1_1__1__Impl
+            // InternalOCLinEcore.g:15499:1: ( rule__SysMLCS__Group_2_1_1__1__Impl )
+            // InternalOCLinEcore.g:15500:2: rule__SysMLCS__Group_2_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SysMLCS__Group_2_1_1__1__Impl();
@@ -47739,17 +47739,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__Group_2_1_1__1__Impl"
-    // InternalOCLinEcore.g:15504:1: rule__SysMLCS__Group_2_1_1__1__Impl : ( ';' ) ;
+    // InternalOCLinEcore.g:15506:1: rule__SysMLCS__Group_2_1_1__1__Impl : ( ';' ) ;
     public final void rule__SysMLCS__Group_2_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15508:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:15509:1: ( ';' )
+            // InternalOCLinEcore.g:15510:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:15511:1: ( ';' )
             {
-            // InternalOCLinEcore.g:15509:1: ( ';' )
-            // InternalOCLinEcore.g:15510:1: ';'
+            // InternalOCLinEcore.g:15511:1: ( ';' )
+            // InternalOCLinEcore.g:15512:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getSemicolonKeyword_2_1_1_1());
@@ -47780,14 +47780,14 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__0"
-    // InternalOCLinEcore.g:15527:1: rule__TypedMultiplicityRefCS__Group__0 : rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 ;
+    // InternalOCLinEcore.g:15529:1: rule__TypedMultiplicityRefCS__Group__0 : rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 ;
     public final void rule__TypedMultiplicityRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15531:1: ( rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 )
-            // InternalOCLinEcore.g:15532:2: rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1
+            // InternalOCLinEcore.g:15533:1: ( rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 )
+            // InternalOCLinEcore.g:15534:2: rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_81);
             rule__TypedMultiplicityRefCS__Group__0__Impl();
@@ -47818,17 +47818,17 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__0__Impl"
-    // InternalOCLinEcore.g:15539:1: rule__TypedMultiplicityRefCS__Group__0__Impl : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:15541:1: rule__TypedMultiplicityRefCS__Group__0__Impl : ( ruleTypedRefCS ) ;
     public final void rule__TypedMultiplicityRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15543:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:15544:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:15545:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:15546:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:15544:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:15545:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:15546:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:15547:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedMultiplicityRefCSAccess().getTypedRefCSParserRuleCall_0());
@@ -47863,14 +47863,14 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__1"
-    // InternalOCLinEcore.g:15556:1: rule__TypedMultiplicityRefCS__Group__1 : rule__TypedMultiplicityRefCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:15558:1: rule__TypedMultiplicityRefCS__Group__1 : rule__TypedMultiplicityRefCS__Group__1__Impl ;
     public final void rule__TypedMultiplicityRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15560:1: ( rule__TypedMultiplicityRefCS__Group__1__Impl )
-            // InternalOCLinEcore.g:15561:2: rule__TypedMultiplicityRefCS__Group__1__Impl
+            // InternalOCLinEcore.g:15562:1: ( rule__TypedMultiplicityRefCS__Group__1__Impl )
+            // InternalOCLinEcore.g:15563:2: rule__TypedMultiplicityRefCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedMultiplicityRefCS__Group__1__Impl();
@@ -47896,22 +47896,22 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__1__Impl"
-    // InternalOCLinEcore.g:15567:1: rule__TypedMultiplicityRefCS__Group__1__Impl : ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalOCLinEcore.g:15569:1: rule__TypedMultiplicityRefCS__Group__1__Impl : ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypedMultiplicityRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15571:1: ( ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalOCLinEcore.g:15572:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLinEcore.g:15573:1: ( ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalOCLinEcore.g:15574:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalOCLinEcore.g:15572:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalOCLinEcore.g:15573:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLinEcore.g:15574:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLinEcore.g:15575:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalOCLinEcore.g:15574:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLinEcore.g:15576:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
             int alt178=2;
             int LA178_0 = input.LA(1);
 
@@ -47920,7 +47920,7 @@
             }
             switch (alt178) {
                 case 1 :
-                    // InternalOCLinEcore.g:15574:2: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1
+                    // InternalOCLinEcore.g:15576:2: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1();
@@ -47958,14 +47958,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__0"
-    // InternalOCLinEcore.g:15588:1: rule__TemplateSignatureCS__Group_0__0 : rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 ;
+    // InternalOCLinEcore.g:15590:1: rule__TemplateSignatureCS__Group_0__0 : rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 ;
     public final void rule__TemplateSignatureCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15592:1: ( rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 )
-            // InternalOCLinEcore.g:15593:2: rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1
+            // InternalOCLinEcore.g:15594:1: ( rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1 )
+            // InternalOCLinEcore.g:15595:2: rule__TemplateSignatureCS__Group_0__0__Impl rule__TemplateSignatureCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TemplateSignatureCS__Group_0__0__Impl();
@@ -47996,17 +47996,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:15600:1: rule__TemplateSignatureCS__Group_0__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:15602:1: rule__TemplateSignatureCS__Group_0__0__Impl : ( '(' ) ;
     public final void rule__TemplateSignatureCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15604:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:15605:1: ( '(' )
+            // InternalOCLinEcore.g:15606:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:15607:1: ( '(' )
             {
-            // InternalOCLinEcore.g:15605:1: ( '(' )
-            // InternalOCLinEcore.g:15606:1: '('
+            // InternalOCLinEcore.g:15607:1: ( '(' )
+            // InternalOCLinEcore.g:15608:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0_0());
@@ -48037,14 +48037,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__1"
-    // InternalOCLinEcore.g:15619:1: rule__TemplateSignatureCS__Group_0__1 : rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 ;
+    // InternalOCLinEcore.g:15621:1: rule__TemplateSignatureCS__Group_0__1 : rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 ;
     public final void rule__TemplateSignatureCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15623:1: ( rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 )
-            // InternalOCLinEcore.g:15624:2: rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2
+            // InternalOCLinEcore.g:15625:1: ( rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2 )
+            // InternalOCLinEcore.g:15626:2: rule__TemplateSignatureCS__Group_0__1__Impl rule__TemplateSignatureCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__TemplateSignatureCS__Group_0__1__Impl();
@@ -48075,23 +48075,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:15631:1: rule__TemplateSignatureCS__Group_0__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) ;
+    // InternalOCLinEcore.g:15633:1: rule__TemplateSignatureCS__Group_0__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15635:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) )
-            // InternalOCLinEcore.g:15636:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
+            // InternalOCLinEcore.g:15637:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) ) )
+            // InternalOCLinEcore.g:15638:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
             {
-            // InternalOCLinEcore.g:15636:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
-            // InternalOCLinEcore.g:15637:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
+            // InternalOCLinEcore.g:15638:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 ) )
+            // InternalOCLinEcore.g:15639:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_1());
             }
-            // InternalOCLinEcore.g:15638:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
-            // InternalOCLinEcore.g:15638:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1
+            // InternalOCLinEcore.g:15640:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 )
+            // InternalOCLinEcore.g:15640:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_0_1();
@@ -48126,14 +48126,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__2"
-    // InternalOCLinEcore.g:15648:1: rule__TemplateSignatureCS__Group_0__2 : rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 ;
+    // InternalOCLinEcore.g:15650:1: rule__TemplateSignatureCS__Group_0__2 : rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 ;
     public final void rule__TemplateSignatureCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15652:1: ( rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 )
-            // InternalOCLinEcore.g:15653:2: rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3
+            // InternalOCLinEcore.g:15654:1: ( rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3 )
+            // InternalOCLinEcore.g:15655:2: rule__TemplateSignatureCS__Group_0__2__Impl rule__TemplateSignatureCS__Group_0__3
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__TemplateSignatureCS__Group_0__2__Impl();
@@ -48164,22 +48164,22 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__2__Impl"
-    // InternalOCLinEcore.g:15660:1: rule__TemplateSignatureCS__Group_0__2__Impl : ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) ;
+    // InternalOCLinEcore.g:15662:1: rule__TemplateSignatureCS__Group_0__2__Impl : ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) ;
     public final void rule__TemplateSignatureCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15664:1: ( ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) )
-            // InternalOCLinEcore.g:15665:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
+            // InternalOCLinEcore.g:15666:1: ( ( ( rule__TemplateSignatureCS__Group_0_2__0 )* ) )
+            // InternalOCLinEcore.g:15667:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
             {
-            // InternalOCLinEcore.g:15665:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
-            // InternalOCLinEcore.g:15666:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
+            // InternalOCLinEcore.g:15667:1: ( ( rule__TemplateSignatureCS__Group_0_2__0 )* )
+            // InternalOCLinEcore.g:15668:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGroup_0_2());
             }
-            // InternalOCLinEcore.g:15667:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
+            // InternalOCLinEcore.g:15669:1: ( rule__TemplateSignatureCS__Group_0_2__0 )*
             loop179:
             do {
                 int alt179=2;
@@ -48192,7 +48192,7 @@
 
                 switch (alt179) {
             	case 1 :
-            	    // InternalOCLinEcore.g:15667:2: rule__TemplateSignatureCS__Group_0_2__0
+            	    // InternalOCLinEcore.g:15669:2: rule__TemplateSignatureCS__Group_0_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TemplateSignatureCS__Group_0_2__0();
@@ -48233,14 +48233,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__3"
-    // InternalOCLinEcore.g:15677:1: rule__TemplateSignatureCS__Group_0__3 : rule__TemplateSignatureCS__Group_0__3__Impl ;
+    // InternalOCLinEcore.g:15679:1: rule__TemplateSignatureCS__Group_0__3 : rule__TemplateSignatureCS__Group_0__3__Impl ;
     public final void rule__TemplateSignatureCS__Group_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15681:1: ( rule__TemplateSignatureCS__Group_0__3__Impl )
-            // InternalOCLinEcore.g:15682:2: rule__TemplateSignatureCS__Group_0__3__Impl
+            // InternalOCLinEcore.g:15683:1: ( rule__TemplateSignatureCS__Group_0__3__Impl )
+            // InternalOCLinEcore.g:15684:2: rule__TemplateSignatureCS__Group_0__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_0__3__Impl();
@@ -48266,17 +48266,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0__3__Impl"
-    // InternalOCLinEcore.g:15688:1: rule__TemplateSignatureCS__Group_0__3__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:15690:1: rule__TemplateSignatureCS__Group_0__3__Impl : ( ')' ) ;
     public final void rule__TemplateSignatureCS__Group_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15692:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:15693:1: ( ')' )
+            // InternalOCLinEcore.g:15694:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:15695:1: ( ')' )
             {
-            // InternalOCLinEcore.g:15693:1: ( ')' )
-            // InternalOCLinEcore.g:15694:1: ')'
+            // InternalOCLinEcore.g:15695:1: ( ')' )
+            // InternalOCLinEcore.g:15696:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_0_3());
@@ -48307,14 +48307,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__0"
-    // InternalOCLinEcore.g:15715:1: rule__TemplateSignatureCS__Group_0_2__0 : rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 ;
+    // InternalOCLinEcore.g:15717:1: rule__TemplateSignatureCS__Group_0_2__0 : rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 ;
     public final void rule__TemplateSignatureCS__Group_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15719:1: ( rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 )
-            // InternalOCLinEcore.g:15720:2: rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1
+            // InternalOCLinEcore.g:15721:1: ( rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1 )
+            // InternalOCLinEcore.g:15722:2: rule__TemplateSignatureCS__Group_0_2__0__Impl rule__TemplateSignatureCS__Group_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TemplateSignatureCS__Group_0_2__0__Impl();
@@ -48345,17 +48345,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__0__Impl"
-    // InternalOCLinEcore.g:15727:1: rule__TemplateSignatureCS__Group_0_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:15729:1: rule__TemplateSignatureCS__Group_0_2__0__Impl : ( ',' ) ;
     public final void rule__TemplateSignatureCS__Group_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15731:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:15732:1: ( ',' )
+            // InternalOCLinEcore.g:15733:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:15734:1: ( ',' )
             {
-            // InternalOCLinEcore.g:15732:1: ( ',' )
-            // InternalOCLinEcore.g:15733:1: ','
+            // InternalOCLinEcore.g:15734:1: ( ',' )
+            // InternalOCLinEcore.g:15735:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_0_2_0());
@@ -48386,14 +48386,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__1"
-    // InternalOCLinEcore.g:15746:1: rule__TemplateSignatureCS__Group_0_2__1 : rule__TemplateSignatureCS__Group_0_2__1__Impl ;
+    // InternalOCLinEcore.g:15748:1: rule__TemplateSignatureCS__Group_0_2__1 : rule__TemplateSignatureCS__Group_0_2__1__Impl ;
     public final void rule__TemplateSignatureCS__Group_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15750:1: ( rule__TemplateSignatureCS__Group_0_2__1__Impl )
-            // InternalOCLinEcore.g:15751:2: rule__TemplateSignatureCS__Group_0_2__1__Impl
+            // InternalOCLinEcore.g:15752:1: ( rule__TemplateSignatureCS__Group_0_2__1__Impl )
+            // InternalOCLinEcore.g:15753:2: rule__TemplateSignatureCS__Group_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_0_2__1__Impl();
@@ -48419,23 +48419,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_0_2__1__Impl"
-    // InternalOCLinEcore.g:15757:1: rule__TemplateSignatureCS__Group_0_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) ;
+    // InternalOCLinEcore.g:15759:1: rule__TemplateSignatureCS__Group_0_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15761:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) )
-            // InternalOCLinEcore.g:15762:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
+            // InternalOCLinEcore.g:15763:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) ) )
+            // InternalOCLinEcore.g:15764:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
             {
-            // InternalOCLinEcore.g:15762:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
-            // InternalOCLinEcore.g:15763:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
+            // InternalOCLinEcore.g:15764:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 ) )
+            // InternalOCLinEcore.g:15765:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_0_2_1());
             }
-            // InternalOCLinEcore.g:15764:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
-            // InternalOCLinEcore.g:15764:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1
+            // InternalOCLinEcore.g:15766:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 )
+            // InternalOCLinEcore.g:15766:2: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1();
@@ -48470,14 +48470,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__0"
-    // InternalOCLinEcore.g:15778:1: rule__TemplateSignatureCS__Group_1__0 : rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 ;
+    // InternalOCLinEcore.g:15780:1: rule__TemplateSignatureCS__Group_1__0 : rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 ;
     public final void rule__TemplateSignatureCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15782:1: ( rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 )
-            // InternalOCLinEcore.g:15783:2: rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1
+            // InternalOCLinEcore.g:15784:1: ( rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1 )
+            // InternalOCLinEcore.g:15785:2: rule__TemplateSignatureCS__Group_1__0__Impl rule__TemplateSignatureCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TemplateSignatureCS__Group_1__0__Impl();
@@ -48508,17 +48508,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:15790:1: rule__TemplateSignatureCS__Group_1__0__Impl : ( '<' ) ;
+    // InternalOCLinEcore.g:15792:1: rule__TemplateSignatureCS__Group_1__0__Impl : ( '<' ) ;
     public final void rule__TemplateSignatureCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15794:1: ( ( '<' ) )
-            // InternalOCLinEcore.g:15795:1: ( '<' )
+            // InternalOCLinEcore.g:15796:1: ( ( '<' ) )
+            // InternalOCLinEcore.g:15797:1: ( '<' )
             {
-            // InternalOCLinEcore.g:15795:1: ( '<' )
-            // InternalOCLinEcore.g:15796:1: '<'
+            // InternalOCLinEcore.g:15797:1: ( '<' )
+            // InternalOCLinEcore.g:15798:1: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getLessThanSignKeyword_1_0());
@@ -48549,14 +48549,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__1"
-    // InternalOCLinEcore.g:15809:1: rule__TemplateSignatureCS__Group_1__1 : rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 ;
+    // InternalOCLinEcore.g:15811:1: rule__TemplateSignatureCS__Group_1__1 : rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 ;
     public final void rule__TemplateSignatureCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15813:1: ( rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 )
-            // InternalOCLinEcore.g:15814:2: rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2
+            // InternalOCLinEcore.g:15815:1: ( rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2 )
+            // InternalOCLinEcore.g:15816:2: rule__TemplateSignatureCS__Group_1__1__Impl rule__TemplateSignatureCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_82);
             rule__TemplateSignatureCS__Group_1__1__Impl();
@@ -48587,23 +48587,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:15821:1: rule__TemplateSignatureCS__Group_1__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:15823:1: rule__TemplateSignatureCS__Group_1__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15825:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:15826:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
+            // InternalOCLinEcore.g:15827:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:15828:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:15826:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
-            // InternalOCLinEcore.g:15827:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
+            // InternalOCLinEcore.g:15828:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 ) )
+            // InternalOCLinEcore.g:15829:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_1());
             }
-            // InternalOCLinEcore.g:15828:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
-            // InternalOCLinEcore.g:15828:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1
+            // InternalOCLinEcore.g:15830:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 )
+            // InternalOCLinEcore.g:15830:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_1_1();
@@ -48638,14 +48638,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__2"
-    // InternalOCLinEcore.g:15838:1: rule__TemplateSignatureCS__Group_1__2 : rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 ;
+    // InternalOCLinEcore.g:15840:1: rule__TemplateSignatureCS__Group_1__2 : rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 ;
     public final void rule__TemplateSignatureCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15842:1: ( rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 )
-            // InternalOCLinEcore.g:15843:2: rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3
+            // InternalOCLinEcore.g:15844:1: ( rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3 )
+            // InternalOCLinEcore.g:15845:2: rule__TemplateSignatureCS__Group_1__2__Impl rule__TemplateSignatureCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_82);
             rule__TemplateSignatureCS__Group_1__2__Impl();
@@ -48676,22 +48676,22 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__2__Impl"
-    // InternalOCLinEcore.g:15850:1: rule__TemplateSignatureCS__Group_1__2__Impl : ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) ;
+    // InternalOCLinEcore.g:15852:1: rule__TemplateSignatureCS__Group_1__2__Impl : ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) ;
     public final void rule__TemplateSignatureCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15854:1: ( ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) )
-            // InternalOCLinEcore.g:15855:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
+            // InternalOCLinEcore.g:15856:1: ( ( ( rule__TemplateSignatureCS__Group_1_2__0 )* ) )
+            // InternalOCLinEcore.g:15857:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
             {
-            // InternalOCLinEcore.g:15855:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
-            // InternalOCLinEcore.g:15856:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
+            // InternalOCLinEcore.g:15857:1: ( ( rule__TemplateSignatureCS__Group_1_2__0 )* )
+            // InternalOCLinEcore.g:15858:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGroup_1_2());
             }
-            // InternalOCLinEcore.g:15857:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
+            // InternalOCLinEcore.g:15859:1: ( rule__TemplateSignatureCS__Group_1_2__0 )*
             loop180:
             do {
                 int alt180=2;
@@ -48704,7 +48704,7 @@
 
                 switch (alt180) {
             	case 1 :
-            	    // InternalOCLinEcore.g:15857:2: rule__TemplateSignatureCS__Group_1_2__0
+            	    // InternalOCLinEcore.g:15859:2: rule__TemplateSignatureCS__Group_1_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TemplateSignatureCS__Group_1_2__0();
@@ -48745,14 +48745,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__3"
-    // InternalOCLinEcore.g:15867:1: rule__TemplateSignatureCS__Group_1__3 : rule__TemplateSignatureCS__Group_1__3__Impl ;
+    // InternalOCLinEcore.g:15869:1: rule__TemplateSignatureCS__Group_1__3 : rule__TemplateSignatureCS__Group_1__3__Impl ;
     public final void rule__TemplateSignatureCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15871:1: ( rule__TemplateSignatureCS__Group_1__3__Impl )
-            // InternalOCLinEcore.g:15872:2: rule__TemplateSignatureCS__Group_1__3__Impl
+            // InternalOCLinEcore.g:15873:1: ( rule__TemplateSignatureCS__Group_1__3__Impl )
+            // InternalOCLinEcore.g:15874:2: rule__TemplateSignatureCS__Group_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_1__3__Impl();
@@ -48778,17 +48778,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1__3__Impl"
-    // InternalOCLinEcore.g:15878:1: rule__TemplateSignatureCS__Group_1__3__Impl : ( '>' ) ;
+    // InternalOCLinEcore.g:15880:1: rule__TemplateSignatureCS__Group_1__3__Impl : ( '>' ) ;
     public final void rule__TemplateSignatureCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15882:1: ( ( '>' ) )
-            // InternalOCLinEcore.g:15883:1: ( '>' )
+            // InternalOCLinEcore.g:15884:1: ( ( '>' ) )
+            // InternalOCLinEcore.g:15885:1: ( '>' )
             {
-            // InternalOCLinEcore.g:15883:1: ( '>' )
-            // InternalOCLinEcore.g:15884:1: '>'
+            // InternalOCLinEcore.g:15885:1: ( '>' )
+            // InternalOCLinEcore.g:15886:1: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGreaterThanSignKeyword_1_3());
@@ -48819,14 +48819,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__0"
-    // InternalOCLinEcore.g:15905:1: rule__TemplateSignatureCS__Group_1_2__0 : rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 ;
+    // InternalOCLinEcore.g:15907:1: rule__TemplateSignatureCS__Group_1_2__0 : rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 ;
     public final void rule__TemplateSignatureCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15909:1: ( rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 )
-            // InternalOCLinEcore.g:15910:2: rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1
+            // InternalOCLinEcore.g:15911:1: ( rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1 )
+            // InternalOCLinEcore.g:15912:2: rule__TemplateSignatureCS__Group_1_2__0__Impl rule__TemplateSignatureCS__Group_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TemplateSignatureCS__Group_1_2__0__Impl();
@@ -48857,17 +48857,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__0__Impl"
-    // InternalOCLinEcore.g:15917:1: rule__TemplateSignatureCS__Group_1_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:15919:1: rule__TemplateSignatureCS__Group_1_2__0__Impl : ( ',' ) ;
     public final void rule__TemplateSignatureCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15921:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:15922:1: ( ',' )
+            // InternalOCLinEcore.g:15923:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:15924:1: ( ',' )
             {
-            // InternalOCLinEcore.g:15922:1: ( ',' )
-            // InternalOCLinEcore.g:15923:1: ','
+            // InternalOCLinEcore.g:15924:1: ( ',' )
+            // InternalOCLinEcore.g:15925:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_1_2_0());
@@ -48898,14 +48898,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__1"
-    // InternalOCLinEcore.g:15936:1: rule__TemplateSignatureCS__Group_1_2__1 : rule__TemplateSignatureCS__Group_1_2__1__Impl ;
+    // InternalOCLinEcore.g:15938:1: rule__TemplateSignatureCS__Group_1_2__1 : rule__TemplateSignatureCS__Group_1_2__1__Impl ;
     public final void rule__TemplateSignatureCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15940:1: ( rule__TemplateSignatureCS__Group_1_2__1__Impl )
-            // InternalOCLinEcore.g:15941:2: rule__TemplateSignatureCS__Group_1_2__1__Impl
+            // InternalOCLinEcore.g:15942:1: ( rule__TemplateSignatureCS__Group_1_2__1__Impl )
+            // InternalOCLinEcore.g:15943:2: rule__TemplateSignatureCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_1_2__1__Impl();
@@ -48931,23 +48931,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_1_2__1__Impl"
-    // InternalOCLinEcore.g:15947:1: rule__TemplateSignatureCS__Group_1_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) ;
+    // InternalOCLinEcore.g:15949:1: rule__TemplateSignatureCS__Group_1_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15951:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) )
-            // InternalOCLinEcore.g:15952:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
+            // InternalOCLinEcore.g:15953:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) ) )
+            // InternalOCLinEcore.g:15954:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
             {
-            // InternalOCLinEcore.g:15952:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
-            // InternalOCLinEcore.g:15953:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
+            // InternalOCLinEcore.g:15954:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 ) )
+            // InternalOCLinEcore.g:15955:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1_2_1());
             }
-            // InternalOCLinEcore.g:15954:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
-            // InternalOCLinEcore.g:15954:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1
+            // InternalOCLinEcore.g:15956:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 )
+            // InternalOCLinEcore.g:15956:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1();
@@ -48982,14 +48982,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0"
-    // InternalOCLinEcore.g:15968:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
+    // InternalOCLinEcore.g:15970:1: rule__TypedTypeRefCS__Group__0 : rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 ;
     public final void rule__TypedTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15972:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
-            // InternalOCLinEcore.g:15973:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
+            // InternalOCLinEcore.g:15974:1: ( rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1 )
+            // InternalOCLinEcore.g:15975:2: rule__TypedTypeRefCS__Group__0__Impl rule__TypedTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_83);
             rule__TypedTypeRefCS__Group__0__Impl();
@@ -49020,23 +49020,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__0__Impl"
-    // InternalOCLinEcore.g:15980:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:15982:1: rule__TypedTypeRefCS__Group__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypedTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:15984:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:15985:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLinEcore.g:15986:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:15987:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:15985:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
-            // InternalOCLinEcore.g:15986:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalOCLinEcore.g:15987:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLinEcore.g:15988:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalOCLinEcore.g:15987:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
-            // InternalOCLinEcore.g:15987:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
+            // InternalOCLinEcore.g:15989:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0 )
+            // InternalOCLinEcore.g:15989:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedPathNameAssignment_0();
@@ -49071,14 +49071,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1"
-    // InternalOCLinEcore.g:15997:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:15999:1: rule__TypedTypeRefCS__Group__1 : rule__TypedTypeRefCS__Group__1__Impl ;
     public final void rule__TypedTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16001:1: ( rule__TypedTypeRefCS__Group__1__Impl )
-            // InternalOCLinEcore.g:16002:2: rule__TypedTypeRefCS__Group__1__Impl
+            // InternalOCLinEcore.g:16003:1: ( rule__TypedTypeRefCS__Group__1__Impl )
+            // InternalOCLinEcore.g:16004:2: rule__TypedTypeRefCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group__1__Impl();
@@ -49104,22 +49104,22 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group__1__Impl"
-    // InternalOCLinEcore.g:16008:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) ;
+    // InternalOCLinEcore.g:16010:1: rule__TypedTypeRefCS__Group__1__Impl : ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) ;
     public final void rule__TypedTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16012:1: ( ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) )
-            // InternalOCLinEcore.g:16013:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
+            // InternalOCLinEcore.g:16014:1: ( ( ( rule__TypedTypeRefCS__Alternatives_1 )? ) )
+            // InternalOCLinEcore.g:16015:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
             {
-            // InternalOCLinEcore.g:16013:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
-            // InternalOCLinEcore.g:16014:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
+            // InternalOCLinEcore.g:16015:1: ( ( rule__TypedTypeRefCS__Alternatives_1 )? )
+            // InternalOCLinEcore.g:16016:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getAlternatives_1());
             }
-            // InternalOCLinEcore.g:16015:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
+            // InternalOCLinEcore.g:16017:1: ( rule__TypedTypeRefCS__Alternatives_1 )?
             int alt181=2;
             int LA181_0 = input.LA(1);
 
@@ -49128,7 +49128,7 @@
             }
             switch (alt181) {
                 case 1 :
-                    // InternalOCLinEcore.g:16015:2: rule__TypedTypeRefCS__Alternatives_1
+                    // InternalOCLinEcore.g:16017:2: rule__TypedTypeRefCS__Alternatives_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Alternatives_1();
@@ -49166,14 +49166,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__0"
-    // InternalOCLinEcore.g:16029:1: rule__TypedTypeRefCS__Group_1_0__0 : rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 ;
+    // InternalOCLinEcore.g:16031:1: rule__TypedTypeRefCS__Group_1_0__0 : rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 ;
     public final void rule__TypedTypeRefCS__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16033:1: ( rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 )
-            // InternalOCLinEcore.g:16034:2: rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1
+            // InternalOCLinEcore.g:16035:1: ( rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1 )
+            // InternalOCLinEcore.g:16036:2: rule__TypedTypeRefCS__Group_1_0__0__Impl rule__TypedTypeRefCS__Group_1_0__1
             {
             pushFollow(FollowSets000.FOLLOW_84);
             rule__TypedTypeRefCS__Group_1_0__0__Impl();
@@ -49204,17 +49204,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__0__Impl"
-    // InternalOCLinEcore.g:16041:1: rule__TypedTypeRefCS__Group_1_0__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:16043:1: rule__TypedTypeRefCS__Group_1_0__0__Impl : ( '(' ) ;
     public final void rule__TypedTypeRefCS__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16045:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:16046:1: ( '(' )
+            // InternalOCLinEcore.g:16047:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:16048:1: ( '(' )
             {
-            // InternalOCLinEcore.g:16046:1: ( '(' )
-            // InternalOCLinEcore.g:16047:1: '('
+            // InternalOCLinEcore.g:16048:1: ( '(' )
+            // InternalOCLinEcore.g:16049:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_0_0());
@@ -49245,14 +49245,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__1"
-    // InternalOCLinEcore.g:16060:1: rule__TypedTypeRefCS__Group_1_0__1 : rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 ;
+    // InternalOCLinEcore.g:16062:1: rule__TypedTypeRefCS__Group_1_0__1 : rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 ;
     public final void rule__TypedTypeRefCS__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16064:1: ( rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 )
-            // InternalOCLinEcore.g:16065:2: rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2
+            // InternalOCLinEcore.g:16066:1: ( rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2 )
+            // InternalOCLinEcore.g:16067:2: rule__TypedTypeRefCS__Group_1_0__1__Impl rule__TypedTypeRefCS__Group_1_0__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__TypedTypeRefCS__Group_1_0__1__Impl();
@@ -49283,23 +49283,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__1__Impl"
-    // InternalOCLinEcore.g:16072:1: rule__TypedTypeRefCS__Group_1_0__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) ;
+    // InternalOCLinEcore.g:16074:1: rule__TypedTypeRefCS__Group_1_0__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16076:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) )
-            // InternalOCLinEcore.g:16077:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
+            // InternalOCLinEcore.g:16078:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) ) )
+            // InternalOCLinEcore.g:16079:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
             {
-            // InternalOCLinEcore.g:16077:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
-            // InternalOCLinEcore.g:16078:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
+            // InternalOCLinEcore.g:16079:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 ) )
+            // InternalOCLinEcore.g:16080:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_0_1());
             }
-            // InternalOCLinEcore.g:16079:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
-            // InternalOCLinEcore.g:16079:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1
+            // InternalOCLinEcore.g:16081:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 )
+            // InternalOCLinEcore.g:16081:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1();
@@ -49334,14 +49334,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__2"
-    // InternalOCLinEcore.g:16089:1: rule__TypedTypeRefCS__Group_1_0__2 : rule__TypedTypeRefCS__Group_1_0__2__Impl ;
+    // InternalOCLinEcore.g:16091:1: rule__TypedTypeRefCS__Group_1_0__2 : rule__TypedTypeRefCS__Group_1_0__2__Impl ;
     public final void rule__TypedTypeRefCS__Group_1_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16093:1: ( rule__TypedTypeRefCS__Group_1_0__2__Impl )
-            // InternalOCLinEcore.g:16094:2: rule__TypedTypeRefCS__Group_1_0__2__Impl
+            // InternalOCLinEcore.g:16095:1: ( rule__TypedTypeRefCS__Group_1_0__2__Impl )
+            // InternalOCLinEcore.g:16096:2: rule__TypedTypeRefCS__Group_1_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1_0__2__Impl();
@@ -49367,17 +49367,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_0__2__Impl"
-    // InternalOCLinEcore.g:16100:1: rule__TypedTypeRefCS__Group_1_0__2__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:16102:1: rule__TypedTypeRefCS__Group_1_0__2__Impl : ( ')' ) ;
     public final void rule__TypedTypeRefCS__Group_1_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16104:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:16105:1: ( ')' )
+            // InternalOCLinEcore.g:16106:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:16107:1: ( ')' )
             {
-            // InternalOCLinEcore.g:16105:1: ( ')' )
-            // InternalOCLinEcore.g:16106:1: ')'
+            // InternalOCLinEcore.g:16107:1: ( ')' )
+            // InternalOCLinEcore.g:16108:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_0_2());
@@ -49408,14 +49408,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__0"
-    // InternalOCLinEcore.g:16125:1: rule__TypedTypeRefCS__Group_1_1__0 : rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 ;
+    // InternalOCLinEcore.g:16127:1: rule__TypedTypeRefCS__Group_1_1__0 : rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 ;
     public final void rule__TypedTypeRefCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16129:1: ( rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 )
-            // InternalOCLinEcore.g:16130:2: rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1
+            // InternalOCLinEcore.g:16131:1: ( rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 )
+            // InternalOCLinEcore.g:16132:2: rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_84);
             rule__TypedTypeRefCS__Group_1_1__0__Impl();
@@ -49446,17 +49446,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__0__Impl"
-    // InternalOCLinEcore.g:16137:1: rule__TypedTypeRefCS__Group_1_1__0__Impl : ( '<' ) ;
+    // InternalOCLinEcore.g:16139:1: rule__TypedTypeRefCS__Group_1_1__0__Impl : ( '<' ) ;
     public final void rule__TypedTypeRefCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16141:1: ( ( '<' ) )
-            // InternalOCLinEcore.g:16142:1: ( '<' )
+            // InternalOCLinEcore.g:16143:1: ( ( '<' ) )
+            // InternalOCLinEcore.g:16144:1: ( '<' )
             {
-            // InternalOCLinEcore.g:16142:1: ( '<' )
-            // InternalOCLinEcore.g:16143:1: '<'
+            // InternalOCLinEcore.g:16144:1: ( '<' )
+            // InternalOCLinEcore.g:16145:1: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLessThanSignKeyword_1_1_0());
@@ -49487,14 +49487,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__1"
-    // InternalOCLinEcore.g:16156:1: rule__TypedTypeRefCS__Group_1_1__1 : rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 ;
+    // InternalOCLinEcore.g:16158:1: rule__TypedTypeRefCS__Group_1_1__1 : rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 ;
     public final void rule__TypedTypeRefCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16160:1: ( rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 )
-            // InternalOCLinEcore.g:16161:2: rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2
+            // InternalOCLinEcore.g:16162:1: ( rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 )
+            // InternalOCLinEcore.g:16163:2: rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_85);
             rule__TypedTypeRefCS__Group_1_1__1__Impl();
@@ -49525,23 +49525,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__1__Impl"
-    // InternalOCLinEcore.g:16168:1: rule__TypedTypeRefCS__Group_1_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:16170:1: rule__TypedTypeRefCS__Group_1_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16172:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) )
-            // InternalOCLinEcore.g:16173:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:16174:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) )
+            // InternalOCLinEcore.g:16175:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:16173:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
-            // InternalOCLinEcore.g:16174:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
+            // InternalOCLinEcore.g:16175:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:16176:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1_1());
             }
-            // InternalOCLinEcore.g:16175:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
-            // InternalOCLinEcore.g:16175:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1
+            // InternalOCLinEcore.g:16177:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
+            // InternalOCLinEcore.g:16177:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1();
@@ -49576,14 +49576,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__2"
-    // InternalOCLinEcore.g:16185:1: rule__TypedTypeRefCS__Group_1_1__2 : rule__TypedTypeRefCS__Group_1_1__2__Impl ;
+    // InternalOCLinEcore.g:16187:1: rule__TypedTypeRefCS__Group_1_1__2 : rule__TypedTypeRefCS__Group_1_1__2__Impl ;
     public final void rule__TypedTypeRefCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16189:1: ( rule__TypedTypeRefCS__Group_1_1__2__Impl )
-            // InternalOCLinEcore.g:16190:2: rule__TypedTypeRefCS__Group_1_1__2__Impl
+            // InternalOCLinEcore.g:16191:1: ( rule__TypedTypeRefCS__Group_1_1__2__Impl )
+            // InternalOCLinEcore.g:16192:2: rule__TypedTypeRefCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1_1__2__Impl();
@@ -49609,17 +49609,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__2__Impl"
-    // InternalOCLinEcore.g:16196:1: rule__TypedTypeRefCS__Group_1_1__2__Impl : ( '>' ) ;
+    // InternalOCLinEcore.g:16198:1: rule__TypedTypeRefCS__Group_1_1__2__Impl : ( '>' ) ;
     public final void rule__TypedTypeRefCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16200:1: ( ( '>' ) )
-            // InternalOCLinEcore.g:16201:1: ( '>' )
+            // InternalOCLinEcore.g:16202:1: ( ( '>' ) )
+            // InternalOCLinEcore.g:16203:1: ( '>' )
             {
-            // InternalOCLinEcore.g:16201:1: ( '>' )
-            // InternalOCLinEcore.g:16202:1: '>'
+            // InternalOCLinEcore.g:16203:1: ( '>' )
+            // InternalOCLinEcore.g:16204:1: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGreaterThanSignKeyword_1_1_2());
@@ -49650,14 +49650,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__0"
-    // InternalOCLinEcore.g:16221:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
+    // InternalOCLinEcore.g:16223:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
     public final void rule__URIPathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16225:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
-            // InternalOCLinEcore.g:16226:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
+            // InternalOCLinEcore.g:16227:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
+            // InternalOCLinEcore.g:16228:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_86);
             rule__URIPathNameCS__Group__0__Impl();
@@ -49688,23 +49688,23 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__0__Impl"
-    // InternalOCLinEcore.g:16233:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:16235:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__URIPathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16237:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalOCLinEcore.g:16238:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLinEcore.g:16239:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalOCLinEcore.g:16240:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:16238:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalOCLinEcore.g:16239:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLinEcore.g:16240:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLinEcore.g:16241:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalOCLinEcore.g:16240:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalOCLinEcore.g:16240:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
+            // InternalOCLinEcore.g:16242:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLinEcore.g:16242:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__OwnedPathElementsAssignment_0();
@@ -49739,14 +49739,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__1"
-    // InternalOCLinEcore.g:16250:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:16252:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
     public final void rule__URIPathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16254:1: ( rule__URIPathNameCS__Group__1__Impl )
-            // InternalOCLinEcore.g:16255:2: rule__URIPathNameCS__Group__1__Impl
+            // InternalOCLinEcore.g:16256:1: ( rule__URIPathNameCS__Group__1__Impl )
+            // InternalOCLinEcore.g:16257:2: rule__URIPathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__Group__1__Impl();
@@ -49772,22 +49772,22 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__1__Impl"
-    // InternalOCLinEcore.g:16261:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
+    // InternalOCLinEcore.g:16263:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
     public final void rule__URIPathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16265:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
-            // InternalOCLinEcore.g:16266:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
+            // InternalOCLinEcore.g:16267:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
+            // InternalOCLinEcore.g:16268:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
             {
-            // InternalOCLinEcore.g:16266:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
-            // InternalOCLinEcore.g:16267:1: ( rule__URIPathNameCS__Group_1__0 )*
+            // InternalOCLinEcore.g:16268:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
+            // InternalOCLinEcore.g:16269:1: ( rule__URIPathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:16268:1: ( rule__URIPathNameCS__Group_1__0 )*
+            // InternalOCLinEcore.g:16270:1: ( rule__URIPathNameCS__Group_1__0 )*
             loop182:
             do {
                 int alt182=2;
@@ -49800,7 +49800,7 @@
 
                 switch (alt182) {
             	case 1 :
-            	    // InternalOCLinEcore.g:16268:2: rule__URIPathNameCS__Group_1__0
+            	    // InternalOCLinEcore.g:16270:2: rule__URIPathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_87);
             	    rule__URIPathNameCS__Group_1__0();
@@ -49841,14 +49841,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__0"
-    // InternalOCLinEcore.g:16282:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
+    // InternalOCLinEcore.g:16284:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
     public final void rule__URIPathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16286:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
-            // InternalOCLinEcore.g:16287:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
+            // InternalOCLinEcore.g:16288:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
+            // InternalOCLinEcore.g:16289:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_88);
             rule__URIPathNameCS__Group_1__0__Impl();
@@ -49879,17 +49879,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:16294:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalOCLinEcore.g:16296:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__URIPathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16298:1: ( ( '::' ) )
-            // InternalOCLinEcore.g:16299:1: ( '::' )
+            // InternalOCLinEcore.g:16300:1: ( ( '::' ) )
+            // InternalOCLinEcore.g:16301:1: ( '::' )
             {
-            // InternalOCLinEcore.g:16299:1: ( '::' )
-            // InternalOCLinEcore.g:16300:1: '::'
+            // InternalOCLinEcore.g:16301:1: ( '::' )
+            // InternalOCLinEcore.g:16302:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
@@ -49920,14 +49920,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__1"
-    // InternalOCLinEcore.g:16313:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:16315:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
     public final void rule__URIPathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16317:1: ( rule__URIPathNameCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:16318:2: rule__URIPathNameCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:16319:1: ( rule__URIPathNameCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:16320:2: rule__URIPathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__Group_1__1__Impl();
@@ -49953,23 +49953,23 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:16324:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:16326:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__URIPathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16328:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:16329:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16330:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:16331:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:16329:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalOCLinEcore.g:16330:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLinEcore.g:16331:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16332:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalOCLinEcore.g:16331:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalOCLinEcore.g:16331:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalOCLinEcore.g:16333:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLinEcore.g:16333:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__OwnedPathElementsAssignment_1_1();
@@ -50004,14 +50004,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0"
-    // InternalOCLinEcore.g:16345:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
+    // InternalOCLinEcore.g:16347:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
     public final void rule__URIFirstPathElementCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16349:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
-            // InternalOCLinEcore.g:16350:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
+            // InternalOCLinEcore.g:16351:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
+            // InternalOCLinEcore.g:16352:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__URIFirstPathElementCS__Group_1__0__Impl();
@@ -50042,23 +50042,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:16357:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:16359:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
     public final void rule__URIFirstPathElementCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16361:1: ( ( () ) )
-            // InternalOCLinEcore.g:16362:1: ( () )
+            // InternalOCLinEcore.g:16363:1: ( ( () ) )
+            // InternalOCLinEcore.g:16364:1: ( () )
             {
-            // InternalOCLinEcore.g:16362:1: ( () )
-            // InternalOCLinEcore.g:16363:1: ()
+            // InternalOCLinEcore.g:16364:1: ( () )
+            // InternalOCLinEcore.g:16365:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
             }
-            // InternalOCLinEcore.g:16364:1: ()
-            // InternalOCLinEcore.g:16366:1:
+            // InternalOCLinEcore.g:16366:1: ()
+            // InternalOCLinEcore.g:16368:1:
             {
             }
 
@@ -50083,14 +50083,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1"
-    // InternalOCLinEcore.g:16376:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:16378:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
     public final void rule__URIFirstPathElementCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16380:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:16381:2: rule__URIFirstPathElementCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:16382:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:16383:2: rule__URIFirstPathElementCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__Group_1__1__Impl();
@@ -50116,23 +50116,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:16387:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:16389:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
     public final void rule__URIFirstPathElementCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16391:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:16392:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16393:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:16394:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:16392:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
-            // InternalOCLinEcore.g:16393:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalOCLinEcore.g:16394:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16395:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
             }
-            // InternalOCLinEcore.g:16394:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
-            // InternalOCLinEcore.g:16394:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
+            // InternalOCLinEcore.g:16396:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalOCLinEcore.g:16396:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__ReferredElementAssignment_1_1();
@@ -50167,14 +50167,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0"
-    // InternalOCLinEcore.g:16408:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
+    // InternalOCLinEcore.g:16410:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
     public final void rule__CollectionTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16412:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
-            // InternalOCLinEcore.g:16413:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
+            // InternalOCLinEcore.g:16414:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
+            // InternalOCLinEcore.g:16415:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__CollectionTypeCS__Group__0__Impl();
@@ -50205,23 +50205,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0__Impl"
-    // InternalOCLinEcore.g:16420:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:16422:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
     public final void rule__CollectionTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16424:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:16425:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:16426:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:16427:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:16425:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:16426:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:16427:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:16428:1: ( rule__CollectionTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:16427:1: ( rule__CollectionTypeCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:16427:2: rule__CollectionTypeCS__NameAssignment_0
+            // InternalOCLinEcore.g:16429:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:16429:2: rule__CollectionTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__NameAssignment_0();
@@ -50256,14 +50256,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1"
-    // InternalOCLinEcore.g:16437:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:16439:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
     public final void rule__CollectionTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16441:1: ( rule__CollectionTypeCS__Group__1__Impl )
-            // InternalOCLinEcore.g:16442:2: rule__CollectionTypeCS__Group__1__Impl
+            // InternalOCLinEcore.g:16443:1: ( rule__CollectionTypeCS__Group__1__Impl )
+            // InternalOCLinEcore.g:16444:2: rule__CollectionTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group__1__Impl();
@@ -50289,22 +50289,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1__Impl"
-    // InternalOCLinEcore.g:16448:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:16450:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
     public final void rule__CollectionTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16452:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:16453:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:16454:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:16455:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:16453:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:16454:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalOCLinEcore.g:16455:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:16456:1: ( rule__CollectionTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:16455:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalOCLinEcore.g:16457:1: ( rule__CollectionTypeCS__Group_1__0 )?
             int alt183=2;
             int LA183_0 = input.LA(1);
 
@@ -50313,7 +50313,7 @@
             }
             switch (alt183) {
                 case 1 :
-                    // InternalOCLinEcore.g:16455:2: rule__CollectionTypeCS__Group_1__0
+                    // InternalOCLinEcore.g:16457:2: rule__CollectionTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__Group_1__0();
@@ -50351,14 +50351,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0"
-    // InternalOCLinEcore.g:16469:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
+    // InternalOCLinEcore.g:16471:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
     public final void rule__CollectionTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16473:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
-            // InternalOCLinEcore.g:16474:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
+            // InternalOCLinEcore.g:16475:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
+            // InternalOCLinEcore.g:16476:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__CollectionTypeCS__Group_1__0__Impl();
@@ -50389,17 +50389,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:16481:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:16483:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__CollectionTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16485:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:16486:1: ( '(' )
+            // InternalOCLinEcore.g:16487:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:16488:1: ( '(' )
             {
-            // InternalOCLinEcore.g:16486:1: ( '(' )
-            // InternalOCLinEcore.g:16487:1: '('
+            // InternalOCLinEcore.g:16488:1: ( '(' )
+            // InternalOCLinEcore.g:16489:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -50430,14 +50430,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1"
-    // InternalOCLinEcore.g:16500:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
+    // InternalOCLinEcore.g:16502:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
     public final void rule__CollectionTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16504:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
-            // InternalOCLinEcore.g:16505:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
+            // InternalOCLinEcore.g:16506:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
+            // InternalOCLinEcore.g:16507:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_89);
             rule__CollectionTypeCS__Group_1__1__Impl();
@@ -50468,23 +50468,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:16512:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:16514:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CollectionTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16516:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:16517:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16518:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:16519:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:16517:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLinEcore.g:16518:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:16519:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16520:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLinEcore.g:16519:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLinEcore.g:16519:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
+            // InternalOCLinEcore.g:16521:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:16521:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__OwnedTypeAssignment_1_1();
@@ -50519,14 +50519,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2"
-    // InternalOCLinEcore.g:16529:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
+    // InternalOCLinEcore.g:16531:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
     public final void rule__CollectionTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16533:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
-            // InternalOCLinEcore.g:16534:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
+            // InternalOCLinEcore.g:16535:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
+            // InternalOCLinEcore.g:16536:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_89);
             rule__CollectionTypeCS__Group_1__2__Impl();
@@ -50557,22 +50557,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2__Impl"
-    // InternalOCLinEcore.g:16541:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
+    // InternalOCLinEcore.g:16543:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
     public final void rule__CollectionTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16545:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
-            // InternalOCLinEcore.g:16546:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalOCLinEcore.g:16547:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
+            // InternalOCLinEcore.g:16548:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
             {
-            // InternalOCLinEcore.g:16546:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
-            // InternalOCLinEcore.g:16547:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalOCLinEcore.g:16548:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalOCLinEcore.g:16549:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityAssignment_1_2());
             }
-            // InternalOCLinEcore.g:16548:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalOCLinEcore.g:16550:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             int alt184=2;
             int LA184_0 = input.LA(1);
 
@@ -50581,7 +50581,7 @@
             }
             switch (alt184) {
                 case 1 :
-                    // InternalOCLinEcore.g:16548:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
+                    // InternalOCLinEcore.g:16550:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2();
@@ -50619,14 +50619,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3"
-    // InternalOCLinEcore.g:16558:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
+    // InternalOCLinEcore.g:16560:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
     public final void rule__CollectionTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16562:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
-            // InternalOCLinEcore.g:16563:2: rule__CollectionTypeCS__Group_1__3__Impl
+            // InternalOCLinEcore.g:16564:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
+            // InternalOCLinEcore.g:16565:2: rule__CollectionTypeCS__Group_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group_1__3__Impl();
@@ -50652,17 +50652,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3__Impl"
-    // InternalOCLinEcore.g:16569:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:16571:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
     public final void rule__CollectionTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16573:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:16574:1: ( ')' )
+            // InternalOCLinEcore.g:16575:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:16576:1: ( ')' )
             {
-            // InternalOCLinEcore.g:16574:1: ( ')' )
-            // InternalOCLinEcore.g:16575:1: ')'
+            // InternalOCLinEcore.g:16576:1: ( ')' )
+            // InternalOCLinEcore.g:16577:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());
@@ -50693,14 +50693,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0"
-    // InternalOCLinEcore.g:16596:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
+    // InternalOCLinEcore.g:16598:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
     public final void rule__MapTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16600:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
-            // InternalOCLinEcore.g:16601:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
+            // InternalOCLinEcore.g:16602:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
+            // InternalOCLinEcore.g:16603:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__MapTypeCS__Group__0__Impl();
@@ -50731,23 +50731,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0__Impl"
-    // InternalOCLinEcore.g:16608:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:16610:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
     public final void rule__MapTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16612:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:16613:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:16614:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:16615:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:16613:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:16614:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:16615:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:16616:1: ( rule__MapTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:16615:1: ( rule__MapTypeCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:16615:2: rule__MapTypeCS__NameAssignment_0
+            // InternalOCLinEcore.g:16617:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:16617:2: rule__MapTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__NameAssignment_0();
@@ -50782,14 +50782,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1"
-    // InternalOCLinEcore.g:16625:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:16627:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
     public final void rule__MapTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16629:1: ( rule__MapTypeCS__Group__1__Impl )
-            // InternalOCLinEcore.g:16630:2: rule__MapTypeCS__Group__1__Impl
+            // InternalOCLinEcore.g:16631:1: ( rule__MapTypeCS__Group__1__Impl )
+            // InternalOCLinEcore.g:16632:2: rule__MapTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group__1__Impl();
@@ -50815,22 +50815,22 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1__Impl"
-    // InternalOCLinEcore.g:16636:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:16638:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
     public final void rule__MapTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16640:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:16641:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:16642:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:16643:1: ( ( rule__MapTypeCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:16641:1: ( ( rule__MapTypeCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:16642:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalOCLinEcore.g:16643:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:16644:1: ( rule__MapTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:16643:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalOCLinEcore.g:16645:1: ( rule__MapTypeCS__Group_1__0 )?
             int alt185=2;
             int LA185_0 = input.LA(1);
 
@@ -50839,7 +50839,7 @@
             }
             switch (alt185) {
                 case 1 :
-                    // InternalOCLinEcore.g:16643:2: rule__MapTypeCS__Group_1__0
+                    // InternalOCLinEcore.g:16645:2: rule__MapTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapTypeCS__Group_1__0();
@@ -50877,14 +50877,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0"
-    // InternalOCLinEcore.g:16657:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
+    // InternalOCLinEcore.g:16659:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
     public final void rule__MapTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16661:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
-            // InternalOCLinEcore.g:16662:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
+            // InternalOCLinEcore.g:16663:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
+            // InternalOCLinEcore.g:16664:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__MapTypeCS__Group_1__0__Impl();
@@ -50915,17 +50915,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:16669:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:16671:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__MapTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16673:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:16674:1: ( '(' )
+            // InternalOCLinEcore.g:16675:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:16676:1: ( '(' )
             {
-            // InternalOCLinEcore.g:16674:1: ( '(' )
-            // InternalOCLinEcore.g:16675:1: '('
+            // InternalOCLinEcore.g:16676:1: ( '(' )
+            // InternalOCLinEcore.g:16677:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -50956,14 +50956,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1"
-    // InternalOCLinEcore.g:16688:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
+    // InternalOCLinEcore.g:16690:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
     public final void rule__MapTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16692:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
-            // InternalOCLinEcore.g:16693:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
+            // InternalOCLinEcore.g:16694:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
+            // InternalOCLinEcore.g:16695:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__MapTypeCS__Group_1__1__Impl();
@@ -50994,23 +50994,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:16700:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:16702:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
     public final void rule__MapTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16704:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:16705:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16706:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:16707:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:16705:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
-            // InternalOCLinEcore.g:16706:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:16707:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:16708:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
             }
-            // InternalOCLinEcore.g:16707:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
-            // InternalOCLinEcore.g:16707:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
+            // InternalOCLinEcore.g:16709:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:16709:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedKeyTypeAssignment_1_1();
@@ -51045,14 +51045,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2"
-    // InternalOCLinEcore.g:16717:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
+    // InternalOCLinEcore.g:16719:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
     public final void rule__MapTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16721:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
-            // InternalOCLinEcore.g:16722:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
+            // InternalOCLinEcore.g:16723:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
+            // InternalOCLinEcore.g:16724:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__MapTypeCS__Group_1__2__Impl();
@@ -51083,17 +51083,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2__Impl"
-    // InternalOCLinEcore.g:16729:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:16731:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
     public final void rule__MapTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16733:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:16734:1: ( ',' )
+            // InternalOCLinEcore.g:16735:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:16736:1: ( ',' )
             {
-            // InternalOCLinEcore.g:16734:1: ( ',' )
-            // InternalOCLinEcore.g:16735:1: ','
+            // InternalOCLinEcore.g:16736:1: ( ',' )
+            // InternalOCLinEcore.g:16737:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
@@ -51124,14 +51124,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3"
-    // InternalOCLinEcore.g:16748:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
+    // InternalOCLinEcore.g:16750:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
     public final void rule__MapTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16752:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
-            // InternalOCLinEcore.g:16753:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
+            // InternalOCLinEcore.g:16754:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
+            // InternalOCLinEcore.g:16755:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__MapTypeCS__Group_1__3__Impl();
@@ -51162,23 +51162,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3__Impl"
-    // InternalOCLinEcore.g:16760:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
+    // InternalOCLinEcore.g:16762:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
     public final void rule__MapTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16764:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
-            // InternalOCLinEcore.g:16765:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalOCLinEcore.g:16766:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
+            // InternalOCLinEcore.g:16767:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
             {
-            // InternalOCLinEcore.g:16765:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
-            // InternalOCLinEcore.g:16766:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalOCLinEcore.g:16767:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalOCLinEcore.g:16768:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
             }
-            // InternalOCLinEcore.g:16767:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
-            // InternalOCLinEcore.g:16767:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
+            // InternalOCLinEcore.g:16769:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalOCLinEcore.g:16769:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedValueTypeAssignment_1_3();
@@ -51213,14 +51213,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4"
-    // InternalOCLinEcore.g:16777:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
+    // InternalOCLinEcore.g:16779:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
     public final void rule__MapTypeCS__Group_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16781:1: ( rule__MapTypeCS__Group_1__4__Impl )
-            // InternalOCLinEcore.g:16782:2: rule__MapTypeCS__Group_1__4__Impl
+            // InternalOCLinEcore.g:16783:1: ( rule__MapTypeCS__Group_1__4__Impl )
+            // InternalOCLinEcore.g:16784:2: rule__MapTypeCS__Group_1__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group_1__4__Impl();
@@ -51246,17 +51246,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4__Impl"
-    // InternalOCLinEcore.g:16788:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:16790:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
     public final void rule__MapTypeCS__Group_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16792:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:16793:1: ( ')' )
+            // InternalOCLinEcore.g:16794:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:16795:1: ( ')' )
             {
-            // InternalOCLinEcore.g:16793:1: ( ')' )
-            // InternalOCLinEcore.g:16794:1: ')'
+            // InternalOCLinEcore.g:16795:1: ( ')' )
+            // InternalOCLinEcore.g:16796:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
@@ -51287,14 +51287,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0"
-    // InternalOCLinEcore.g:16817:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
+    // InternalOCLinEcore.g:16819:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
     public final void rule__TupleTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16821:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
-            // InternalOCLinEcore.g:16822:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
+            // InternalOCLinEcore.g:16823:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
+            // InternalOCLinEcore.g:16824:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__TupleTypeCS__Group__0__Impl();
@@ -51325,23 +51325,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0__Impl"
-    // InternalOCLinEcore.g:16829:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:16831:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
     public final void rule__TupleTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16833:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:16834:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:16835:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:16836:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:16834:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:16835:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:16836:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:16837:1: ( rule__TupleTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:16836:1: ( rule__TupleTypeCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:16836:2: rule__TupleTypeCS__NameAssignment_0
+            // InternalOCLinEcore.g:16838:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:16838:2: rule__TupleTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__NameAssignment_0();
@@ -51376,14 +51376,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1"
-    // InternalOCLinEcore.g:16846:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:16848:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
     public final void rule__TupleTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16850:1: ( rule__TupleTypeCS__Group__1__Impl )
-            // InternalOCLinEcore.g:16851:2: rule__TupleTypeCS__Group__1__Impl
+            // InternalOCLinEcore.g:16852:1: ( rule__TupleTypeCS__Group__1__Impl )
+            // InternalOCLinEcore.g:16853:2: rule__TupleTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group__1__Impl();
@@ -51409,22 +51409,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1__Impl"
-    // InternalOCLinEcore.g:16857:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:16859:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16861:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:16862:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:16863:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:16864:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:16862:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:16863:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalOCLinEcore.g:16864:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:16865:1: ( rule__TupleTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:16864:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalOCLinEcore.g:16866:1: ( rule__TupleTypeCS__Group_1__0 )?
             int alt186=2;
             int LA186_0 = input.LA(1);
 
@@ -51433,7 +51433,7 @@
             }
             switch (alt186) {
                 case 1 :
-                    // InternalOCLinEcore.g:16864:2: rule__TupleTypeCS__Group_1__0
+                    // InternalOCLinEcore.g:16866:2: rule__TupleTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1__0();
@@ -51471,14 +51471,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0"
-    // InternalOCLinEcore.g:16878:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
+    // InternalOCLinEcore.g:16880:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
     public final void rule__TupleTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16882:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
-            // InternalOCLinEcore.g:16883:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
+            // InternalOCLinEcore.g:16884:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
+            // InternalOCLinEcore.g:16885:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_55);
             rule__TupleTypeCS__Group_1__0__Impl();
@@ -51509,17 +51509,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:16890:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:16892:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TupleTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16894:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:16895:1: ( '(' )
+            // InternalOCLinEcore.g:16896:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:16897:1: ( '(' )
             {
-            // InternalOCLinEcore.g:16895:1: ( '(' )
-            // InternalOCLinEcore.g:16896:1: '('
+            // InternalOCLinEcore.g:16897:1: ( '(' )
+            // InternalOCLinEcore.g:16898:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -51550,14 +51550,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1"
-    // InternalOCLinEcore.g:16909:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
+    // InternalOCLinEcore.g:16911:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
     public final void rule__TupleTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16913:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
-            // InternalOCLinEcore.g:16914:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
+            // InternalOCLinEcore.g:16915:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
+            // InternalOCLinEcore.g:16916:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_55);
             rule__TupleTypeCS__Group_1__1__Impl();
@@ -51588,22 +51588,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:16921:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
+    // InternalOCLinEcore.g:16923:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16925:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
-            // InternalOCLinEcore.g:16926:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:16927:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
+            // InternalOCLinEcore.g:16928:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
             {
-            // InternalOCLinEcore.g:16926:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
-            // InternalOCLinEcore.g:16927:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:16928:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:16929:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
             }
-            // InternalOCLinEcore.g:16928:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:16930:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             int alt187=2;
             int LA187_0 = input.LA(1);
 
@@ -51612,7 +51612,7 @@
             }
             switch (alt187) {
                 case 1 :
-                    // InternalOCLinEcore.g:16928:2: rule__TupleTypeCS__Group_1_1__0
+                    // InternalOCLinEcore.g:16930:2: rule__TupleTypeCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1_1__0();
@@ -51650,14 +51650,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2"
-    // InternalOCLinEcore.g:16938:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
+    // InternalOCLinEcore.g:16940:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
     public final void rule__TupleTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16942:1: ( rule__TupleTypeCS__Group_1__2__Impl )
-            // InternalOCLinEcore.g:16943:2: rule__TupleTypeCS__Group_1__2__Impl
+            // InternalOCLinEcore.g:16944:1: ( rule__TupleTypeCS__Group_1__2__Impl )
+            // InternalOCLinEcore.g:16945:2: rule__TupleTypeCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1__2__Impl();
@@ -51683,17 +51683,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2__Impl"
-    // InternalOCLinEcore.g:16949:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:16951:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TupleTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16953:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:16954:1: ( ')' )
+            // InternalOCLinEcore.g:16955:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:16956:1: ( ')' )
             {
-            // InternalOCLinEcore.g:16954:1: ( ')' )
-            // InternalOCLinEcore.g:16955:1: ')'
+            // InternalOCLinEcore.g:16956:1: ( ')' )
+            // InternalOCLinEcore.g:16957:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
@@ -51724,14 +51724,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0"
-    // InternalOCLinEcore.g:16974:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
+    // InternalOCLinEcore.g:16976:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16978:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
-            // InternalOCLinEcore.g:16979:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
+            // InternalOCLinEcore.g:16980:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
+            // InternalOCLinEcore.g:16981:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__TupleTypeCS__Group_1_1__0__Impl();
@@ -51762,23 +51762,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0__Impl"
-    // InternalOCLinEcore.g:16986:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
+    // InternalOCLinEcore.g:16988:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:16990:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
-            // InternalOCLinEcore.g:16991:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalOCLinEcore.g:16992:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
+            // InternalOCLinEcore.g:16993:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
             {
-            // InternalOCLinEcore.g:16991:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
-            // InternalOCLinEcore.g:16992:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalOCLinEcore.g:16993:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalOCLinEcore.g:16994:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
             }
-            // InternalOCLinEcore.g:16993:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
-            // InternalOCLinEcore.g:16993:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
+            // InternalOCLinEcore.g:16995:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalOCLinEcore.g:16995:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_0();
@@ -51813,14 +51813,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1"
-    // InternalOCLinEcore.g:17003:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
+    // InternalOCLinEcore.g:17005:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17007:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
-            // InternalOCLinEcore.g:17008:2: rule__TupleTypeCS__Group_1_1__1__Impl
+            // InternalOCLinEcore.g:17009:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
+            // InternalOCLinEcore.g:17010:2: rule__TupleTypeCS__Group_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1__1__Impl();
@@ -51846,22 +51846,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1__Impl"
-    // InternalOCLinEcore.g:17014:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
+    // InternalOCLinEcore.g:17016:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
     public final void rule__TupleTypeCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17018:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
-            // InternalOCLinEcore.g:17019:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalOCLinEcore.g:17020:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
+            // InternalOCLinEcore.g:17021:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
             {
-            // InternalOCLinEcore.g:17019:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
-            // InternalOCLinEcore.g:17020:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalOCLinEcore.g:17021:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalOCLinEcore.g:17022:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
             }
-            // InternalOCLinEcore.g:17021:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalOCLinEcore.g:17023:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             loop188:
             do {
                 int alt188=2;
@@ -51874,7 +51874,7 @@
 
                 switch (alt188) {
             	case 1 :
-            	    // InternalOCLinEcore.g:17021:2: rule__TupleTypeCS__Group_1_1_1__0
+            	    // InternalOCLinEcore.g:17023:2: rule__TupleTypeCS__Group_1_1_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TupleTypeCS__Group_1_1_1__0();
@@ -51915,14 +51915,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0"
-    // InternalOCLinEcore.g:17035:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
+    // InternalOCLinEcore.g:17037:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17039:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
-            // InternalOCLinEcore.g:17040:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
+            // InternalOCLinEcore.g:17041:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
+            // InternalOCLinEcore.g:17042:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TupleTypeCS__Group_1_1_1__0__Impl();
@@ -51953,17 +51953,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0__Impl"
-    // InternalOCLinEcore.g:17047:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:17049:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17051:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:17052:1: ( ',' )
+            // InternalOCLinEcore.g:17053:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:17054:1: ( ',' )
             {
-            // InternalOCLinEcore.g:17052:1: ( ',' )
-            // InternalOCLinEcore.g:17053:1: ','
+            // InternalOCLinEcore.g:17054:1: ( ',' )
+            // InternalOCLinEcore.g:17055:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
@@ -51994,14 +51994,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1"
-    // InternalOCLinEcore.g:17066:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
+    // InternalOCLinEcore.g:17068:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17070:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
-            // InternalOCLinEcore.g:17071:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
+            // InternalOCLinEcore.g:17072:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
+            // InternalOCLinEcore.g:17073:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1_1__1__Impl();
@@ -52027,23 +52027,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1__Impl"
-    // InternalOCLinEcore.g:17077:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:17079:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17081:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
-            // InternalOCLinEcore.g:17082:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalOCLinEcore.g:17083:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
+            // InternalOCLinEcore.g:17084:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:17082:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
-            // InternalOCLinEcore.g:17083:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalOCLinEcore.g:17084:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalOCLinEcore.g:17085:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
             }
-            // InternalOCLinEcore.g:17084:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
-            // InternalOCLinEcore.g:17084:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
+            // InternalOCLinEcore.g:17086:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalOCLinEcore.g:17086:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1();
@@ -52078,14 +52078,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0"
-    // InternalOCLinEcore.g:17098:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
+    // InternalOCLinEcore.g:17100:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
     public final void rule__TuplePartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17102:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
-            // InternalOCLinEcore.g:17103:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
+            // InternalOCLinEcore.g:17104:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
+            // InternalOCLinEcore.g:17105:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__TuplePartCS__Group__0__Impl();
@@ -52116,23 +52116,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0__Impl"
-    // InternalOCLinEcore.g:17110:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:17112:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
     public final void rule__TuplePartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17114:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:17115:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:17116:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:17117:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:17115:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:17116:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:17117:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:17118:1: ( rule__TuplePartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:17117:1: ( rule__TuplePartCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:17117:2: rule__TuplePartCS__NameAssignment_0
+            // InternalOCLinEcore.g:17119:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:17119:2: rule__TuplePartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__NameAssignment_0();
@@ -52167,14 +52167,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1"
-    // InternalOCLinEcore.g:17127:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
+    // InternalOCLinEcore.g:17129:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
     public final void rule__TuplePartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17131:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
-            // InternalOCLinEcore.g:17132:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
+            // InternalOCLinEcore.g:17133:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
+            // InternalOCLinEcore.g:17134:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__TuplePartCS__Group__1__Impl();
@@ -52205,17 +52205,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1__Impl"
-    // InternalOCLinEcore.g:17139:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:17141:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
     public final void rule__TuplePartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17143:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:17144:1: ( ':' )
+            // InternalOCLinEcore.g:17145:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:17146:1: ( ':' )
             {
-            // InternalOCLinEcore.g:17144:1: ( ':' )
-            // InternalOCLinEcore.g:17145:1: ':'
+            // InternalOCLinEcore.g:17146:1: ( ':' )
+            // InternalOCLinEcore.g:17147:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
@@ -52246,14 +52246,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2"
-    // InternalOCLinEcore.g:17158:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:17160:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
     public final void rule__TuplePartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17162:1: ( rule__TuplePartCS__Group__2__Impl )
-            // InternalOCLinEcore.g:17163:2: rule__TuplePartCS__Group__2__Impl
+            // InternalOCLinEcore.g:17164:1: ( rule__TuplePartCS__Group__2__Impl )
+            // InternalOCLinEcore.g:17165:2: rule__TuplePartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__Group__2__Impl();
@@ -52279,23 +52279,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2__Impl"
-    // InternalOCLinEcore.g:17169:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:17171:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__TuplePartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17173:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
-            // InternalOCLinEcore.g:17174:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLinEcore.g:17175:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
+            // InternalOCLinEcore.g:17176:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:17174:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
-            // InternalOCLinEcore.g:17175:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalOCLinEcore.g:17176:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLinEcore.g:17177:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalOCLinEcore.g:17176:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
-            // InternalOCLinEcore.g:17176:2: rule__TuplePartCS__OwnedTypeAssignment_2
+            // InternalOCLinEcore.g:17178:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalOCLinEcore.g:17178:2: rule__TuplePartCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__OwnedTypeAssignment_2();
@@ -52330,14 +52330,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:17192:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:17194:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
     public final void rule__CollectionLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17196:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:17197:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:17198:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:17199:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CollectionLiteralExpCS__Group__0__Impl();
@@ -52368,23 +52368,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:17204:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:17206:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17208:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalOCLinEcore.g:17209:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLinEcore.g:17210:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalOCLinEcore.g:17211:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:17209:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalOCLinEcore.g:17210:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLinEcore.g:17211:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLinEcore.g:17212:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalOCLinEcore.g:17211:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalOCLinEcore.g:17211:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
+            // InternalOCLinEcore.g:17213:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLinEcore.g:17213:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedTypeAssignment_0();
@@ -52419,14 +52419,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:17221:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
+    // InternalOCLinEcore.g:17223:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
     public final void rule__CollectionLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17225:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
-            // InternalOCLinEcore.g:17226:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
+            // InternalOCLinEcore.g:17227:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
+            // InternalOCLinEcore.g:17228:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_90);
             rule__CollectionLiteralExpCS__Group__1__Impl();
@@ -52457,17 +52457,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:17233:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:17235:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17237:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:17238:1: ( '{' )
+            // InternalOCLinEcore.g:17239:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:17240:1: ( '{' )
             {
-            // InternalOCLinEcore.g:17238:1: ( '{' )
-            // InternalOCLinEcore.g:17239:1: '{'
+            // InternalOCLinEcore.g:17240:1: ( '{' )
+            // InternalOCLinEcore.g:17241:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -52498,14 +52498,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2"
-    // InternalOCLinEcore.g:17252:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
+    // InternalOCLinEcore.g:17254:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
     public final void rule__CollectionLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17256:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
-            // InternalOCLinEcore.g:17257:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
+            // InternalOCLinEcore.g:17258:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
+            // InternalOCLinEcore.g:17259:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_90);
             rule__CollectionLiteralExpCS__Group__2__Impl();
@@ -52536,22 +52536,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:17264:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:17266:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__CollectionLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17268:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:17269:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:17270:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:17271:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:17269:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:17270:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalOCLinEcore.g:17271:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:17272:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:17271:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalOCLinEcore.g:17273:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             int alt189=2;
             int LA189_0 = input.LA(1);
 
@@ -52560,7 +52560,7 @@
             }
             switch (alt189) {
                 case 1 :
-                    // InternalOCLinEcore.g:17271:2: rule__CollectionLiteralExpCS__Group_2__0
+                    // InternalOCLinEcore.g:17273:2: rule__CollectionLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralExpCS__Group_2__0();
@@ -52598,14 +52598,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3"
-    // InternalOCLinEcore.g:17281:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:17283:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
     public final void rule__CollectionLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17285:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
-            // InternalOCLinEcore.g:17286:2: rule__CollectionLiteralExpCS__Group__3__Impl
+            // InternalOCLinEcore.g:17287:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
+            // InternalOCLinEcore.g:17288:2: rule__CollectionLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group__3__Impl();
@@ -52631,17 +52631,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:17292:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:17294:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17296:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:17297:1: ( '}' )
+            // InternalOCLinEcore.g:17298:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:17299:1: ( '}' )
             {
-            // InternalOCLinEcore.g:17297:1: ( '}' )
-            // InternalOCLinEcore.g:17298:1: '}'
+            // InternalOCLinEcore.g:17299:1: ( '}' )
+            // InternalOCLinEcore.g:17300:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -52672,14 +52672,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0"
-    // InternalOCLinEcore.g:17319:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
+    // InternalOCLinEcore.g:17321:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17323:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
-            // InternalOCLinEcore.g:17324:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
+            // InternalOCLinEcore.g:17325:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
+            // InternalOCLinEcore.g:17326:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__CollectionLiteralExpCS__Group_2__0__Impl();
@@ -52710,23 +52710,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:17331:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLinEcore.g:17333:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17335:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLinEcore.g:17336:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:17337:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLinEcore.g:17338:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLinEcore.g:17336:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLinEcore.g:17337:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:17338:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:17339:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLinEcore.g:17338:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLinEcore.g:17338:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalOCLinEcore.g:17340:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:17340:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -52761,14 +52761,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1"
-    // InternalOCLinEcore.g:17348:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:17350:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17352:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:17353:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:17354:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:17355:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2__1__Impl();
@@ -52794,22 +52794,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:17359:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalOCLinEcore.g:17361:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17363:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalOCLinEcore.g:17364:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:17365:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalOCLinEcore.g:17366:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalOCLinEcore.g:17364:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
-            // InternalOCLinEcore.g:17365:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:17366:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:17367:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:17366:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:17368:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             loop190:
             do {
                 int alt190=2;
@@ -52822,7 +52822,7 @@
 
                 switch (alt190) {
             	case 1 :
-            	    // InternalOCLinEcore.g:17366:2: rule__CollectionLiteralExpCS__Group_2_1__0
+            	    // InternalOCLinEcore.g:17368:2: rule__CollectionLiteralExpCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__CollectionLiteralExpCS__Group_2_1__0();
@@ -52863,14 +52863,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0"
-    // InternalOCLinEcore.g:17380:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:17382:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17384:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:17385:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
+            // InternalOCLinEcore.g:17386:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:17387:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_91);
             rule__CollectionLiteralExpCS__Group_2_1__0__Impl();
@@ -52901,17 +52901,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:17392:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:17394:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17396:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:17397:1: ( ',' )
+            // InternalOCLinEcore.g:17398:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:17399:1: ( ',' )
             {
-            // InternalOCLinEcore.g:17397:1: ( ',' )
-            // InternalOCLinEcore.g:17398:1: ','
+            // InternalOCLinEcore.g:17399:1: ( ',' )
+            // InternalOCLinEcore.g:17400:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -52942,14 +52942,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1"
-    // InternalOCLinEcore.g:17411:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalOCLinEcore.g:17413:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17415:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
-            // InternalOCLinEcore.g:17416:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
+            // InternalOCLinEcore.g:17417:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
+            // InternalOCLinEcore.g:17418:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2_1__1__Impl();
@@ -52975,23 +52975,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:17422:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:17424:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17426:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLinEcore.g:17427:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:17428:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLinEcore.g:17429:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:17427:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLinEcore.g:17428:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:17429:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:17430:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLinEcore.g:17429:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLinEcore.g:17429:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLinEcore.g:17431:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:17431:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -53026,14 +53026,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0"
-    // InternalOCLinEcore.g:17443:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
+    // InternalOCLinEcore.g:17445:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17447:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
-            // InternalOCLinEcore.g:17448:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
+            // InternalOCLinEcore.g:17449:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
+            // InternalOCLinEcore.g:17450:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_92);
             rule__CollectionLiteralPartCS__Group_0__0__Impl();
@@ -53064,23 +53064,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:17455:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
+    // InternalOCLinEcore.g:17457:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17459:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
-            // InternalOCLinEcore.g:17460:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalOCLinEcore.g:17461:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
+            // InternalOCLinEcore.g:17462:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
             {
-            // InternalOCLinEcore.g:17460:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
-            // InternalOCLinEcore.g:17461:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalOCLinEcore.g:17462:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalOCLinEcore.g:17463:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
             }
-            // InternalOCLinEcore.g:17462:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
-            // InternalOCLinEcore.g:17462:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
+            // InternalOCLinEcore.g:17464:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalOCLinEcore.g:17464:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0();
@@ -53115,14 +53115,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1"
-    // InternalOCLinEcore.g:17472:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
+    // InternalOCLinEcore.g:17474:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17476:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
-            // InternalOCLinEcore.g:17477:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
+            // InternalOCLinEcore.g:17478:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
+            // InternalOCLinEcore.g:17479:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0__1__Impl();
@@ -53148,22 +53148,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:17483:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
+    // InternalOCLinEcore.g:17485:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17487:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
-            // InternalOCLinEcore.g:17488:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalOCLinEcore.g:17489:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
+            // InternalOCLinEcore.g:17490:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
             {
-            // InternalOCLinEcore.g:17488:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
-            // InternalOCLinEcore.g:17489:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalOCLinEcore.g:17490:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalOCLinEcore.g:17491:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
             }
-            // InternalOCLinEcore.g:17490:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalOCLinEcore.g:17492:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             int alt191=2;
             int LA191_0 = input.LA(1);
 
@@ -53172,7 +53172,7 @@
             }
             switch (alt191) {
                 case 1 :
-                    // InternalOCLinEcore.g:17490:2: rule__CollectionLiteralPartCS__Group_0_1__0
+                    // InternalOCLinEcore.g:17492:2: rule__CollectionLiteralPartCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0_1__0();
@@ -53210,14 +53210,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0"
-    // InternalOCLinEcore.g:17504:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
+    // InternalOCLinEcore.g:17506:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17508:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
-            // InternalOCLinEcore.g:17509:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
+            // InternalOCLinEcore.g:17510:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
+            // InternalOCLinEcore.g:17511:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__CollectionLiteralPartCS__Group_0_1__0__Impl();
@@ -53248,17 +53248,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0__Impl"
-    // InternalOCLinEcore.g:17516:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
+    // InternalOCLinEcore.g:17518:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17520:1: ( ( '..' ) )
-            // InternalOCLinEcore.g:17521:1: ( '..' )
+            // InternalOCLinEcore.g:17522:1: ( ( '..' ) )
+            // InternalOCLinEcore.g:17523:1: ( '..' )
             {
-            // InternalOCLinEcore.g:17521:1: ( '..' )
-            // InternalOCLinEcore.g:17522:1: '..'
+            // InternalOCLinEcore.g:17523:1: ( '..' )
+            // InternalOCLinEcore.g:17524:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
@@ -53289,14 +53289,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1"
-    // InternalOCLinEcore.g:17535:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
+    // InternalOCLinEcore.g:17537:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17539:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
-            // InternalOCLinEcore.g:17540:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
+            // InternalOCLinEcore.g:17541:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
+            // InternalOCLinEcore.g:17542:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0_1__1__Impl();
@@ -53322,23 +53322,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1__Impl"
-    // InternalOCLinEcore.g:17546:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
+    // InternalOCLinEcore.g:17548:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17550:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
-            // InternalOCLinEcore.g:17551:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalOCLinEcore.g:17552:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
+            // InternalOCLinEcore.g:17553:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
             {
-            // InternalOCLinEcore.g:17551:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
-            // InternalOCLinEcore.g:17552:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalOCLinEcore.g:17553:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalOCLinEcore.g:17554:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
             }
-            // InternalOCLinEcore.g:17553:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
-            // InternalOCLinEcore.g:17553:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
+            // InternalOCLinEcore.g:17555:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalOCLinEcore.g:17555:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1();
@@ -53373,14 +53373,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0"
-    // InternalOCLinEcore.g:17567:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
+    // InternalOCLinEcore.g:17569:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
     public final void rule__CollectionPatternCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17571:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
-            // InternalOCLinEcore.g:17572:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
+            // InternalOCLinEcore.g:17573:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
+            // InternalOCLinEcore.g:17574:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CollectionPatternCS__Group__0__Impl();
@@ -53411,23 +53411,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0__Impl"
-    // InternalOCLinEcore.g:17579:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:17581:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionPatternCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17583:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
-            // InternalOCLinEcore.g:17584:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLinEcore.g:17585:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
+            // InternalOCLinEcore.g:17586:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:17584:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
-            // InternalOCLinEcore.g:17585:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalOCLinEcore.g:17586:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLinEcore.g:17587:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalOCLinEcore.g:17586:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
-            // InternalOCLinEcore.g:17586:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
+            // InternalOCLinEcore.g:17588:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalOCLinEcore.g:17588:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedTypeAssignment_0();
@@ -53462,14 +53462,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1"
-    // InternalOCLinEcore.g:17596:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
+    // InternalOCLinEcore.g:17598:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
     public final void rule__CollectionPatternCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17600:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
-            // InternalOCLinEcore.g:17601:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
+            // InternalOCLinEcore.g:17602:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
+            // InternalOCLinEcore.g:17603:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_90);
             rule__CollectionPatternCS__Group__1__Impl();
@@ -53500,17 +53500,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1__Impl"
-    // InternalOCLinEcore.g:17608:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:17610:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionPatternCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17612:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:17613:1: ( '{' )
+            // InternalOCLinEcore.g:17614:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:17615:1: ( '{' )
             {
-            // InternalOCLinEcore.g:17613:1: ( '{' )
-            // InternalOCLinEcore.g:17614:1: '{'
+            // InternalOCLinEcore.g:17615:1: ( '{' )
+            // InternalOCLinEcore.g:17616:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
@@ -53541,14 +53541,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2"
-    // InternalOCLinEcore.g:17627:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
+    // InternalOCLinEcore.g:17629:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
     public final void rule__CollectionPatternCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17631:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
-            // InternalOCLinEcore.g:17632:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
+            // InternalOCLinEcore.g:17633:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
+            // InternalOCLinEcore.g:17634:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_90);
             rule__CollectionPatternCS__Group__2__Impl();
@@ -53579,22 +53579,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2__Impl"
-    // InternalOCLinEcore.g:17639:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:17641:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
     public final void rule__CollectionPatternCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17643:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:17644:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:17645:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:17646:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:17644:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:17645:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalOCLinEcore.g:17646:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:17647:1: ( rule__CollectionPatternCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:17646:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalOCLinEcore.g:17648:1: ( rule__CollectionPatternCS__Group_2__0 )?
             int alt192=2;
             int LA192_0 = input.LA(1);
 
@@ -53603,7 +53603,7 @@
             }
             switch (alt192) {
                 case 1 :
-                    // InternalOCLinEcore.g:17646:2: rule__CollectionPatternCS__Group_2__0
+                    // InternalOCLinEcore.g:17648:2: rule__CollectionPatternCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionPatternCS__Group_2__0();
@@ -53641,14 +53641,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3"
-    // InternalOCLinEcore.g:17656:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:17658:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
     public final void rule__CollectionPatternCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17660:1: ( rule__CollectionPatternCS__Group__3__Impl )
-            // InternalOCLinEcore.g:17661:2: rule__CollectionPatternCS__Group__3__Impl
+            // InternalOCLinEcore.g:17662:1: ( rule__CollectionPatternCS__Group__3__Impl )
+            // InternalOCLinEcore.g:17663:2: rule__CollectionPatternCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group__3__Impl();
@@ -53674,17 +53674,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3__Impl"
-    // InternalOCLinEcore.g:17667:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:17669:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionPatternCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17671:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:17672:1: ( '}' )
+            // InternalOCLinEcore.g:17673:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:17674:1: ( '}' )
             {
-            // InternalOCLinEcore.g:17672:1: ( '}' )
-            // InternalOCLinEcore.g:17673:1: '}'
+            // InternalOCLinEcore.g:17674:1: ( '}' )
+            // InternalOCLinEcore.g:17675:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
@@ -53715,14 +53715,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0"
-    // InternalOCLinEcore.g:17694:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
+    // InternalOCLinEcore.g:17696:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
     public final void rule__CollectionPatternCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17698:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
-            // InternalOCLinEcore.g:17699:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
+            // InternalOCLinEcore.g:17700:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
+            // InternalOCLinEcore.g:17701:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_94);
             rule__CollectionPatternCS__Group_2__0__Impl();
@@ -53753,23 +53753,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:17706:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLinEcore.g:17708:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17710:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLinEcore.g:17711:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:17712:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLinEcore.g:17713:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLinEcore.g:17711:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLinEcore.g:17712:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:17713:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:17714:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLinEcore.g:17713:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLinEcore.g:17713:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
+            // InternalOCLinEcore.g:17715:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:17715:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_0();
@@ -53804,14 +53804,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1"
-    // InternalOCLinEcore.g:17723:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
+    // InternalOCLinEcore.g:17725:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
     public final void rule__CollectionPatternCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17727:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
-            // InternalOCLinEcore.g:17728:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
+            // InternalOCLinEcore.g:17729:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
+            // InternalOCLinEcore.g:17730:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_94);
             rule__CollectionPatternCS__Group_2__1__Impl();
@@ -53842,22 +53842,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:17735:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
+    // InternalOCLinEcore.g:17737:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionPatternCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17739:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
-            // InternalOCLinEcore.g:17740:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:17741:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
+            // InternalOCLinEcore.g:17742:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
             {
-            // InternalOCLinEcore.g:17740:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
-            // InternalOCLinEcore.g:17741:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:17742:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:17743:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:17742:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:17744:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             loop193:
             do {
                 int alt193=2;
@@ -53870,7 +53870,7 @@
 
                 switch (alt193) {
             	case 1 :
-            	    // InternalOCLinEcore.g:17742:2: rule__CollectionPatternCS__Group_2_1__0
+            	    // InternalOCLinEcore.g:17744:2: rule__CollectionPatternCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__CollectionPatternCS__Group_2_1__0();
@@ -53911,14 +53911,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2"
-    // InternalOCLinEcore.g:17752:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
+    // InternalOCLinEcore.g:17754:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
     public final void rule__CollectionPatternCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17756:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
-            // InternalOCLinEcore.g:17757:2: rule__CollectionPatternCS__Group_2__2__Impl
+            // InternalOCLinEcore.g:17758:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
+            // InternalOCLinEcore.g:17759:2: rule__CollectionPatternCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2__2__Impl();
@@ -53944,23 +53944,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2__Impl"
-    // InternalOCLinEcore.g:17763:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
+    // InternalOCLinEcore.g:17765:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17767:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
-            // InternalOCLinEcore.g:17768:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalOCLinEcore.g:17769:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
+            // InternalOCLinEcore.g:17770:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
             {
-            // InternalOCLinEcore.g:17768:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
-            // InternalOCLinEcore.g:17769:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalOCLinEcore.g:17770:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalOCLinEcore.g:17771:1: ( rule__CollectionPatternCS__Group_2_2__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
             }
-            // InternalOCLinEcore.g:17770:1: ( rule__CollectionPatternCS__Group_2_2__0 )
-            // InternalOCLinEcore.g:17770:2: rule__CollectionPatternCS__Group_2_2__0
+            // InternalOCLinEcore.g:17772:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalOCLinEcore.g:17772:2: rule__CollectionPatternCS__Group_2_2__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__0();
@@ -53995,14 +53995,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0"
-    // InternalOCLinEcore.g:17786:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:17788:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
     public final void rule__CollectionPatternCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17790:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:17791:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
+            // InternalOCLinEcore.g:17792:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:17793:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_91);
             rule__CollectionPatternCS__Group_2_1__0__Impl();
@@ -54033,17 +54033,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:17798:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:17800:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionPatternCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17802:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:17803:1: ( ',' )
+            // InternalOCLinEcore.g:17804:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:17805:1: ( ',' )
             {
-            // InternalOCLinEcore.g:17803:1: ( ',' )
-            // InternalOCLinEcore.g:17804:1: ','
+            // InternalOCLinEcore.g:17805:1: ( ',' )
+            // InternalOCLinEcore.g:17806:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
@@ -54074,14 +54074,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1"
-    // InternalOCLinEcore.g:17817:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
+    // InternalOCLinEcore.g:17819:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17821:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
-            // InternalOCLinEcore.g:17822:2: rule__CollectionPatternCS__Group_2_1__1__Impl
+            // InternalOCLinEcore.g:17823:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
+            // InternalOCLinEcore.g:17824:2: rule__CollectionPatternCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_1__1__Impl();
@@ -54107,23 +54107,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:17828:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:17830:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17832:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLinEcore.g:17833:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:17834:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLinEcore.g:17835:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:17833:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLinEcore.g:17834:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:17835:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:17836:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLinEcore.g:17835:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLinEcore.g:17835:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLinEcore.g:17837:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:17837:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1();
@@ -54158,14 +54158,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0"
-    // InternalOCLinEcore.g:17849:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
+    // InternalOCLinEcore.g:17851:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
     public final void rule__CollectionPatternCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17853:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
-            // InternalOCLinEcore.g:17854:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
+            // InternalOCLinEcore.g:17855:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
+            // InternalOCLinEcore.g:17856:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_95);
             rule__CollectionPatternCS__Group_2_2__0__Impl();
@@ -54196,17 +54196,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0__Impl"
-    // InternalOCLinEcore.g:17861:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
+    // InternalOCLinEcore.g:17863:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
     public final void rule__CollectionPatternCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17865:1: ( ( '++' ) )
-            // InternalOCLinEcore.g:17866:1: ( '++' )
+            // InternalOCLinEcore.g:17867:1: ( ( '++' ) )
+            // InternalOCLinEcore.g:17868:1: ( '++' )
             {
-            // InternalOCLinEcore.g:17866:1: ( '++' )
-            // InternalOCLinEcore.g:17867:1: '++'
+            // InternalOCLinEcore.g:17868:1: ( '++' )
+            // InternalOCLinEcore.g:17869:1: '++'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
@@ -54237,14 +54237,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1"
-    // InternalOCLinEcore.g:17880:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
+    // InternalOCLinEcore.g:17882:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17884:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
-            // InternalOCLinEcore.g:17885:2: rule__CollectionPatternCS__Group_2_2__1__Impl
+            // InternalOCLinEcore.g:17886:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
+            // InternalOCLinEcore.g:17887:2: rule__CollectionPatternCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__1__Impl();
@@ -54270,23 +54270,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1__Impl"
-    // InternalOCLinEcore.g:17891:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
+    // InternalOCLinEcore.g:17893:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17895:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
-            // InternalOCLinEcore.g:17896:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalOCLinEcore.g:17897:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
+            // InternalOCLinEcore.g:17898:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
             {
-            // InternalOCLinEcore.g:17896:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
-            // InternalOCLinEcore.g:17897:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalOCLinEcore.g:17898:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalOCLinEcore.g:17899:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
             }
-            // InternalOCLinEcore.g:17898:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
-            // InternalOCLinEcore.g:17898:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
+            // InternalOCLinEcore.g:17900:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalOCLinEcore.g:17900:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1();
@@ -54321,14 +54321,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0"
-    // InternalOCLinEcore.g:17912:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
+    // InternalOCLinEcore.g:17914:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
     public final void rule__ShadowPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17916:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
-            // InternalOCLinEcore.g:17917:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
+            // InternalOCLinEcore.g:17918:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
+            // InternalOCLinEcore.g:17919:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__ShadowPartCS__Group_0__0__Impl();
@@ -54359,23 +54359,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:17924:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
+    // InternalOCLinEcore.g:17926:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
     public final void rule__ShadowPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17928:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
-            // InternalOCLinEcore.g:17929:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalOCLinEcore.g:17930:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
+            // InternalOCLinEcore.g:17931:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
             {
-            // InternalOCLinEcore.g:17929:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
-            // InternalOCLinEcore.g:17930:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalOCLinEcore.g:17931:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalOCLinEcore.g:17932:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0_0());
             }
-            // InternalOCLinEcore.g:17931:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
-            // InternalOCLinEcore.g:17931:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
+            // InternalOCLinEcore.g:17933:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalOCLinEcore.g:17933:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__ReferredPropertyAssignment_0_0();
@@ -54410,14 +54410,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1"
-    // InternalOCLinEcore.g:17941:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
+    // InternalOCLinEcore.g:17943:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
     public final void rule__ShadowPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17945:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
-            // InternalOCLinEcore.g:17946:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
+            // InternalOCLinEcore.g:17947:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
+            // InternalOCLinEcore.g:17948:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_91);
             rule__ShadowPartCS__Group_0__1__Impl();
@@ -54448,17 +54448,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:17953:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:17955:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
     public final void rule__ShadowPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17957:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:17958:1: ( '=' )
+            // InternalOCLinEcore.g:17959:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:17960:1: ( '=' )
             {
-            // InternalOCLinEcore.g:17958:1: ( '=' )
-            // InternalOCLinEcore.g:17959:1: '='
+            // InternalOCLinEcore.g:17960:1: ( '=' )
+            // InternalOCLinEcore.g:17961:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());
@@ -54489,14 +54489,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2"
-    // InternalOCLinEcore.g:17972:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
+    // InternalOCLinEcore.g:17974:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
     public final void rule__ShadowPartCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17976:1: ( rule__ShadowPartCS__Group_0__2__Impl )
-            // InternalOCLinEcore.g:17977:2: rule__ShadowPartCS__Group_0__2__Impl
+            // InternalOCLinEcore.g:17978:1: ( rule__ShadowPartCS__Group_0__2__Impl )
+            // InternalOCLinEcore.g:17979:2: rule__ShadowPartCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__Group_0__2__Impl();
@@ -54522,23 +54522,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2__Impl"
-    // InternalOCLinEcore.g:17983:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
+    // InternalOCLinEcore.g:17985:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
     public final void rule__ShadowPartCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:17987:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
-            // InternalOCLinEcore.g:17988:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalOCLinEcore.g:17989:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
+            // InternalOCLinEcore.g:17990:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
             {
-            // InternalOCLinEcore.g:17988:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
-            // InternalOCLinEcore.g:17989:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalOCLinEcore.g:17990:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalOCLinEcore.g:17991:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_0_2());
             }
-            // InternalOCLinEcore.g:17990:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
-            // InternalOCLinEcore.g:17990:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
+            // InternalOCLinEcore.g:17992:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalOCLinEcore.g:17992:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2();
@@ -54573,14 +54573,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0"
-    // InternalOCLinEcore.g:18006:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
+    // InternalOCLinEcore.g:18008:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
     public final void rule__PatternExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18010:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
-            // InternalOCLinEcore.g:18011:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
+            // InternalOCLinEcore.g:18012:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
+            // InternalOCLinEcore.g:18013:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_91);
             rule__PatternExpCS__Group__0__Impl();
@@ -54611,22 +54611,22 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18018:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
+    // InternalOCLinEcore.g:18020:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
     public final void rule__PatternExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18022:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
-            // InternalOCLinEcore.g:18023:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalOCLinEcore.g:18024:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
+            // InternalOCLinEcore.g:18025:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
             {
-            // InternalOCLinEcore.g:18023:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
-            // InternalOCLinEcore.g:18024:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalOCLinEcore.g:18025:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalOCLinEcore.g:18026:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
             }
-            // InternalOCLinEcore.g:18025:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalOCLinEcore.g:18027:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             int alt194=2;
             int LA194_0 = input.LA(1);
 
@@ -54635,7 +54635,7 @@
             }
             switch (alt194) {
                 case 1 :
-                    // InternalOCLinEcore.g:18025:2: rule__PatternExpCS__PatternVariableNameAssignment_0
+                    // InternalOCLinEcore.g:18027:2: rule__PatternExpCS__PatternVariableNameAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PatternExpCS__PatternVariableNameAssignment_0();
@@ -54673,14 +54673,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1"
-    // InternalOCLinEcore.g:18035:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
+    // InternalOCLinEcore.g:18037:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
     public final void rule__PatternExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18039:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
-            // InternalOCLinEcore.g:18040:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
+            // InternalOCLinEcore.g:18041:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
+            // InternalOCLinEcore.g:18042:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__PatternExpCS__Group__1__Impl();
@@ -54711,17 +54711,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:18047:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:18049:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
     public final void rule__PatternExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18051:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:18052:1: ( ':' )
+            // InternalOCLinEcore.g:18053:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:18054:1: ( ':' )
             {
-            // InternalOCLinEcore.g:18052:1: ( ':' )
-            // InternalOCLinEcore.g:18053:1: ':'
+            // InternalOCLinEcore.g:18054:1: ( ':' )
+            // InternalOCLinEcore.g:18055:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
@@ -54752,14 +54752,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2"
-    // InternalOCLinEcore.g:18066:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:18068:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
     public final void rule__PatternExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18070:1: ( rule__PatternExpCS__Group__2__Impl )
-            // InternalOCLinEcore.g:18071:2: rule__PatternExpCS__Group__2__Impl
+            // InternalOCLinEcore.g:18072:1: ( rule__PatternExpCS__Group__2__Impl )
+            // InternalOCLinEcore.g:18073:2: rule__PatternExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__Group__2__Impl();
@@ -54785,23 +54785,23 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:18077:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:18079:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
     public final void rule__PatternExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18081:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
-            // InternalOCLinEcore.g:18082:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalOCLinEcore.g:18083:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
+            // InternalOCLinEcore.g:18084:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:18082:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
-            // InternalOCLinEcore.g:18083:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalOCLinEcore.g:18084:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalOCLinEcore.g:18085:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
             }
-            // InternalOCLinEcore.g:18084:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
-            // InternalOCLinEcore.g:18084:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
+            // InternalOCLinEcore.g:18086:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalOCLinEcore.g:18086:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__OwnedPatternTypeAssignment_2();
@@ -54836,14 +54836,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:18100:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:18102:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
     public final void rule__LambdaLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18104:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:18105:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:18106:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:18107:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__LambdaLiteralExpCS__Group__0__Impl();
@@ -54874,17 +54874,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18112:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
+    // InternalOCLinEcore.g:18114:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
     public final void rule__LambdaLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18116:1: ( ( 'Lambda' ) )
-            // InternalOCLinEcore.g:18117:1: ( 'Lambda' )
+            // InternalOCLinEcore.g:18118:1: ( ( 'Lambda' ) )
+            // InternalOCLinEcore.g:18119:1: ( 'Lambda' )
             {
-            // InternalOCLinEcore.g:18117:1: ( 'Lambda' )
-            // InternalOCLinEcore.g:18118:1: 'Lambda'
+            // InternalOCLinEcore.g:18119:1: ( 'Lambda' )
+            // InternalOCLinEcore.g:18120:1: 'Lambda'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
@@ -54915,14 +54915,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:18131:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
+    // InternalOCLinEcore.g:18133:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
     public final void rule__LambdaLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18135:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
-            // InternalOCLinEcore.g:18136:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
+            // InternalOCLinEcore.g:18137:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
+            // InternalOCLinEcore.g:18138:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__LambdaLiteralExpCS__Group__1__Impl();
@@ -54953,17 +54953,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:18143:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:18145:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__LambdaLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18147:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:18148:1: ( '{' )
+            // InternalOCLinEcore.g:18149:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:18150:1: ( '{' )
             {
-            // InternalOCLinEcore.g:18148:1: ( '{' )
-            // InternalOCLinEcore.g:18149:1: '{'
+            // InternalOCLinEcore.g:18150:1: ( '{' )
+            // InternalOCLinEcore.g:18151:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -54994,14 +54994,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2"
-    // InternalOCLinEcore.g:18162:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
+    // InternalOCLinEcore.g:18164:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
     public final void rule__LambdaLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18166:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
-            // InternalOCLinEcore.g:18167:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
+            // InternalOCLinEcore.g:18168:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
+            // InternalOCLinEcore.g:18169:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__LambdaLiteralExpCS__Group__2__Impl();
@@ -55032,23 +55032,23 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:18174:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:18176:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
     public final void rule__LambdaLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18178:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
-            // InternalOCLinEcore.g:18179:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalOCLinEcore.g:18180:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
+            // InternalOCLinEcore.g:18181:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:18179:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
-            // InternalOCLinEcore.g:18180:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalOCLinEcore.g:18181:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalOCLinEcore.g:18182:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
             }
-            // InternalOCLinEcore.g:18181:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
-            // InternalOCLinEcore.g:18181:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
+            // InternalOCLinEcore.g:18183:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalOCLinEcore.g:18183:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2();
@@ -55083,14 +55083,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3"
-    // InternalOCLinEcore.g:18191:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:18193:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
     public final void rule__LambdaLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18195:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
-            // InternalOCLinEcore.g:18196:2: rule__LambdaLiteralExpCS__Group__3__Impl
+            // InternalOCLinEcore.g:18197:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
+            // InternalOCLinEcore.g:18198:2: rule__LambdaLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__Group__3__Impl();
@@ -55116,17 +55116,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:18202:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:18204:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__LambdaLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18206:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:18207:1: ( '}' )
+            // InternalOCLinEcore.g:18208:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:18209:1: ( '}' )
             {
-            // InternalOCLinEcore.g:18207:1: ( '}' )
-            // InternalOCLinEcore.g:18208:1: '}'
+            // InternalOCLinEcore.g:18209:1: ( '}' )
+            // InternalOCLinEcore.g:18210:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -55157,14 +55157,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:18229:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:18231:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
     public final void rule__MapLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18233:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:18234:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:18235:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:18236:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__MapLiteralExpCS__Group__0__Impl();
@@ -55195,23 +55195,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18241:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:18243:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18245:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalOCLinEcore.g:18246:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLinEcore.g:18247:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalOCLinEcore.g:18248:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:18246:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalOCLinEcore.g:18247:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLinEcore.g:18248:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLinEcore.g:18249:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalOCLinEcore.g:18248:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalOCLinEcore.g:18248:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
+            // InternalOCLinEcore.g:18250:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLinEcore.g:18250:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedTypeAssignment_0();
@@ -55246,14 +55246,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:18258:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
+    // InternalOCLinEcore.g:18260:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
     public final void rule__MapLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18262:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
-            // InternalOCLinEcore.g:18263:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
+            // InternalOCLinEcore.g:18264:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
+            // InternalOCLinEcore.g:18265:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_96);
             rule__MapLiteralExpCS__Group__1__Impl();
@@ -55284,17 +55284,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:18270:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:18272:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__MapLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18274:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:18275:1: ( '{' )
+            // InternalOCLinEcore.g:18276:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:18277:1: ( '{' )
             {
-            // InternalOCLinEcore.g:18275:1: ( '{' )
-            // InternalOCLinEcore.g:18276:1: '{'
+            // InternalOCLinEcore.g:18277:1: ( '{' )
+            // InternalOCLinEcore.g:18278:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -55325,14 +55325,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2"
-    // InternalOCLinEcore.g:18289:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
+    // InternalOCLinEcore.g:18291:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
     public final void rule__MapLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18293:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
-            // InternalOCLinEcore.g:18294:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
+            // InternalOCLinEcore.g:18295:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
+            // InternalOCLinEcore.g:18296:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_96);
             rule__MapLiteralExpCS__Group__2__Impl();
@@ -55363,22 +55363,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:18301:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:18303:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__MapLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18305:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:18306:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:18307:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:18308:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:18306:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:18307:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalOCLinEcore.g:18308:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:18309:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:18308:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalOCLinEcore.g:18310:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             int alt195=2;
             int LA195_0 = input.LA(1);
 
@@ -55387,7 +55387,7 @@
             }
             switch (alt195) {
                 case 1 :
-                    // InternalOCLinEcore.g:18308:2: rule__MapLiteralExpCS__Group_2__0
+                    // InternalOCLinEcore.g:18310:2: rule__MapLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapLiteralExpCS__Group_2__0();
@@ -55425,14 +55425,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3"
-    // InternalOCLinEcore.g:18318:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:18320:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
     public final void rule__MapLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18322:1: ( rule__MapLiteralExpCS__Group__3__Impl )
-            // InternalOCLinEcore.g:18323:2: rule__MapLiteralExpCS__Group__3__Impl
+            // InternalOCLinEcore.g:18324:1: ( rule__MapLiteralExpCS__Group__3__Impl )
+            // InternalOCLinEcore.g:18325:2: rule__MapLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group__3__Impl();
@@ -55458,17 +55458,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:18329:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:18331:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__MapLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18333:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:18334:1: ( '}' )
+            // InternalOCLinEcore.g:18335:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:18336:1: ( '}' )
             {
-            // InternalOCLinEcore.g:18334:1: ( '}' )
-            // InternalOCLinEcore.g:18335:1: '}'
+            // InternalOCLinEcore.g:18336:1: ( '}' )
+            // InternalOCLinEcore.g:18337:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -55499,14 +55499,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0"
-    // InternalOCLinEcore.g:18356:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
+    // InternalOCLinEcore.g:18358:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
     public final void rule__MapLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18360:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
-            // InternalOCLinEcore.g:18361:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
+            // InternalOCLinEcore.g:18362:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
+            // InternalOCLinEcore.g:18363:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__MapLiteralExpCS__Group_2__0__Impl();
@@ -55537,23 +55537,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:18368:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLinEcore.g:18370:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18372:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLinEcore.g:18373:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:18374:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLinEcore.g:18375:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLinEcore.g:18373:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLinEcore.g:18374:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:18375:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:18376:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLinEcore.g:18375:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLinEcore.g:18375:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalOCLinEcore.g:18377:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:18377:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -55588,14 +55588,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1"
-    // InternalOCLinEcore.g:18385:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:18387:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18389:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:18390:2: rule__MapLiteralExpCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:18391:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:18392:2: rule__MapLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2__1__Impl();
@@ -55621,22 +55621,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:18396:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalOCLinEcore.g:18398:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__MapLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18400:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalOCLinEcore.g:18401:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:18402:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalOCLinEcore.g:18403:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalOCLinEcore.g:18401:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
-            // InternalOCLinEcore.g:18402:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:18403:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:18404:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:18403:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:18405:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             loop196:
             do {
                 int alt196=2;
@@ -55649,7 +55649,7 @@
 
                 switch (alt196) {
             	case 1 :
-            	    // InternalOCLinEcore.g:18403:2: rule__MapLiteralExpCS__Group_2_1__0
+            	    // InternalOCLinEcore.g:18405:2: rule__MapLiteralExpCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__MapLiteralExpCS__Group_2_1__0();
@@ -55690,14 +55690,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0"
-    // InternalOCLinEcore.g:18417:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:18419:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
     public final void rule__MapLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18421:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:18422:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
+            // InternalOCLinEcore.g:18423:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:18424:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__MapLiteralExpCS__Group_2_1__0__Impl();
@@ -55728,17 +55728,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:18429:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:18431:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18433:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:18434:1: ( ',' )
+            // InternalOCLinEcore.g:18435:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:18436:1: ( ',' )
             {
-            // InternalOCLinEcore.g:18434:1: ( ',' )
-            // InternalOCLinEcore.g:18435:1: ','
+            // InternalOCLinEcore.g:18436:1: ( ',' )
+            // InternalOCLinEcore.g:18437:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -55769,14 +55769,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1"
-    // InternalOCLinEcore.g:18448:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalOCLinEcore.g:18450:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18452:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
-            // InternalOCLinEcore.g:18453:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
+            // InternalOCLinEcore.g:18454:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
+            // InternalOCLinEcore.g:18455:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2_1__1__Impl();
@@ -55802,23 +55802,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:18459:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:18461:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18463:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLinEcore.g:18464:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:18465:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLinEcore.g:18466:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:18464:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLinEcore.g:18465:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:18466:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:18467:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLinEcore.g:18466:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLinEcore.g:18466:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLinEcore.g:18468:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:18468:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -55853,14 +55853,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0"
-    // InternalOCLinEcore.g:18480:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
+    // InternalOCLinEcore.g:18482:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
     public final void rule__MapLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18484:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
-            // InternalOCLinEcore.g:18485:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
+            // InternalOCLinEcore.g:18486:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
+            // InternalOCLinEcore.g:18487:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_97);
             rule__MapLiteralPartCS__Group__0__Impl();
@@ -55891,23 +55891,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18492:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:18494:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
     public final void rule__MapLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18496:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
-            // InternalOCLinEcore.g:18497:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalOCLinEcore.g:18498:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
+            // InternalOCLinEcore.g:18499:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:18497:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
-            // InternalOCLinEcore.g:18498:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalOCLinEcore.g:18499:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalOCLinEcore.g:18500:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
             }
-            // InternalOCLinEcore.g:18499:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
-            // InternalOCLinEcore.g:18499:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
+            // InternalOCLinEcore.g:18501:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalOCLinEcore.g:18501:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedKeyAssignment_0();
@@ -55942,14 +55942,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1"
-    // InternalOCLinEcore.g:18509:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
+    // InternalOCLinEcore.g:18511:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
     public final void rule__MapLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18513:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
-            // InternalOCLinEcore.g:18514:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
+            // InternalOCLinEcore.g:18515:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
+            // InternalOCLinEcore.g:18516:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__MapLiteralPartCS__Group__1__Impl();
@@ -55980,17 +55980,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1__Impl"
-    // InternalOCLinEcore.g:18521:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:18523:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
     public final void rule__MapLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18525:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:18526:1: ( '<-' )
+            // InternalOCLinEcore.g:18527:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:18528:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:18526:1: ( '<-' )
-            // InternalOCLinEcore.g:18527:1: '<-'
+            // InternalOCLinEcore.g:18528:1: ( '<-' )
+            // InternalOCLinEcore.g:18529:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
@@ -56021,14 +56021,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2"
-    // InternalOCLinEcore.g:18540:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:18542:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
     public final void rule__MapLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18544:1: ( rule__MapLiteralPartCS__Group__2__Impl )
-            // InternalOCLinEcore.g:18545:2: rule__MapLiteralPartCS__Group__2__Impl
+            // InternalOCLinEcore.g:18546:1: ( rule__MapLiteralPartCS__Group__2__Impl )
+            // InternalOCLinEcore.g:18547:2: rule__MapLiteralPartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__Group__2__Impl();
@@ -56054,23 +56054,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2__Impl"
-    // InternalOCLinEcore.g:18551:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:18553:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
     public final void rule__MapLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18555:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
-            // InternalOCLinEcore.g:18556:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalOCLinEcore.g:18557:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
+            // InternalOCLinEcore.g:18558:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:18556:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
-            // InternalOCLinEcore.g:18557:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalOCLinEcore.g:18558:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalOCLinEcore.g:18559:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
             }
-            // InternalOCLinEcore.g:18558:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
-            // InternalOCLinEcore.g:18558:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
+            // InternalOCLinEcore.g:18560:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalOCLinEcore.g:18560:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedValueAssignment_2();
@@ -56105,14 +56105,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:18574:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:18576:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
     public final void rule__TupleLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18578:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:18579:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:18580:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:18581:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__TupleLiteralExpCS__Group__0__Impl();
@@ -56143,17 +56143,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18586:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
+    // InternalOCLinEcore.g:18588:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
     public final void rule__TupleLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18590:1: ( ( 'Tuple' ) )
-            // InternalOCLinEcore.g:18591:1: ( 'Tuple' )
+            // InternalOCLinEcore.g:18592:1: ( ( 'Tuple' ) )
+            // InternalOCLinEcore.g:18593:1: ( 'Tuple' )
             {
-            // InternalOCLinEcore.g:18591:1: ( 'Tuple' )
-            // InternalOCLinEcore.g:18592:1: 'Tuple'
+            // InternalOCLinEcore.g:18593:1: ( 'Tuple' )
+            // InternalOCLinEcore.g:18594:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
@@ -56184,14 +56184,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:18605:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
+    // InternalOCLinEcore.g:18607:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
     public final void rule__TupleLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18609:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
-            // InternalOCLinEcore.g:18610:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
+            // InternalOCLinEcore.g:18611:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
+            // InternalOCLinEcore.g:18612:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TupleLiteralExpCS__Group__1__Impl();
@@ -56222,17 +56222,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:18617:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:18619:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__TupleLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18621:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:18622:1: ( '{' )
+            // InternalOCLinEcore.g:18623:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:18624:1: ( '{' )
             {
-            // InternalOCLinEcore.g:18622:1: ( '{' )
-            // InternalOCLinEcore.g:18623:1: '{'
+            // InternalOCLinEcore.g:18624:1: ( '{' )
+            // InternalOCLinEcore.g:18625:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -56263,14 +56263,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2"
-    // InternalOCLinEcore.g:18636:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
+    // InternalOCLinEcore.g:18638:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
     public final void rule__TupleLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18640:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
-            // InternalOCLinEcore.g:18641:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
+            // InternalOCLinEcore.g:18642:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
+            // InternalOCLinEcore.g:18643:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_98);
             rule__TupleLiteralExpCS__Group__2__Impl();
@@ -56301,23 +56301,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:18648:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
+    // InternalOCLinEcore.g:18650:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
     public final void rule__TupleLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18652:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
-            // InternalOCLinEcore.g:18653:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalOCLinEcore.g:18654:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
+            // InternalOCLinEcore.g:18655:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
             {
-            // InternalOCLinEcore.g:18653:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
-            // InternalOCLinEcore.g:18654:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalOCLinEcore.g:18655:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalOCLinEcore.g:18656:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
             }
-            // InternalOCLinEcore.g:18655:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
-            // InternalOCLinEcore.g:18655:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
+            // InternalOCLinEcore.g:18657:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalOCLinEcore.g:18657:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_2();
@@ -56352,14 +56352,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3"
-    // InternalOCLinEcore.g:18665:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
+    // InternalOCLinEcore.g:18667:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
     public final void rule__TupleLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18669:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
-            // InternalOCLinEcore.g:18670:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
+            // InternalOCLinEcore.g:18671:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
+            // InternalOCLinEcore.g:18672:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_98);
             rule__TupleLiteralExpCS__Group__3__Impl();
@@ -56390,22 +56390,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:18677:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
+    // InternalOCLinEcore.g:18679:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
     public final void rule__TupleLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18681:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
-            // InternalOCLinEcore.g:18682:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalOCLinEcore.g:18683:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
+            // InternalOCLinEcore.g:18684:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
             {
-            // InternalOCLinEcore.g:18682:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
-            // InternalOCLinEcore.g:18683:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalOCLinEcore.g:18684:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalOCLinEcore.g:18685:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
             }
-            // InternalOCLinEcore.g:18684:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalOCLinEcore.g:18686:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             loop197:
             do {
                 int alt197=2;
@@ -56418,7 +56418,7 @@
 
                 switch (alt197) {
             	case 1 :
-            	    // InternalOCLinEcore.g:18684:2: rule__TupleLiteralExpCS__Group_3__0
+            	    // InternalOCLinEcore.g:18686:2: rule__TupleLiteralExpCS__Group_3__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TupleLiteralExpCS__Group_3__0();
@@ -56459,14 +56459,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4"
-    // InternalOCLinEcore.g:18694:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:18696:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
     public final void rule__TupleLiteralExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18698:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
-            // InternalOCLinEcore.g:18699:2: rule__TupleLiteralExpCS__Group__4__Impl
+            // InternalOCLinEcore.g:18700:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
+            // InternalOCLinEcore.g:18701:2: rule__TupleLiteralExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group__4__Impl();
@@ -56492,17 +56492,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4__Impl"
-    // InternalOCLinEcore.g:18705:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:18707:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
     public final void rule__TupleLiteralExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18709:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:18710:1: ( '}' )
+            // InternalOCLinEcore.g:18711:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:18712:1: ( '}' )
             {
-            // InternalOCLinEcore.g:18710:1: ( '}' )
-            // InternalOCLinEcore.g:18711:1: '}'
+            // InternalOCLinEcore.g:18712:1: ( '}' )
+            // InternalOCLinEcore.g:18713:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
@@ -56533,14 +56533,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0"
-    // InternalOCLinEcore.g:18734:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
+    // InternalOCLinEcore.g:18736:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
     public final void rule__TupleLiteralExpCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18738:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
-            // InternalOCLinEcore.g:18739:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
+            // InternalOCLinEcore.g:18740:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
+            // InternalOCLinEcore.g:18741:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__TupleLiteralExpCS__Group_3__0__Impl();
@@ -56571,17 +56571,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0__Impl"
-    // InternalOCLinEcore.g:18746:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:18748:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
     public final void rule__TupleLiteralExpCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18750:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:18751:1: ( ',' )
+            // InternalOCLinEcore.g:18752:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:18753:1: ( ',' )
             {
-            // InternalOCLinEcore.g:18751:1: ( ',' )
-            // InternalOCLinEcore.g:18752:1: ','
+            // InternalOCLinEcore.g:18753:1: ( ',' )
+            // InternalOCLinEcore.g:18754:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
@@ -56612,14 +56612,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1"
-    // InternalOCLinEcore.g:18765:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
+    // InternalOCLinEcore.g:18767:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
     public final void rule__TupleLiteralExpCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18769:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
-            // InternalOCLinEcore.g:18770:2: rule__TupleLiteralExpCS__Group_3__1__Impl
+            // InternalOCLinEcore.g:18771:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
+            // InternalOCLinEcore.g:18772:2: rule__TupleLiteralExpCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group_3__1__Impl();
@@ -56645,23 +56645,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1__Impl"
-    // InternalOCLinEcore.g:18776:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
+    // InternalOCLinEcore.g:18778:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
     public final void rule__TupleLiteralExpCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18780:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
-            // InternalOCLinEcore.g:18781:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalOCLinEcore.g:18782:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
+            // InternalOCLinEcore.g:18783:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
             {
-            // InternalOCLinEcore.g:18781:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
-            // InternalOCLinEcore.g:18782:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalOCLinEcore.g:18783:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalOCLinEcore.g:18784:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
             }
-            // InternalOCLinEcore.g:18783:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
-            // InternalOCLinEcore.g:18783:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
+            // InternalOCLinEcore.g:18785:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalOCLinEcore.g:18785:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1();
@@ -56696,14 +56696,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0"
-    // InternalOCLinEcore.g:18797:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
+    // InternalOCLinEcore.g:18799:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
     public final void rule__TupleLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18801:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
-            // InternalOCLinEcore.g:18802:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
+            // InternalOCLinEcore.g:18803:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
+            // InternalOCLinEcore.g:18804:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_99);
             rule__TupleLiteralPartCS__Group__0__Impl();
@@ -56734,23 +56734,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18809:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:18811:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18813:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:18814:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:18815:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:18816:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:18814:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:18815:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:18816:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:18817:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:18816:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:18816:2: rule__TupleLiteralPartCS__NameAssignment_0
+            // InternalOCLinEcore.g:18818:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:18818:2: rule__TupleLiteralPartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__NameAssignment_0();
@@ -56785,14 +56785,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1"
-    // InternalOCLinEcore.g:18826:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
+    // InternalOCLinEcore.g:18828:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
     public final void rule__TupleLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18830:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
-            // InternalOCLinEcore.g:18831:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
+            // InternalOCLinEcore.g:18832:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
+            // InternalOCLinEcore.g:18833:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_99);
             rule__TupleLiteralPartCS__Group__1__Impl();
@@ -56823,22 +56823,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1__Impl"
-    // InternalOCLinEcore.g:18838:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:18840:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
     public final void rule__TupleLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18842:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:18843:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:18844:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:18845:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:18843:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:18844:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalOCLinEcore.g:18845:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:18846:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:18845:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalOCLinEcore.g:18847:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             int alt198=2;
             int LA198_0 = input.LA(1);
 
@@ -56847,7 +56847,7 @@
             }
             switch (alt198) {
                 case 1 :
-                    // InternalOCLinEcore.g:18845:2: rule__TupleLiteralPartCS__Group_1__0
+                    // InternalOCLinEcore.g:18847:2: rule__TupleLiteralPartCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleLiteralPartCS__Group_1__0();
@@ -56885,14 +56885,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2"
-    // InternalOCLinEcore.g:18855:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
+    // InternalOCLinEcore.g:18857:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
     public final void rule__TupleLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18859:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
-            // InternalOCLinEcore.g:18860:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
+            // InternalOCLinEcore.g:18861:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
+            // InternalOCLinEcore.g:18862:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__TupleLiteralPartCS__Group__2__Impl();
@@ -56923,17 +56923,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2__Impl"
-    // InternalOCLinEcore.g:18867:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:18869:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
     public final void rule__TupleLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18871:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:18872:1: ( '=' )
+            // InternalOCLinEcore.g:18873:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:18874:1: ( '=' )
             {
-            // InternalOCLinEcore.g:18872:1: ( '=' )
-            // InternalOCLinEcore.g:18873:1: '='
+            // InternalOCLinEcore.g:18874:1: ( '=' )
+            // InternalOCLinEcore.g:18875:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
@@ -56964,14 +56964,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3"
-    // InternalOCLinEcore.g:18886:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:18888:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
     public final void rule__TupleLiteralPartCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18890:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
-            // InternalOCLinEcore.g:18891:2: rule__TupleLiteralPartCS__Group__3__Impl
+            // InternalOCLinEcore.g:18892:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
+            // InternalOCLinEcore.g:18893:2: rule__TupleLiteralPartCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group__3__Impl();
@@ -56997,23 +56997,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3__Impl"
-    // InternalOCLinEcore.g:18897:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
+    // InternalOCLinEcore.g:18899:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18901:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
-            // InternalOCLinEcore.g:18902:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalOCLinEcore.g:18903:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
+            // InternalOCLinEcore.g:18904:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
             {
-            // InternalOCLinEcore.g:18902:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
-            // InternalOCLinEcore.g:18903:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalOCLinEcore.g:18904:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalOCLinEcore.g:18905:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
             }
-            // InternalOCLinEcore.g:18904:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
-            // InternalOCLinEcore.g:18904:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
+            // InternalOCLinEcore.g:18906:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalOCLinEcore.g:18906:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3();
@@ -57048,14 +57048,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0"
-    // InternalOCLinEcore.g:18922:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
+    // InternalOCLinEcore.g:18924:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
     public final void rule__TupleLiteralPartCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18926:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
-            // InternalOCLinEcore.g:18927:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
+            // InternalOCLinEcore.g:18928:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
+            // InternalOCLinEcore.g:18929:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__TupleLiteralPartCS__Group_1__0__Impl();
@@ -57086,17 +57086,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:18934:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:18936:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__TupleLiteralPartCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18938:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:18939:1: ( ':' )
+            // InternalOCLinEcore.g:18940:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:18941:1: ( ':' )
             {
-            // InternalOCLinEcore.g:18939:1: ( ':' )
-            // InternalOCLinEcore.g:18940:1: ':'
+            // InternalOCLinEcore.g:18941:1: ( ':' )
+            // InternalOCLinEcore.g:18942:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
@@ -57127,14 +57127,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1"
-    // InternalOCLinEcore.g:18953:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:18955:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
     public final void rule__TupleLiteralPartCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18957:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:18958:2: rule__TupleLiteralPartCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:18959:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:18960:2: rule__TupleLiteralPartCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group_1__1__Impl();
@@ -57160,23 +57160,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:18964:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:18966:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__TupleLiteralPartCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18968:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:18969:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:18970:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:18971:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:18969:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLinEcore.g:18970:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:18971:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:18972:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLinEcore.g:18971:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLinEcore.g:18971:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
+            // InternalOCLinEcore.g:18973:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:18973:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1();
@@ -57211,14 +57211,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:18985:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:18987:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:18989:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:18990:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:18991:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:18992:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_100);
             rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl();
@@ -57249,23 +57249,23 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:18997:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:18999:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19001:1: ( ( () ) )
-            // InternalOCLinEcore.g:19002:1: ( () )
+            // InternalOCLinEcore.g:19003:1: ( ( () ) )
+            // InternalOCLinEcore.g:19004:1: ( () )
             {
-            // InternalOCLinEcore.g:19002:1: ( () )
-            // InternalOCLinEcore.g:19003:1: ()
+            // InternalOCLinEcore.g:19004:1: ( () )
+            // InternalOCLinEcore.g:19005:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
             }
-            // InternalOCLinEcore.g:19004:1: ()
-            // InternalOCLinEcore.g:19006:1:
+            // InternalOCLinEcore.g:19006:1: ()
+            // InternalOCLinEcore.g:19008:1:
             {
             }
 
@@ -57290,14 +57290,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:19016:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:19018:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19020:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
-            // InternalOCLinEcore.g:19021:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
+            // InternalOCLinEcore.g:19022:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
+            // InternalOCLinEcore.g:19023:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl();
@@ -57323,17 +57323,17 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19027:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
+    // InternalOCLinEcore.g:19029:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19031:1: ( ( '*' ) )
-            // InternalOCLinEcore.g:19032:1: ( '*' )
+            // InternalOCLinEcore.g:19033:1: ( ( '*' ) )
+            // InternalOCLinEcore.g:19034:1: ( '*' )
             {
-            // InternalOCLinEcore.g:19032:1: ( '*' )
-            // InternalOCLinEcore.g:19033:1: '*'
+            // InternalOCLinEcore.g:19034:1: ( '*' )
+            // InternalOCLinEcore.g:19035:1: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
@@ -57364,14 +57364,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:19050:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:19052:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
     public final void rule__InvalidLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19054:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:19055:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:19056:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:19057:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_101);
             rule__InvalidLiteralExpCS__Group__0__Impl();
@@ -57402,23 +57402,23 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:19062:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:19064:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__InvalidLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19066:1: ( ( () ) )
-            // InternalOCLinEcore.g:19067:1: ( () )
+            // InternalOCLinEcore.g:19068:1: ( ( () ) )
+            // InternalOCLinEcore.g:19069:1: ( () )
             {
-            // InternalOCLinEcore.g:19067:1: ( () )
-            // InternalOCLinEcore.g:19068:1: ()
+            // InternalOCLinEcore.g:19069:1: ( () )
+            // InternalOCLinEcore.g:19070:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
             }
-            // InternalOCLinEcore.g:19069:1: ()
-            // InternalOCLinEcore.g:19071:1:
+            // InternalOCLinEcore.g:19071:1: ()
+            // InternalOCLinEcore.g:19073:1:
             {
             }
 
@@ -57443,14 +57443,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:19081:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:19083:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
     public final void rule__InvalidLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19085:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
-            // InternalOCLinEcore.g:19086:2: rule__InvalidLiteralExpCS__Group__1__Impl
+            // InternalOCLinEcore.g:19087:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
+            // InternalOCLinEcore.g:19088:2: rule__InvalidLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvalidLiteralExpCS__Group__1__Impl();
@@ -57476,17 +57476,17 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19092:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
+    // InternalOCLinEcore.g:19094:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
     public final void rule__InvalidLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19096:1: ( ( 'invalid' ) )
-            // InternalOCLinEcore.g:19097:1: ( 'invalid' )
+            // InternalOCLinEcore.g:19098:1: ( ( 'invalid' ) )
+            // InternalOCLinEcore.g:19099:1: ( 'invalid' )
             {
-            // InternalOCLinEcore.g:19097:1: ( 'invalid' )
-            // InternalOCLinEcore.g:19098:1: 'invalid'
+            // InternalOCLinEcore.g:19099:1: ( 'invalid' )
+            // InternalOCLinEcore.g:19100:1: 'invalid'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
@@ -57517,14 +57517,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0"
-    // InternalOCLinEcore.g:19115:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
+    // InternalOCLinEcore.g:19117:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
     public final void rule__NullLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19119:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
-            // InternalOCLinEcore.g:19120:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
+            // InternalOCLinEcore.g:19121:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
+            // InternalOCLinEcore.g:19122:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_102);
             rule__NullLiteralExpCS__Group__0__Impl();
@@ -57555,23 +57555,23 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:19127:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:19129:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__NullLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19131:1: ( ( () ) )
-            // InternalOCLinEcore.g:19132:1: ( () )
+            // InternalOCLinEcore.g:19133:1: ( ( () ) )
+            // InternalOCLinEcore.g:19134:1: ( () )
             {
-            // InternalOCLinEcore.g:19132:1: ( () )
-            // InternalOCLinEcore.g:19133:1: ()
+            // InternalOCLinEcore.g:19134:1: ( () )
+            // InternalOCLinEcore.g:19135:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
             }
-            // InternalOCLinEcore.g:19134:1: ()
-            // InternalOCLinEcore.g:19136:1:
+            // InternalOCLinEcore.g:19136:1: ()
+            // InternalOCLinEcore.g:19138:1:
             {
             }
 
@@ -57596,14 +57596,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1"
-    // InternalOCLinEcore.g:19146:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:19148:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
     public final void rule__NullLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19150:1: ( rule__NullLiteralExpCS__Group__1__Impl )
-            // InternalOCLinEcore.g:19151:2: rule__NullLiteralExpCS__Group__1__Impl
+            // InternalOCLinEcore.g:19152:1: ( rule__NullLiteralExpCS__Group__1__Impl )
+            // InternalOCLinEcore.g:19153:2: rule__NullLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NullLiteralExpCS__Group__1__Impl();
@@ -57629,17 +57629,17 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19157:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
+    // InternalOCLinEcore.g:19159:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
     public final void rule__NullLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19161:1: ( ( 'null' ) )
-            // InternalOCLinEcore.g:19162:1: ( 'null' )
+            // InternalOCLinEcore.g:19163:1: ( ( 'null' ) )
+            // InternalOCLinEcore.g:19164:1: ( 'null' )
             {
-            // InternalOCLinEcore.g:19162:1: ( 'null' )
-            // InternalOCLinEcore.g:19163:1: 'null'
+            // InternalOCLinEcore.g:19164:1: ( 'null' )
+            // InternalOCLinEcore.g:19165:1: 'null'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
@@ -57670,14 +57670,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0"
-    // InternalOCLinEcore.g:19180:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
+    // InternalOCLinEcore.g:19182:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19184:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
-            // InternalOCLinEcore.g:19185:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
+            // InternalOCLinEcore.g:19186:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
+            // InternalOCLinEcore.g:19187:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_81);
             rule__TypeLiteralWithMultiplicityCS__Group__0__Impl();
@@ -57708,17 +57708,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0__Impl"
-    // InternalOCLinEcore.g:19192:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
+    // InternalOCLinEcore.g:19194:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19196:1: ( ( ruleTypeLiteralCS ) )
-            // InternalOCLinEcore.g:19197:1: ( ruleTypeLiteralCS )
+            // InternalOCLinEcore.g:19198:1: ( ( ruleTypeLiteralCS ) )
+            // InternalOCLinEcore.g:19199:1: ( ruleTypeLiteralCS )
             {
-            // InternalOCLinEcore.g:19197:1: ( ruleTypeLiteralCS )
-            // InternalOCLinEcore.g:19198:1: ruleTypeLiteralCS
+            // InternalOCLinEcore.g:19199:1: ( ruleTypeLiteralCS )
+            // InternalOCLinEcore.g:19200:1: ruleTypeLiteralCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());
@@ -57753,14 +57753,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1"
-    // InternalOCLinEcore.g:19209:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:19211:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19213:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
-            // InternalOCLinEcore.g:19214:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
+            // InternalOCLinEcore.g:19215:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
+            // InternalOCLinEcore.g:19216:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeLiteralWithMultiplicityCS__Group__1__Impl();
@@ -57786,22 +57786,22 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19220:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalOCLinEcore.g:19222:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19224:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalOCLinEcore.g:19225:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLinEcore.g:19226:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalOCLinEcore.g:19227:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalOCLinEcore.g:19225:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalOCLinEcore.g:19226:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLinEcore.g:19227:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLinEcore.g:19228:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalOCLinEcore.g:19227:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLinEcore.g:19229:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             int alt199=2;
             int LA199_0 = input.LA(1);
 
@@ -57810,7 +57810,7 @@
             }
             switch (alt199) {
                 case 1 :
-                    // InternalOCLinEcore.g:19227:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
+                    // InternalOCLinEcore.g:19229:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1();
@@ -57848,14 +57848,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0"
-    // InternalOCLinEcore.g:19241:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
+    // InternalOCLinEcore.g:19243:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
     public final void rule__TypeNameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19245:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
-            // InternalOCLinEcore.g:19246:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
+            // InternalOCLinEcore.g:19247:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
+            // InternalOCLinEcore.g:19248:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__TypeNameExpCS__Group__0__Impl();
@@ -57886,23 +57886,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:19253:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:19255:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypeNameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19257:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:19258:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLinEcore.g:19259:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:19260:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:19258:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalOCLinEcore.g:19259:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLinEcore.g:19260:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLinEcore.g:19261:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalOCLinEcore.g:19260:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
-            // InternalOCLinEcore.g:19260:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
+            // InternalOCLinEcore.g:19262:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLinEcore.g:19262:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPathNameAssignment_0();
@@ -57937,14 +57937,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1"
-    // InternalOCLinEcore.g:19270:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:19272:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
     public final void rule__TypeNameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19274:1: ( rule__TypeNameExpCS__Group__1__Impl )
-            // InternalOCLinEcore.g:19275:2: rule__TypeNameExpCS__Group__1__Impl
+            // InternalOCLinEcore.g:19276:1: ( rule__TypeNameExpCS__Group__1__Impl )
+            // InternalOCLinEcore.g:19277:2: rule__TypeNameExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group__1__Impl();
@@ -57970,22 +57970,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19281:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:19283:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19285:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:19286:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:19287:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:19288:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:19286:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:19287:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalOCLinEcore.g:19288:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:19289:1: ( rule__TypeNameExpCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:19288:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalOCLinEcore.g:19290:1: ( rule__TypeNameExpCS__Group_1__0 )?
             int alt200=2;
             int LA200_0 = input.LA(1);
 
@@ -57994,7 +57994,7 @@
             }
             switch (alt200) {
                 case 1 :
-                    // InternalOCLinEcore.g:19288:2: rule__TypeNameExpCS__Group_1__0
+                    // InternalOCLinEcore.g:19290:2: rule__TypeNameExpCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1__0();
@@ -58032,14 +58032,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0"
-    // InternalOCLinEcore.g:19302:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
+    // InternalOCLinEcore.g:19304:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
     public final void rule__TypeNameExpCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19306:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
-            // InternalOCLinEcore.g:19307:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
+            // InternalOCLinEcore.g:19308:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
+            // InternalOCLinEcore.g:19309:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__TypeNameExpCS__Group_1__0__Impl();
@@ -58070,23 +58070,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:19314:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
+    // InternalOCLinEcore.g:19316:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
     public final void rule__TypeNameExpCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19318:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
-            // InternalOCLinEcore.g:19319:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalOCLinEcore.g:19320:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
+            // InternalOCLinEcore.g:19321:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
             {
-            // InternalOCLinEcore.g:19319:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
-            // InternalOCLinEcore.g:19320:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalOCLinEcore.g:19321:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalOCLinEcore.g:19322:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
             }
-            // InternalOCLinEcore.g:19321:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
-            // InternalOCLinEcore.g:19321:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
+            // InternalOCLinEcore.g:19323:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalOCLinEcore.g:19323:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0();
@@ -58121,14 +58121,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1"
-    // InternalOCLinEcore.g:19331:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:19333:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
     public final void rule__TypeNameExpCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19335:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:19336:2: rule__TypeNameExpCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:19337:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:19338:2: rule__TypeNameExpCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1__1__Impl();
@@ -58154,22 +58154,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:19342:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
+    // InternalOCLinEcore.g:19344:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19346:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
-            // InternalOCLinEcore.g:19347:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:19348:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
+            // InternalOCLinEcore.g:19349:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
             {
-            // InternalOCLinEcore.g:19347:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
-            // InternalOCLinEcore.g:19348:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:19349:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalOCLinEcore.g:19350:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
             }
-            // InternalOCLinEcore.g:19349:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalOCLinEcore.g:19351:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             int alt201=2;
             int LA201_0 = input.LA(1);
 
@@ -58178,7 +58178,7 @@
             }
             switch (alt201) {
                 case 1 :
-                    // InternalOCLinEcore.g:19349:2: rule__TypeNameExpCS__Group_1_1__0
+                    // InternalOCLinEcore.g:19351:2: rule__TypeNameExpCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1_1__0();
@@ -58216,14 +58216,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0"
-    // InternalOCLinEcore.g:19363:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
+    // InternalOCLinEcore.g:19365:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
     public final void rule__TypeNameExpCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19367:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
-            // InternalOCLinEcore.g:19368:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
+            // InternalOCLinEcore.g:19369:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
+            // InternalOCLinEcore.g:19370:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__TypeNameExpCS__Group_1_1__0__Impl();
@@ -58254,17 +58254,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0__Impl"
-    // InternalOCLinEcore.g:19375:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:19377:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19379:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:19380:1: ( '{' )
+            // InternalOCLinEcore.g:19381:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:19382:1: ( '{' )
             {
-            // InternalOCLinEcore.g:19380:1: ( '{' )
-            // InternalOCLinEcore.g:19381:1: '{'
+            // InternalOCLinEcore.g:19382:1: ( '{' )
+            // InternalOCLinEcore.g:19383:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
@@ -58295,14 +58295,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1"
-    // InternalOCLinEcore.g:19394:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
+    // InternalOCLinEcore.g:19396:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
     public final void rule__TypeNameExpCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19398:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
-            // InternalOCLinEcore.g:19399:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
+            // InternalOCLinEcore.g:19400:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
+            // InternalOCLinEcore.g:19401:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__TypeNameExpCS__Group_1_1__1__Impl();
@@ -58333,23 +58333,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1__Impl"
-    // InternalOCLinEcore.g:19406:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:19408:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
     public final void rule__TypeNameExpCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19410:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
-            // InternalOCLinEcore.g:19411:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:19412:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
+            // InternalOCLinEcore.g:19413:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:19411:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
-            // InternalOCLinEcore.g:19412:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalOCLinEcore.g:19413:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalOCLinEcore.g:19414:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
             }
-            // InternalOCLinEcore.g:19413:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
-            // InternalOCLinEcore.g:19413:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
+            // InternalOCLinEcore.g:19415:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalOCLinEcore.g:19415:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1();
@@ -58384,14 +58384,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2"
-    // InternalOCLinEcore.g:19423:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
+    // InternalOCLinEcore.g:19425:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
     public final void rule__TypeNameExpCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19427:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
-            // InternalOCLinEcore.g:19428:2: rule__TypeNameExpCS__Group_1_1__2__Impl
+            // InternalOCLinEcore.g:19429:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
+            // InternalOCLinEcore.g:19430:2: rule__TypeNameExpCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1_1__2__Impl();
@@ -58417,17 +58417,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2__Impl"
-    // InternalOCLinEcore.g:19434:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:19436:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19438:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:19439:1: ( '}' )
+            // InternalOCLinEcore.g:19440:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:19441:1: ( '}' )
             {
-            // InternalOCLinEcore.g:19439:1: ( '}' )
-            // InternalOCLinEcore.g:19440:1: '}'
+            // InternalOCLinEcore.g:19441:1: ( '}' )
+            // InternalOCLinEcore.g:19442:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
@@ -58458,14 +58458,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0"
-    // InternalOCLinEcore.g:19459:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
+    // InternalOCLinEcore.g:19461:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
     public final void rule__TypeExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19463:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
-            // InternalOCLinEcore.g:19464:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
+            // InternalOCLinEcore.g:19465:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
+            // InternalOCLinEcore.g:19466:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_81);
             rule__TypeExpCS__Group__0__Impl();
@@ -58496,17 +58496,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:19471:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalOCLinEcore.g:19473:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__TypeExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19475:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalOCLinEcore.g:19476:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLinEcore.g:19477:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalOCLinEcore.g:19478:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalOCLinEcore.g:19476:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalOCLinEcore.g:19477:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalOCLinEcore.g:19478:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLinEcore.g:19479:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());
@@ -58541,14 +58541,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1"
-    // InternalOCLinEcore.g:19488:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:19490:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
     public final void rule__TypeExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19492:1: ( rule__TypeExpCS__Group__1__Impl )
-            // InternalOCLinEcore.g:19493:2: rule__TypeExpCS__Group__1__Impl
+            // InternalOCLinEcore.g:19494:1: ( rule__TypeExpCS__Group__1__Impl )
+            // InternalOCLinEcore.g:19495:2: rule__TypeExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeExpCS__Group__1__Impl();
@@ -58574,22 +58574,22 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19499:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalOCLinEcore.g:19501:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19503:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalOCLinEcore.g:19504:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLinEcore.g:19505:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalOCLinEcore.g:19506:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalOCLinEcore.g:19504:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalOCLinEcore.g:19505:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLinEcore.g:19506:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLinEcore.g:19507:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalOCLinEcore.g:19506:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLinEcore.g:19508:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             int alt202=2;
             int LA202_0 = input.LA(1);
 
@@ -58598,7 +58598,7 @@
             }
             switch (alt202) {
                 case 1 :
-                    // InternalOCLinEcore.g:19506:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
+                    // InternalOCLinEcore.g:19508:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeExpCS__OwnedMultiplicityAssignment_1();
@@ -58636,14 +58636,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0"
-    // InternalOCLinEcore.g:19520:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
+    // InternalOCLinEcore.g:19522:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
     public final void rule__ExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19524:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
-            // InternalOCLinEcore.g:19525:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
+            // InternalOCLinEcore.g:19526:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
+            // InternalOCLinEcore.g:19527:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_103);
             rule__ExpCS__Group_0__0__Impl();
@@ -58674,17 +58674,17 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:19532:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalOCLinEcore.g:19534:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__ExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19536:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalOCLinEcore.g:19537:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLinEcore.g:19538:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalOCLinEcore.g:19539:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalOCLinEcore.g:19537:1: ( rulePrefixedPrimaryExpCS )
-            // InternalOCLinEcore.g:19538:1: rulePrefixedPrimaryExpCS
+            // InternalOCLinEcore.g:19539:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLinEcore.g:19540:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());
@@ -58719,14 +58719,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1"
-    // InternalOCLinEcore.g:19549:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
+    // InternalOCLinEcore.g:19551:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
     public final void rule__ExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19553:1: ( rule__ExpCS__Group_0__1__Impl )
-            // InternalOCLinEcore.g:19554:2: rule__ExpCS__Group_0__1__Impl
+            // InternalOCLinEcore.g:19555:1: ( rule__ExpCS__Group_0__1__Impl )
+            // InternalOCLinEcore.g:19556:2: rule__ExpCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0__1__Impl();
@@ -58752,22 +58752,22 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:19560:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
+    // InternalOCLinEcore.g:19562:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
     public final void rule__ExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19564:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
-            // InternalOCLinEcore.g:19565:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalOCLinEcore.g:19566:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
+            // InternalOCLinEcore.g:19567:1: ( ( rule__ExpCS__Group_0_1__0 )? )
             {
-            // InternalOCLinEcore.g:19565:1: ( ( rule__ExpCS__Group_0_1__0 )? )
-            // InternalOCLinEcore.g:19566:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalOCLinEcore.g:19567:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalOCLinEcore.g:19568:1: ( rule__ExpCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getGroup_0_1());
             }
-            // InternalOCLinEcore.g:19567:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalOCLinEcore.g:19569:1: ( rule__ExpCS__Group_0_1__0 )?
             int alt203=2;
             int LA203_0 = input.LA(1);
 
@@ -58776,7 +58776,7 @@
             }
             switch (alt203) {
                 case 1 :
-                    // InternalOCLinEcore.g:19567:2: rule__ExpCS__Group_0_1__0
+                    // InternalOCLinEcore.g:19569:2: rule__ExpCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0_1__0();
@@ -58814,14 +58814,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0"
-    // InternalOCLinEcore.g:19581:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
+    // InternalOCLinEcore.g:19583:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
     public final void rule__ExpCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19585:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
-            // InternalOCLinEcore.g:19586:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
+            // InternalOCLinEcore.g:19587:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
+            // InternalOCLinEcore.g:19588:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_103);
             rule__ExpCS__Group_0_1__0__Impl();
@@ -58852,23 +58852,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0__Impl"
-    // InternalOCLinEcore.g:19593:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:19595:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
     public final void rule__ExpCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19597:1: ( ( () ) )
-            // InternalOCLinEcore.g:19598:1: ( () )
+            // InternalOCLinEcore.g:19599:1: ( ( () ) )
+            // InternalOCLinEcore.g:19600:1: ( () )
             {
-            // InternalOCLinEcore.g:19598:1: ( () )
-            // InternalOCLinEcore.g:19599:1: ()
+            // InternalOCLinEcore.g:19600:1: ( () )
+            // InternalOCLinEcore.g:19601:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
             }
-            // InternalOCLinEcore.g:19600:1: ()
-            // InternalOCLinEcore.g:19602:1:
+            // InternalOCLinEcore.g:19602:1: ()
+            // InternalOCLinEcore.g:19604:1:
             {
             }
 
@@ -58893,14 +58893,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1"
-    // InternalOCLinEcore.g:19612:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
+    // InternalOCLinEcore.g:19614:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
     public final void rule__ExpCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19616:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
-            // InternalOCLinEcore.g:19617:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
+            // InternalOCLinEcore.g:19618:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
+            // InternalOCLinEcore.g:19619:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__ExpCS__Group_0_1__1__Impl();
@@ -58931,23 +58931,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1__Impl"
-    // InternalOCLinEcore.g:19624:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
+    // InternalOCLinEcore.g:19626:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
     public final void rule__ExpCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19628:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
-            // InternalOCLinEcore.g:19629:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalOCLinEcore.g:19630:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
+            // InternalOCLinEcore.g:19631:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
             {
-            // InternalOCLinEcore.g:19629:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
-            // InternalOCLinEcore.g:19630:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalOCLinEcore.g:19631:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalOCLinEcore.g:19632:1: ( rule__ExpCS__NameAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
             }
-            // InternalOCLinEcore.g:19631:1: ( rule__ExpCS__NameAssignment_0_1_1 )
-            // InternalOCLinEcore.g:19631:2: rule__ExpCS__NameAssignment_0_1_1
+            // InternalOCLinEcore.g:19633:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalOCLinEcore.g:19633:2: rule__ExpCS__NameAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__NameAssignment_0_1_1();
@@ -58982,14 +58982,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2"
-    // InternalOCLinEcore.g:19641:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
+    // InternalOCLinEcore.g:19643:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
     public final void rule__ExpCS__Group_0_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19645:1: ( rule__ExpCS__Group_0_1__2__Impl )
-            // InternalOCLinEcore.g:19646:2: rule__ExpCS__Group_0_1__2__Impl
+            // InternalOCLinEcore.g:19647:1: ( rule__ExpCS__Group_0_1__2__Impl )
+            // InternalOCLinEcore.g:19648:2: rule__ExpCS__Group_0_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0_1__2__Impl();
@@ -59015,23 +59015,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2__Impl"
-    // InternalOCLinEcore.g:19652:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
+    // InternalOCLinEcore.g:19654:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
     public final void rule__ExpCS__Group_0_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19656:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
-            // InternalOCLinEcore.g:19657:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalOCLinEcore.g:19658:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
+            // InternalOCLinEcore.g:19659:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
             {
-            // InternalOCLinEcore.g:19657:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
-            // InternalOCLinEcore.g:19658:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalOCLinEcore.g:19659:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalOCLinEcore.g:19660:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
             }
-            // InternalOCLinEcore.g:19659:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
-            // InternalOCLinEcore.g:19659:2: rule__ExpCS__OwnedRightAssignment_0_1_2
+            // InternalOCLinEcore.g:19661:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalOCLinEcore.g:19661:2: rule__ExpCS__OwnedRightAssignment_0_1_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__OwnedRightAssignment_0_1_2();
@@ -59066,14 +59066,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0"
-    // InternalOCLinEcore.g:19675:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
+    // InternalOCLinEcore.g:19677:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
     public final void rule__PrefixedLetExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19679:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
-            // InternalOCLinEcore.g:19680:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
+            // InternalOCLinEcore.g:19681:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
+            // InternalOCLinEcore.g:19682:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_104);
             rule__PrefixedLetExpCS__Group_0__0__Impl();
@@ -59104,23 +59104,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:19687:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:19689:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedLetExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19691:1: ( ( () ) )
-            // InternalOCLinEcore.g:19692:1: ( () )
+            // InternalOCLinEcore.g:19693:1: ( ( () ) )
+            // InternalOCLinEcore.g:19694:1: ( () )
             {
-            // InternalOCLinEcore.g:19692:1: ( () )
-            // InternalOCLinEcore.g:19693:1: ()
+            // InternalOCLinEcore.g:19694:1: ( () )
+            // InternalOCLinEcore.g:19695:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalOCLinEcore.g:19694:1: ()
-            // InternalOCLinEcore.g:19696:1:
+            // InternalOCLinEcore.g:19696:1: ()
+            // InternalOCLinEcore.g:19698:1:
             {
             }
 
@@ -59145,14 +59145,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1"
-    // InternalOCLinEcore.g:19706:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
+    // InternalOCLinEcore.g:19708:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
     public final void rule__PrefixedLetExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19710:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
-            // InternalOCLinEcore.g:19711:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
+            // InternalOCLinEcore.g:19712:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
+            // InternalOCLinEcore.g:19713:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__PrefixedLetExpCS__Group_0__1__Impl();
@@ -59183,23 +59183,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:19718:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
+    // InternalOCLinEcore.g:19720:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19722:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
-            // InternalOCLinEcore.g:19723:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalOCLinEcore.g:19724:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
+            // InternalOCLinEcore.g:19725:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
             {
-            // InternalOCLinEcore.g:19723:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
-            // InternalOCLinEcore.g:19724:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalOCLinEcore.g:19725:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalOCLinEcore.g:19726:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalOCLinEcore.g:19725:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
-            // InternalOCLinEcore.g:19725:2: rule__PrefixedLetExpCS__NameAssignment_0_1
+            // InternalOCLinEcore.g:19727:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalOCLinEcore.g:19727:2: rule__PrefixedLetExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__NameAssignment_0_1();
@@ -59234,14 +59234,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2"
-    // InternalOCLinEcore.g:19735:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
+    // InternalOCLinEcore.g:19737:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedLetExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19739:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
-            // InternalOCLinEcore.g:19740:2: rule__PrefixedLetExpCS__Group_0__2__Impl
+            // InternalOCLinEcore.g:19741:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
+            // InternalOCLinEcore.g:19742:2: rule__PrefixedLetExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__Group_0__2__Impl();
@@ -59267,23 +59267,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2__Impl"
-    // InternalOCLinEcore.g:19746:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalOCLinEcore.g:19748:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19750:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalOCLinEcore.g:19751:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLinEcore.g:19752:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalOCLinEcore.g:19753:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalOCLinEcore.g:19751:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalOCLinEcore.g:19752:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLinEcore.g:19753:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLinEcore.g:19754:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalOCLinEcore.g:19753:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
-            // InternalOCLinEcore.g:19753:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
+            // InternalOCLinEcore.g:19755:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLinEcore.g:19755:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__OwnedRightAssignment_0_2();
@@ -59318,14 +59318,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0"
-    // InternalOCLinEcore.g:19769:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
+    // InternalOCLinEcore.g:19771:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19773:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
-            // InternalOCLinEcore.g:19774:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
+            // InternalOCLinEcore.g:19775:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
+            // InternalOCLinEcore.g:19776:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_104);
             rule__PrefixedPrimaryExpCS__Group_0__0__Impl();
@@ -59356,23 +59356,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:19781:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:19783:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19785:1: ( ( () ) )
-            // InternalOCLinEcore.g:19786:1: ( () )
+            // InternalOCLinEcore.g:19787:1: ( ( () ) )
+            // InternalOCLinEcore.g:19788:1: ( () )
             {
-            // InternalOCLinEcore.g:19786:1: ( () )
-            // InternalOCLinEcore.g:19787:1: ()
+            // InternalOCLinEcore.g:19788:1: ( () )
+            // InternalOCLinEcore.g:19789:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalOCLinEcore.g:19788:1: ()
-            // InternalOCLinEcore.g:19790:1:
+            // InternalOCLinEcore.g:19790:1: ()
+            // InternalOCLinEcore.g:19792:1:
             {
             }
 
@@ -59397,14 +59397,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1"
-    // InternalOCLinEcore.g:19800:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
+    // InternalOCLinEcore.g:19802:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19804:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
-            // InternalOCLinEcore.g:19805:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
+            // InternalOCLinEcore.g:19806:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
+            // InternalOCLinEcore.g:19807:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__PrefixedPrimaryExpCS__Group_0__1__Impl();
@@ -59435,23 +59435,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:19812:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
+    // InternalOCLinEcore.g:19814:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19816:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
-            // InternalOCLinEcore.g:19817:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalOCLinEcore.g:19818:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
+            // InternalOCLinEcore.g:19819:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
             {
-            // InternalOCLinEcore.g:19817:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
-            // InternalOCLinEcore.g:19818:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalOCLinEcore.g:19819:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalOCLinEcore.g:19820:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalOCLinEcore.g:19819:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
-            // InternalOCLinEcore.g:19819:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
+            // InternalOCLinEcore.g:19821:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalOCLinEcore.g:19821:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__NameAssignment_0_1();
@@ -59486,14 +59486,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2"
-    // InternalOCLinEcore.g:19829:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
+    // InternalOCLinEcore.g:19831:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19833:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
-            // InternalOCLinEcore.g:19834:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
+            // InternalOCLinEcore.g:19835:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
+            // InternalOCLinEcore.g:19836:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__Group_0__2__Impl();
@@ -59519,23 +59519,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2__Impl"
-    // InternalOCLinEcore.g:19840:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalOCLinEcore.g:19842:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19844:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalOCLinEcore.g:19845:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLinEcore.g:19846:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalOCLinEcore.g:19847:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalOCLinEcore.g:19845:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalOCLinEcore.g:19846:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLinEcore.g:19847:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLinEcore.g:19848:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalOCLinEcore.g:19847:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
-            // InternalOCLinEcore.g:19847:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
+            // InternalOCLinEcore.g:19849:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLinEcore.g:19849:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2();
@@ -59570,14 +59570,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0"
-    // InternalOCLinEcore.g:19863:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
+    // InternalOCLinEcore.g:19865:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
     public final void rule__NameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19867:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
-            // InternalOCLinEcore.g:19868:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
+            // InternalOCLinEcore.g:19869:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
+            // InternalOCLinEcore.g:19870:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_105);
             rule__NameExpCS__Group__0__Impl();
@@ -59608,23 +59608,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:19875:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:19877:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__NameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19879:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:19880:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLinEcore.g:19881:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:19882:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:19880:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalOCLinEcore.g:19881:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLinEcore.g:19882:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLinEcore.g:19883:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalOCLinEcore.g:19882:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
-            // InternalOCLinEcore.g:19882:2: rule__NameExpCS__OwnedPathNameAssignment_0
+            // InternalOCLinEcore.g:19884:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLinEcore.g:19884:2: rule__NameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__OwnedPathNameAssignment_0();
@@ -59659,14 +59659,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1"
-    // InternalOCLinEcore.g:19892:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
+    // InternalOCLinEcore.g:19894:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
     public final void rule__NameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19896:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
-            // InternalOCLinEcore.g:19897:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
+            // InternalOCLinEcore.g:19898:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
+            // InternalOCLinEcore.g:19899:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_105);
             rule__NameExpCS__Group__1__Impl();
@@ -59697,22 +59697,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:19904:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
+    // InternalOCLinEcore.g:19906:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
     public final void rule__NameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19908:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
-            // InternalOCLinEcore.g:19909:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalOCLinEcore.g:19910:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
+            // InternalOCLinEcore.g:19911:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
             {
-            // InternalOCLinEcore.g:19909:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
-            // InternalOCLinEcore.g:19910:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalOCLinEcore.g:19911:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalOCLinEcore.g:19912:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
             }
-            // InternalOCLinEcore.g:19911:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalOCLinEcore.g:19913:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             loop204:
             do {
                 int alt204=2;
@@ -59725,7 +59725,7 @@
 
                 switch (alt204) {
             	case 1 :
-            	    // InternalOCLinEcore.g:19911:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
+            	    // InternalOCLinEcore.g:19913:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_106);
             	    rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1();
@@ -59766,14 +59766,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2"
-    // InternalOCLinEcore.g:19921:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
+    // InternalOCLinEcore.g:19923:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
     public final void rule__NameExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19925:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
-            // InternalOCLinEcore.g:19926:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
+            // InternalOCLinEcore.g:19927:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
+            // InternalOCLinEcore.g:19928:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_105);
             rule__NameExpCS__Group__2__Impl();
@@ -59804,22 +59804,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:19933:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
+    // InternalOCLinEcore.g:19935:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
     public final void rule__NameExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19937:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
-            // InternalOCLinEcore.g:19938:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalOCLinEcore.g:19939:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
+            // InternalOCLinEcore.g:19940:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
             {
-            // InternalOCLinEcore.g:19938:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
-            // InternalOCLinEcore.g:19939:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalOCLinEcore.g:19940:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalOCLinEcore.g:19941:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
             }
-            // InternalOCLinEcore.g:19940:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalOCLinEcore.g:19942:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             int alt205=2;
             int LA205_0 = input.LA(1);
 
@@ -59828,7 +59828,7 @@
             }
             switch (alt205) {
                 case 1 :
-                    // InternalOCLinEcore.g:19940:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
+                    // InternalOCLinEcore.g:19942:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2();
@@ -59866,14 +59866,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3"
-    // InternalOCLinEcore.g:19950:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
+    // InternalOCLinEcore.g:19952:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
     public final void rule__NameExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19954:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
-            // InternalOCLinEcore.g:19955:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
+            // InternalOCLinEcore.g:19956:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
+            // InternalOCLinEcore.g:19957:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_105);
             rule__NameExpCS__Group__3__Impl();
@@ -59904,22 +59904,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:19962:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
+    // InternalOCLinEcore.g:19964:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
     public final void rule__NameExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19966:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
-            // InternalOCLinEcore.g:19967:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalOCLinEcore.g:19968:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
+            // InternalOCLinEcore.g:19969:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
             {
-            // InternalOCLinEcore.g:19967:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
-            // InternalOCLinEcore.g:19968:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalOCLinEcore.g:19969:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalOCLinEcore.g:19970:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
             }
-            // InternalOCLinEcore.g:19969:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalOCLinEcore.g:19971:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             int alt206=2;
             int LA206_0 = input.LA(1);
 
@@ -59928,7 +59928,7 @@
             }
             switch (alt206) {
                 case 1 :
-                    // InternalOCLinEcore.g:19969:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
+                    // InternalOCLinEcore.g:19971:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3();
@@ -59966,14 +59966,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4"
-    // InternalOCLinEcore.g:19979:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:19981:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
     public final void rule__NameExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19983:1: ( rule__NameExpCS__Group__4__Impl )
-            // InternalOCLinEcore.g:19984:2: rule__NameExpCS__Group__4__Impl
+            // InternalOCLinEcore.g:19985:1: ( rule__NameExpCS__Group__4__Impl )
+            // InternalOCLinEcore.g:19986:2: rule__NameExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group__4__Impl();
@@ -59999,22 +59999,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4__Impl"
-    // InternalOCLinEcore.g:19990:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
+    // InternalOCLinEcore.g:19992:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
     public final void rule__NameExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:19994:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
-            // InternalOCLinEcore.g:19995:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:19996:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
+            // InternalOCLinEcore.g:19997:1: ( ( rule__NameExpCS__Group_4__0 )? )
             {
-            // InternalOCLinEcore.g:19995:1: ( ( rule__NameExpCS__Group_4__0 )? )
-            // InternalOCLinEcore.g:19996:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalOCLinEcore.g:19997:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalOCLinEcore.g:19998:1: ( rule__NameExpCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getGroup_4());
             }
-            // InternalOCLinEcore.g:19997:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalOCLinEcore.g:19999:1: ( rule__NameExpCS__Group_4__0 )?
             int alt207=2;
             int LA207_0 = input.LA(1);
 
@@ -60023,7 +60023,7 @@
             }
             switch (alt207) {
                 case 1 :
-                    // InternalOCLinEcore.g:19997:2: rule__NameExpCS__Group_4__0
+                    // InternalOCLinEcore.g:19999:2: rule__NameExpCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__Group_4__0();
@@ -60061,14 +60061,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0"
-    // InternalOCLinEcore.g:20017:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
+    // InternalOCLinEcore.g:20019:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
     public final void rule__NameExpCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20021:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
-            // InternalOCLinEcore.g:20022:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
+            // InternalOCLinEcore.g:20023:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
+            // InternalOCLinEcore.g:20024:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_107);
             rule__NameExpCS__Group_4__0__Impl();
@@ -60099,23 +60099,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0__Impl"
-    // InternalOCLinEcore.g:20029:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
+    // InternalOCLinEcore.g:20031:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
     public final void rule__NameExpCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20033:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
-            // InternalOCLinEcore.g:20034:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalOCLinEcore.g:20035:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
+            // InternalOCLinEcore.g:20036:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
             {
-            // InternalOCLinEcore.g:20034:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
-            // InternalOCLinEcore.g:20035:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalOCLinEcore.g:20036:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalOCLinEcore.g:20037:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
             }
-            // InternalOCLinEcore.g:20036:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
-            // InternalOCLinEcore.g:20036:2: rule__NameExpCS__IsPreAssignment_4_0
+            // InternalOCLinEcore.g:20038:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalOCLinEcore.g:20038:2: rule__NameExpCS__IsPreAssignment_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__IsPreAssignment_4_0();
@@ -60150,14 +60150,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1"
-    // InternalOCLinEcore.g:20046:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
+    // InternalOCLinEcore.g:20048:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
     public final void rule__NameExpCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20050:1: ( rule__NameExpCS__Group_4__1__Impl )
-            // InternalOCLinEcore.g:20051:2: rule__NameExpCS__Group_4__1__Impl
+            // InternalOCLinEcore.g:20052:1: ( rule__NameExpCS__Group_4__1__Impl )
+            // InternalOCLinEcore.g:20053:2: rule__NameExpCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group_4__1__Impl();
@@ -60183,17 +60183,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1__Impl"
-    // InternalOCLinEcore.g:20057:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
+    // InternalOCLinEcore.g:20059:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
     public final void rule__NameExpCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20061:1: ( ( 'pre' ) )
-            // InternalOCLinEcore.g:20062:1: ( 'pre' )
+            // InternalOCLinEcore.g:20063:1: ( ( 'pre' ) )
+            // InternalOCLinEcore.g:20064:1: ( 'pre' )
             {
-            // InternalOCLinEcore.g:20062:1: ( 'pre' )
-            // InternalOCLinEcore.g:20063:1: 'pre'
+            // InternalOCLinEcore.g:20064:1: ( 'pre' )
+            // InternalOCLinEcore.g:20065:1: 'pre'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
@@ -60224,14 +60224,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0"
-    // InternalOCLinEcore.g:20080:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
+    // InternalOCLinEcore.g:20082:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
     public final void rule__CurlyBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20084:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
-            // InternalOCLinEcore.g:20085:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
+            // InternalOCLinEcore.g:20086:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
+            // InternalOCLinEcore.g:20087:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CurlyBracketedClauseCS__Group__0__Impl();
@@ -60262,23 +60262,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0__Impl"
-    // InternalOCLinEcore.g:20092:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:20094:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__CurlyBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20096:1: ( ( () ) )
-            // InternalOCLinEcore.g:20097:1: ( () )
+            // InternalOCLinEcore.g:20098:1: ( ( () ) )
+            // InternalOCLinEcore.g:20099:1: ( () )
             {
-            // InternalOCLinEcore.g:20097:1: ( () )
-            // InternalOCLinEcore.g:20098:1: ()
+            // InternalOCLinEcore.g:20099:1: ( () )
+            // InternalOCLinEcore.g:20100:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
             }
-            // InternalOCLinEcore.g:20099:1: ()
-            // InternalOCLinEcore.g:20101:1:
+            // InternalOCLinEcore.g:20101:1: ()
+            // InternalOCLinEcore.g:20103:1:
             {
             }
 
@@ -60303,14 +60303,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1"
-    // InternalOCLinEcore.g:20111:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
+    // InternalOCLinEcore.g:20113:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
     public final void rule__CurlyBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20115:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
-            // InternalOCLinEcore.g:20116:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
+            // InternalOCLinEcore.g:20117:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
+            // InternalOCLinEcore.g:20118:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__CurlyBracketedClauseCS__Group__1__Impl();
@@ -60341,17 +60341,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1__Impl"
-    // InternalOCLinEcore.g:20123:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLinEcore.g:20125:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20127:1: ( ( '{' ) )
-            // InternalOCLinEcore.g:20128:1: ( '{' )
+            // InternalOCLinEcore.g:20129:1: ( ( '{' ) )
+            // InternalOCLinEcore.g:20130:1: ( '{' )
             {
-            // InternalOCLinEcore.g:20128:1: ( '{' )
-            // InternalOCLinEcore.g:20129:1: '{'
+            // InternalOCLinEcore.g:20130:1: ( '{' )
+            // InternalOCLinEcore.g:20131:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
@@ -60382,14 +60382,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2"
-    // InternalOCLinEcore.g:20142:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
+    // InternalOCLinEcore.g:20144:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
     public final void rule__CurlyBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20146:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
-            // InternalOCLinEcore.g:20147:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
+            // InternalOCLinEcore.g:20148:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
+            // InternalOCLinEcore.g:20149:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__CurlyBracketedClauseCS__Group__2__Impl();
@@ -60420,22 +60420,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2__Impl"
-    // InternalOCLinEcore.g:20154:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:20156:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__CurlyBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20158:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:20159:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:20160:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:20161:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:20159:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:20160:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalOCLinEcore.g:20161:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:20162:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:20161:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalOCLinEcore.g:20163:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             int alt208=2;
             int LA208_0 = input.LA(1);
 
@@ -60444,7 +60444,7 @@
             }
             switch (alt208) {
                 case 1 :
-                    // InternalOCLinEcore.g:20161:2: rule__CurlyBracketedClauseCS__Group_2__0
+                    // InternalOCLinEcore.g:20163:2: rule__CurlyBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CurlyBracketedClauseCS__Group_2__0();
@@ -60482,14 +60482,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3"
-    // InternalOCLinEcore.g:20171:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:20173:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20175:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
-            // InternalOCLinEcore.g:20176:2: rule__CurlyBracketedClauseCS__Group__3__Impl
+            // InternalOCLinEcore.g:20177:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
+            // InternalOCLinEcore.g:20178:2: rule__CurlyBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group__3__Impl();
@@ -60515,17 +60515,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3__Impl"
-    // InternalOCLinEcore.g:20182:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLinEcore.g:20184:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20186:1: ( ( '}' ) )
-            // InternalOCLinEcore.g:20187:1: ( '}' )
+            // InternalOCLinEcore.g:20188:1: ( ( '}' ) )
+            // InternalOCLinEcore.g:20189:1: ( '}' )
             {
-            // InternalOCLinEcore.g:20187:1: ( '}' )
-            // InternalOCLinEcore.g:20188:1: '}'
+            // InternalOCLinEcore.g:20189:1: ( '}' )
+            // InternalOCLinEcore.g:20190:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
@@ -60556,14 +60556,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0"
-    // InternalOCLinEcore.g:20209:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
+    // InternalOCLinEcore.g:20211:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20213:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
-            // InternalOCLinEcore.g:20214:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
+            // InternalOCLinEcore.g:20215:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
+            // InternalOCLinEcore.g:20216:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__CurlyBracketedClauseCS__Group_2__0__Impl();
@@ -60594,23 +60594,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:20221:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLinEcore.g:20223:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20225:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLinEcore.g:20226:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:20227:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLinEcore.g:20228:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLinEcore.g:20226:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLinEcore.g:20227:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:20228:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:20229:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLinEcore.g:20228:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLinEcore.g:20228:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
+            // InternalOCLinEcore.g:20230:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLinEcore.g:20230:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0();
@@ -60645,14 +60645,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1"
-    // InternalOCLinEcore.g:20238:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:20240:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20242:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:20243:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:20244:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:20245:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2__1__Impl();
@@ -60678,22 +60678,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:20249:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
+    // InternalOCLinEcore.g:20251:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20253:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
-            // InternalOCLinEcore.g:20254:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:20255:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
+            // InternalOCLinEcore.g:20256:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
             {
-            // InternalOCLinEcore.g:20254:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
-            // InternalOCLinEcore.g:20255:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:20256:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalOCLinEcore.g:20257:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_1());
             }
-            // InternalOCLinEcore.g:20256:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalOCLinEcore.g:20258:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             loop209:
             do {
                 int alt209=2;
@@ -60706,7 +60706,7 @@
 
                 switch (alt209) {
             	case 1 :
-            	    // InternalOCLinEcore.g:20256:2: rule__CurlyBracketedClauseCS__Group_2_1__0
+            	    // InternalOCLinEcore.g:20258:2: rule__CurlyBracketedClauseCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__CurlyBracketedClauseCS__Group_2_1__0();
@@ -60747,14 +60747,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0"
-    // InternalOCLinEcore.g:20270:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:20272:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20274:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:20275:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
+            // InternalOCLinEcore.g:20276:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:20277:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__CurlyBracketedClauseCS__Group_2_1__0__Impl();
@@ -60785,17 +60785,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:20282:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:20284:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20286:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:20287:1: ( ',' )
+            // InternalOCLinEcore.g:20288:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:20289:1: ( ',' )
             {
-            // InternalOCLinEcore.g:20287:1: ( ',' )
-            // InternalOCLinEcore.g:20288:1: ','
+            // InternalOCLinEcore.g:20289:1: ( ',' )
+            // InternalOCLinEcore.g:20290:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
@@ -60826,14 +60826,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1"
-    // InternalOCLinEcore.g:20301:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
+    // InternalOCLinEcore.g:20303:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20305:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
-            // InternalOCLinEcore.g:20306:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
+            // InternalOCLinEcore.g:20307:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
+            // InternalOCLinEcore.g:20308:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2_1__1__Impl();
@@ -60859,23 +60859,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:20312:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:20314:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20316:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLinEcore.g:20317:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:20318:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLinEcore.g:20319:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:20317:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLinEcore.g:20318:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:20319:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:20320:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLinEcore.g:20319:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLinEcore.g:20319:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLinEcore.g:20321:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLinEcore.g:20321:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1();
@@ -60910,14 +60910,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0"
-    // InternalOCLinEcore.g:20333:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
+    // InternalOCLinEcore.g:20335:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
     public final void rule__RoundBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20337:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
-            // InternalOCLinEcore.g:20338:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
+            // InternalOCLinEcore.g:20339:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
+            // InternalOCLinEcore.g:20340:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__RoundBracketedClauseCS__Group__0__Impl();
@@ -60948,23 +60948,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0__Impl"
-    // InternalOCLinEcore.g:20345:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:20347:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__RoundBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20349:1: ( ( () ) )
-            // InternalOCLinEcore.g:20350:1: ( () )
+            // InternalOCLinEcore.g:20351:1: ( ( () ) )
+            // InternalOCLinEcore.g:20352:1: ( () )
             {
-            // InternalOCLinEcore.g:20350:1: ( () )
-            // InternalOCLinEcore.g:20351:1: ()
+            // InternalOCLinEcore.g:20352:1: ( () )
+            // InternalOCLinEcore.g:20353:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
             }
-            // InternalOCLinEcore.g:20352:1: ()
-            // InternalOCLinEcore.g:20354:1:
+            // InternalOCLinEcore.g:20354:1: ()
+            // InternalOCLinEcore.g:20356:1:
             {
             }
 
@@ -60989,14 +60989,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1"
-    // InternalOCLinEcore.g:20364:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
+    // InternalOCLinEcore.g:20366:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
     public final void rule__RoundBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20368:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
-            // InternalOCLinEcore.g:20369:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
+            // InternalOCLinEcore.g:20370:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
+            // InternalOCLinEcore.g:20371:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_108);
             rule__RoundBracketedClauseCS__Group__1__Impl();
@@ -61027,17 +61027,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1__Impl"
-    // InternalOCLinEcore.g:20376:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:20378:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
     public final void rule__RoundBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20380:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:20381:1: ( '(' )
+            // InternalOCLinEcore.g:20382:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:20383:1: ( '(' )
             {
-            // InternalOCLinEcore.g:20381:1: ( '(' )
-            // InternalOCLinEcore.g:20382:1: '('
+            // InternalOCLinEcore.g:20383:1: ( '(' )
+            // InternalOCLinEcore.g:20384:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
@@ -61068,14 +61068,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2"
-    // InternalOCLinEcore.g:20395:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
+    // InternalOCLinEcore.g:20397:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
     public final void rule__RoundBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20399:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
-            // InternalOCLinEcore.g:20400:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
+            // InternalOCLinEcore.g:20401:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
+            // InternalOCLinEcore.g:20402:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_108);
             rule__RoundBracketedClauseCS__Group__2__Impl();
@@ -61106,22 +61106,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2__Impl"
-    // InternalOCLinEcore.g:20407:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:20409:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__RoundBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20411:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:20412:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:20413:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:20414:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:20412:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:20413:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalOCLinEcore.g:20414:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:20415:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:20414:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalOCLinEcore.g:20416:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             int alt210=2;
             int LA210_0 = input.LA(1);
 
@@ -61130,7 +61130,7 @@
             }
             switch (alt210) {
                 case 1 :
-                    // InternalOCLinEcore.g:20414:2: rule__RoundBracketedClauseCS__Group_2__0
+                    // InternalOCLinEcore.g:20416:2: rule__RoundBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__RoundBracketedClauseCS__Group_2__0();
@@ -61168,14 +61168,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3"
-    // InternalOCLinEcore.g:20424:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:20426:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
     public final void rule__RoundBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20428:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
-            // InternalOCLinEcore.g:20429:2: rule__RoundBracketedClauseCS__Group__3__Impl
+            // InternalOCLinEcore.g:20430:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
+            // InternalOCLinEcore.g:20431:2: rule__RoundBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group__3__Impl();
@@ -61201,17 +61201,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3__Impl"
-    // InternalOCLinEcore.g:20435:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:20437:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
     public final void rule__RoundBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20439:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:20440:1: ( ')' )
+            // InternalOCLinEcore.g:20441:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:20442:1: ( ')' )
             {
-            // InternalOCLinEcore.g:20440:1: ( ')' )
-            // InternalOCLinEcore.g:20441:1: ')'
+            // InternalOCLinEcore.g:20442:1: ( ')' )
+            // InternalOCLinEcore.g:20443:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
@@ -61242,14 +61242,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0"
-    // InternalOCLinEcore.g:20462:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
+    // InternalOCLinEcore.g:20464:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
     public final void rule__RoundBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20466:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
-            // InternalOCLinEcore.g:20467:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
+            // InternalOCLinEcore.g:20468:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
+            // InternalOCLinEcore.g:20469:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_109);
             rule__RoundBracketedClauseCS__Group_2__0__Impl();
@@ -61280,23 +61280,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:20474:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
+    // InternalOCLinEcore.g:20476:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20478:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
-            // InternalOCLinEcore.g:20479:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:20480:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
+            // InternalOCLinEcore.g:20481:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
             {
-            // InternalOCLinEcore.g:20479:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
-            // InternalOCLinEcore.g:20480:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalOCLinEcore.g:20481:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalOCLinEcore.g:20482:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
             }
-            // InternalOCLinEcore.g:20481:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
-            // InternalOCLinEcore.g:20481:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
+            // InternalOCLinEcore.g:20483:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalOCLinEcore.g:20483:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0();
@@ -61331,14 +61331,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1"
-    // InternalOCLinEcore.g:20491:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:20493:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__RoundBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20495:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:20496:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:20497:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:20498:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group_2__1__Impl();
@@ -61364,22 +61364,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:20502:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
+    // InternalOCLinEcore.g:20504:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20506:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
-            // InternalOCLinEcore.g:20507:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalOCLinEcore.g:20508:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
+            // InternalOCLinEcore.g:20509:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
             {
-            // InternalOCLinEcore.g:20507:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
-            // InternalOCLinEcore.g:20508:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalOCLinEcore.g:20509:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalOCLinEcore.g:20510:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
             }
-            // InternalOCLinEcore.g:20509:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalOCLinEcore.g:20511:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             loop211:
             do {
                 int alt211=2;
@@ -61392,7 +61392,7 @@
 
                 switch (alt211) {
             	case 1 :
-            	    // InternalOCLinEcore.g:20509:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
+            	    // InternalOCLinEcore.g:20511:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_110);
             	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1();
@@ -61433,14 +61433,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0"
-    // InternalOCLinEcore.g:20523:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
+    // InternalOCLinEcore.g:20525:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
     public final void rule__SquareBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20527:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
-            // InternalOCLinEcore.g:20528:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
+            // InternalOCLinEcore.g:20529:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
+            // InternalOCLinEcore.g:20530:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__SquareBracketedClauseCS__Group__0__Impl();
@@ -61471,17 +61471,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0__Impl"
-    // InternalOCLinEcore.g:20535:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
+    // InternalOCLinEcore.g:20537:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
     public final void rule__SquareBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20539:1: ( ( '[' ) )
-            // InternalOCLinEcore.g:20540:1: ( '[' )
+            // InternalOCLinEcore.g:20541:1: ( ( '[' ) )
+            // InternalOCLinEcore.g:20542:1: ( '[' )
             {
-            // InternalOCLinEcore.g:20540:1: ( '[' )
-            // InternalOCLinEcore.g:20541:1: '['
+            // InternalOCLinEcore.g:20542:1: ( '[' )
+            // InternalOCLinEcore.g:20543:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
@@ -61512,14 +61512,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1"
-    // InternalOCLinEcore.g:20554:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
+    // InternalOCLinEcore.g:20556:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
     public final void rule__SquareBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20558:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
-            // InternalOCLinEcore.g:20559:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
+            // InternalOCLinEcore.g:20560:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
+            // InternalOCLinEcore.g:20561:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_111);
             rule__SquareBracketedClauseCS__Group__1__Impl();
@@ -61550,23 +61550,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1__Impl"
-    // InternalOCLinEcore.g:20566:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:20568:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20570:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
-            // InternalOCLinEcore.g:20571:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalOCLinEcore.g:20572:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
+            // InternalOCLinEcore.g:20573:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:20571:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
-            // InternalOCLinEcore.g:20572:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalOCLinEcore.g:20573:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalOCLinEcore.g:20574:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
             }
-            // InternalOCLinEcore.g:20573:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
-            // InternalOCLinEcore.g:20573:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
+            // InternalOCLinEcore.g:20575:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalOCLinEcore.g:20575:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_1();
@@ -61601,14 +61601,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2"
-    // InternalOCLinEcore.g:20583:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
+    // InternalOCLinEcore.g:20585:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
     public final void rule__SquareBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20587:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
-            // InternalOCLinEcore.g:20588:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
+            // InternalOCLinEcore.g:20589:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
+            // InternalOCLinEcore.g:20590:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_111);
             rule__SquareBracketedClauseCS__Group__2__Impl();
@@ -61639,22 +61639,22 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2__Impl"
-    // InternalOCLinEcore.g:20595:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
+    // InternalOCLinEcore.g:20597:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
     public final void rule__SquareBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20599:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
-            // InternalOCLinEcore.g:20600:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalOCLinEcore.g:20601:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
+            // InternalOCLinEcore.g:20602:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
             {
-            // InternalOCLinEcore.g:20600:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
-            // InternalOCLinEcore.g:20601:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalOCLinEcore.g:20602:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalOCLinEcore.g:20603:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:20602:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalOCLinEcore.g:20604:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             loop212:
             do {
                 int alt212=2;
@@ -61667,7 +61667,7 @@
 
                 switch (alt212) {
             	case 1 :
-            	    // InternalOCLinEcore.g:20602:2: rule__SquareBracketedClauseCS__Group_2__0
+            	    // InternalOCLinEcore.g:20604:2: rule__SquareBracketedClauseCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__SquareBracketedClauseCS__Group_2__0();
@@ -61708,14 +61708,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3"
-    // InternalOCLinEcore.g:20612:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:20614:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
     public final void rule__SquareBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20616:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
-            // InternalOCLinEcore.g:20617:2: rule__SquareBracketedClauseCS__Group__3__Impl
+            // InternalOCLinEcore.g:20618:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
+            // InternalOCLinEcore.g:20619:2: rule__SquareBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group__3__Impl();
@@ -61741,17 +61741,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3__Impl"
-    // InternalOCLinEcore.g:20623:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
+    // InternalOCLinEcore.g:20625:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
     public final void rule__SquareBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20627:1: ( ( ']' ) )
-            // InternalOCLinEcore.g:20628:1: ( ']' )
+            // InternalOCLinEcore.g:20629:1: ( ( ']' ) )
+            // InternalOCLinEcore.g:20630:1: ( ']' )
             {
-            // InternalOCLinEcore.g:20628:1: ( ']' )
-            // InternalOCLinEcore.g:20629:1: ']'
+            // InternalOCLinEcore.g:20630:1: ( ']' )
+            // InternalOCLinEcore.g:20631:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
@@ -61782,14 +61782,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0"
-    // InternalOCLinEcore.g:20650:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
+    // InternalOCLinEcore.g:20652:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
     public final void rule__SquareBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20654:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
-            // InternalOCLinEcore.g:20655:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
+            // InternalOCLinEcore.g:20656:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
+            // InternalOCLinEcore.g:20657:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__SquareBracketedClauseCS__Group_2__0__Impl();
@@ -61820,17 +61820,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:20662:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:20664:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20666:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:20667:1: ( ',' )
+            // InternalOCLinEcore.g:20668:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:20669:1: ( ',' )
             {
-            // InternalOCLinEcore.g:20667:1: ( ',' )
-            // InternalOCLinEcore.g:20668:1: ','
+            // InternalOCLinEcore.g:20669:1: ( ',' )
+            // InternalOCLinEcore.g:20670:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
@@ -61861,14 +61861,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1"
-    // InternalOCLinEcore.g:20681:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:20683:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__SquareBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20685:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:20686:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:20687:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:20688:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group_2__1__Impl();
@@ -61894,23 +61894,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:20692:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:20694:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20696:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:20697:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalOCLinEcore.g:20698:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:20699:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:20697:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
-            // InternalOCLinEcore.g:20698:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalOCLinEcore.g:20699:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalOCLinEcore.g:20700:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
             }
-            // InternalOCLinEcore.g:20699:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
-            // InternalOCLinEcore.g:20699:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
+            // InternalOCLinEcore.g:20701:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalOCLinEcore.g:20701:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1();
@@ -61945,14 +61945,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0"
-    // InternalOCLinEcore.g:20713:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
+    // InternalOCLinEcore.g:20715:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
     public final void rule__NavigatingArgCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20717:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
-            // InternalOCLinEcore.g:20718:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
+            // InternalOCLinEcore.g:20719:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
+            // InternalOCLinEcore.g:20720:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_112);
             rule__NavigatingArgCS__Group_0__0__Impl();
@@ -61983,23 +61983,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0__Impl"
-    // InternalOCLinEcore.g:20725:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
+    // InternalOCLinEcore.g:20727:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
     public final void rule__NavigatingArgCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20729:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
-            // InternalOCLinEcore.g:20730:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalOCLinEcore.g:20731:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
+            // InternalOCLinEcore.g:20732:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
             {
-            // InternalOCLinEcore.g:20730:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
-            // InternalOCLinEcore.g:20731:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalOCLinEcore.g:20732:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalOCLinEcore.g:20733:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
             }
-            // InternalOCLinEcore.g:20732:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
-            // InternalOCLinEcore.g:20732:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
+            // InternalOCLinEcore.g:20734:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalOCLinEcore.g:20734:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0();
@@ -62034,14 +62034,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1"
-    // InternalOCLinEcore.g:20742:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
+    // InternalOCLinEcore.g:20744:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20746:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
-            // InternalOCLinEcore.g:20747:2: rule__NavigatingArgCS__Group_0__1__Impl
+            // InternalOCLinEcore.g:20748:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
+            // InternalOCLinEcore.g:20749:2: rule__NavigatingArgCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0__1__Impl();
@@ -62067,22 +62067,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1__Impl"
-    // InternalOCLinEcore.g:20753:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
+    // InternalOCLinEcore.g:20755:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
     public final void rule__NavigatingArgCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20757:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
-            // InternalOCLinEcore.g:20758:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalOCLinEcore.g:20759:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
+            // InternalOCLinEcore.g:20760:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
             {
-            // InternalOCLinEcore.g:20758:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
-            // InternalOCLinEcore.g:20759:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalOCLinEcore.g:20760:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalOCLinEcore.g:20761:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
             }
-            // InternalOCLinEcore.g:20760:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalOCLinEcore.g:20762:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             int alt213=2;
             int LA213_0 = input.LA(1);
 
@@ -62091,7 +62091,7 @@
             }
             switch (alt213) {
                 case 1 :
-                    // InternalOCLinEcore.g:20760:2: rule__NavigatingArgCS__Alternatives_0_1
+                    // InternalOCLinEcore.g:20762:2: rule__NavigatingArgCS__Alternatives_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Alternatives_0_1();
@@ -62129,14 +62129,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0"
-    // InternalOCLinEcore.g:20774:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
+    // InternalOCLinEcore.g:20776:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20778:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
-            // InternalOCLinEcore.g:20779:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
+            // InternalOCLinEcore.g:20780:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
+            // InternalOCLinEcore.g:20781:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__NavigatingArgCS__Group_0_1_0__0__Impl();
@@ -62167,17 +62167,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0__Impl"
-    // InternalOCLinEcore.g:20786:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:20788:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20790:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:20791:1: ( '<-' )
+            // InternalOCLinEcore.g:20792:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:20793:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:20791:1: ( '<-' )
-            // InternalOCLinEcore.g:20792:1: '<-'
+            // InternalOCLinEcore.g:20793:1: ( '<-' )
+            // InternalOCLinEcore.g:20794:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
@@ -62208,14 +62208,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1"
-    // InternalOCLinEcore.g:20805:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
+    // InternalOCLinEcore.g:20807:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20809:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
-            // InternalOCLinEcore.g:20810:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
+            // InternalOCLinEcore.g:20811:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
+            // InternalOCLinEcore.g:20812:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__NavigatingArgCS__Group_0_1_0__1__Impl();
@@ -62246,23 +62246,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1__Impl"
-    // InternalOCLinEcore.g:20817:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
+    // InternalOCLinEcore.g:20819:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20821:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
-            // InternalOCLinEcore.g:20822:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalOCLinEcore.g:20823:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
+            // InternalOCLinEcore.g:20824:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
             {
-            // InternalOCLinEcore.g:20822:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
-            // InternalOCLinEcore.g:20823:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalOCLinEcore.g:20824:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalOCLinEcore.g:20825:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_0_1());
             }
-            // InternalOCLinEcore.g:20824:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
-            // InternalOCLinEcore.g:20824:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
+            // InternalOCLinEcore.g:20826:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalOCLinEcore.g:20826:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1();
@@ -62297,14 +62297,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2"
-    // InternalOCLinEcore.g:20834:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
+    // InternalOCLinEcore.g:20836:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20838:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
-            // InternalOCLinEcore.g:20839:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
+            // InternalOCLinEcore.g:20840:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
+            // InternalOCLinEcore.g:20841:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0__2__Impl();
@@ -62330,22 +62330,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2__Impl"
-    // InternalOCLinEcore.g:20845:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
+    // InternalOCLinEcore.g:20847:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20849:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
-            // InternalOCLinEcore.g:20850:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalOCLinEcore.g:20851:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
+            // InternalOCLinEcore.g:20852:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
             {
-            // InternalOCLinEcore.g:20850:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
-            // InternalOCLinEcore.g:20851:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalOCLinEcore.g:20852:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalOCLinEcore.g:20853:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
             }
-            // InternalOCLinEcore.g:20852:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalOCLinEcore.g:20854:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             int alt214=2;
             int LA214_0 = input.LA(1);
 
@@ -62354,7 +62354,7 @@
             }
             switch (alt214) {
                 case 1 :
-                    // InternalOCLinEcore.g:20852:2: rule__NavigatingArgCS__Group_0_1_0_2__0
+                    // InternalOCLinEcore.g:20854:2: rule__NavigatingArgCS__Group_0_1_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0_2__0();
@@ -62392,14 +62392,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0"
-    // InternalOCLinEcore.g:20868:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
+    // InternalOCLinEcore.g:20870:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20872:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
-            // InternalOCLinEcore.g:20873:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
+            // InternalOCLinEcore.g:20874:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
+            // InternalOCLinEcore.g:20875:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingArgCS__Group_0_1_0_2__0__Impl();
@@ -62430,17 +62430,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0__Impl"
-    // InternalOCLinEcore.g:20880:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:20882:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20884:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:20885:1: ( '=' )
+            // InternalOCLinEcore.g:20886:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:20887:1: ( '=' )
             {
-            // InternalOCLinEcore.g:20885:1: ( '=' )
-            // InternalOCLinEcore.g:20886:1: '='
+            // InternalOCLinEcore.g:20887:1: ( '=' )
+            // InternalOCLinEcore.g:20888:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
@@ -62471,14 +62471,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1"
-    // InternalOCLinEcore.g:20899:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
+    // InternalOCLinEcore.g:20901:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20903:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
-            // InternalOCLinEcore.g:20904:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
+            // InternalOCLinEcore.g:20905:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
+            // InternalOCLinEcore.g:20906:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0_2__1__Impl();
@@ -62504,23 +62504,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1__Impl"
-    // InternalOCLinEcore.g:20910:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
+    // InternalOCLinEcore.g:20912:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20914:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
-            // InternalOCLinEcore.g:20915:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalOCLinEcore.g:20916:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
+            // InternalOCLinEcore.g:20917:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
             {
-            // InternalOCLinEcore.g:20915:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
-            // InternalOCLinEcore.g:20916:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalOCLinEcore.g:20917:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalOCLinEcore.g:20918:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
             }
-            // InternalOCLinEcore.g:20917:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
-            // InternalOCLinEcore.g:20917:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
+            // InternalOCLinEcore.g:20919:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalOCLinEcore.g:20919:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1();
@@ -62555,14 +62555,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0"
-    // InternalOCLinEcore.g:20931:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
+    // InternalOCLinEcore.g:20933:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20935:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
-            // InternalOCLinEcore.g:20936:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
+            // InternalOCLinEcore.g:20937:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
+            // InternalOCLinEcore.g:20938:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingArgCS__Group_0_1_1__0__Impl();
@@ -62593,17 +62593,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0__Impl"
-    // InternalOCLinEcore.g:20943:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:20945:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20947:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:20948:1: ( ':' )
+            // InternalOCLinEcore.g:20949:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:20950:1: ( ':' )
             {
-            // InternalOCLinEcore.g:20948:1: ( ':' )
-            // InternalOCLinEcore.g:20949:1: ':'
+            // InternalOCLinEcore.g:20950:1: ( ':' )
+            // InternalOCLinEcore.g:20951:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
@@ -62634,14 +62634,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1"
-    // InternalOCLinEcore.g:20962:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
+    // InternalOCLinEcore.g:20964:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20966:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
-            // InternalOCLinEcore.g:20967:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
+            // InternalOCLinEcore.g:20968:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
+            // InternalOCLinEcore.g:20969:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_113);
             rule__NavigatingArgCS__Group_0_1_1__1__Impl();
@@ -62672,23 +62672,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1__Impl"
-    // InternalOCLinEcore.g:20974:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
+    // InternalOCLinEcore.g:20976:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20978:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
-            // InternalOCLinEcore.g:20979:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalOCLinEcore.g:20980:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
+            // InternalOCLinEcore.g:20981:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
             {
-            // InternalOCLinEcore.g:20979:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
-            // InternalOCLinEcore.g:20980:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalOCLinEcore.g:20981:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalOCLinEcore.g:20982:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_1_1());
             }
-            // InternalOCLinEcore.g:20981:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
-            // InternalOCLinEcore.g:20981:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
+            // InternalOCLinEcore.g:20983:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalOCLinEcore.g:20983:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1();
@@ -62723,14 +62723,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2"
-    // InternalOCLinEcore.g:20991:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
+    // InternalOCLinEcore.g:20993:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:20995:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
-            // InternalOCLinEcore.g:20996:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
+            // InternalOCLinEcore.g:20997:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
+            // InternalOCLinEcore.g:20998:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
             {
             pushFollow(FollowSets000.FOLLOW_113);
             rule__NavigatingArgCS__Group_0_1_1__2__Impl();
@@ -62761,22 +62761,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2__Impl"
-    // InternalOCLinEcore.g:21003:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
+    // InternalOCLinEcore.g:21005:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21007:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
-            // InternalOCLinEcore.g:21008:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalOCLinEcore.g:21009:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
+            // InternalOCLinEcore.g:21010:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
             {
-            // InternalOCLinEcore.g:21008:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
-            // InternalOCLinEcore.g:21009:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalOCLinEcore.g:21010:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalOCLinEcore.g:21011:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_2());
             }
-            // InternalOCLinEcore.g:21010:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalOCLinEcore.g:21012:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             int alt215=2;
             int LA215_0 = input.LA(1);
 
@@ -62785,7 +62785,7 @@
             }
             switch (alt215) {
                 case 1 :
-                    // InternalOCLinEcore.g:21010:2: rule__NavigatingArgCS__Group_0_1_1_2__0
+                    // InternalOCLinEcore.g:21012:2: rule__NavigatingArgCS__Group_0_1_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_2__0();
@@ -62823,14 +62823,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3"
-    // InternalOCLinEcore.g:21020:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
+    // InternalOCLinEcore.g:21022:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21024:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
-            // InternalOCLinEcore.g:21025:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
+            // InternalOCLinEcore.g:21026:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
+            // InternalOCLinEcore.g:21027:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1__3__Impl();
@@ -62856,22 +62856,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3__Impl"
-    // InternalOCLinEcore.g:21031:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
+    // InternalOCLinEcore.g:21033:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21035:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
-            // InternalOCLinEcore.g:21036:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalOCLinEcore.g:21037:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
+            // InternalOCLinEcore.g:21038:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
             {
-            // InternalOCLinEcore.g:21036:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
-            // InternalOCLinEcore.g:21037:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalOCLinEcore.g:21038:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalOCLinEcore.g:21039:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_3());
             }
-            // InternalOCLinEcore.g:21038:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalOCLinEcore.g:21040:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             int alt216=2;
             int LA216_0 = input.LA(1);
 
@@ -62880,7 +62880,7 @@
             }
             switch (alt216) {
                 case 1 :
-                    // InternalOCLinEcore.g:21038:2: rule__NavigatingArgCS__Group_0_1_1_3__0
+                    // InternalOCLinEcore.g:21040:2: rule__NavigatingArgCS__Group_0_1_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_3__0();
@@ -62918,14 +62918,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0"
-    // InternalOCLinEcore.g:21056:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
+    // InternalOCLinEcore.g:21058:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21060:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
-            // InternalOCLinEcore.g:21061:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
+            // InternalOCLinEcore.g:21062:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
+            // InternalOCLinEcore.g:21063:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__NavigatingArgCS__Group_0_1_1_2__0__Impl();
@@ -62956,17 +62956,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0__Impl"
-    // InternalOCLinEcore.g:21068:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:21070:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21072:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:21073:1: ( '<-' )
+            // InternalOCLinEcore.g:21074:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:21075:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:21073:1: ( '<-' )
-            // InternalOCLinEcore.g:21074:1: '<-'
+            // InternalOCLinEcore.g:21075:1: ( '<-' )
+            // InternalOCLinEcore.g:21076:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
@@ -62997,14 +62997,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1"
-    // InternalOCLinEcore.g:21087:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
+    // InternalOCLinEcore.g:21089:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21091:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
-            // InternalOCLinEcore.g:21092:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
+            // InternalOCLinEcore.g:21093:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
+            // InternalOCLinEcore.g:21094:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_2__1__Impl();
@@ -63030,23 +63030,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1__Impl"
-    // InternalOCLinEcore.g:21098:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
+    // InternalOCLinEcore.g:21100:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21102:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
-            // InternalOCLinEcore.g:21103:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalOCLinEcore.g:21104:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
+            // InternalOCLinEcore.g:21105:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
             {
-            // InternalOCLinEcore.g:21103:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
-            // InternalOCLinEcore.g:21104:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalOCLinEcore.g:21105:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalOCLinEcore.g:21106:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_1_2_1());
             }
-            // InternalOCLinEcore.g:21105:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
-            // InternalOCLinEcore.g:21105:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
+            // InternalOCLinEcore.g:21107:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalOCLinEcore.g:21107:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1();
@@ -63081,14 +63081,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0"
-    // InternalOCLinEcore.g:21119:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
+    // InternalOCLinEcore.g:21121:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21123:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
-            // InternalOCLinEcore.g:21124:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
+            // InternalOCLinEcore.g:21125:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
+            // InternalOCLinEcore.g:21126:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingArgCS__Group_0_1_1_3__0__Impl();
@@ -63119,17 +63119,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0__Impl"
-    // InternalOCLinEcore.g:21131:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:21133:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21135:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:21136:1: ( '=' )
+            // InternalOCLinEcore.g:21137:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:21138:1: ( '=' )
             {
-            // InternalOCLinEcore.g:21136:1: ( '=' )
-            // InternalOCLinEcore.g:21137:1: '='
+            // InternalOCLinEcore.g:21138:1: ( '=' )
+            // InternalOCLinEcore.g:21139:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());
@@ -63160,14 +63160,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1"
-    // InternalOCLinEcore.g:21150:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
+    // InternalOCLinEcore.g:21152:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21154:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
-            // InternalOCLinEcore.g:21155:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
+            // InternalOCLinEcore.g:21156:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
+            // InternalOCLinEcore.g:21157:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_3__1__Impl();
@@ -63193,23 +63193,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1__Impl"
-    // InternalOCLinEcore.g:21161:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
+    // InternalOCLinEcore.g:21163:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21165:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
-            // InternalOCLinEcore.g:21166:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalOCLinEcore.g:21167:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
+            // InternalOCLinEcore.g:21168:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
             {
-            // InternalOCLinEcore.g:21166:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
-            // InternalOCLinEcore.g:21167:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalOCLinEcore.g:21168:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalOCLinEcore.g:21169:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_3_1());
             }
-            // InternalOCLinEcore.g:21168:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
-            // InternalOCLinEcore.g:21168:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
+            // InternalOCLinEcore.g:21170:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalOCLinEcore.g:21170:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1();
@@ -63244,14 +63244,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0"
-    // InternalOCLinEcore.g:21182:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
+    // InternalOCLinEcore.g:21184:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21186:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
-            // InternalOCLinEcore.g:21187:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
+            // InternalOCLinEcore.g:21188:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
+            // InternalOCLinEcore.g:21189:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_112);
             rule__NavigatingArgCS__Group_0_1_2__0__Impl();
@@ -63282,22 +63282,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0__Impl"
-    // InternalOCLinEcore.g:21194:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
+    // InternalOCLinEcore.g:21196:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21198:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
-            // InternalOCLinEcore.g:21199:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalOCLinEcore.g:21200:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
+            // InternalOCLinEcore.g:21201:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
             {
-            // InternalOCLinEcore.g:21199:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
-            // InternalOCLinEcore.g:21200:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalOCLinEcore.g:21201:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalOCLinEcore.g:21202:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_0());
             }
-            // InternalOCLinEcore.g:21201:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalOCLinEcore.g:21203:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             int alt217=2;
             int LA217_0 = input.LA(1);
 
@@ -63306,7 +63306,7 @@
             }
             switch (alt217) {
                 case 1 :
-                    // InternalOCLinEcore.g:21201:2: rule__NavigatingArgCS__Group_0_1_2_0__0
+                    // InternalOCLinEcore.g:21203:2: rule__NavigatingArgCS__Group_0_1_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_0__0();
@@ -63344,14 +63344,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1"
-    // InternalOCLinEcore.g:21211:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
+    // InternalOCLinEcore.g:21213:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21215:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
-            // InternalOCLinEcore.g:21216:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
+            // InternalOCLinEcore.g:21217:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
+            // InternalOCLinEcore.g:21218:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
             {
             pushFollow(FollowSets000.FOLLOW_112);
             rule__NavigatingArgCS__Group_0_1_2__1__Impl();
@@ -63382,22 +63382,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1__Impl"
-    // InternalOCLinEcore.g:21223:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
+    // InternalOCLinEcore.g:21225:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21227:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
-            // InternalOCLinEcore.g:21228:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalOCLinEcore.g:21229:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
+            // InternalOCLinEcore.g:21230:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
             {
-            // InternalOCLinEcore.g:21228:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
-            // InternalOCLinEcore.g:21229:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalOCLinEcore.g:21230:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalOCLinEcore.g:21231:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_1());
             }
-            // InternalOCLinEcore.g:21230:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalOCLinEcore.g:21232:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             int alt218=2;
             int LA218_0 = input.LA(1);
 
@@ -63406,7 +63406,7 @@
             }
             switch (alt218) {
                 case 1 :
-                    // InternalOCLinEcore.g:21230:2: rule__NavigatingArgCS__Group_0_1_2_1__0
+                    // InternalOCLinEcore.g:21232:2: rule__NavigatingArgCS__Group_0_1_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_1__0();
@@ -63444,14 +63444,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2"
-    // InternalOCLinEcore.g:21240:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
+    // InternalOCLinEcore.g:21242:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21244:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
-            // InternalOCLinEcore.g:21245:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
+            // InternalOCLinEcore.g:21246:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
+            // InternalOCLinEcore.g:21247:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingArgCS__Group_0_1_2__2__Impl();
@@ -63482,17 +63482,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2__Impl"
-    // InternalOCLinEcore.g:21252:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
+    // InternalOCLinEcore.g:21254:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21256:1: ( ( 'in' ) )
-            // InternalOCLinEcore.g:21257:1: ( 'in' )
+            // InternalOCLinEcore.g:21258:1: ( ( 'in' ) )
+            // InternalOCLinEcore.g:21259:1: ( 'in' )
             {
-            // InternalOCLinEcore.g:21257:1: ( 'in' )
-            // InternalOCLinEcore.g:21258:1: 'in'
+            // InternalOCLinEcore.g:21259:1: ( 'in' )
+            // InternalOCLinEcore.g:21260:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());
@@ -63523,14 +63523,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3"
-    // InternalOCLinEcore.g:21271:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
+    // InternalOCLinEcore.g:21273:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21275:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
-            // InternalOCLinEcore.g:21276:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
+            // InternalOCLinEcore.g:21277:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
+            // InternalOCLinEcore.g:21278:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2__3__Impl();
@@ -63556,23 +63556,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3__Impl"
-    // InternalOCLinEcore.g:21282:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
+    // InternalOCLinEcore.g:21284:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21286:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
-            // InternalOCLinEcore.g:21287:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalOCLinEcore.g:21288:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
+            // InternalOCLinEcore.g:21289:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
             {
-            // InternalOCLinEcore.g:21287:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
-            // InternalOCLinEcore.g:21288:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalOCLinEcore.g:21289:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalOCLinEcore.g:21290:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_2_3());
             }
-            // InternalOCLinEcore.g:21289:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
-            // InternalOCLinEcore.g:21289:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
+            // InternalOCLinEcore.g:21291:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalOCLinEcore.g:21291:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3();
@@ -63607,14 +63607,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0"
-    // InternalOCLinEcore.g:21307:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
+    // InternalOCLinEcore.g:21309:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21311:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
-            // InternalOCLinEcore.g:21312:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
+            // InternalOCLinEcore.g:21313:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
+            // InternalOCLinEcore.g:21314:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingArgCS__Group_0_1_2_0__0__Impl();
@@ -63645,17 +63645,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0__Impl"
-    // InternalOCLinEcore.g:21319:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:21321:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21323:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:21324:1: ( ':' )
+            // InternalOCLinEcore.g:21325:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:21326:1: ( ':' )
             {
-            // InternalOCLinEcore.g:21324:1: ( ':' )
-            // InternalOCLinEcore.g:21325:1: ':'
+            // InternalOCLinEcore.g:21326:1: ( ':' )
+            // InternalOCLinEcore.g:21327:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
@@ -63686,14 +63686,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1"
-    // InternalOCLinEcore.g:21338:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
+    // InternalOCLinEcore.g:21340:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21342:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
-            // InternalOCLinEcore.g:21343:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
+            // InternalOCLinEcore.g:21344:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
+            // InternalOCLinEcore.g:21345:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_0__1__Impl();
@@ -63719,23 +63719,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1__Impl"
-    // InternalOCLinEcore.g:21349:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
+    // InternalOCLinEcore.g:21351:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21353:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
-            // InternalOCLinEcore.g:21354:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalOCLinEcore.g:21355:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
+            // InternalOCLinEcore.g:21356:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
             {
-            // InternalOCLinEcore.g:21354:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
-            // InternalOCLinEcore.g:21355:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalOCLinEcore.g:21356:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalOCLinEcore.g:21357:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_2_0_1());
             }
-            // InternalOCLinEcore.g:21356:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
-            // InternalOCLinEcore.g:21356:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
+            // InternalOCLinEcore.g:21358:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalOCLinEcore.g:21358:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1();
@@ -63770,14 +63770,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0"
-    // InternalOCLinEcore.g:21370:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
+    // InternalOCLinEcore.g:21372:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21374:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
-            // InternalOCLinEcore.g:21375:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
+            // InternalOCLinEcore.g:21376:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
+            // InternalOCLinEcore.g:21377:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__NavigatingArgCS__Group_0_1_2_1__0__Impl();
@@ -63808,17 +63808,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0__Impl"
-    // InternalOCLinEcore.g:21382:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:21384:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21386:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:21387:1: ( '<-' )
+            // InternalOCLinEcore.g:21388:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:21389:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:21387:1: ( '<-' )
-            // InternalOCLinEcore.g:21388:1: '<-'
+            // InternalOCLinEcore.g:21389:1: ( '<-' )
+            // InternalOCLinEcore.g:21390:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
@@ -63849,14 +63849,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1"
-    // InternalOCLinEcore.g:21401:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
+    // InternalOCLinEcore.g:21403:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21405:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
-            // InternalOCLinEcore.g:21406:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
+            // InternalOCLinEcore.g:21407:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
+            // InternalOCLinEcore.g:21408:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_1__1__Impl();
@@ -63882,23 +63882,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1__Impl"
-    // InternalOCLinEcore.g:21412:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:21414:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21416:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
-            // InternalOCLinEcore.g:21417:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalOCLinEcore.g:21418:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
+            // InternalOCLinEcore.g:21419:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:21417:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
-            // InternalOCLinEcore.g:21418:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalOCLinEcore.g:21419:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalOCLinEcore.g:21420:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_2_1_1());
             }
-            // InternalOCLinEcore.g:21419:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
-            // InternalOCLinEcore.g:21419:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
+            // InternalOCLinEcore.g:21421:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalOCLinEcore.g:21421:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1();
@@ -63933,14 +63933,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0"
-    // InternalOCLinEcore.g:21433:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
+    // InternalOCLinEcore.g:21435:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
     public final void rule__NavigatingArgCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21437:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
-            // InternalOCLinEcore.g:21438:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
+            // InternalOCLinEcore.g:21439:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
+            // InternalOCLinEcore.g:21440:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingArgCS__Group_1__0__Impl();
@@ -63971,17 +63971,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:21445:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:21447:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21449:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:21450:1: ( ':' )
+            // InternalOCLinEcore.g:21451:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:21452:1: ( ':' )
             {
-            // InternalOCLinEcore.g:21450:1: ( ':' )
-            // InternalOCLinEcore.g:21451:1: ':'
+            // InternalOCLinEcore.g:21452:1: ( ':' )
+            // InternalOCLinEcore.g:21453:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
@@ -64012,14 +64012,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1"
-    // InternalOCLinEcore.g:21464:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:21466:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21468:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:21469:2: rule__NavigatingArgCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:21470:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:21471:2: rule__NavigatingArgCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_1__1__Impl();
@@ -64045,23 +64045,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:21475:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:21477:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21479:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:21480:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:21481:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:21482:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:21480:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLinEcore.g:21481:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:21482:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:21483:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLinEcore.g:21482:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLinEcore.g:21482:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
+            // InternalOCLinEcore.g:21484:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:21484:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_1_1();
@@ -64096,14 +64096,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0"
-    // InternalOCLinEcore.g:21496:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
+    // InternalOCLinEcore.g:21498:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
     public final void rule__NavigatingBarArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21500:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
-            // InternalOCLinEcore.g:21501:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
+            // InternalOCLinEcore.g:21502:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
+            // InternalOCLinEcore.g:21503:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingBarArgCS__Group__0__Impl();
@@ -64134,23 +64134,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0__Impl"
-    // InternalOCLinEcore.g:21508:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:21510:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21512:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
-            // InternalOCLinEcore.g:21513:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalOCLinEcore.g:21514:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
+            // InternalOCLinEcore.g:21515:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:21513:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
-            // InternalOCLinEcore.g:21514:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalOCLinEcore.g:21515:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalOCLinEcore.g:21516:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalOCLinEcore.g:21515:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
-            // InternalOCLinEcore.g:21515:2: rule__NavigatingBarArgCS__PrefixAssignment_0
+            // InternalOCLinEcore.g:21517:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalOCLinEcore.g:21517:2: rule__NavigatingBarArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__PrefixAssignment_0();
@@ -64185,14 +64185,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1"
-    // InternalOCLinEcore.g:21525:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
+    // InternalOCLinEcore.g:21527:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
     public final void rule__NavigatingBarArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21529:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
-            // InternalOCLinEcore.g:21530:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
+            // InternalOCLinEcore.g:21531:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
+            // InternalOCLinEcore.g:21532:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__NavigatingBarArgCS__Group__1__Impl();
@@ -64223,23 +64223,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1__Impl"
-    // InternalOCLinEcore.g:21537:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:21539:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21541:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalOCLinEcore.g:21542:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:21543:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:21544:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:21542:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalOCLinEcore.g:21543:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLinEcore.g:21544:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:21545:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalOCLinEcore.g:21544:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalOCLinEcore.g:21544:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
+            // InternalOCLinEcore.g:21546:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLinEcore.g:21546:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1();
@@ -64274,14 +64274,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2"
-    // InternalOCLinEcore.g:21554:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:21556:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21558:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
-            // InternalOCLinEcore.g:21559:2: rule__NavigatingBarArgCS__Group__2__Impl
+            // InternalOCLinEcore.g:21560:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
+            // InternalOCLinEcore.g:21561:2: rule__NavigatingBarArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group__2__Impl();
@@ -64307,22 +64307,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2__Impl"
-    // InternalOCLinEcore.g:21565:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:21567:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21569:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:21570:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:21571:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:21572:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:21570:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:21571:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalOCLinEcore.g:21572:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:21573:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:21572:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalOCLinEcore.g:21574:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             int alt219=2;
             int LA219_0 = input.LA(1);
 
@@ -64331,7 +64331,7 @@
             }
             switch (alt219) {
                 case 1 :
-                    // InternalOCLinEcore.g:21572:2: rule__NavigatingBarArgCS__Group_2__0
+                    // InternalOCLinEcore.g:21574:2: rule__NavigatingBarArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2__0();
@@ -64369,14 +64369,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0"
-    // InternalOCLinEcore.g:21588:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
+    // InternalOCLinEcore.g:21590:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21592:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
-            // InternalOCLinEcore.g:21593:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
+            // InternalOCLinEcore.g:21594:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
+            // InternalOCLinEcore.g:21595:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingBarArgCS__Group_2__0__Impl();
@@ -64407,17 +64407,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:21600:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:21602:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingBarArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21604:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:21605:1: ( ':' )
+            // InternalOCLinEcore.g:21606:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:21607:1: ( ':' )
             {
-            // InternalOCLinEcore.g:21605:1: ( ':' )
-            // InternalOCLinEcore.g:21606:1: ':'
+            // InternalOCLinEcore.g:21607:1: ( ':' )
+            // InternalOCLinEcore.g:21608:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
@@ -64448,14 +64448,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1"
-    // InternalOCLinEcore.g:21619:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
+    // InternalOCLinEcore.g:21621:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
     public final void rule__NavigatingBarArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21623:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
-            // InternalOCLinEcore.g:21624:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
+            // InternalOCLinEcore.g:21625:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
+            // InternalOCLinEcore.g:21626:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__NavigatingBarArgCS__Group_2__1__Impl();
@@ -64486,23 +64486,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:21631:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:21633:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21635:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:21636:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLinEcore.g:21637:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:21638:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:21636:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalOCLinEcore.g:21637:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLinEcore.g:21638:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLinEcore.g:21639:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalOCLinEcore.g:21638:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
-            // InternalOCLinEcore.g:21638:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
+            // InternalOCLinEcore.g:21640:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLinEcore.g:21640:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1();
@@ -64537,14 +64537,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2"
-    // InternalOCLinEcore.g:21648:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
+    // InternalOCLinEcore.g:21650:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21652:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
-            // InternalOCLinEcore.g:21653:2: rule__NavigatingBarArgCS__Group_2__2__Impl
+            // InternalOCLinEcore.g:21654:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
+            // InternalOCLinEcore.g:21655:2: rule__NavigatingBarArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2__2__Impl();
@@ -64570,22 +64570,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2__Impl"
-    // InternalOCLinEcore.g:21659:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
+    // InternalOCLinEcore.g:21661:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21663:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
-            // InternalOCLinEcore.g:21664:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalOCLinEcore.g:21665:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
+            // InternalOCLinEcore.g:21666:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
             {
-            // InternalOCLinEcore.g:21664:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
-            // InternalOCLinEcore.g:21665:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalOCLinEcore.g:21666:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalOCLinEcore.g:21667:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
             }
-            // InternalOCLinEcore.g:21666:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalOCLinEcore.g:21668:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             int alt220=2;
             int LA220_0 = input.LA(1);
 
@@ -64594,7 +64594,7 @@
             }
             switch (alt220) {
                 case 1 :
-                    // InternalOCLinEcore.g:21666:2: rule__NavigatingBarArgCS__Group_2_2__0
+                    // InternalOCLinEcore.g:21668:2: rule__NavigatingBarArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2_2__0();
@@ -64632,14 +64632,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0"
-    // InternalOCLinEcore.g:21682:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
+    // InternalOCLinEcore.g:21684:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21686:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
-            // InternalOCLinEcore.g:21687:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
+            // InternalOCLinEcore.g:21688:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
+            // InternalOCLinEcore.g:21689:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingBarArgCS__Group_2_2__0__Impl();
@@ -64670,17 +64670,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0__Impl"
-    // InternalOCLinEcore.g:21694:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:21696:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21698:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:21699:1: ( '=' )
+            // InternalOCLinEcore.g:21700:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:21701:1: ( '=' )
             {
-            // InternalOCLinEcore.g:21699:1: ( '=' )
-            // InternalOCLinEcore.g:21700:1: '='
+            // InternalOCLinEcore.g:21701:1: ( '=' )
+            // InternalOCLinEcore.g:21702:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -64711,14 +64711,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1"
-    // InternalOCLinEcore.g:21713:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
+    // InternalOCLinEcore.g:21715:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21717:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
-            // InternalOCLinEcore.g:21718:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
+            // InternalOCLinEcore.g:21719:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
+            // InternalOCLinEcore.g:21720:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2_2__1__Impl();
@@ -64744,23 +64744,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1__Impl"
-    // InternalOCLinEcore.g:21724:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalOCLinEcore.g:21726:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21728:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalOCLinEcore.g:21729:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLinEcore.g:21730:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalOCLinEcore.g:21731:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalOCLinEcore.g:21729:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalOCLinEcore.g:21730:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLinEcore.g:21731:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLinEcore.g:21732:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalOCLinEcore.g:21731:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalOCLinEcore.g:21731:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalOCLinEcore.g:21733:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLinEcore.g:21733:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -64795,14 +64795,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0"
-    // InternalOCLinEcore.g:21745:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
+    // InternalOCLinEcore.g:21747:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
     public final void rule__NavigatingCommaArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21749:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
-            // InternalOCLinEcore.g:21750:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
+            // InternalOCLinEcore.g:21751:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
+            // InternalOCLinEcore.g:21752:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingCommaArgCS__Group__0__Impl();
@@ -64833,23 +64833,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0__Impl"
-    // InternalOCLinEcore.g:21757:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:21759:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21761:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
-            // InternalOCLinEcore.g:21762:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalOCLinEcore.g:21763:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
+            // InternalOCLinEcore.g:21764:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:21762:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
-            // InternalOCLinEcore.g:21763:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalOCLinEcore.g:21764:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalOCLinEcore.g:21765:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalOCLinEcore.g:21764:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
-            // InternalOCLinEcore.g:21764:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
+            // InternalOCLinEcore.g:21766:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalOCLinEcore.g:21766:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__PrefixAssignment_0();
@@ -64884,14 +64884,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1"
-    // InternalOCLinEcore.g:21774:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
+    // InternalOCLinEcore.g:21776:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
     public final void rule__NavigatingCommaArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21778:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
-            // InternalOCLinEcore.g:21779:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
+            // InternalOCLinEcore.g:21780:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
+            // InternalOCLinEcore.g:21781:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_112);
             rule__NavigatingCommaArgCS__Group__1__Impl();
@@ -64922,23 +64922,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1__Impl"
-    // InternalOCLinEcore.g:21786:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:21788:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21790:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalOCLinEcore.g:21791:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:21792:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:21793:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:21791:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalOCLinEcore.g:21792:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLinEcore.g:21793:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:21794:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalOCLinEcore.g:21793:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalOCLinEcore.g:21793:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
+            // InternalOCLinEcore.g:21795:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLinEcore.g:21795:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1();
@@ -64973,14 +64973,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2"
-    // InternalOCLinEcore.g:21803:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:21805:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21807:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
-            // InternalOCLinEcore.g:21808:2: rule__NavigatingCommaArgCS__Group__2__Impl
+            // InternalOCLinEcore.g:21809:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
+            // InternalOCLinEcore.g:21810:2: rule__NavigatingCommaArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group__2__Impl();
@@ -65006,22 +65006,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2__Impl"
-    // InternalOCLinEcore.g:21814:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
+    // InternalOCLinEcore.g:21816:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21818:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
-            // InternalOCLinEcore.g:21819:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalOCLinEcore.g:21820:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
+            // InternalOCLinEcore.g:21821:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
             {
-            // InternalOCLinEcore.g:21819:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
-            // InternalOCLinEcore.g:21820:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalOCLinEcore.g:21821:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalOCLinEcore.g:21822:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
             }
-            // InternalOCLinEcore.g:21821:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalOCLinEcore.g:21823:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             int alt221=2;
             int LA221_0 = input.LA(1);
 
@@ -65030,7 +65030,7 @@
             }
             switch (alt221) {
                 case 1 :
-                    // InternalOCLinEcore.g:21821:2: rule__NavigatingCommaArgCS__Alternatives_2
+                    // InternalOCLinEcore.g:21823:2: rule__NavigatingCommaArgCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Alternatives_2();
@@ -65068,14 +65068,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0"
-    // InternalOCLinEcore.g:21837:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
+    // InternalOCLinEcore.g:21839:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21841:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
-            // InternalOCLinEcore.g:21842:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
+            // InternalOCLinEcore.g:21843:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
+            // InternalOCLinEcore.g:21844:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__NavigatingCommaArgCS__Group_2_0__0__Impl();
@@ -65106,17 +65106,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0__Impl"
-    // InternalOCLinEcore.g:21849:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:21851:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21853:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:21854:1: ( '<-' )
+            // InternalOCLinEcore.g:21855:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:21856:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:21854:1: ( '<-' )
-            // InternalOCLinEcore.g:21855:1: '<-'
+            // InternalOCLinEcore.g:21856:1: ( '<-' )
+            // InternalOCLinEcore.g:21857:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
@@ -65147,14 +65147,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1"
-    // InternalOCLinEcore.g:21868:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
+    // InternalOCLinEcore.g:21870:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21872:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
-            // InternalOCLinEcore.g:21873:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
+            // InternalOCLinEcore.g:21874:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
+            // InternalOCLinEcore.g:21875:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__NavigatingCommaArgCS__Group_2_0__1__Impl();
@@ -65185,23 +65185,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1__Impl"
-    // InternalOCLinEcore.g:21880:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
+    // InternalOCLinEcore.g:21882:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21884:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
-            // InternalOCLinEcore.g:21885:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalOCLinEcore.g:21886:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
+            // InternalOCLinEcore.g:21887:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
             {
-            // InternalOCLinEcore.g:21885:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
-            // InternalOCLinEcore.g:21886:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalOCLinEcore.g:21887:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalOCLinEcore.g:21888:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_0_1());
             }
-            // InternalOCLinEcore.g:21887:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
-            // InternalOCLinEcore.g:21887:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
+            // InternalOCLinEcore.g:21889:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalOCLinEcore.g:21889:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1();
@@ -65236,14 +65236,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2"
-    // InternalOCLinEcore.g:21897:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
+    // InternalOCLinEcore.g:21899:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21901:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
-            // InternalOCLinEcore.g:21902:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
+            // InternalOCLinEcore.g:21903:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
+            // InternalOCLinEcore.g:21904:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0__2__Impl();
@@ -65269,22 +65269,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2__Impl"
-    // InternalOCLinEcore.g:21908:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
+    // InternalOCLinEcore.g:21910:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21912:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
-            // InternalOCLinEcore.g:21913:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalOCLinEcore.g:21914:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
+            // InternalOCLinEcore.g:21915:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
             {
-            // InternalOCLinEcore.g:21913:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
-            // InternalOCLinEcore.g:21914:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalOCLinEcore.g:21915:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalOCLinEcore.g:21916:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
             }
-            // InternalOCLinEcore.g:21915:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalOCLinEcore.g:21917:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             int alt222=2;
             int LA222_0 = input.LA(1);
 
@@ -65293,7 +65293,7 @@
             }
             switch (alt222) {
                 case 1 :
-                    // InternalOCLinEcore.g:21915:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
+                    // InternalOCLinEcore.g:21917:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0_2__0();
@@ -65331,14 +65331,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0"
-    // InternalOCLinEcore.g:21931:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
+    // InternalOCLinEcore.g:21933:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21935:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
-            // InternalOCLinEcore.g:21936:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
+            // InternalOCLinEcore.g:21937:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
+            // InternalOCLinEcore.g:21938:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl();
@@ -65369,17 +65369,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl"
-    // InternalOCLinEcore.g:21943:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:21945:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21947:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:21948:1: ( '=' )
+            // InternalOCLinEcore.g:21949:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:21950:1: ( '=' )
             {
-            // InternalOCLinEcore.g:21948:1: ( '=' )
-            // InternalOCLinEcore.g:21949:1: '='
+            // InternalOCLinEcore.g:21950:1: ( '=' )
+            // InternalOCLinEcore.g:21951:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
@@ -65410,14 +65410,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1"
-    // InternalOCLinEcore.g:21962:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
+    // InternalOCLinEcore.g:21964:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21966:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
-            // InternalOCLinEcore.g:21967:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
+            // InternalOCLinEcore.g:21968:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
+            // InternalOCLinEcore.g:21969:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl();
@@ -65443,23 +65443,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl"
-    // InternalOCLinEcore.g:21973:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
+    // InternalOCLinEcore.g:21975:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21977:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
-            // InternalOCLinEcore.g:21978:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalOCLinEcore.g:21979:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
+            // InternalOCLinEcore.g:21980:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
             {
-            // InternalOCLinEcore.g:21978:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
-            // InternalOCLinEcore.g:21979:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalOCLinEcore.g:21980:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalOCLinEcore.g:21981:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
             }
-            // InternalOCLinEcore.g:21980:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
-            // InternalOCLinEcore.g:21980:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
+            // InternalOCLinEcore.g:21982:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalOCLinEcore.g:21982:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1();
@@ -65494,14 +65494,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0"
-    // InternalOCLinEcore.g:21994:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
+    // InternalOCLinEcore.g:21996:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:21998:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
-            // InternalOCLinEcore.g:21999:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
+            // InternalOCLinEcore.g:22000:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
+            // InternalOCLinEcore.g:22001:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingCommaArgCS__Group_2_1__0__Impl();
@@ -65532,17 +65532,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0__Impl"
-    // InternalOCLinEcore.g:22006:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:22008:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22010:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:22011:1: ( ':' )
+            // InternalOCLinEcore.g:22012:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:22013:1: ( ':' )
             {
-            // InternalOCLinEcore.g:22011:1: ( ':' )
-            // InternalOCLinEcore.g:22012:1: ':'
+            // InternalOCLinEcore.g:22013:1: ( ':' )
+            // InternalOCLinEcore.g:22014:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
@@ -65573,14 +65573,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1"
-    // InternalOCLinEcore.g:22025:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
+    // InternalOCLinEcore.g:22027:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22029:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
-            // InternalOCLinEcore.g:22030:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
+            // InternalOCLinEcore.g:22031:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
+            // InternalOCLinEcore.g:22032:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
             {
             pushFollow(FollowSets000.FOLLOW_113);
             rule__NavigatingCommaArgCS__Group_2_1__1__Impl();
@@ -65611,23 +65611,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"
-    // InternalOCLinEcore.g:22037:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:22039:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22041:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
-            // InternalOCLinEcore.g:22042:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:22043:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
+            // InternalOCLinEcore.g:22044:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:22042:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
-            // InternalOCLinEcore.g:22043:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalOCLinEcore.g:22044:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalOCLinEcore.g:22045:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_1_1());
             }
-            // InternalOCLinEcore.g:22044:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
-            // InternalOCLinEcore.g:22044:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
+            // InternalOCLinEcore.g:22046:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalOCLinEcore.g:22046:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1();
@@ -65662,14 +65662,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2"
-    // InternalOCLinEcore.g:22054:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
+    // InternalOCLinEcore.g:22056:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22058:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
-            // InternalOCLinEcore.g:22059:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
+            // InternalOCLinEcore.g:22060:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
+            // InternalOCLinEcore.g:22061:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
             {
             pushFollow(FollowSets000.FOLLOW_113);
             rule__NavigatingCommaArgCS__Group_2_1__2__Impl();
@@ -65700,22 +65700,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2__Impl"
-    // InternalOCLinEcore.g:22066:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
+    // InternalOCLinEcore.g:22068:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22070:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
-            // InternalOCLinEcore.g:22071:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalOCLinEcore.g:22072:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
+            // InternalOCLinEcore.g:22073:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
             {
-            // InternalOCLinEcore.g:22071:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
-            // InternalOCLinEcore.g:22072:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalOCLinEcore.g:22073:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalOCLinEcore.g:22074:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_2());
             }
-            // InternalOCLinEcore.g:22073:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalOCLinEcore.g:22075:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             int alt223=2;
             int LA223_0 = input.LA(1);
 
@@ -65724,7 +65724,7 @@
             }
             switch (alt223) {
                 case 1 :
-                    // InternalOCLinEcore.g:22073:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
+                    // InternalOCLinEcore.g:22075:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_2__0();
@@ -65762,14 +65762,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3"
-    // InternalOCLinEcore.g:22083:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
+    // InternalOCLinEcore.g:22085:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22087:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
-            // InternalOCLinEcore.g:22088:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
+            // InternalOCLinEcore.g:22089:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
+            // InternalOCLinEcore.g:22090:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1__3__Impl();
@@ -65795,22 +65795,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3__Impl"
-    // InternalOCLinEcore.g:22094:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
+    // InternalOCLinEcore.g:22096:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22098:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
-            // InternalOCLinEcore.g:22099:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalOCLinEcore.g:22100:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
+            // InternalOCLinEcore.g:22101:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
             {
-            // InternalOCLinEcore.g:22099:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
-            // InternalOCLinEcore.g:22100:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalOCLinEcore.g:22101:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalOCLinEcore.g:22102:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_3());
             }
-            // InternalOCLinEcore.g:22101:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalOCLinEcore.g:22103:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             int alt224=2;
             int LA224_0 = input.LA(1);
 
@@ -65819,7 +65819,7 @@
             }
             switch (alt224) {
                 case 1 :
-                    // InternalOCLinEcore.g:22101:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
+                    // InternalOCLinEcore.g:22103:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_3__0();
@@ -65857,14 +65857,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0"
-    // InternalOCLinEcore.g:22119:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
+    // InternalOCLinEcore.g:22121:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22123:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
-            // InternalOCLinEcore.g:22124:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
+            // InternalOCLinEcore.g:22125:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
+            // InternalOCLinEcore.g:22126:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl();
@@ -65895,17 +65895,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl"
-    // InternalOCLinEcore.g:22131:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:22133:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22135:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:22136:1: ( '<-' )
+            // InternalOCLinEcore.g:22137:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:22138:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:22136:1: ( '<-' )
-            // InternalOCLinEcore.g:22137:1: '<-'
+            // InternalOCLinEcore.g:22138:1: ( '<-' )
+            // InternalOCLinEcore.g:22139:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
@@ -65936,14 +65936,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1"
-    // InternalOCLinEcore.g:22150:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
+    // InternalOCLinEcore.g:22152:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22154:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
-            // InternalOCLinEcore.g:22155:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
+            // InternalOCLinEcore.g:22156:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
+            // InternalOCLinEcore.g:22157:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl();
@@ -65969,23 +65969,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl"
-    // InternalOCLinEcore.g:22161:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
+    // InternalOCLinEcore.g:22163:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22165:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
-            // InternalOCLinEcore.g:22166:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalOCLinEcore.g:22167:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
+            // InternalOCLinEcore.g:22168:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
             {
-            // InternalOCLinEcore.g:22166:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
-            // InternalOCLinEcore.g:22167:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalOCLinEcore.g:22168:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalOCLinEcore.g:22169:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_1_2_1());
             }
-            // InternalOCLinEcore.g:22168:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
-            // InternalOCLinEcore.g:22168:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
+            // InternalOCLinEcore.g:22170:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalOCLinEcore.g:22170:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1();
@@ -66020,14 +66020,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0"
-    // InternalOCLinEcore.g:22182:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
+    // InternalOCLinEcore.g:22184:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22186:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
-            // InternalOCLinEcore.g:22187:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
+            // InternalOCLinEcore.g:22188:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
+            // InternalOCLinEcore.g:22189:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl();
@@ -66058,17 +66058,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl"
-    // InternalOCLinEcore.g:22194:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:22196:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22198:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:22199:1: ( '=' )
+            // InternalOCLinEcore.g:22200:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:22201:1: ( '=' )
             {
-            // InternalOCLinEcore.g:22199:1: ( '=' )
-            // InternalOCLinEcore.g:22200:1: '='
+            // InternalOCLinEcore.g:22201:1: ( '=' )
+            // InternalOCLinEcore.g:22202:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());
@@ -66099,14 +66099,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1"
-    // InternalOCLinEcore.g:22213:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
+    // InternalOCLinEcore.g:22215:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22217:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
-            // InternalOCLinEcore.g:22218:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
+            // InternalOCLinEcore.g:22219:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
+            // InternalOCLinEcore.g:22220:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl();
@@ -66132,23 +66132,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl"
-    // InternalOCLinEcore.g:22224:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
+    // InternalOCLinEcore.g:22226:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22228:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
-            // InternalOCLinEcore.g:22229:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalOCLinEcore.g:22230:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
+            // InternalOCLinEcore.g:22231:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
             {
-            // InternalOCLinEcore.g:22229:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
-            // InternalOCLinEcore.g:22230:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalOCLinEcore.g:22231:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalOCLinEcore.g:22232:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_3_1());
             }
-            // InternalOCLinEcore.g:22231:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
-            // InternalOCLinEcore.g:22231:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
+            // InternalOCLinEcore.g:22233:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalOCLinEcore.g:22233:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1();
@@ -66183,14 +66183,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0"
-    // InternalOCLinEcore.g:22245:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
+    // InternalOCLinEcore.g:22247:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22249:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
-            // InternalOCLinEcore.g:22250:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
+            // InternalOCLinEcore.g:22251:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
+            // InternalOCLinEcore.g:22252:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_112);
             rule__NavigatingCommaArgCS__Group_2_2__0__Impl();
@@ -66221,22 +66221,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0__Impl"
-    // InternalOCLinEcore.g:22257:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
+    // InternalOCLinEcore.g:22259:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22261:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
-            // InternalOCLinEcore.g:22262:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalOCLinEcore.g:22263:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
+            // InternalOCLinEcore.g:22264:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
             {
-            // InternalOCLinEcore.g:22262:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
-            // InternalOCLinEcore.g:22263:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalOCLinEcore.g:22264:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalOCLinEcore.g:22265:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_0());
             }
-            // InternalOCLinEcore.g:22264:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalOCLinEcore.g:22266:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             int alt225=2;
             int LA225_0 = input.LA(1);
 
@@ -66245,7 +66245,7 @@
             }
             switch (alt225) {
                 case 1 :
-                    // InternalOCLinEcore.g:22264:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
+                    // InternalOCLinEcore.g:22266:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_0__0();
@@ -66283,14 +66283,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1"
-    // InternalOCLinEcore.g:22274:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
+    // InternalOCLinEcore.g:22276:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22278:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
-            // InternalOCLinEcore.g:22279:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
+            // InternalOCLinEcore.g:22280:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
+            // InternalOCLinEcore.g:22281:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
             {
             pushFollow(FollowSets000.FOLLOW_112);
             rule__NavigatingCommaArgCS__Group_2_2__1__Impl();
@@ -66321,22 +66321,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1__Impl"
-    // InternalOCLinEcore.g:22286:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
+    // InternalOCLinEcore.g:22288:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22290:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
-            // InternalOCLinEcore.g:22291:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalOCLinEcore.g:22292:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
+            // InternalOCLinEcore.g:22293:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
             {
-            // InternalOCLinEcore.g:22291:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
-            // InternalOCLinEcore.g:22292:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalOCLinEcore.g:22293:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalOCLinEcore.g:22294:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_1());
             }
-            // InternalOCLinEcore.g:22293:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalOCLinEcore.g:22295:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             int alt226=2;
             int LA226_0 = input.LA(1);
 
@@ -66345,7 +66345,7 @@
             }
             switch (alt226) {
                 case 1 :
-                    // InternalOCLinEcore.g:22293:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
+                    // InternalOCLinEcore.g:22295:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_1__0();
@@ -66383,14 +66383,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2"
-    // InternalOCLinEcore.g:22303:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
+    // InternalOCLinEcore.g:22305:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22307:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
-            // InternalOCLinEcore.g:22308:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
+            // InternalOCLinEcore.g:22309:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
+            // InternalOCLinEcore.g:22310:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingCommaArgCS__Group_2_2__2__Impl();
@@ -66421,17 +66421,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2__Impl"
-    // InternalOCLinEcore.g:22315:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
+    // InternalOCLinEcore.g:22317:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22319:1: ( ( 'in' ) )
-            // InternalOCLinEcore.g:22320:1: ( 'in' )
+            // InternalOCLinEcore.g:22321:1: ( ( 'in' ) )
+            // InternalOCLinEcore.g:22322:1: ( 'in' )
             {
-            // InternalOCLinEcore.g:22320:1: ( 'in' )
-            // InternalOCLinEcore.g:22321:1: 'in'
+            // InternalOCLinEcore.g:22322:1: ( 'in' )
+            // InternalOCLinEcore.g:22323:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());
@@ -66462,14 +66462,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3"
-    // InternalOCLinEcore.g:22334:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
+    // InternalOCLinEcore.g:22336:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22338:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
-            // InternalOCLinEcore.g:22339:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
+            // InternalOCLinEcore.g:22340:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
+            // InternalOCLinEcore.g:22341:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2__3__Impl();
@@ -66495,23 +66495,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3__Impl"
-    // InternalOCLinEcore.g:22345:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
+    // InternalOCLinEcore.g:22347:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22349:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
-            // InternalOCLinEcore.g:22350:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalOCLinEcore.g:22351:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
+            // InternalOCLinEcore.g:22352:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
             {
-            // InternalOCLinEcore.g:22350:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
-            // InternalOCLinEcore.g:22351:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalOCLinEcore.g:22352:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalOCLinEcore.g:22353:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_2_3());
             }
-            // InternalOCLinEcore.g:22352:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
-            // InternalOCLinEcore.g:22352:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
+            // InternalOCLinEcore.g:22354:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalOCLinEcore.g:22354:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3();
@@ -66546,14 +66546,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0"
-    // InternalOCLinEcore.g:22370:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
+    // InternalOCLinEcore.g:22372:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22374:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
-            // InternalOCLinEcore.g:22375:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
+            // InternalOCLinEcore.g:22376:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
+            // InternalOCLinEcore.g:22377:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl();
@@ -66584,17 +66584,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl"
-    // InternalOCLinEcore.g:22382:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:22384:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22386:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:22387:1: ( ':' )
+            // InternalOCLinEcore.g:22388:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:22389:1: ( ':' )
             {
-            // InternalOCLinEcore.g:22387:1: ( ':' )
-            // InternalOCLinEcore.g:22388:1: ':'
+            // InternalOCLinEcore.g:22389:1: ( ':' )
+            // InternalOCLinEcore.g:22390:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
@@ -66625,14 +66625,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1"
-    // InternalOCLinEcore.g:22401:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
+    // InternalOCLinEcore.g:22403:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22405:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
-            // InternalOCLinEcore.g:22406:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
+            // InternalOCLinEcore.g:22407:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
+            // InternalOCLinEcore.g:22408:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl();
@@ -66658,23 +66658,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl"
-    // InternalOCLinEcore.g:22412:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
+    // InternalOCLinEcore.g:22414:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22416:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
-            // InternalOCLinEcore.g:22417:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalOCLinEcore.g:22418:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
+            // InternalOCLinEcore.g:22419:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
             {
-            // InternalOCLinEcore.g:22417:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
-            // InternalOCLinEcore.g:22418:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalOCLinEcore.g:22419:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalOCLinEcore.g:22420:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_2_0_1());
             }
-            // InternalOCLinEcore.g:22419:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
-            // InternalOCLinEcore.g:22419:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
+            // InternalOCLinEcore.g:22421:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalOCLinEcore.g:22421:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1();
@@ -66709,14 +66709,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0"
-    // InternalOCLinEcore.g:22433:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
+    // InternalOCLinEcore.g:22435:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22437:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
-            // InternalOCLinEcore.g:22438:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
+            // InternalOCLinEcore.g:22439:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
+            // InternalOCLinEcore.g:22440:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl();
@@ -66747,17 +66747,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl"
-    // InternalOCLinEcore.g:22445:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
+    // InternalOCLinEcore.g:22447:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22449:1: ( ( '<-' ) )
-            // InternalOCLinEcore.g:22450:1: ( '<-' )
+            // InternalOCLinEcore.g:22451:1: ( ( '<-' ) )
+            // InternalOCLinEcore.g:22452:1: ( '<-' )
             {
-            // InternalOCLinEcore.g:22450:1: ( '<-' )
-            // InternalOCLinEcore.g:22451:1: '<-'
+            // InternalOCLinEcore.g:22452:1: ( '<-' )
+            // InternalOCLinEcore.g:22453:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
@@ -66788,14 +66788,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1"
-    // InternalOCLinEcore.g:22464:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
+    // InternalOCLinEcore.g:22466:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22468:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
-            // InternalOCLinEcore.g:22469:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
+            // InternalOCLinEcore.g:22470:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
+            // InternalOCLinEcore.g:22471:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl();
@@ -66821,23 +66821,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl"
-    // InternalOCLinEcore.g:22475:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
+    // InternalOCLinEcore.g:22477:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22479:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
-            // InternalOCLinEcore.g:22480:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalOCLinEcore.g:22481:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
+            // InternalOCLinEcore.g:22482:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
             {
-            // InternalOCLinEcore.g:22480:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
-            // InternalOCLinEcore.g:22481:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalOCLinEcore.g:22482:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalOCLinEcore.g:22483:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_2_1_1());
             }
-            // InternalOCLinEcore.g:22482:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
-            // InternalOCLinEcore.g:22482:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
+            // InternalOCLinEcore.g:22484:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalOCLinEcore.g:22484:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1();
@@ -66872,14 +66872,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0"
-    // InternalOCLinEcore.g:22496:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
+    // InternalOCLinEcore.g:22498:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
     public final void rule__NavigatingSemiArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22500:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
-            // InternalOCLinEcore.g:22501:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
+            // InternalOCLinEcore.g:22502:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
+            // InternalOCLinEcore.g:22503:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingSemiArgCS__Group__0__Impl();
@@ -66910,23 +66910,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0__Impl"
-    // InternalOCLinEcore.g:22508:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:22510:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22512:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
-            // InternalOCLinEcore.g:22513:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalOCLinEcore.g:22514:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
+            // InternalOCLinEcore.g:22515:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:22513:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
-            // InternalOCLinEcore.g:22514:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalOCLinEcore.g:22515:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalOCLinEcore.g:22516:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalOCLinEcore.g:22515:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
-            // InternalOCLinEcore.g:22515:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
+            // InternalOCLinEcore.g:22517:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalOCLinEcore.g:22517:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__PrefixAssignment_0();
@@ -66961,14 +66961,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1"
-    // InternalOCLinEcore.g:22525:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
+    // InternalOCLinEcore.g:22527:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
     public final void rule__NavigatingSemiArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22529:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
-            // InternalOCLinEcore.g:22530:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
+            // InternalOCLinEcore.g:22531:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
+            // InternalOCLinEcore.g:22532:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__NavigatingSemiArgCS__Group__1__Impl();
@@ -66999,23 +66999,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1__Impl"
-    // InternalOCLinEcore.g:22537:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:22539:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22541:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalOCLinEcore.g:22542:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:22543:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:22544:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:22542:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalOCLinEcore.g:22543:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLinEcore.g:22544:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:22545:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalOCLinEcore.g:22544:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalOCLinEcore.g:22544:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
+            // InternalOCLinEcore.g:22546:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLinEcore.g:22546:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1();
@@ -67050,14 +67050,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2"
-    // InternalOCLinEcore.g:22554:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:22556:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22558:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
-            // InternalOCLinEcore.g:22559:2: rule__NavigatingSemiArgCS__Group__2__Impl
+            // InternalOCLinEcore.g:22560:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
+            // InternalOCLinEcore.g:22561:2: rule__NavigatingSemiArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group__2__Impl();
@@ -67083,22 +67083,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2__Impl"
-    // InternalOCLinEcore.g:22565:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:22567:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22569:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:22570:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:22571:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:22572:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:22570:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:22571:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalOCLinEcore.g:22572:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:22573:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:22572:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalOCLinEcore.g:22574:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             int alt227=2;
             int LA227_0 = input.LA(1);
 
@@ -67107,7 +67107,7 @@
             }
             switch (alt227) {
                 case 1 :
-                    // InternalOCLinEcore.g:22572:2: rule__NavigatingSemiArgCS__Group_2__0
+                    // InternalOCLinEcore.g:22574:2: rule__NavigatingSemiArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2__0();
@@ -67145,14 +67145,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0"
-    // InternalOCLinEcore.g:22588:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
+    // InternalOCLinEcore.g:22590:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22592:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
-            // InternalOCLinEcore.g:22593:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
+            // InternalOCLinEcore.g:22594:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
+            // InternalOCLinEcore.g:22595:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__NavigatingSemiArgCS__Group_2__0__Impl();
@@ -67183,17 +67183,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:22600:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:22602:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22604:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:22605:1: ( ':' )
+            // InternalOCLinEcore.g:22606:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:22607:1: ( ':' )
             {
-            // InternalOCLinEcore.g:22605:1: ( ':' )
-            // InternalOCLinEcore.g:22606:1: ':'
+            // InternalOCLinEcore.g:22607:1: ( ':' )
+            // InternalOCLinEcore.g:22608:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
@@ -67224,14 +67224,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1"
-    // InternalOCLinEcore.g:22619:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
+    // InternalOCLinEcore.g:22621:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
     public final void rule__NavigatingSemiArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22623:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
-            // InternalOCLinEcore.g:22624:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
+            // InternalOCLinEcore.g:22625:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
+            // InternalOCLinEcore.g:22626:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__NavigatingSemiArgCS__Group_2__1__Impl();
@@ -67262,23 +67262,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:22631:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:22633:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22635:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:22636:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLinEcore.g:22637:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:22638:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:22636:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalOCLinEcore.g:22637:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLinEcore.g:22638:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLinEcore.g:22639:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalOCLinEcore.g:22638:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
-            // InternalOCLinEcore.g:22638:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
+            // InternalOCLinEcore.g:22640:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLinEcore.g:22640:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1();
@@ -67313,14 +67313,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2"
-    // InternalOCLinEcore.g:22648:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
+    // InternalOCLinEcore.g:22650:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22652:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
-            // InternalOCLinEcore.g:22653:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
+            // InternalOCLinEcore.g:22654:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
+            // InternalOCLinEcore.g:22655:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2__2__Impl();
@@ -67346,22 +67346,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2__Impl"
-    // InternalOCLinEcore.g:22659:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
+    // InternalOCLinEcore.g:22661:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22663:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
-            // InternalOCLinEcore.g:22664:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalOCLinEcore.g:22665:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
+            // InternalOCLinEcore.g:22666:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
             {
-            // InternalOCLinEcore.g:22664:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
-            // InternalOCLinEcore.g:22665:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalOCLinEcore.g:22666:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalOCLinEcore.g:22667:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
             }
-            // InternalOCLinEcore.g:22666:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalOCLinEcore.g:22668:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             int alt228=2;
             int LA228_0 = input.LA(1);
 
@@ -67370,7 +67370,7 @@
             }
             switch (alt228) {
                 case 1 :
-                    // InternalOCLinEcore.g:22666:2: rule__NavigatingSemiArgCS__Group_2_2__0
+                    // InternalOCLinEcore.g:22668:2: rule__NavigatingSemiArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2_2__0();
@@ -67408,14 +67408,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0"
-    // InternalOCLinEcore.g:22682:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
+    // InternalOCLinEcore.g:22684:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22686:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
-            // InternalOCLinEcore.g:22687:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
+            // InternalOCLinEcore.g:22688:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
+            // InternalOCLinEcore.g:22689:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NavigatingSemiArgCS__Group_2_2__0__Impl();
@@ -67446,17 +67446,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0__Impl"
-    // InternalOCLinEcore.g:22694:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:22696:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22698:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:22699:1: ( '=' )
+            // InternalOCLinEcore.g:22700:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:22701:1: ( '=' )
             {
-            // InternalOCLinEcore.g:22699:1: ( '=' )
-            // InternalOCLinEcore.g:22700:1: '='
+            // InternalOCLinEcore.g:22701:1: ( '=' )
+            // InternalOCLinEcore.g:22702:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -67487,14 +67487,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1"
-    // InternalOCLinEcore.g:22713:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
+    // InternalOCLinEcore.g:22715:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22717:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
-            // InternalOCLinEcore.g:22718:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
+            // InternalOCLinEcore.g:22719:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
+            // InternalOCLinEcore.g:22720:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2_2__1__Impl();
@@ -67520,23 +67520,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1__Impl"
-    // InternalOCLinEcore.g:22724:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalOCLinEcore.g:22726:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22728:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalOCLinEcore.g:22729:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLinEcore.g:22730:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalOCLinEcore.g:22731:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalOCLinEcore.g:22729:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalOCLinEcore.g:22730:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLinEcore.g:22731:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLinEcore.g:22732:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalOCLinEcore.g:22731:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalOCLinEcore.g:22731:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalOCLinEcore.g:22733:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLinEcore.g:22733:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -67571,14 +67571,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0"
-    // InternalOCLinEcore.g:22745:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
+    // InternalOCLinEcore.g:22747:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
     public final void rule__CoIteratorVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22749:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
-            // InternalOCLinEcore.g:22750:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
+            // InternalOCLinEcore.g:22751:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
+            // InternalOCLinEcore.g:22752:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_51);
             rule__CoIteratorVariableCS__Group__0__Impl();
@@ -67609,23 +67609,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0__Impl"
-    // InternalOCLinEcore.g:22757:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:22759:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
     public final void rule__CoIteratorVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22761:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:22762:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:22763:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:22764:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:22762:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:22763:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:22764:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:22765:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:22764:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:22764:2: rule__CoIteratorVariableCS__NameAssignment_0
+            // InternalOCLinEcore.g:22766:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:22766:2: rule__CoIteratorVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__NameAssignment_0();
@@ -67660,14 +67660,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1"
-    // InternalOCLinEcore.g:22774:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:22776:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22778:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
-            // InternalOCLinEcore.g:22779:2: rule__CoIteratorVariableCS__Group__1__Impl
+            // InternalOCLinEcore.g:22780:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
+            // InternalOCLinEcore.g:22781:2: rule__CoIteratorVariableCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group__1__Impl();
@@ -67693,22 +67693,22 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1__Impl"
-    // InternalOCLinEcore.g:22785:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:22787:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
     public final void rule__CoIteratorVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22789:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:22790:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:22791:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:22792:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:22790:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:22791:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalOCLinEcore.g:22792:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:22793:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:22792:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalOCLinEcore.g:22794:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             int alt229=2;
             int LA229_0 = input.LA(1);
 
@@ -67717,7 +67717,7 @@
             }
             switch (alt229) {
                 case 1 :
-                    // InternalOCLinEcore.g:22792:2: rule__CoIteratorVariableCS__Group_1__0
+                    // InternalOCLinEcore.g:22794:2: rule__CoIteratorVariableCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CoIteratorVariableCS__Group_1__0();
@@ -67755,14 +67755,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0"
-    // InternalOCLinEcore.g:22806:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
+    // InternalOCLinEcore.g:22808:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
     public final void rule__CoIteratorVariableCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22810:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
-            // InternalOCLinEcore.g:22811:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
+            // InternalOCLinEcore.g:22812:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
+            // InternalOCLinEcore.g:22813:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__CoIteratorVariableCS__Group_1__0__Impl();
@@ -67793,17 +67793,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:22818:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:22820:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__CoIteratorVariableCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22822:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:22823:1: ( ':' )
+            // InternalOCLinEcore.g:22824:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:22825:1: ( ':' )
             {
-            // InternalOCLinEcore.g:22823:1: ( ':' )
-            // InternalOCLinEcore.g:22824:1: ':'
+            // InternalOCLinEcore.g:22825:1: ( ':' )
+            // InternalOCLinEcore.g:22826:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
@@ -67834,14 +67834,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1"
-    // InternalOCLinEcore.g:22837:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:22839:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22841:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:22842:2: rule__CoIteratorVariableCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:22843:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:22844:2: rule__CoIteratorVariableCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group_1__1__Impl();
@@ -67867,23 +67867,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:22848:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:22850:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CoIteratorVariableCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22852:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:22853:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:22854:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:22855:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:22853:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLinEcore.g:22854:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:22855:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLinEcore.g:22856:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLinEcore.g:22855:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLinEcore.g:22855:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
+            // InternalOCLinEcore.g:22857:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLinEcore.g:22857:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1();
@@ -67918,14 +67918,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0"
-    // InternalOCLinEcore.g:22869:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
+    // InternalOCLinEcore.g:22871:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
     public final void rule__IfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22873:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
-            // InternalOCLinEcore.g:22874:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
+            // InternalOCLinEcore.g:22875:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
+            // InternalOCLinEcore.g:22876:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_91);
             rule__IfExpCS__Group__0__Impl();
@@ -67956,17 +67956,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:22881:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
+    // InternalOCLinEcore.g:22883:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
     public final void rule__IfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22885:1: ( ( 'if' ) )
-            // InternalOCLinEcore.g:22886:1: ( 'if' )
+            // InternalOCLinEcore.g:22887:1: ( ( 'if' ) )
+            // InternalOCLinEcore.g:22888:1: ( 'if' )
             {
-            // InternalOCLinEcore.g:22886:1: ( 'if' )
-            // InternalOCLinEcore.g:22887:1: 'if'
+            // InternalOCLinEcore.g:22888:1: ( 'if' )
+            // InternalOCLinEcore.g:22889:1: 'if'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
@@ -67997,14 +67997,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1"
-    // InternalOCLinEcore.g:22900:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
+    // InternalOCLinEcore.g:22902:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
     public final void rule__IfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22904:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
-            // InternalOCLinEcore.g:22905:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
+            // InternalOCLinEcore.g:22906:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
+            // InternalOCLinEcore.g:22907:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_114);
             rule__IfExpCS__Group__1__Impl();
@@ -68035,23 +68035,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:22912:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:22914:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__IfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22916:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalOCLinEcore.g:22917:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLinEcore.g:22918:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:22919:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:22917:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
-            // InternalOCLinEcore.g:22918:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLinEcore.g:22919:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLinEcore.g:22920:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalOCLinEcore.g:22919:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
-            // InternalOCLinEcore.g:22919:2: rule__IfExpCS__OwnedConditionAssignment_1
+            // InternalOCLinEcore.g:22921:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLinEcore.g:22921:2: rule__IfExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAssignment_1();
@@ -68086,14 +68086,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2"
-    // InternalOCLinEcore.g:22929:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
+    // InternalOCLinEcore.g:22931:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
     public final void rule__IfExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22933:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
-            // InternalOCLinEcore.g:22934:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
+            // InternalOCLinEcore.g:22935:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
+            // InternalOCLinEcore.g:22936:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__IfExpCS__Group__2__Impl();
@@ -68124,17 +68124,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:22941:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalOCLinEcore.g:22943:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__IfExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22945:1: ( ( 'then' ) )
-            // InternalOCLinEcore.g:22946:1: ( 'then' )
+            // InternalOCLinEcore.g:22947:1: ( ( 'then' ) )
+            // InternalOCLinEcore.g:22948:1: ( 'then' )
             {
-            // InternalOCLinEcore.g:22946:1: ( 'then' )
-            // InternalOCLinEcore.g:22947:1: 'then'
+            // InternalOCLinEcore.g:22948:1: ( 'then' )
+            // InternalOCLinEcore.g:22949:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
@@ -68165,14 +68165,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3"
-    // InternalOCLinEcore.g:22960:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
+    // InternalOCLinEcore.g:22962:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
     public final void rule__IfExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22964:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
-            // InternalOCLinEcore.g:22965:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
+            // InternalOCLinEcore.g:22966:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
+            // InternalOCLinEcore.g:22967:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_115);
             rule__IfExpCS__Group__3__Impl();
@@ -68203,23 +68203,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:22972:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalOCLinEcore.g:22974:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__IfExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22976:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalOCLinEcore.g:22977:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLinEcore.g:22978:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalOCLinEcore.g:22979:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalOCLinEcore.g:22977:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalOCLinEcore.g:22978:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLinEcore.g:22979:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLinEcore.g:22980:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalOCLinEcore.g:22979:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalOCLinEcore.g:22979:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
+            // InternalOCLinEcore.g:22981:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLinEcore.g:22981:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedThenExpressionAssignment_3();
@@ -68254,14 +68254,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4"
-    // InternalOCLinEcore.g:22989:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
+    // InternalOCLinEcore.g:22991:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
     public final void rule__IfExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:22993:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
-            // InternalOCLinEcore.g:22994:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
+            // InternalOCLinEcore.g:22995:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
+            // InternalOCLinEcore.g:22996:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_115);
             rule__IfExpCS__Group__4__Impl();
@@ -68292,22 +68292,22 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4__Impl"
-    // InternalOCLinEcore.g:23001:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
+    // InternalOCLinEcore.g:23003:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
     public final void rule__IfExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23005:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
-            // InternalOCLinEcore.g:23006:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalOCLinEcore.g:23007:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
+            // InternalOCLinEcore.g:23008:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
             {
-            // InternalOCLinEcore.g:23006:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
-            // InternalOCLinEcore.g:23007:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalOCLinEcore.g:23008:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalOCLinEcore.g:23009:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
             }
-            // InternalOCLinEcore.g:23008:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalOCLinEcore.g:23010:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             loop230:
             do {
                 int alt230=2;
@@ -68320,7 +68320,7 @@
 
                 switch (alt230) {
             	case 1 :
-            	    // InternalOCLinEcore.g:23008:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
+            	    // InternalOCLinEcore.g:23010:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
             	    {
             	    pushFollow(FollowSets000.FOLLOW_116);
             	    rule__IfExpCS__OwnedIfThenExpressionsAssignment_4();
@@ -68361,14 +68361,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5"
-    // InternalOCLinEcore.g:23018:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
+    // InternalOCLinEcore.g:23020:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
     public final void rule__IfExpCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23022:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
-            // InternalOCLinEcore.g:23023:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
+            // InternalOCLinEcore.g:23024:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
+            // InternalOCLinEcore.g:23025:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__IfExpCS__Group__5__Impl();
@@ -68399,17 +68399,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5__Impl"
-    // InternalOCLinEcore.g:23030:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
+    // InternalOCLinEcore.g:23032:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
     public final void rule__IfExpCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23034:1: ( ( 'else' ) )
-            // InternalOCLinEcore.g:23035:1: ( 'else' )
+            // InternalOCLinEcore.g:23036:1: ( ( 'else' ) )
+            // InternalOCLinEcore.g:23037:1: ( 'else' )
             {
-            // InternalOCLinEcore.g:23035:1: ( 'else' )
-            // InternalOCLinEcore.g:23036:1: 'else'
+            // InternalOCLinEcore.g:23037:1: ( 'else' )
+            // InternalOCLinEcore.g:23038:1: 'else'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
@@ -68440,14 +68440,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6"
-    // InternalOCLinEcore.g:23049:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
+    // InternalOCLinEcore.g:23051:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
     public final void rule__IfExpCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23053:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
-            // InternalOCLinEcore.g:23054:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
+            // InternalOCLinEcore.g:23055:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
+            // InternalOCLinEcore.g:23056:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_117);
             rule__IfExpCS__Group__6__Impl();
@@ -68478,23 +68478,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6__Impl"
-    // InternalOCLinEcore.g:23061:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
+    // InternalOCLinEcore.g:23063:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
     public final void rule__IfExpCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23065:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
-            // InternalOCLinEcore.g:23066:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalOCLinEcore.g:23067:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
+            // InternalOCLinEcore.g:23068:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
             {
-            // InternalOCLinEcore.g:23066:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
-            // InternalOCLinEcore.g:23067:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalOCLinEcore.g:23068:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalOCLinEcore.g:23069:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
             }
-            // InternalOCLinEcore.g:23068:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
-            // InternalOCLinEcore.g:23068:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
+            // InternalOCLinEcore.g:23070:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalOCLinEcore.g:23070:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedElseExpressionAssignment_6();
@@ -68529,14 +68529,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7"
-    // InternalOCLinEcore.g:23078:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
+    // InternalOCLinEcore.g:23080:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
     public final void rule__IfExpCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23082:1: ( rule__IfExpCS__Group__7__Impl )
-            // InternalOCLinEcore.g:23083:2: rule__IfExpCS__Group__7__Impl
+            // InternalOCLinEcore.g:23084:1: ( rule__IfExpCS__Group__7__Impl )
+            // InternalOCLinEcore.g:23085:2: rule__IfExpCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__Group__7__Impl();
@@ -68562,17 +68562,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7__Impl"
-    // InternalOCLinEcore.g:23089:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
+    // InternalOCLinEcore.g:23091:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
     public final void rule__IfExpCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23093:1: ( ( 'endif' ) )
-            // InternalOCLinEcore.g:23094:1: ( 'endif' )
+            // InternalOCLinEcore.g:23095:1: ( ( 'endif' ) )
+            // InternalOCLinEcore.g:23096:1: ( 'endif' )
             {
-            // InternalOCLinEcore.g:23094:1: ( 'endif' )
-            // InternalOCLinEcore.g:23095:1: 'endif'
+            // InternalOCLinEcore.g:23096:1: ( 'endif' )
+            // InternalOCLinEcore.g:23097:1: 'endif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
@@ -68603,14 +68603,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0"
-    // InternalOCLinEcore.g:23124:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
+    // InternalOCLinEcore.g:23126:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
     public final void rule__ElseIfThenExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23128:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
-            // InternalOCLinEcore.g:23129:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
+            // InternalOCLinEcore.g:23130:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
+            // InternalOCLinEcore.g:23131:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__ElseIfThenExpCS__Group__0__Impl();
@@ -68641,17 +68641,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23136:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
+    // InternalOCLinEcore.g:23138:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
     public final void rule__ElseIfThenExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23140:1: ( ( 'elseif' ) )
-            // InternalOCLinEcore.g:23141:1: ( 'elseif' )
+            // InternalOCLinEcore.g:23142:1: ( ( 'elseif' ) )
+            // InternalOCLinEcore.g:23143:1: ( 'elseif' )
             {
-            // InternalOCLinEcore.g:23141:1: ( 'elseif' )
-            // InternalOCLinEcore.g:23142:1: 'elseif'
+            // InternalOCLinEcore.g:23143:1: ( 'elseif' )
+            // InternalOCLinEcore.g:23144:1: 'elseif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
@@ -68682,14 +68682,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1"
-    // InternalOCLinEcore.g:23155:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
+    // InternalOCLinEcore.g:23157:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
     public final void rule__ElseIfThenExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23159:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
-            // InternalOCLinEcore.g:23160:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
+            // InternalOCLinEcore.g:23161:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
+            // InternalOCLinEcore.g:23162:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_114);
             rule__ElseIfThenExpCS__Group__1__Impl();
@@ -68720,23 +68720,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:23167:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:23169:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23171:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalOCLinEcore.g:23172:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLinEcore.g:23173:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:23174:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:23172:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
-            // InternalOCLinEcore.g:23173:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLinEcore.g:23174:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLinEcore.g:23175:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalOCLinEcore.g:23174:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
-            // InternalOCLinEcore.g:23174:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
+            // InternalOCLinEcore.g:23176:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLinEcore.g:23176:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedConditionAssignment_1();
@@ -68771,14 +68771,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2"
-    // InternalOCLinEcore.g:23184:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
+    // InternalOCLinEcore.g:23186:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
     public final void rule__ElseIfThenExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23188:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
-            // InternalOCLinEcore.g:23189:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
+            // InternalOCLinEcore.g:23190:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
+            // InternalOCLinEcore.g:23191:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__ElseIfThenExpCS__Group__2__Impl();
@@ -68809,17 +68809,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:23196:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalOCLinEcore.g:23198:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__ElseIfThenExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23200:1: ( ( 'then' ) )
-            // InternalOCLinEcore.g:23201:1: ( 'then' )
+            // InternalOCLinEcore.g:23202:1: ( ( 'then' ) )
+            // InternalOCLinEcore.g:23203:1: ( 'then' )
             {
-            // InternalOCLinEcore.g:23201:1: ( 'then' )
-            // InternalOCLinEcore.g:23202:1: 'then'
+            // InternalOCLinEcore.g:23203:1: ( 'then' )
+            // InternalOCLinEcore.g:23204:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
@@ -68850,14 +68850,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3"
-    // InternalOCLinEcore.g:23215:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:23217:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
     public final void rule__ElseIfThenExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23219:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
-            // InternalOCLinEcore.g:23220:2: rule__ElseIfThenExpCS__Group__3__Impl
+            // InternalOCLinEcore.g:23221:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
+            // InternalOCLinEcore.g:23222:2: rule__ElseIfThenExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__Group__3__Impl();
@@ -68883,23 +68883,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:23226:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalOCLinEcore.g:23228:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23230:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalOCLinEcore.g:23231:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLinEcore.g:23232:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalOCLinEcore.g:23233:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalOCLinEcore.g:23231:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalOCLinEcore.g:23232:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLinEcore.g:23233:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLinEcore.g:23234:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalOCLinEcore.g:23233:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalOCLinEcore.g:23233:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
+            // InternalOCLinEcore.g:23235:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLinEcore.g:23235:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3();
@@ -68934,14 +68934,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0"
-    // InternalOCLinEcore.g:23251:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
+    // InternalOCLinEcore.g:23253:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
     public final void rule__LetExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23255:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
-            // InternalOCLinEcore.g:23256:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
+            // InternalOCLinEcore.g:23257:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
+            // InternalOCLinEcore.g:23258:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__LetExpCS__Group__0__Impl();
@@ -68972,17 +68972,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23263:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
+    // InternalOCLinEcore.g:23265:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
     public final void rule__LetExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23267:1: ( ( 'let' ) )
-            // InternalOCLinEcore.g:23268:1: ( 'let' )
+            // InternalOCLinEcore.g:23269:1: ( ( 'let' ) )
+            // InternalOCLinEcore.g:23270:1: ( 'let' )
             {
-            // InternalOCLinEcore.g:23268:1: ( 'let' )
-            // InternalOCLinEcore.g:23269:1: 'let'
+            // InternalOCLinEcore.g:23270:1: ( 'let' )
+            // InternalOCLinEcore.g:23271:1: 'let'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
@@ -69013,14 +69013,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1"
-    // InternalOCLinEcore.g:23282:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
+    // InternalOCLinEcore.g:23284:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
     public final void rule__LetExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23286:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
-            // InternalOCLinEcore.g:23287:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
+            // InternalOCLinEcore.g:23288:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
+            // InternalOCLinEcore.g:23289:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_118);
             rule__LetExpCS__Group__1__Impl();
@@ -69051,23 +69051,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:23294:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:23296:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
     public final void rule__LetExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23298:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
-            // InternalOCLinEcore.g:23299:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalOCLinEcore.g:23300:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
+            // InternalOCLinEcore.g:23301:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:23299:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
-            // InternalOCLinEcore.g:23300:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalOCLinEcore.g:23301:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalOCLinEcore.g:23302:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
             }
-            // InternalOCLinEcore.g:23301:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
-            // InternalOCLinEcore.g:23301:2: rule__LetExpCS__OwnedVariablesAssignment_1
+            // InternalOCLinEcore.g:23303:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalOCLinEcore.g:23303:2: rule__LetExpCS__OwnedVariablesAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_1();
@@ -69102,14 +69102,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2"
-    // InternalOCLinEcore.g:23311:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
+    // InternalOCLinEcore.g:23313:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
     public final void rule__LetExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23315:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
-            // InternalOCLinEcore.g:23316:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
+            // InternalOCLinEcore.g:23317:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
+            // InternalOCLinEcore.g:23318:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_118);
             rule__LetExpCS__Group__2__Impl();
@@ -69140,22 +69140,22 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:23323:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
+    // InternalOCLinEcore.g:23325:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
     public final void rule__LetExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23327:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
-            // InternalOCLinEcore.g:23328:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalOCLinEcore.g:23329:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
+            // InternalOCLinEcore.g:23330:1: ( ( rule__LetExpCS__Group_2__0 )* )
             {
-            // InternalOCLinEcore.g:23328:1: ( ( rule__LetExpCS__Group_2__0 )* )
-            // InternalOCLinEcore.g:23329:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalOCLinEcore.g:23330:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalOCLinEcore.g:23331:1: ( rule__LetExpCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:23330:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalOCLinEcore.g:23332:1: ( rule__LetExpCS__Group_2__0 )*
             loop231:
             do {
                 int alt231=2;
@@ -69168,7 +69168,7 @@
 
                 switch (alt231) {
             	case 1 :
-            	    // InternalOCLinEcore.g:23330:2: rule__LetExpCS__Group_2__0
+            	    // InternalOCLinEcore.g:23332:2: rule__LetExpCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__LetExpCS__Group_2__0();
@@ -69209,14 +69209,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3"
-    // InternalOCLinEcore.g:23340:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
+    // InternalOCLinEcore.g:23342:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
     public final void rule__LetExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23344:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
-            // InternalOCLinEcore.g:23345:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
+            // InternalOCLinEcore.g:23346:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
+            // InternalOCLinEcore.g:23347:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__LetExpCS__Group__3__Impl();
@@ -69247,17 +69247,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3__Impl"
-    // InternalOCLinEcore.g:23352:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
+    // InternalOCLinEcore.g:23354:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
     public final void rule__LetExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23356:1: ( ( 'in' ) )
-            // InternalOCLinEcore.g:23357:1: ( 'in' )
+            // InternalOCLinEcore.g:23358:1: ( ( 'in' ) )
+            // InternalOCLinEcore.g:23359:1: ( 'in' )
             {
-            // InternalOCLinEcore.g:23357:1: ( 'in' )
-            // InternalOCLinEcore.g:23358:1: 'in'
+            // InternalOCLinEcore.g:23359:1: ( 'in' )
+            // InternalOCLinEcore.g:23360:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getInKeyword_3());
@@ -69288,14 +69288,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4"
-    // InternalOCLinEcore.g:23371:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:23373:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
     public final void rule__LetExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23375:1: ( rule__LetExpCS__Group__4__Impl )
-            // InternalOCLinEcore.g:23376:2: rule__LetExpCS__Group__4__Impl
+            // InternalOCLinEcore.g:23377:1: ( rule__LetExpCS__Group__4__Impl )
+            // InternalOCLinEcore.g:23378:2: rule__LetExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group__4__Impl();
@@ -69321,23 +69321,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4__Impl"
-    // InternalOCLinEcore.g:23382:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
+    // InternalOCLinEcore.g:23384:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
     public final void rule__LetExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23386:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
-            // InternalOCLinEcore.g:23387:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalOCLinEcore.g:23388:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
+            // InternalOCLinEcore.g:23389:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
             {
-            // InternalOCLinEcore.g:23387:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
-            // InternalOCLinEcore.g:23388:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalOCLinEcore.g:23389:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalOCLinEcore.g:23390:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
             }
-            // InternalOCLinEcore.g:23389:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
-            // InternalOCLinEcore.g:23389:2: rule__LetExpCS__OwnedInExpressionAssignment_4
+            // InternalOCLinEcore.g:23391:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalOCLinEcore.g:23391:2: rule__LetExpCS__OwnedInExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedInExpressionAssignment_4();
@@ -69372,14 +69372,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0"
-    // InternalOCLinEcore.g:23409:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
+    // InternalOCLinEcore.g:23411:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
     public final void rule__LetExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23413:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
-            // InternalOCLinEcore.g:23414:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
+            // InternalOCLinEcore.g:23415:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
+            // InternalOCLinEcore.g:23416:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__LetExpCS__Group_2__0__Impl();
@@ -69410,17 +69410,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:23421:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:23423:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__LetExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23425:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:23426:1: ( ',' )
+            // InternalOCLinEcore.g:23427:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:23428:1: ( ',' )
             {
-            // InternalOCLinEcore.g:23426:1: ( ',' )
-            // InternalOCLinEcore.g:23427:1: ','
+            // InternalOCLinEcore.g:23428:1: ( ',' )
+            // InternalOCLinEcore.g:23429:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
@@ -69451,14 +69451,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1"
-    // InternalOCLinEcore.g:23440:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:23442:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
     public final void rule__LetExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23444:1: ( rule__LetExpCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:23445:2: rule__LetExpCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:23446:1: ( rule__LetExpCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:23447:2: rule__LetExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group_2__1__Impl();
@@ -69484,23 +69484,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:23451:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:23453:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
     public final void rule__LetExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23455:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:23456:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalOCLinEcore.g:23457:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:23458:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:23456:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
-            // InternalOCLinEcore.g:23457:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalOCLinEcore.g:23458:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalOCLinEcore.g:23459:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
             }
-            // InternalOCLinEcore.g:23458:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
-            // InternalOCLinEcore.g:23458:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
+            // InternalOCLinEcore.g:23460:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalOCLinEcore.g:23460:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_2_1();
@@ -69535,14 +69535,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0"
-    // InternalOCLinEcore.g:23472:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
+    // InternalOCLinEcore.g:23474:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
     public final void rule__LetVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23476:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
-            // InternalOCLinEcore.g:23477:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
+            // InternalOCLinEcore.g:23478:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
+            // InternalOCLinEcore.g:23479:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_119);
             rule__LetVariableCS__Group__0__Impl();
@@ -69573,23 +69573,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23484:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:23486:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
     public final void rule__LetVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23488:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:23489:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:23490:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:23491:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:23489:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:23490:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:23491:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:23492:1: ( rule__LetVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:23491:1: ( rule__LetVariableCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:23491:2: rule__LetVariableCS__NameAssignment_0
+            // InternalOCLinEcore.g:23493:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:23493:2: rule__LetVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__NameAssignment_0();
@@ -69624,14 +69624,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1"
-    // InternalOCLinEcore.g:23501:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
+    // InternalOCLinEcore.g:23503:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
     public final void rule__LetVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23505:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
-            // InternalOCLinEcore.g:23506:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
+            // InternalOCLinEcore.g:23507:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
+            // InternalOCLinEcore.g:23508:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_119);
             rule__LetVariableCS__Group__1__Impl();
@@ -69662,22 +69662,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1__Impl"
-    // InternalOCLinEcore.g:23513:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
+    // InternalOCLinEcore.g:23515:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
     public final void rule__LetVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23517:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
-            // InternalOCLinEcore.g:23518:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalOCLinEcore.g:23519:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
+            // InternalOCLinEcore.g:23520:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
             {
-            // InternalOCLinEcore.g:23518:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
-            // InternalOCLinEcore.g:23519:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalOCLinEcore.g:23520:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalOCLinEcore.g:23521:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
             }
-            // InternalOCLinEcore.g:23520:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalOCLinEcore.g:23522:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             int alt232=2;
             int LA232_0 = input.LA(1);
 
@@ -69686,7 +69686,7 @@
             }
             switch (alt232) {
                 case 1 :
-                    // InternalOCLinEcore.g:23520:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
+                    // InternalOCLinEcore.g:23522:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1();
@@ -69724,14 +69724,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2"
-    // InternalOCLinEcore.g:23530:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
+    // InternalOCLinEcore.g:23532:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
     public final void rule__LetVariableCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23534:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
-            // InternalOCLinEcore.g:23535:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
+            // InternalOCLinEcore.g:23536:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
+            // InternalOCLinEcore.g:23537:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_119);
             rule__LetVariableCS__Group__2__Impl();
@@ -69762,22 +69762,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2__Impl"
-    // InternalOCLinEcore.g:23542:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:23544:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
     public final void rule__LetVariableCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23546:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:23547:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:23548:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:23549:1: ( ( rule__LetVariableCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:23547:1: ( ( rule__LetVariableCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:23548:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalOCLinEcore.g:23549:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:23550:1: ( rule__LetVariableCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:23549:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalOCLinEcore.g:23551:1: ( rule__LetVariableCS__Group_2__0 )?
             int alt233=2;
             int LA233_0 = input.LA(1);
 
@@ -69786,7 +69786,7 @@
             }
             switch (alt233) {
                 case 1 :
-                    // InternalOCLinEcore.g:23549:2: rule__LetVariableCS__Group_2__0
+                    // InternalOCLinEcore.g:23551:2: rule__LetVariableCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__Group_2__0();
@@ -69824,14 +69824,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3"
-    // InternalOCLinEcore.g:23559:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
+    // InternalOCLinEcore.g:23561:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
     public final void rule__LetVariableCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23563:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
-            // InternalOCLinEcore.g:23564:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
+            // InternalOCLinEcore.g:23565:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
+            // InternalOCLinEcore.g:23566:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__LetVariableCS__Group__3__Impl();
@@ -69862,17 +69862,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3__Impl"
-    // InternalOCLinEcore.g:23571:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
+    // InternalOCLinEcore.g:23573:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
     public final void rule__LetVariableCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23575:1: ( ( '=' ) )
-            // InternalOCLinEcore.g:23576:1: ( '=' )
+            // InternalOCLinEcore.g:23577:1: ( ( '=' ) )
+            // InternalOCLinEcore.g:23578:1: ( '=' )
             {
-            // InternalOCLinEcore.g:23576:1: ( '=' )
-            // InternalOCLinEcore.g:23577:1: '='
+            // InternalOCLinEcore.g:23578:1: ( '=' )
+            // InternalOCLinEcore.g:23579:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
@@ -69903,14 +69903,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4"
-    // InternalOCLinEcore.g:23590:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
+    // InternalOCLinEcore.g:23592:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
     public final void rule__LetVariableCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23594:1: ( rule__LetVariableCS__Group__4__Impl )
-            // InternalOCLinEcore.g:23595:2: rule__LetVariableCS__Group__4__Impl
+            // InternalOCLinEcore.g:23596:1: ( rule__LetVariableCS__Group__4__Impl )
+            // InternalOCLinEcore.g:23597:2: rule__LetVariableCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group__4__Impl();
@@ -69936,23 +69936,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4__Impl"
-    // InternalOCLinEcore.g:23601:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
+    // InternalOCLinEcore.g:23603:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
     public final void rule__LetVariableCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23605:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
-            // InternalOCLinEcore.g:23606:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalOCLinEcore.g:23607:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
+            // InternalOCLinEcore.g:23608:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
             {
-            // InternalOCLinEcore.g:23606:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
-            // InternalOCLinEcore.g:23607:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalOCLinEcore.g:23608:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalOCLinEcore.g:23609:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
             }
-            // InternalOCLinEcore.g:23608:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
-            // InternalOCLinEcore.g:23608:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
+            // InternalOCLinEcore.g:23610:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalOCLinEcore.g:23610:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedInitExpressionAssignment_4();
@@ -69987,14 +69987,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0"
-    // InternalOCLinEcore.g:23628:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
+    // InternalOCLinEcore.g:23630:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
     public final void rule__LetVariableCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23632:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
-            // InternalOCLinEcore.g:23633:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
+            // InternalOCLinEcore.g:23634:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
+            // InternalOCLinEcore.g:23635:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__LetVariableCS__Group_2__0__Impl();
@@ -70025,17 +70025,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:23640:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLinEcore.g:23642:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__LetVariableCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23644:1: ( ( ':' ) )
-            // InternalOCLinEcore.g:23645:1: ( ':' )
+            // InternalOCLinEcore.g:23646:1: ( ( ':' ) )
+            // InternalOCLinEcore.g:23647:1: ( ':' )
             {
-            // InternalOCLinEcore.g:23645:1: ( ':' )
-            // InternalOCLinEcore.g:23646:1: ':'
+            // InternalOCLinEcore.g:23647:1: ( ':' )
+            // InternalOCLinEcore.g:23648:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
@@ -70066,14 +70066,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1"
-    // InternalOCLinEcore.g:23659:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:23661:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
     public final void rule__LetVariableCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23663:1: ( rule__LetVariableCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:23664:2: rule__LetVariableCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:23665:1: ( rule__LetVariableCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:23666:2: rule__LetVariableCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group_2__1__Impl();
@@ -70099,23 +70099,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:23670:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:23672:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__LetVariableCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23674:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:23675:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLinEcore.g:23676:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:23677:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:23675:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
-            // InternalOCLinEcore.g:23676:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLinEcore.g:23677:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLinEcore.g:23678:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalOCLinEcore.g:23677:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
-            // InternalOCLinEcore.g:23677:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
+            // InternalOCLinEcore.g:23679:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLinEcore.g:23679:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedTypeAssignment_2_1();
@@ -70150,14 +70150,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0"
-    // InternalOCLinEcore.g:23691:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
+    // InternalOCLinEcore.g:23693:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
     public final void rule__NestedExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23695:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
-            // InternalOCLinEcore.g:23696:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
+            // InternalOCLinEcore.g:23697:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
+            // InternalOCLinEcore.g:23698:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__NestedExpCS__Group__0__Impl();
@@ -70188,17 +70188,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23703:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
+    // InternalOCLinEcore.g:23705:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
     public final void rule__NestedExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23707:1: ( ( '(' ) )
-            // InternalOCLinEcore.g:23708:1: ( '(' )
+            // InternalOCLinEcore.g:23709:1: ( ( '(' ) )
+            // InternalOCLinEcore.g:23710:1: ( '(' )
             {
-            // InternalOCLinEcore.g:23708:1: ( '(' )
-            // InternalOCLinEcore.g:23709:1: '('
+            // InternalOCLinEcore.g:23710:1: ( '(' )
+            // InternalOCLinEcore.g:23711:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
@@ -70229,14 +70229,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1"
-    // InternalOCLinEcore.g:23722:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
+    // InternalOCLinEcore.g:23724:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
     public final void rule__NestedExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23726:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
-            // InternalOCLinEcore.g:23727:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
+            // InternalOCLinEcore.g:23728:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
+            // InternalOCLinEcore.g:23729:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__NestedExpCS__Group__1__Impl();
@@ -70267,23 +70267,23 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:23734:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
+    // InternalOCLinEcore.g:23736:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
     public final void rule__NestedExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23738:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
-            // InternalOCLinEcore.g:23739:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:23740:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalOCLinEcore.g:23741:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
             {
-            // InternalOCLinEcore.g:23739:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
-            // InternalOCLinEcore.g:23740:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalOCLinEcore.g:23741:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalOCLinEcore.g:23742:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
             }
-            // InternalOCLinEcore.g:23741:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
-            // InternalOCLinEcore.g:23741:2: rule__NestedExpCS__OwnedExpressionAssignment_1
+            // InternalOCLinEcore.g:23743:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalOCLinEcore.g:23743:2: rule__NestedExpCS__OwnedExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__OwnedExpressionAssignment_1();
@@ -70318,14 +70318,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2"
-    // InternalOCLinEcore.g:23751:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:23753:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
     public final void rule__NestedExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23755:1: ( rule__NestedExpCS__Group__2__Impl )
-            // InternalOCLinEcore.g:23756:2: rule__NestedExpCS__Group__2__Impl
+            // InternalOCLinEcore.g:23757:1: ( rule__NestedExpCS__Group__2__Impl )
+            // InternalOCLinEcore.g:23758:2: rule__NestedExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__Group__2__Impl();
@@ -70351,17 +70351,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2__Impl"
-    // InternalOCLinEcore.g:23762:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
+    // InternalOCLinEcore.g:23764:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
     public final void rule__NestedExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23766:1: ( ( ')' ) )
-            // InternalOCLinEcore.g:23767:1: ( ')' )
+            // InternalOCLinEcore.g:23768:1: ( ( ')' ) )
+            // InternalOCLinEcore.g:23769:1: ( ')' )
             {
-            // InternalOCLinEcore.g:23767:1: ( ')' )
-            // InternalOCLinEcore.g:23768:1: ')'
+            // InternalOCLinEcore.g:23769:1: ( ')' )
+            // InternalOCLinEcore.g:23770:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
@@ -70392,14 +70392,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0"
-    // InternalOCLinEcore.g:23787:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
+    // InternalOCLinEcore.g:23789:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
     public final void rule__SelfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23791:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
-            // InternalOCLinEcore.g:23792:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
+            // InternalOCLinEcore.g:23793:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
+            // InternalOCLinEcore.g:23794:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_120);
             rule__SelfExpCS__Group__0__Impl();
@@ -70430,23 +70430,23 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23799:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:23801:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
     public final void rule__SelfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23803:1: ( ( () ) )
-            // InternalOCLinEcore.g:23804:1: ( () )
+            // InternalOCLinEcore.g:23805:1: ( ( () ) )
+            // InternalOCLinEcore.g:23806:1: ( () )
             {
-            // InternalOCLinEcore.g:23804:1: ( () )
-            // InternalOCLinEcore.g:23805:1: ()
+            // InternalOCLinEcore.g:23806:1: ( () )
+            // InternalOCLinEcore.g:23807:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
             }
-            // InternalOCLinEcore.g:23806:1: ()
-            // InternalOCLinEcore.g:23808:1:
+            // InternalOCLinEcore.g:23808:1: ()
+            // InternalOCLinEcore.g:23810:1:
             {
             }
 
@@ -70471,14 +70471,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1"
-    // InternalOCLinEcore.g:23818:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:23820:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
     public final void rule__SelfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23822:1: ( rule__SelfExpCS__Group__1__Impl )
-            // InternalOCLinEcore.g:23823:2: rule__SelfExpCS__Group__1__Impl
+            // InternalOCLinEcore.g:23824:1: ( rule__SelfExpCS__Group__1__Impl )
+            // InternalOCLinEcore.g:23825:2: rule__SelfExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SelfExpCS__Group__1__Impl();
@@ -70504,17 +70504,17 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1__Impl"
-    // InternalOCLinEcore.g:23829:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
+    // InternalOCLinEcore.g:23831:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
     public final void rule__SelfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23833:1: ( ( 'self' ) )
-            // InternalOCLinEcore.g:23834:1: ( 'self' )
+            // InternalOCLinEcore.g:23835:1: ( ( 'self' ) )
+            // InternalOCLinEcore.g:23836:1: ( 'self' )
             {
-            // InternalOCLinEcore.g:23834:1: ( 'self' )
-            // InternalOCLinEcore.g:23835:1: 'self'
+            // InternalOCLinEcore.g:23836:1: ( 'self' )
+            // InternalOCLinEcore.g:23837:1: 'self'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
@@ -70545,14 +70545,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0"
-    // InternalOCLinEcore.g:23852:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
+    // InternalOCLinEcore.g:23854:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
     public final void rule__MultiplicityBoundsCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23856:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
-            // InternalOCLinEcore.g:23857:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
+            // InternalOCLinEcore.g:23858:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
+            // InternalOCLinEcore.g:23859:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_92);
             rule__MultiplicityBoundsCS__Group__0__Impl();
@@ -70583,23 +70583,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23864:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:23866:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23868:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
-            // InternalOCLinEcore.g:23869:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalOCLinEcore.g:23870:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
+            // InternalOCLinEcore.g:23871:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:23869:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
-            // InternalOCLinEcore.g:23870:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalOCLinEcore.g:23871:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalOCLinEcore.g:23872:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
             }
-            // InternalOCLinEcore.g:23871:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
-            // InternalOCLinEcore.g:23871:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
+            // InternalOCLinEcore.g:23873:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalOCLinEcore.g:23873:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__LowerBoundAssignment_0();
@@ -70634,14 +70634,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1"
-    // InternalOCLinEcore.g:23881:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:23883:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23885:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
-            // InternalOCLinEcore.g:23886:2: rule__MultiplicityBoundsCS__Group__1__Impl
+            // InternalOCLinEcore.g:23887:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
+            // InternalOCLinEcore.g:23888:2: rule__MultiplicityBoundsCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group__1__Impl();
@@ -70667,22 +70667,22 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1__Impl"
-    // InternalOCLinEcore.g:23892:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:23894:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
     public final void rule__MultiplicityBoundsCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23896:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:23897:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:23898:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:23899:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:23897:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:23898:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalOCLinEcore.g:23899:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:23900:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:23899:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalOCLinEcore.g:23901:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             int alt234=2;
             int LA234_0 = input.LA(1);
 
@@ -70691,7 +70691,7 @@
             }
             switch (alt234) {
                 case 1 :
-                    // InternalOCLinEcore.g:23899:2: rule__MultiplicityBoundsCS__Group_1__0
+                    // InternalOCLinEcore.g:23901:2: rule__MultiplicityBoundsCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityBoundsCS__Group_1__0();
@@ -70729,14 +70729,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0"
-    // InternalOCLinEcore.g:23913:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
+    // InternalOCLinEcore.g:23915:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
     public final void rule__MultiplicityBoundsCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23917:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
-            // InternalOCLinEcore.g:23918:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
+            // InternalOCLinEcore.g:23919:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
+            // InternalOCLinEcore.g:23920:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_121);
             rule__MultiplicityBoundsCS__Group_1__0__Impl();
@@ -70767,17 +70767,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:23925:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
+    // InternalOCLinEcore.g:23927:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23929:1: ( ( '..' ) )
-            // InternalOCLinEcore.g:23930:1: ( '..' )
+            // InternalOCLinEcore.g:23931:1: ( ( '..' ) )
+            // InternalOCLinEcore.g:23932:1: ( '..' )
             {
-            // InternalOCLinEcore.g:23930:1: ( '..' )
-            // InternalOCLinEcore.g:23931:1: '..'
+            // InternalOCLinEcore.g:23932:1: ( '..' )
+            // InternalOCLinEcore.g:23933:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
@@ -70808,14 +70808,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1"
-    // InternalOCLinEcore.g:23944:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:23946:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23948:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:23949:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:23950:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:23951:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group_1__1__Impl();
@@ -70841,23 +70841,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:23955:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:23957:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23959:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:23960:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalOCLinEcore.g:23961:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:23962:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:23960:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
-            // InternalOCLinEcore.g:23961:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalOCLinEcore.g:23962:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalOCLinEcore.g:23963:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
             }
-            // InternalOCLinEcore.g:23962:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
-            // InternalOCLinEcore.g:23962:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
+            // InternalOCLinEcore.g:23964:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalOCLinEcore.g:23964:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1();
@@ -70892,14 +70892,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0"
-    // InternalOCLinEcore.g:23976:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
+    // InternalOCLinEcore.g:23978:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
     public final void rule__MultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23980:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
-            // InternalOCLinEcore.g:23981:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
+            // InternalOCLinEcore.g:23982:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
+            // InternalOCLinEcore.g:23983:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_122);
             rule__MultiplicityCS__Group__0__Impl();
@@ -70930,17 +70930,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0__Impl"
-    // InternalOCLinEcore.g:23988:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
+    // InternalOCLinEcore.g:23990:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
     public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:23992:1: ( ( '[' ) )
-            // InternalOCLinEcore.g:23993:1: ( '[' )
+            // InternalOCLinEcore.g:23994:1: ( ( '[' ) )
+            // InternalOCLinEcore.g:23995:1: ( '[' )
             {
-            // InternalOCLinEcore.g:23993:1: ( '[' )
-            // InternalOCLinEcore.g:23994:1: '['
+            // InternalOCLinEcore.g:23995:1: ( '[' )
+            // InternalOCLinEcore.g:23996:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
@@ -70971,14 +70971,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1"
-    // InternalOCLinEcore.g:24007:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
+    // InternalOCLinEcore.g:24009:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
     public final void rule__MultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24011:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
-            // InternalOCLinEcore.g:24012:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
+            // InternalOCLinEcore.g:24013:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
+            // InternalOCLinEcore.g:24014:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_123);
             rule__MultiplicityCS__Group__1__Impl();
@@ -71009,23 +71009,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1__Impl"
-    // InternalOCLinEcore.g:24019:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
+    // InternalOCLinEcore.g:24021:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
     public final void rule__MultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24023:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
-            // InternalOCLinEcore.g:24024:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalOCLinEcore.g:24025:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
+            // InternalOCLinEcore.g:24026:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
             {
-            // InternalOCLinEcore.g:24024:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
-            // InternalOCLinEcore.g:24025:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalOCLinEcore.g:24026:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalOCLinEcore.g:24027:1: ( rule__MultiplicityCS__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
             }
-            // InternalOCLinEcore.g:24026:1: ( rule__MultiplicityCS__Alternatives_1 )
-            // InternalOCLinEcore.g:24026:2: rule__MultiplicityCS__Alternatives_1
+            // InternalOCLinEcore.g:24028:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalOCLinEcore.g:24028:2: rule__MultiplicityCS__Alternatives_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Alternatives_1();
@@ -71060,14 +71060,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2"
-    // InternalOCLinEcore.g:24036:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
+    // InternalOCLinEcore.g:24038:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
     public final void rule__MultiplicityCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24040:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
-            // InternalOCLinEcore.g:24041:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
+            // InternalOCLinEcore.g:24042:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
+            // InternalOCLinEcore.g:24043:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_123);
             rule__MultiplicityCS__Group__2__Impl();
@@ -71098,22 +71098,22 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2__Impl"
-    // InternalOCLinEcore.g:24048:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
+    // InternalOCLinEcore.g:24050:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
     public final void rule__MultiplicityCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24052:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
-            // InternalOCLinEcore.g:24053:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalOCLinEcore.g:24054:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
+            // InternalOCLinEcore.g:24055:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
             {
-            // InternalOCLinEcore.g:24053:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
-            // InternalOCLinEcore.g:24054:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalOCLinEcore.g:24055:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalOCLinEcore.g:24056:1: ( rule__MultiplicityCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
             }
-            // InternalOCLinEcore.g:24055:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalOCLinEcore.g:24057:1: ( rule__MultiplicityCS__Alternatives_2 )?
             int alt235=2;
             int LA235_0 = input.LA(1);
 
@@ -71122,7 +71122,7 @@
             }
             switch (alt235) {
                 case 1 :
-                    // InternalOCLinEcore.g:24055:2: rule__MultiplicityCS__Alternatives_2
+                    // InternalOCLinEcore.g:24057:2: rule__MultiplicityCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__Alternatives_2();
@@ -71160,14 +71160,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3"
-    // InternalOCLinEcore.g:24065:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
+    // InternalOCLinEcore.g:24067:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
     public final void rule__MultiplicityCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24069:1: ( rule__MultiplicityCS__Group__3__Impl )
-            // InternalOCLinEcore.g:24070:2: rule__MultiplicityCS__Group__3__Impl
+            // InternalOCLinEcore.g:24071:1: ( rule__MultiplicityCS__Group__3__Impl )
+            // InternalOCLinEcore.g:24072:2: rule__MultiplicityCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Group__3__Impl();
@@ -71193,17 +71193,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3__Impl"
-    // InternalOCLinEcore.g:24076:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
+    // InternalOCLinEcore.g:24078:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
     public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24080:1: ( ( ']' ) )
-            // InternalOCLinEcore.g:24081:1: ( ']' )
+            // InternalOCLinEcore.g:24082:1: ( ( ']' ) )
+            // InternalOCLinEcore.g:24083:1: ( ']' )
             {
-            // InternalOCLinEcore.g:24081:1: ( ']' )
-            // InternalOCLinEcore.g:24082:1: ']'
+            // InternalOCLinEcore.g:24083:1: ( ']' )
+            // InternalOCLinEcore.g:24084:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
@@ -71234,14 +71234,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0"
-    // InternalOCLinEcore.g:24103:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
+    // InternalOCLinEcore.g:24105:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
     public final void rule__PathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24107:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
-            // InternalOCLinEcore.g:24108:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
+            // InternalOCLinEcore.g:24109:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
+            // InternalOCLinEcore.g:24110:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_86);
             rule__PathNameCS__Group__0__Impl();
@@ -71272,23 +71272,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0__Impl"
-    // InternalOCLinEcore.g:24115:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:24117:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__PathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24119:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalOCLinEcore.g:24120:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLinEcore.g:24121:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalOCLinEcore.g:24122:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:24120:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalOCLinEcore.g:24121:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLinEcore.g:24122:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLinEcore.g:24123:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalOCLinEcore.g:24122:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalOCLinEcore.g:24122:2: rule__PathNameCS__OwnedPathElementsAssignment_0
+            // InternalOCLinEcore.g:24124:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLinEcore.g:24124:2: rule__PathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_0();
@@ -71323,14 +71323,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1"
-    // InternalOCLinEcore.g:24132:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:24134:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
     public final void rule__PathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24136:1: ( rule__PathNameCS__Group__1__Impl )
-            // InternalOCLinEcore.g:24137:2: rule__PathNameCS__Group__1__Impl
+            // InternalOCLinEcore.g:24138:1: ( rule__PathNameCS__Group__1__Impl )
+            // InternalOCLinEcore.g:24139:2: rule__PathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group__1__Impl();
@@ -71356,22 +71356,22 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1__Impl"
-    // InternalOCLinEcore.g:24143:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
+    // InternalOCLinEcore.g:24145:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
     public final void rule__PathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24147:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
-            // InternalOCLinEcore.g:24148:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalOCLinEcore.g:24149:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
+            // InternalOCLinEcore.g:24150:1: ( ( rule__PathNameCS__Group_1__0 )* )
             {
-            // InternalOCLinEcore.g:24148:1: ( ( rule__PathNameCS__Group_1__0 )* )
-            // InternalOCLinEcore.g:24149:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalOCLinEcore.g:24150:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalOCLinEcore.g:24151:1: ( rule__PathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:24150:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalOCLinEcore.g:24152:1: ( rule__PathNameCS__Group_1__0 )*
             loop236:
             do {
                 int alt236=2;
@@ -71384,7 +71384,7 @@
 
                 switch (alt236) {
             	case 1 :
-            	    // InternalOCLinEcore.g:24150:2: rule__PathNameCS__Group_1__0
+            	    // InternalOCLinEcore.g:24152:2: rule__PathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_87);
             	    rule__PathNameCS__Group_1__0();
@@ -71425,14 +71425,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0"
-    // InternalOCLinEcore.g:24164:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
+    // InternalOCLinEcore.g:24166:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
     public final void rule__PathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24168:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
-            // InternalOCLinEcore.g:24169:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
+            // InternalOCLinEcore.g:24170:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
+            // InternalOCLinEcore.g:24171:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_88);
             rule__PathNameCS__Group_1__0__Impl();
@@ -71463,17 +71463,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:24176:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalOCLinEcore.g:24178:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24180:1: ( ( '::' ) )
-            // InternalOCLinEcore.g:24181:1: ( '::' )
+            // InternalOCLinEcore.g:24182:1: ( ( '::' ) )
+            // InternalOCLinEcore.g:24183:1: ( '::' )
             {
-            // InternalOCLinEcore.g:24181:1: ( '::' )
-            // InternalOCLinEcore.g:24182:1: '::'
+            // InternalOCLinEcore.g:24183:1: ( '::' )
+            // InternalOCLinEcore.g:24184:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
@@ -71504,14 +71504,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1"
-    // InternalOCLinEcore.g:24195:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:24197:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
     public final void rule__PathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24199:1: ( rule__PathNameCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:24200:2: rule__PathNameCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:24201:1: ( rule__PathNameCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:24202:2: rule__PathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group_1__1__Impl();
@@ -71537,23 +71537,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:24206:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:24208:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__PathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24210:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:24211:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:24212:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:24213:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:24211:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalOCLinEcore.g:24212:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLinEcore.g:24213:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:24214:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalOCLinEcore.g:24213:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalOCLinEcore.g:24213:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalOCLinEcore.g:24215:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLinEcore.g:24215:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_1_1();
@@ -71588,14 +71588,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0"
-    // InternalOCLinEcore.g:24227:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
+    // InternalOCLinEcore.g:24231:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
     public final void rule__TemplateBindingCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24231:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
-            // InternalOCLinEcore.g:24232:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
+            // InternalOCLinEcore.g:24235:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
+            // InternalOCLinEcore.g:24236:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_124);
             rule__TemplateBindingCS__Group__0__Impl();
@@ -71626,23 +71626,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0__Impl"
-    // InternalOCLinEcore.g:24239:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:24243:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
     public final void rule__TemplateBindingCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24243:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
-            // InternalOCLinEcore.g:24244:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalOCLinEcore.g:24247:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
+            // InternalOCLinEcore.g:24248:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:24244:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
-            // InternalOCLinEcore.g:24245:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalOCLinEcore.g:24248:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalOCLinEcore.g:24249:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
             }
-            // InternalOCLinEcore.g:24246:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
-            // InternalOCLinEcore.g:24246:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
+            // InternalOCLinEcore.g:24250:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalOCLinEcore.g:24250:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0();
@@ -71677,14 +71677,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1"
-    // InternalOCLinEcore.g:24256:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
+    // InternalOCLinEcore.g:24260:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
     public final void rule__TemplateBindingCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24260:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
-            // InternalOCLinEcore.g:24261:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
+            // InternalOCLinEcore.g:24264:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
+            // InternalOCLinEcore.g:24265:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_124);
             rule__TemplateBindingCS__Group__1__Impl();
@@ -71715,22 +71715,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1__Impl"
-    // InternalOCLinEcore.g:24268:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
+    // InternalOCLinEcore.g:24272:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
     public final void rule__TemplateBindingCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24272:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
-            // InternalOCLinEcore.g:24273:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalOCLinEcore.g:24276:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
+            // InternalOCLinEcore.g:24277:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
             {
-            // InternalOCLinEcore.g:24273:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
-            // InternalOCLinEcore.g:24274:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalOCLinEcore.g:24277:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalOCLinEcore.g:24278:1: ( rule__TemplateBindingCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:24275:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalOCLinEcore.g:24279:1: ( rule__TemplateBindingCS__Group_1__0 )*
             loop237:
             do {
                 int alt237=2;
@@ -71743,7 +71743,7 @@
 
                 switch (alt237) {
             	case 1 :
-            	    // InternalOCLinEcore.g:24275:2: rule__TemplateBindingCS__Group_1__0
+            	    // InternalOCLinEcore.g:24279:2: rule__TemplateBindingCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_20);
             	    rule__TemplateBindingCS__Group_1__0();
@@ -71784,14 +71784,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2"
-    // InternalOCLinEcore.g:24285:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:24289:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
     public final void rule__TemplateBindingCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24289:1: ( rule__TemplateBindingCS__Group__2__Impl )
-            // InternalOCLinEcore.g:24290:2: rule__TemplateBindingCS__Group__2__Impl
+            // InternalOCLinEcore.g:24293:1: ( rule__TemplateBindingCS__Group__2__Impl )
+            // InternalOCLinEcore.g:24294:2: rule__TemplateBindingCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__2__Impl();
@@ -71817,22 +71817,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2__Impl"
-    // InternalOCLinEcore.g:24296:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
+    // InternalOCLinEcore.g:24300:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
     public final void rule__TemplateBindingCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24300:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
-            // InternalOCLinEcore.g:24301:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalOCLinEcore.g:24304:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
+            // InternalOCLinEcore.g:24305:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
             {
-            // InternalOCLinEcore.g:24301:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
-            // InternalOCLinEcore.g:24302:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalOCLinEcore.g:24305:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalOCLinEcore.g:24306:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
             }
-            // InternalOCLinEcore.g:24303:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalOCLinEcore.g:24307:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             int alt238=2;
             int LA238_0 = input.LA(1);
 
@@ -71841,7 +71841,7 @@
             }
             switch (alt238) {
                 case 1 :
-                    // InternalOCLinEcore.g:24303:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
+                    // InternalOCLinEcore.g:24307:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateBindingCS__OwnedMultiplicityAssignment_2();
@@ -71879,14 +71879,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0"
-    // InternalOCLinEcore.g:24319:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
+    // InternalOCLinEcore.g:24323:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
     public final void rule__TemplateBindingCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24323:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
-            // InternalOCLinEcore.g:24324:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
+            // InternalOCLinEcore.g:24327:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
+            // InternalOCLinEcore.g:24328:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_84);
             rule__TemplateBindingCS__Group_1__0__Impl();
@@ -71917,17 +71917,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:24331:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
+    // InternalOCLinEcore.g:24335:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
     public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24335:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:24336:1: ( ',' )
+            // InternalOCLinEcore.g:24339:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:24340:1: ( ',' )
             {
-            // InternalOCLinEcore.g:24336:1: ( ',' )
-            // InternalOCLinEcore.g:24337:1: ','
+            // InternalOCLinEcore.g:24340:1: ( ',' )
+            // InternalOCLinEcore.g:24341:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
@@ -71958,14 +71958,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1"
-    // InternalOCLinEcore.g:24350:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
+    // InternalOCLinEcore.g:24354:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
     public final void rule__TemplateBindingCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24354:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
-            // InternalOCLinEcore.g:24355:2: rule__TemplateBindingCS__Group_1__1__Impl
+            // InternalOCLinEcore.g:24358:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
+            // InternalOCLinEcore.g:24359:2: rule__TemplateBindingCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group_1__1__Impl();
@@ -71991,23 +71991,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:24361:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:24365:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
     public final void rule__TemplateBindingCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24365:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:24366:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:24369:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:24370:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:24366:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
-            // InternalOCLinEcore.g:24367:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalOCLinEcore.g:24370:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:24371:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
             }
-            // InternalOCLinEcore.g:24368:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
-            // InternalOCLinEcore.g:24368:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
+            // InternalOCLinEcore.g:24372:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalOCLinEcore.g:24372:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1();
@@ -72042,14 +72042,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0"
-    // InternalOCLinEcore.g:24382:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
+    // InternalOCLinEcore.g:24386:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
     public final void rule__TypeParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24386:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
-            // InternalOCLinEcore.g:24387:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
+            // InternalOCLinEcore.g:24390:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
+            // InternalOCLinEcore.g:24391:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_125);
             rule__TypeParameterCS__Group__0__Impl();
@@ -72080,23 +72080,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0__Impl"
-    // InternalOCLinEcore.g:24394:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
+    // InternalOCLinEcore.g:24398:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
     public final void rule__TypeParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24398:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
-            // InternalOCLinEcore.g:24399:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:24402:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
+            // InternalOCLinEcore.g:24403:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
             {
-            // InternalOCLinEcore.g:24399:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
-            // InternalOCLinEcore.g:24400:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:24403:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalOCLinEcore.g:24404:1: ( rule__TypeParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
             }
-            // InternalOCLinEcore.g:24401:1: ( rule__TypeParameterCS__NameAssignment_0 )
-            // InternalOCLinEcore.g:24401:2: rule__TypeParameterCS__NameAssignment_0
+            // InternalOCLinEcore.g:24405:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalOCLinEcore.g:24405:2: rule__TypeParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__NameAssignment_0();
@@ -72131,14 +72131,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1"
-    // InternalOCLinEcore.g:24411:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
+    // InternalOCLinEcore.g:24415:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
     public final void rule__TypeParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24415:1: ( rule__TypeParameterCS__Group__1__Impl )
-            // InternalOCLinEcore.g:24416:2: rule__TypeParameterCS__Group__1__Impl
+            // InternalOCLinEcore.g:24419:1: ( rule__TypeParameterCS__Group__1__Impl )
+            // InternalOCLinEcore.g:24420:2: rule__TypeParameterCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__1__Impl();
@@ -72164,22 +72164,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1__Impl"
-    // InternalOCLinEcore.g:24422:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
+    // InternalOCLinEcore.g:24426:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
     public final void rule__TypeParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24426:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
-            // InternalOCLinEcore.g:24427:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:24430:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
+            // InternalOCLinEcore.g:24431:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
             {
-            // InternalOCLinEcore.g:24427:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
-            // InternalOCLinEcore.g:24428:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalOCLinEcore.g:24431:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalOCLinEcore.g:24432:1: ( rule__TypeParameterCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
             }
-            // InternalOCLinEcore.g:24429:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalOCLinEcore.g:24433:1: ( rule__TypeParameterCS__Group_1__0 )?
             int alt239=2;
             int LA239_0 = input.LA(1);
 
@@ -72188,7 +72188,7 @@
             }
             switch (alt239) {
                 case 1 :
-                    // InternalOCLinEcore.g:24429:2: rule__TypeParameterCS__Group_1__0
+                    // InternalOCLinEcore.g:24433:2: rule__TypeParameterCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeParameterCS__Group_1__0();
@@ -72226,14 +72226,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0"
-    // InternalOCLinEcore.g:24443:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
+    // InternalOCLinEcore.g:24447:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
     public final void rule__TypeParameterCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24447:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
-            // InternalOCLinEcore.g:24448:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
+            // InternalOCLinEcore.g:24451:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
+            // InternalOCLinEcore.g:24452:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__TypeParameterCS__Group_1__0__Impl();
@@ -72264,17 +72264,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0__Impl"
-    // InternalOCLinEcore.g:24455:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
+    // InternalOCLinEcore.g:24459:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
     public final void rule__TypeParameterCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24459:1: ( ( 'extends' ) )
-            // InternalOCLinEcore.g:24460:1: ( 'extends' )
+            // InternalOCLinEcore.g:24463:1: ( ( 'extends' ) )
+            // InternalOCLinEcore.g:24464:1: ( 'extends' )
             {
-            // InternalOCLinEcore.g:24460:1: ( 'extends' )
-            // InternalOCLinEcore.g:24461:1: 'extends'
+            // InternalOCLinEcore.g:24464:1: ( 'extends' )
+            // InternalOCLinEcore.g:24465:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
@@ -72305,14 +72305,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1"
-    // InternalOCLinEcore.g:24474:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
+    // InternalOCLinEcore.g:24478:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
     public final void rule__TypeParameterCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24478:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
-            // InternalOCLinEcore.g:24479:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
+            // InternalOCLinEcore.g:24482:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
+            // InternalOCLinEcore.g:24483:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_126);
             rule__TypeParameterCS__Group_1__1__Impl();
@@ -72343,23 +72343,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1__Impl"
-    // InternalOCLinEcore.g:24486:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
+    // InternalOCLinEcore.g:24490:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24490:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
-            // InternalOCLinEcore.g:24491:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:24494:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
+            // InternalOCLinEcore.g:24495:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
             {
-            // InternalOCLinEcore.g:24491:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
-            // InternalOCLinEcore.g:24492:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalOCLinEcore.g:24495:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalOCLinEcore.g:24496:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
             }
-            // InternalOCLinEcore.g:24493:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
-            // InternalOCLinEcore.g:24493:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
+            // InternalOCLinEcore.g:24497:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalOCLinEcore.g:24497:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_1();
@@ -72394,14 +72394,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2"
-    // InternalOCLinEcore.g:24503:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
+    // InternalOCLinEcore.g:24507:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
     public final void rule__TypeParameterCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24507:1: ( rule__TypeParameterCS__Group_1__2__Impl )
-            // InternalOCLinEcore.g:24508:2: rule__TypeParameterCS__Group_1__2__Impl
+            // InternalOCLinEcore.g:24511:1: ( rule__TypeParameterCS__Group_1__2__Impl )
+            // InternalOCLinEcore.g:24512:2: rule__TypeParameterCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1__2__Impl();
@@ -72427,22 +72427,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2__Impl"
-    // InternalOCLinEcore.g:24514:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
+    // InternalOCLinEcore.g:24518:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
     public final void rule__TypeParameterCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24518:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
-            // InternalOCLinEcore.g:24519:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalOCLinEcore.g:24522:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
+            // InternalOCLinEcore.g:24523:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
             {
-            // InternalOCLinEcore.g:24519:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
-            // InternalOCLinEcore.g:24520:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalOCLinEcore.g:24523:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalOCLinEcore.g:24524:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
             }
-            // InternalOCLinEcore.g:24521:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalOCLinEcore.g:24525:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             loop240:
             do {
                 int alt240=2;
@@ -72455,7 +72455,7 @@
 
                 switch (alt240) {
             	case 1 :
-            	    // InternalOCLinEcore.g:24521:2: rule__TypeParameterCS__Group_1_2__0
+            	    // InternalOCLinEcore.g:24525:2: rule__TypeParameterCS__Group_1_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_127);
             	    rule__TypeParameterCS__Group_1_2__0();
@@ -72496,14 +72496,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0"
-    // InternalOCLinEcore.g:24537:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
+    // InternalOCLinEcore.g:24541:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
     public final void rule__TypeParameterCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24541:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
-            // InternalOCLinEcore.g:24542:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
+            // InternalOCLinEcore.g:24545:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
+            // InternalOCLinEcore.g:24546:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__TypeParameterCS__Group_1_2__0__Impl();
@@ -72534,17 +72534,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0__Impl"
-    // InternalOCLinEcore.g:24549:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
+    // InternalOCLinEcore.g:24553:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
     public final void rule__TypeParameterCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24553:1: ( ( '&&' ) )
-            // InternalOCLinEcore.g:24554:1: ( '&&' )
+            // InternalOCLinEcore.g:24557:1: ( ( '&&' ) )
+            // InternalOCLinEcore.g:24558:1: ( '&&' )
             {
-            // InternalOCLinEcore.g:24554:1: ( '&&' )
-            // InternalOCLinEcore.g:24555:1: '&&'
+            // InternalOCLinEcore.g:24558:1: ( '&&' )
+            // InternalOCLinEcore.g:24559:1: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
@@ -72575,14 +72575,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1"
-    // InternalOCLinEcore.g:24568:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
+    // InternalOCLinEcore.g:24572:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
     public final void rule__TypeParameterCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24572:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
-            // InternalOCLinEcore.g:24573:2: rule__TypeParameterCS__Group_1_2__1__Impl
+            // InternalOCLinEcore.g:24576:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
+            // InternalOCLinEcore.g:24577:2: rule__TypeParameterCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1_2__1__Impl();
@@ -72608,23 +72608,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1__Impl"
-    // InternalOCLinEcore.g:24579:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
+    // InternalOCLinEcore.g:24583:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24583:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
-            // InternalOCLinEcore.g:24584:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalOCLinEcore.g:24587:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
+            // InternalOCLinEcore.g:24588:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
             {
-            // InternalOCLinEcore.g:24584:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
-            // InternalOCLinEcore.g:24585:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalOCLinEcore.g:24588:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalOCLinEcore.g:24589:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
             }
-            // InternalOCLinEcore.g:24586:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
-            // InternalOCLinEcore.g:24586:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
+            // InternalOCLinEcore.g:24590:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalOCLinEcore.g:24590:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1();
@@ -72659,14 +72659,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0"
-    // InternalOCLinEcore.g:24600:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
+    // InternalOCLinEcore.g:24604:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
     public final void rule__WildcardTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24604:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
-            // InternalOCLinEcore.g:24605:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
+            // InternalOCLinEcore.g:24608:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
+            // InternalOCLinEcore.g:24609:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_84);
             rule__WildcardTypeRefCS__Group__0__Impl();
@@ -72697,23 +72697,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0__Impl"
-    // InternalOCLinEcore.g:24612:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
+    // InternalOCLinEcore.g:24616:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
     public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24616:1: ( ( () ) )
-            // InternalOCLinEcore.g:24617:1: ( () )
+            // InternalOCLinEcore.g:24620:1: ( ( () ) )
+            // InternalOCLinEcore.g:24621:1: ( () )
             {
-            // InternalOCLinEcore.g:24617:1: ( () )
-            // InternalOCLinEcore.g:24618:1: ()
+            // InternalOCLinEcore.g:24621:1: ( () )
+            // InternalOCLinEcore.g:24622:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
             }
-            // InternalOCLinEcore.g:24619:1: ()
-            // InternalOCLinEcore.g:24621:1:
+            // InternalOCLinEcore.g:24623:1: ()
+            // InternalOCLinEcore.g:24625:1:
             {
             }
 
@@ -72738,14 +72738,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1"
-    // InternalOCLinEcore.g:24631:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
+    // InternalOCLinEcore.g:24635:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
     public final void rule__WildcardTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24635:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
-            // InternalOCLinEcore.g:24636:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
+            // InternalOCLinEcore.g:24639:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
+            // InternalOCLinEcore.g:24640:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_125);
             rule__WildcardTypeRefCS__Group__1__Impl();
@@ -72776,17 +72776,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1__Impl"
-    // InternalOCLinEcore.g:24643:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
+    // InternalOCLinEcore.g:24647:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
     public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24647:1: ( ( '?' ) )
-            // InternalOCLinEcore.g:24648:1: ( '?' )
+            // InternalOCLinEcore.g:24651:1: ( ( '?' ) )
+            // InternalOCLinEcore.g:24652:1: ( '?' )
             {
-            // InternalOCLinEcore.g:24648:1: ( '?' )
-            // InternalOCLinEcore.g:24649:1: '?'
+            // InternalOCLinEcore.g:24652:1: ( '?' )
+            // InternalOCLinEcore.g:24653:1: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
@@ -72817,14 +72817,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2"
-    // InternalOCLinEcore.g:24662:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
+    // InternalOCLinEcore.g:24666:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
     public final void rule__WildcardTypeRefCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24666:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
-            // InternalOCLinEcore.g:24667:2: rule__WildcardTypeRefCS__Group__2__Impl
+            // InternalOCLinEcore.g:24670:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
+            // InternalOCLinEcore.g:24671:2: rule__WildcardTypeRefCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__2__Impl();
@@ -72850,22 +72850,22 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2__Impl"
-    // InternalOCLinEcore.g:24673:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
+    // InternalOCLinEcore.g:24677:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
     public final void rule__WildcardTypeRefCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24677:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
-            // InternalOCLinEcore.g:24678:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:24681:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
+            // InternalOCLinEcore.g:24682:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
             {
-            // InternalOCLinEcore.g:24678:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
-            // InternalOCLinEcore.g:24679:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalOCLinEcore.g:24682:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalOCLinEcore.g:24683:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
             }
-            // InternalOCLinEcore.g:24680:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalOCLinEcore.g:24684:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             int alt241=2;
             int LA241_0 = input.LA(1);
 
@@ -72874,7 +72874,7 @@
             }
             switch (alt241) {
                 case 1 :
-                    // InternalOCLinEcore.g:24680:2: rule__WildcardTypeRefCS__Group_2__0
+                    // InternalOCLinEcore.g:24684:2: rule__WildcardTypeRefCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__WildcardTypeRefCS__Group_2__0();
@@ -72912,14 +72912,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0"
-    // InternalOCLinEcore.g:24696:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
+    // InternalOCLinEcore.g:24700:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
     public final void rule__WildcardTypeRefCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24700:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
-            // InternalOCLinEcore.g:24701:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
+            // InternalOCLinEcore.g:24704:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
+            // InternalOCLinEcore.g:24705:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_28);
             rule__WildcardTypeRefCS__Group_2__0__Impl();
@@ -72950,17 +72950,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0__Impl"
-    // InternalOCLinEcore.g:24708:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
+    // InternalOCLinEcore.g:24712:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
     public final void rule__WildcardTypeRefCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24712:1: ( ( 'extends' ) )
-            // InternalOCLinEcore.g:24713:1: ( 'extends' )
+            // InternalOCLinEcore.g:24716:1: ( ( 'extends' ) )
+            // InternalOCLinEcore.g:24717:1: ( 'extends' )
             {
-            // InternalOCLinEcore.g:24713:1: ( 'extends' )
-            // InternalOCLinEcore.g:24714:1: 'extends'
+            // InternalOCLinEcore.g:24717:1: ( 'extends' )
+            // InternalOCLinEcore.g:24718:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
@@ -72991,14 +72991,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1"
-    // InternalOCLinEcore.g:24727:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
+    // InternalOCLinEcore.g:24731:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
     public final void rule__WildcardTypeRefCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24731:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
-            // InternalOCLinEcore.g:24732:2: rule__WildcardTypeRefCS__Group_2__1__Impl
+            // InternalOCLinEcore.g:24735:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
+            // InternalOCLinEcore.g:24736:2: rule__WildcardTypeRefCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group_2__1__Impl();
@@ -73024,23 +73024,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1__Impl"
-    // InternalOCLinEcore.g:24738:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
+    // InternalOCLinEcore.g:24742:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
     public final void rule__WildcardTypeRefCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24742:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
-            // InternalOCLinEcore.g:24743:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalOCLinEcore.g:24746:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
+            // InternalOCLinEcore.g:24747:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
             {
-            // InternalOCLinEcore.g:24743:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
-            // InternalOCLinEcore.g:24744:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalOCLinEcore.g:24747:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalOCLinEcore.g:24748:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
             }
-            // InternalOCLinEcore.g:24745:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
-            // InternalOCLinEcore.g:24745:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
+            // InternalOCLinEcore.g:24749:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalOCLinEcore.g:24749:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1();
@@ -73075,17 +73075,17 @@
 
 
     // $ANTLR start "rule__TopLevelCS__OwnedImportsAssignment_2"
-    // InternalOCLinEcore.g:24760:1: rule__TopLevelCS__OwnedImportsAssignment_2 : ( ruleImportCS ) ;
+    // InternalOCLinEcore.g:24764:1: rule__TopLevelCS__OwnedImportsAssignment_2 : ( ruleImportCS ) ;
     public final void rule__TopLevelCS__OwnedImportsAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24764:1: ( ( ruleImportCS ) )
-            // InternalOCLinEcore.g:24765:1: ( ruleImportCS )
+            // InternalOCLinEcore.g:24768:1: ( ( ruleImportCS ) )
+            // InternalOCLinEcore.g:24769:1: ( ruleImportCS )
             {
-            // InternalOCLinEcore.g:24765:1: ( ruleImportCS )
-            // InternalOCLinEcore.g:24766:1: ruleImportCS
+            // InternalOCLinEcore.g:24769:1: ( ruleImportCS )
+            // InternalOCLinEcore.g:24770:1: ruleImportCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getOwnedImportsImportCSParserRuleCall_2_0());
@@ -73120,17 +73120,17 @@
 
 
     // $ANTLR start "rule__TopLevelCS__OwnedPackagesAssignment_3"
-    // InternalOCLinEcore.g:24775:1: rule__TopLevelCS__OwnedPackagesAssignment_3 : ( rulePackageCS ) ;
+    // InternalOCLinEcore.g:24779:1: rule__TopLevelCS__OwnedPackagesAssignment_3 : ( rulePackageCS ) ;
     public final void rule__TopLevelCS__OwnedPackagesAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24779:1: ( ( rulePackageCS ) )
-            // InternalOCLinEcore.g:24780:1: ( rulePackageCS )
+            // InternalOCLinEcore.g:24783:1: ( ( rulePackageCS ) )
+            // InternalOCLinEcore.g:24784:1: ( rulePackageCS )
             {
-            // InternalOCLinEcore.g:24780:1: ( rulePackageCS )
-            // InternalOCLinEcore.g:24781:1: rulePackageCS
+            // InternalOCLinEcore.g:24784:1: ( rulePackageCS )
+            // InternalOCLinEcore.g:24785:1: rulePackageCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTopLevelCSAccess().getOwnedPackagesPackageCSParserRuleCall_3_0());
@@ -73165,23 +73165,23 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__IsCallableAssignment_0"
-    // InternalOCLinEcore.g:24790:1: rule__InvariantConstraintCS__IsCallableAssignment_0 : ( ( 'callable' ) ) ;
+    // InternalOCLinEcore.g:24794:1: rule__InvariantConstraintCS__IsCallableAssignment_0 : ( ( 'callable' ) ) ;
     public final void rule__InvariantConstraintCS__IsCallableAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24794:1: ( ( ( 'callable' ) ) )
-            // InternalOCLinEcore.g:24795:1: ( ( 'callable' ) )
+            // InternalOCLinEcore.g:24798:1: ( ( ( 'callable' ) ) )
+            // InternalOCLinEcore.g:24799:1: ( ( 'callable' ) )
             {
-            // InternalOCLinEcore.g:24795:1: ( ( 'callable' ) )
-            // InternalOCLinEcore.g:24796:1: ( 'callable' )
+            // InternalOCLinEcore.g:24799:1: ( ( 'callable' ) )
+            // InternalOCLinEcore.g:24800:1: ( 'callable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
             }
-            // InternalOCLinEcore.g:24797:1: ( 'callable' )
-            // InternalOCLinEcore.g:24798:1: 'callable'
+            // InternalOCLinEcore.g:24801:1: ( 'callable' )
+            // InternalOCLinEcore.g:24802:1: 'callable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getIsCallableCallableKeyword_0_0());
@@ -73218,23 +73218,23 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__StereotypeAssignment_1"
-    // InternalOCLinEcore.g:24813:1: rule__InvariantConstraintCS__StereotypeAssignment_1 : ( ( 'invariant' ) ) ;
+    // InternalOCLinEcore.g:24817:1: rule__InvariantConstraintCS__StereotypeAssignment_1 : ( ( 'invariant' ) ) ;
     public final void rule__InvariantConstraintCS__StereotypeAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24817:1: ( ( ( 'invariant' ) ) )
-            // InternalOCLinEcore.g:24818:1: ( ( 'invariant' ) )
+            // InternalOCLinEcore.g:24821:1: ( ( ( 'invariant' ) ) )
+            // InternalOCLinEcore.g:24822:1: ( ( 'invariant' ) )
             {
-            // InternalOCLinEcore.g:24818:1: ( ( 'invariant' ) )
-            // InternalOCLinEcore.g:24819:1: ( 'invariant' )
+            // InternalOCLinEcore.g:24822:1: ( ( 'invariant' ) )
+            // InternalOCLinEcore.g:24823:1: ( 'invariant' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
             }
-            // InternalOCLinEcore.g:24820:1: ( 'invariant' )
-            // InternalOCLinEcore.g:24821:1: 'invariant'
+            // InternalOCLinEcore.g:24824:1: ( 'invariant' )
+            // InternalOCLinEcore.g:24825:1: 'invariant'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getStereotypeInvariantKeyword_1_0());
@@ -73271,17 +73271,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__NameAssignment_2_0"
-    // InternalOCLinEcore.g:24836:1: rule__InvariantConstraintCS__NameAssignment_2_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:24840:1: rule__InvariantConstraintCS__NameAssignment_2_0 : ( ruleUnrestrictedName ) ;
     public final void rule__InvariantConstraintCS__NameAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24840:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:24841:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:24844:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:24845:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:24841:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:24842:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:24845:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:24846:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_2_0_0());
@@ -73316,17 +73316,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1"
-    // InternalOCLinEcore.g:24851:1: rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:24855:1: rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__InvariantConstraintCS__OwnedMessageSpecificationAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24855:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:24856:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24859:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:24860:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:24856:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:24857:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:24860:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24861:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_2_1_1_0());
@@ -73361,17 +73361,17 @@
 
 
     // $ANTLR start "rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1"
-    // InternalOCLinEcore.g:24866:1: rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:24870:1: rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1 : ( ruleSpecificationCS ) ;
     public final void rule__InvariantConstraintCS__OwnedSpecificationAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24870:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:24871:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24874:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:24875:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:24871:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:24872:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:24875:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24876:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvariantConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0_1_0());
@@ -73406,23 +73406,23 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__StereotypeAssignment_0"
-    // InternalOCLinEcore.g:24881:1: rule__PostconditionConstraintCS__StereotypeAssignment_0 : ( ( 'postcondition' ) ) ;
+    // InternalOCLinEcore.g:24885:1: rule__PostconditionConstraintCS__StereotypeAssignment_0 : ( ( 'postcondition' ) ) ;
     public final void rule__PostconditionConstraintCS__StereotypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24885:1: ( ( ( 'postcondition' ) ) )
-            // InternalOCLinEcore.g:24886:1: ( ( 'postcondition' ) )
+            // InternalOCLinEcore.g:24889:1: ( ( ( 'postcondition' ) ) )
+            // InternalOCLinEcore.g:24890:1: ( ( 'postcondition' ) )
             {
-            // InternalOCLinEcore.g:24886:1: ( ( 'postcondition' ) )
-            // InternalOCLinEcore.g:24887:1: ( 'postcondition' )
+            // InternalOCLinEcore.g:24890:1: ( ( 'postcondition' ) )
+            // InternalOCLinEcore.g:24891:1: ( 'postcondition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
             }
-            // InternalOCLinEcore.g:24888:1: ( 'postcondition' )
-            // InternalOCLinEcore.g:24889:1: 'postcondition'
+            // InternalOCLinEcore.g:24892:1: ( 'postcondition' )
+            // InternalOCLinEcore.g:24893:1: 'postcondition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getStereotypePostconditionKeyword_0_0());
@@ -73459,17 +73459,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__NameAssignment_1_0"
-    // InternalOCLinEcore.g:24904:1: rule__PostconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:24908:1: rule__PostconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PostconditionConstraintCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24908:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:24909:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:24912:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:24913:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:24909:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:24910:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:24913:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:24914:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
@@ -73504,17 +73504,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1"
-    // InternalOCLinEcore.g:24919:1: rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:24923:1: rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__PostconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24923:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:24924:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24927:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:24928:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:24924:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:24925:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:24928:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24929:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
@@ -73549,17 +73549,17 @@
 
 
     // $ANTLR start "rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3"
-    // InternalOCLinEcore.g:24934:1: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:24938:1: rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
     public final void rule__PostconditionConstraintCS__OwnedSpecificationAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24938:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:24939:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24942:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:24943:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:24939:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:24940:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:24943:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24944:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
@@ -73594,23 +73594,23 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__StereotypeAssignment_0"
-    // InternalOCLinEcore.g:24949:1: rule__PreconditionConstraintCS__StereotypeAssignment_0 : ( ( 'precondition' ) ) ;
+    // InternalOCLinEcore.g:24953:1: rule__PreconditionConstraintCS__StereotypeAssignment_0 : ( ( 'precondition' ) ) ;
     public final void rule__PreconditionConstraintCS__StereotypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24953:1: ( ( ( 'precondition' ) ) )
-            // InternalOCLinEcore.g:24954:1: ( ( 'precondition' ) )
+            // InternalOCLinEcore.g:24957:1: ( ( ( 'precondition' ) ) )
+            // InternalOCLinEcore.g:24958:1: ( ( 'precondition' ) )
             {
-            // InternalOCLinEcore.g:24954:1: ( ( 'precondition' ) )
-            // InternalOCLinEcore.g:24955:1: ( 'precondition' )
+            // InternalOCLinEcore.g:24958:1: ( ( 'precondition' ) )
+            // InternalOCLinEcore.g:24959:1: ( 'precondition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
             }
-            // InternalOCLinEcore.g:24956:1: ( 'precondition' )
-            // InternalOCLinEcore.g:24957:1: 'precondition'
+            // InternalOCLinEcore.g:24960:1: ( 'precondition' )
+            // InternalOCLinEcore.g:24961:1: 'precondition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getStereotypePreconditionKeyword_0_0());
@@ -73647,17 +73647,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__NameAssignment_1_0"
-    // InternalOCLinEcore.g:24972:1: rule__PreconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:24976:1: rule__PreconditionConstraintCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PreconditionConstraintCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24976:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:24977:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:24980:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:24981:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:24977:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:24978:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:24981:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:24982:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
@@ -73692,17 +73692,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1"
-    // InternalOCLinEcore.g:24987:1: rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:24991:1: rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__PreconditionConstraintCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:24991:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:24992:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24995:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:24996:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:24992:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:24993:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:24996:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:24997:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
@@ -73737,17 +73737,17 @@
 
 
     // $ANTLR start "rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3"
-    // InternalOCLinEcore.g:25002:1: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:25006:1: rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
     public final void rule__PreconditionConstraintCS__OwnedSpecificationAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25006:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:25007:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:25010:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:25011:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:25007:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:25008:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:25011:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:25012:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreconditionConstraintCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
@@ -73782,23 +73782,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__NameAssignment_2"
-    // InternalOCLinEcore.g:25017:1: rule__AnnotationCS__NameAssignment_2 : ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) ;
+    // InternalOCLinEcore.g:25021:1: rule__AnnotationCS__NameAssignment_2 : ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) ;
     public final void rule__AnnotationCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25021:1: ( ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) )
-            // InternalOCLinEcore.g:25022:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
+            // InternalOCLinEcore.g:25025:1: ( ( ( rule__AnnotationCS__NameAlternatives_2_0 ) ) )
+            // InternalOCLinEcore.g:25026:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
             {
-            // InternalOCLinEcore.g:25022:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
-            // InternalOCLinEcore.g:25023:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
+            // InternalOCLinEcore.g:25026:1: ( ( rule__AnnotationCS__NameAlternatives_2_0 ) )
+            // InternalOCLinEcore.g:25027:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getNameAlternatives_2_0());
             }
-            // InternalOCLinEcore.g:25024:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
-            // InternalOCLinEcore.g:25024:2: rule__AnnotationCS__NameAlternatives_2_0
+            // InternalOCLinEcore.g:25028:1: ( rule__AnnotationCS__NameAlternatives_2_0 )
+            // InternalOCLinEcore.g:25028:2: rule__AnnotationCS__NameAlternatives_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__NameAlternatives_2_0();
@@ -73833,17 +73833,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedDetailsAssignment_3_1"
-    // InternalOCLinEcore.g:25033:1: rule__AnnotationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
+    // InternalOCLinEcore.g:25037:1: rule__AnnotationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
     public final void rule__AnnotationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25037:1: ( ( ruleDetailCS ) )
-            // InternalOCLinEcore.g:25038:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25041:1: ( ( ruleDetailCS ) )
+            // InternalOCLinEcore.g:25042:1: ( ruleDetailCS )
             {
-            // InternalOCLinEcore.g:25038:1: ( ruleDetailCS )
-            // InternalOCLinEcore.g:25039:1: ruleDetailCS
+            // InternalOCLinEcore.g:25042:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25043:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
@@ -73878,17 +73878,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedDetailsAssignment_3_2_1"
-    // InternalOCLinEcore.g:25048:1: rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
+    // InternalOCLinEcore.g:25052:1: rule__AnnotationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
     public final void rule__AnnotationCS__OwnedDetailsAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25052:1: ( ( ruleDetailCS ) )
-            // InternalOCLinEcore.g:25053:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25056:1: ( ( ruleDetailCS ) )
+            // InternalOCLinEcore.g:25057:1: ( ruleDetailCS )
             {
-            // InternalOCLinEcore.g:25053:1: ( ruleDetailCS )
-            // InternalOCLinEcore.g:25054:1: ruleDetailCS
+            // InternalOCLinEcore.g:25057:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25058:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
@@ -73923,17 +73923,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0"
-    // InternalOCLinEcore.g:25063:1: rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:25067:1: rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__AnnotationCS__OwnedAnnotationsAssignment_4_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25067:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:25068:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25071:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:25072:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:25068:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:25069:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:25072:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25073:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());
@@ -73968,17 +73968,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1"
-    // InternalOCLinEcore.g:25078:1: rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 : ( ruleModelElementCS ) ;
+    // InternalOCLinEcore.g:25082:1: rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1 : ( ruleModelElementCS ) ;
     public final void rule__AnnotationCS__OwnedContentsAssignment_4_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25082:1: ( ( ruleModelElementCS ) )
-            // InternalOCLinEcore.g:25083:1: ( ruleModelElementCS )
+            // InternalOCLinEcore.g:25086:1: ( ( ruleModelElementCS ) )
+            // InternalOCLinEcore.g:25087:1: ( ruleModelElementCS )
             {
-            // InternalOCLinEcore.g:25083:1: ( ruleModelElementCS )
-            // InternalOCLinEcore.g:25084:1: ruleModelElementCS
+            // InternalOCLinEcore.g:25087:1: ( ruleModelElementCS )
+            // InternalOCLinEcore.g:25088:1: ruleModelElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedContentsModelElementCSParserRuleCall_4_0_1_1_0());
@@ -74013,17 +74013,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2"
-    // InternalOCLinEcore.g:25093:1: rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 : ( ruleModelElementRefCS ) ;
+    // InternalOCLinEcore.g:25097:1: rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2 : ( ruleModelElementRefCS ) ;
     public final void rule__AnnotationCS__OwnedReferencesAssignment_4_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25097:1: ( ( ruleModelElementRefCS ) )
-            // InternalOCLinEcore.g:25098:1: ( ruleModelElementRefCS )
+            // InternalOCLinEcore.g:25101:1: ( ( ruleModelElementRefCS ) )
+            // InternalOCLinEcore.g:25102:1: ( ruleModelElementRefCS )
             {
-            // InternalOCLinEcore.g:25098:1: ( ruleModelElementRefCS )
-            // InternalOCLinEcore.g:25099:1: ruleModelElementRefCS
+            // InternalOCLinEcore.g:25102:1: ( ruleModelElementRefCS )
+            // InternalOCLinEcore.g:25103:1: ruleModelElementRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedReferencesModelElementRefCSParserRuleCall_4_0_1_2_0());
@@ -74058,23 +74058,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_0_0"
-    // InternalOCLinEcore.g:25108:1: rule__AttributeCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
+    // InternalOCLinEcore.g:25112:1: rule__AttributeCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25112:1: ( ( ( 'static' ) ) )
-            // InternalOCLinEcore.g:25113:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:25116:1: ( ( ( 'static' ) ) )
+            // InternalOCLinEcore.g:25117:1: ( ( 'static' ) )
             {
-            // InternalOCLinEcore.g:25113:1: ( ( 'static' ) )
-            // InternalOCLinEcore.g:25114:1: ( 'static' )
+            // InternalOCLinEcore.g:25117:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:25118:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
             }
-            // InternalOCLinEcore.g:25115:1: ( 'static' )
-            // InternalOCLinEcore.g:25116:1: 'static'
+            // InternalOCLinEcore.g:25119:1: ( 'static' )
+            // InternalOCLinEcore.g:25120:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());
@@ -74111,23 +74111,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_0_1"
-    // InternalOCLinEcore.g:25131:1: rule__AttributeCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
+    // InternalOCLinEcore.g:25135:1: rule__AttributeCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25135:1: ( ( ( 'definition' ) ) )
-            // InternalOCLinEcore.g:25136:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:25139:1: ( ( ( 'definition' ) ) )
+            // InternalOCLinEcore.g:25140:1: ( ( 'definition' ) )
             {
-            // InternalOCLinEcore.g:25136:1: ( ( 'definition' ) )
-            // InternalOCLinEcore.g:25137:1: ( 'definition' )
+            // InternalOCLinEcore.g:25140:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:25141:1: ( 'definition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
             }
-            // InternalOCLinEcore.g:25138:1: ( 'definition' )
-            // InternalOCLinEcore.g:25139:1: 'definition'
+            // InternalOCLinEcore.g:25142:1: ( 'definition' )
+            // InternalOCLinEcore.g:25143:1: 'definition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
@@ -74164,23 +74164,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_1_0"
-    // InternalOCLinEcore.g:25154:1: rule__AttributeCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
+    // InternalOCLinEcore.g:25158:1: rule__AttributeCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25158:1: ( ( ( 'definition' ) ) )
-            // InternalOCLinEcore.g:25159:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:25162:1: ( ( ( 'definition' ) ) )
+            // InternalOCLinEcore.g:25163:1: ( ( 'definition' ) )
             {
-            // InternalOCLinEcore.g:25159:1: ( ( 'definition' ) )
-            // InternalOCLinEcore.g:25160:1: ( 'definition' )
+            // InternalOCLinEcore.g:25163:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:25164:1: ( 'definition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
             }
-            // InternalOCLinEcore.g:25161:1: ( 'definition' )
-            // InternalOCLinEcore.g:25162:1: 'definition'
+            // InternalOCLinEcore.g:25165:1: ( 'definition' )
+            // InternalOCLinEcore.g:25166:1: 'definition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
@@ -74217,23 +74217,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_0_1_1"
-    // InternalOCLinEcore.g:25177:1: rule__AttributeCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
+    // InternalOCLinEcore.g:25181:1: rule__AttributeCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25181:1: ( ( ( 'static' ) ) )
-            // InternalOCLinEcore.g:25182:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:25185:1: ( ( ( 'static' ) ) )
+            // InternalOCLinEcore.g:25186:1: ( ( 'static' ) )
             {
-            // InternalOCLinEcore.g:25182:1: ( ( 'static' ) )
-            // InternalOCLinEcore.g:25183:1: ( 'static' )
+            // InternalOCLinEcore.g:25186:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:25187:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
             }
-            // InternalOCLinEcore.g:25184:1: ( 'static' )
-            // InternalOCLinEcore.g:25185:1: 'static'
+            // InternalOCLinEcore.g:25188:1: ( 'static' )
+            // InternalOCLinEcore.g:25189:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());
@@ -74270,17 +74270,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__NameAssignment_2"
-    // InternalOCLinEcore.g:25200:1: rule__AttributeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:25204:1: rule__AttributeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
     public final void rule__AttributeCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25204:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:25205:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25208:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:25209:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:25205:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:25206:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:25209:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25210:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
@@ -74315,17 +74315,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__OwnedTypeAssignment_3_1"
-    // InternalOCLinEcore.g:25215:1: rule__AttributeCS__OwnedTypeAssignment_3_1 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLinEcore.g:25219:1: rule__AttributeCS__OwnedTypeAssignment_3_1 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__AttributeCS__OwnedTypeAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25219:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLinEcore.g:25220:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:25223:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLinEcore.g:25224:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLinEcore.g:25220:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLinEcore.g:25221:1: ruleTypedMultiplicityRefCS
+            // InternalOCLinEcore.g:25224:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:25225:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_1_0());
@@ -74360,17 +74360,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__DefaultAssignment_4_1"
-    // InternalOCLinEcore.g:25230:1: rule__AttributeCS__DefaultAssignment_4_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:25234:1: rule__AttributeCS__DefaultAssignment_4_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__AttributeCS__DefaultAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25234:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:25235:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25238:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:25239:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:25235:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:25236:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:25239:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25240:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());
@@ -74401,23 +74401,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_0"
-    // InternalOCLinEcore.g:25245:1: rule__AttributeCS__QualifiersAssignment_5_1_0_0 : ( ( 'derived' ) ) ;
+    // InternalOCLinEcore.g:25249:1: rule__AttributeCS__QualifiersAssignment_5_1_0_0 : ( ( 'derived' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25249:1: ( ( ( 'derived' ) ) )
-            // InternalOCLinEcore.g:25250:1: ( ( 'derived' ) )
+            // InternalOCLinEcore.g:25253:1: ( ( ( 'derived' ) ) )
+            // InternalOCLinEcore.g:25254:1: ( ( 'derived' ) )
             {
-            // InternalOCLinEcore.g:25250:1: ( ( 'derived' ) )
-            // InternalOCLinEcore.g:25251:1: ( 'derived' )
+            // InternalOCLinEcore.g:25254:1: ( ( 'derived' ) )
+            // InternalOCLinEcore.g:25255:1: ( 'derived' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
             }
-            // InternalOCLinEcore.g:25252:1: ( 'derived' )
-            // InternalOCLinEcore.g:25253:1: 'derived'
+            // InternalOCLinEcore.g:25256:1: ( 'derived' )
+            // InternalOCLinEcore.g:25257:1: 'derived'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());
@@ -74454,23 +74454,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_1"
-    // InternalOCLinEcore.g:25268:1: rule__AttributeCS__QualifiersAssignment_5_1_0_1 : ( ( '!derived' ) ) ;
+    // InternalOCLinEcore.g:25272:1: rule__AttributeCS__QualifiersAssignment_5_1_0_1 : ( ( '!derived' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25272:1: ( ( ( '!derived' ) ) )
-            // InternalOCLinEcore.g:25273:1: ( ( '!derived' ) )
+            // InternalOCLinEcore.g:25276:1: ( ( ( '!derived' ) ) )
+            // InternalOCLinEcore.g:25277:1: ( ( '!derived' ) )
             {
-            // InternalOCLinEcore.g:25273:1: ( ( '!derived' ) )
-            // InternalOCLinEcore.g:25274:1: ( '!derived' )
+            // InternalOCLinEcore.g:25277:1: ( ( '!derived' ) )
+            // InternalOCLinEcore.g:25278:1: ( '!derived' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
             }
-            // InternalOCLinEcore.g:25275:1: ( '!derived' )
-            // InternalOCLinEcore.g:25276:1: '!derived'
+            // InternalOCLinEcore.g:25279:1: ( '!derived' )
+            // InternalOCLinEcore.g:25280:1: '!derived'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());
@@ -74507,23 +74507,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_2"
-    // InternalOCLinEcore.g:25291:1: rule__AttributeCS__QualifiersAssignment_5_1_0_2 : ( ( 'id' ) ) ;
+    // InternalOCLinEcore.g:25295:1: rule__AttributeCS__QualifiersAssignment_5_1_0_2 : ( ( 'id' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25295:1: ( ( ( 'id' ) ) )
-            // InternalOCLinEcore.g:25296:1: ( ( 'id' ) )
+            // InternalOCLinEcore.g:25299:1: ( ( ( 'id' ) ) )
+            // InternalOCLinEcore.g:25300:1: ( ( 'id' ) )
             {
-            // InternalOCLinEcore.g:25296:1: ( ( 'id' ) )
-            // InternalOCLinEcore.g:25297:1: ( 'id' )
+            // InternalOCLinEcore.g:25300:1: ( ( 'id' ) )
+            // InternalOCLinEcore.g:25301:1: ( 'id' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
             }
-            // InternalOCLinEcore.g:25298:1: ( 'id' )
-            // InternalOCLinEcore.g:25299:1: 'id'
+            // InternalOCLinEcore.g:25302:1: ( 'id' )
+            // InternalOCLinEcore.g:25303:1: 'id'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());
@@ -74560,23 +74560,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_3"
-    // InternalOCLinEcore.g:25314:1: rule__AttributeCS__QualifiersAssignment_5_1_0_3 : ( ( '!id' ) ) ;
+    // InternalOCLinEcore.g:25318:1: rule__AttributeCS__QualifiersAssignment_5_1_0_3 : ( ( '!id' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25318:1: ( ( ( '!id' ) ) )
-            // InternalOCLinEcore.g:25319:1: ( ( '!id' ) )
+            // InternalOCLinEcore.g:25322:1: ( ( ( '!id' ) ) )
+            // InternalOCLinEcore.g:25323:1: ( ( '!id' ) )
             {
-            // InternalOCLinEcore.g:25319:1: ( ( '!id' ) )
-            // InternalOCLinEcore.g:25320:1: ( '!id' )
+            // InternalOCLinEcore.g:25323:1: ( ( '!id' ) )
+            // InternalOCLinEcore.g:25324:1: ( '!id' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
             }
-            // InternalOCLinEcore.g:25321:1: ( '!id' )
-            // InternalOCLinEcore.g:25322:1: '!id'
+            // InternalOCLinEcore.g:25325:1: ( '!id' )
+            // InternalOCLinEcore.g:25326:1: '!id'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());
@@ -74613,23 +74613,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_4"
-    // InternalOCLinEcore.g:25337:1: rule__AttributeCS__QualifiersAssignment_5_1_0_4 : ( ( 'ordered' ) ) ;
+    // InternalOCLinEcore.g:25341:1: rule__AttributeCS__QualifiersAssignment_5_1_0_4 : ( ( 'ordered' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25341:1: ( ( ( 'ordered' ) ) )
-            // InternalOCLinEcore.g:25342:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:25345:1: ( ( ( 'ordered' ) ) )
+            // InternalOCLinEcore.g:25346:1: ( ( 'ordered' ) )
             {
-            // InternalOCLinEcore.g:25342:1: ( ( 'ordered' ) )
-            // InternalOCLinEcore.g:25343:1: ( 'ordered' )
+            // InternalOCLinEcore.g:25346:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:25347:1: ( 'ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
             }
-            // InternalOCLinEcore.g:25344:1: ( 'ordered' )
-            // InternalOCLinEcore.g:25345:1: 'ordered'
+            // InternalOCLinEcore.g:25348:1: ( 'ordered' )
+            // InternalOCLinEcore.g:25349:1: 'ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());
@@ -74666,23 +74666,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_5"
-    // InternalOCLinEcore.g:25360:1: rule__AttributeCS__QualifiersAssignment_5_1_0_5 : ( ( '!ordered' ) ) ;
+    // InternalOCLinEcore.g:25364:1: rule__AttributeCS__QualifiersAssignment_5_1_0_5 : ( ( '!ordered' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25364:1: ( ( ( '!ordered' ) ) )
-            // InternalOCLinEcore.g:25365:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:25368:1: ( ( ( '!ordered' ) ) )
+            // InternalOCLinEcore.g:25369:1: ( ( '!ordered' ) )
             {
-            // InternalOCLinEcore.g:25365:1: ( ( '!ordered' ) )
-            // InternalOCLinEcore.g:25366:1: ( '!ordered' )
+            // InternalOCLinEcore.g:25369:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:25370:1: ( '!ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
             }
-            // InternalOCLinEcore.g:25367:1: ( '!ordered' )
-            // InternalOCLinEcore.g:25368:1: '!ordered'
+            // InternalOCLinEcore.g:25371:1: ( '!ordered' )
+            // InternalOCLinEcore.g:25372:1: '!ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());
@@ -74719,23 +74719,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_6"
-    // InternalOCLinEcore.g:25383:1: rule__AttributeCS__QualifiersAssignment_5_1_0_6 : ( ( 'readonly' ) ) ;
+    // InternalOCLinEcore.g:25387:1: rule__AttributeCS__QualifiersAssignment_5_1_0_6 : ( ( 'readonly' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25387:1: ( ( ( 'readonly' ) ) )
-            // InternalOCLinEcore.g:25388:1: ( ( 'readonly' ) )
+            // InternalOCLinEcore.g:25391:1: ( ( ( 'readonly' ) ) )
+            // InternalOCLinEcore.g:25392:1: ( ( 'readonly' ) )
             {
-            // InternalOCLinEcore.g:25388:1: ( ( 'readonly' ) )
-            // InternalOCLinEcore.g:25389:1: ( 'readonly' )
+            // InternalOCLinEcore.g:25392:1: ( ( 'readonly' ) )
+            // InternalOCLinEcore.g:25393:1: ( 'readonly' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
             }
-            // InternalOCLinEcore.g:25390:1: ( 'readonly' )
-            // InternalOCLinEcore.g:25391:1: 'readonly'
+            // InternalOCLinEcore.g:25394:1: ( 'readonly' )
+            // InternalOCLinEcore.g:25395:1: 'readonly'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());
@@ -74772,23 +74772,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_7"
-    // InternalOCLinEcore.g:25406:1: rule__AttributeCS__QualifiersAssignment_5_1_0_7 : ( ( '!readonly' ) ) ;
+    // InternalOCLinEcore.g:25410:1: rule__AttributeCS__QualifiersAssignment_5_1_0_7 : ( ( '!readonly' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25410:1: ( ( ( '!readonly' ) ) )
-            // InternalOCLinEcore.g:25411:1: ( ( '!readonly' ) )
+            // InternalOCLinEcore.g:25414:1: ( ( ( '!readonly' ) ) )
+            // InternalOCLinEcore.g:25415:1: ( ( '!readonly' ) )
             {
-            // InternalOCLinEcore.g:25411:1: ( ( '!readonly' ) )
-            // InternalOCLinEcore.g:25412:1: ( '!readonly' )
+            // InternalOCLinEcore.g:25415:1: ( ( '!readonly' ) )
+            // InternalOCLinEcore.g:25416:1: ( '!readonly' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
             }
-            // InternalOCLinEcore.g:25413:1: ( '!readonly' )
-            // InternalOCLinEcore.g:25414:1: '!readonly'
+            // InternalOCLinEcore.g:25417:1: ( '!readonly' )
+            // InternalOCLinEcore.g:25418:1: '!readonly'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());
@@ -74825,23 +74825,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_8"
-    // InternalOCLinEcore.g:25429:1: rule__AttributeCS__QualifiersAssignment_5_1_0_8 : ( ( 'transient' ) ) ;
+    // InternalOCLinEcore.g:25433:1: rule__AttributeCS__QualifiersAssignment_5_1_0_8 : ( ( 'transient' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25433:1: ( ( ( 'transient' ) ) )
-            // InternalOCLinEcore.g:25434:1: ( ( 'transient' ) )
+            // InternalOCLinEcore.g:25437:1: ( ( ( 'transient' ) ) )
+            // InternalOCLinEcore.g:25438:1: ( ( 'transient' ) )
             {
-            // InternalOCLinEcore.g:25434:1: ( ( 'transient' ) )
-            // InternalOCLinEcore.g:25435:1: ( 'transient' )
+            // InternalOCLinEcore.g:25438:1: ( ( 'transient' ) )
+            // InternalOCLinEcore.g:25439:1: ( 'transient' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
             }
-            // InternalOCLinEcore.g:25436:1: ( 'transient' )
-            // InternalOCLinEcore.g:25437:1: 'transient'
+            // InternalOCLinEcore.g:25440:1: ( 'transient' )
+            // InternalOCLinEcore.g:25441:1: 'transient'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());
@@ -74878,23 +74878,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_9"
-    // InternalOCLinEcore.g:25452:1: rule__AttributeCS__QualifiersAssignment_5_1_0_9 : ( ( '!transient' ) ) ;
+    // InternalOCLinEcore.g:25456:1: rule__AttributeCS__QualifiersAssignment_5_1_0_9 : ( ( '!transient' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25456:1: ( ( ( '!transient' ) ) )
-            // InternalOCLinEcore.g:25457:1: ( ( '!transient' ) )
+            // InternalOCLinEcore.g:25460:1: ( ( ( '!transient' ) ) )
+            // InternalOCLinEcore.g:25461:1: ( ( '!transient' ) )
             {
-            // InternalOCLinEcore.g:25457:1: ( ( '!transient' ) )
-            // InternalOCLinEcore.g:25458:1: ( '!transient' )
+            // InternalOCLinEcore.g:25461:1: ( ( '!transient' ) )
+            // InternalOCLinEcore.g:25462:1: ( '!transient' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
             }
-            // InternalOCLinEcore.g:25459:1: ( '!transient' )
-            // InternalOCLinEcore.g:25460:1: '!transient'
+            // InternalOCLinEcore.g:25463:1: ( '!transient' )
+            // InternalOCLinEcore.g:25464:1: '!transient'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());
@@ -74931,23 +74931,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_10"
-    // InternalOCLinEcore.g:25475:1: rule__AttributeCS__QualifiersAssignment_5_1_0_10 : ( ( 'unique' ) ) ;
+    // InternalOCLinEcore.g:25479:1: rule__AttributeCS__QualifiersAssignment_5_1_0_10 : ( ( 'unique' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25479:1: ( ( ( 'unique' ) ) )
-            // InternalOCLinEcore.g:25480:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:25483:1: ( ( ( 'unique' ) ) )
+            // InternalOCLinEcore.g:25484:1: ( ( 'unique' ) )
             {
-            // InternalOCLinEcore.g:25480:1: ( ( 'unique' ) )
-            // InternalOCLinEcore.g:25481:1: ( 'unique' )
+            // InternalOCLinEcore.g:25484:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:25485:1: ( 'unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
             }
-            // InternalOCLinEcore.g:25482:1: ( 'unique' )
-            // InternalOCLinEcore.g:25483:1: 'unique'
+            // InternalOCLinEcore.g:25486:1: ( 'unique' )
+            // InternalOCLinEcore.g:25487:1: 'unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());
@@ -74984,23 +74984,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_11"
-    // InternalOCLinEcore.g:25498:1: rule__AttributeCS__QualifiersAssignment_5_1_0_11 : ( ( '!unique' ) ) ;
+    // InternalOCLinEcore.g:25502:1: rule__AttributeCS__QualifiersAssignment_5_1_0_11 : ( ( '!unique' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25502:1: ( ( ( '!unique' ) ) )
-            // InternalOCLinEcore.g:25503:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:25506:1: ( ( ( '!unique' ) ) )
+            // InternalOCLinEcore.g:25507:1: ( ( '!unique' ) )
             {
-            // InternalOCLinEcore.g:25503:1: ( ( '!unique' ) )
-            // InternalOCLinEcore.g:25504:1: ( '!unique' )
+            // InternalOCLinEcore.g:25507:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:25508:1: ( '!unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
             }
-            // InternalOCLinEcore.g:25505:1: ( '!unique' )
-            // InternalOCLinEcore.g:25506:1: '!unique'
+            // InternalOCLinEcore.g:25509:1: ( '!unique' )
+            // InternalOCLinEcore.g:25510:1: '!unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());
@@ -75037,23 +75037,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_12"
-    // InternalOCLinEcore.g:25521:1: rule__AttributeCS__QualifiersAssignment_5_1_0_12 : ( ( 'unsettable' ) ) ;
+    // InternalOCLinEcore.g:25525:1: rule__AttributeCS__QualifiersAssignment_5_1_0_12 : ( ( 'unsettable' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25525:1: ( ( ( 'unsettable' ) ) )
-            // InternalOCLinEcore.g:25526:1: ( ( 'unsettable' ) )
+            // InternalOCLinEcore.g:25529:1: ( ( ( 'unsettable' ) ) )
+            // InternalOCLinEcore.g:25530:1: ( ( 'unsettable' ) )
             {
-            // InternalOCLinEcore.g:25526:1: ( ( 'unsettable' ) )
-            // InternalOCLinEcore.g:25527:1: ( 'unsettable' )
+            // InternalOCLinEcore.g:25530:1: ( ( 'unsettable' ) )
+            // InternalOCLinEcore.g:25531:1: ( 'unsettable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
             }
-            // InternalOCLinEcore.g:25528:1: ( 'unsettable' )
-            // InternalOCLinEcore.g:25529:1: 'unsettable'
+            // InternalOCLinEcore.g:25532:1: ( 'unsettable' )
+            // InternalOCLinEcore.g:25533:1: 'unsettable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());
@@ -75090,23 +75090,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_13"
-    // InternalOCLinEcore.g:25544:1: rule__AttributeCS__QualifiersAssignment_5_1_0_13 : ( ( '!unsettable' ) ) ;
+    // InternalOCLinEcore.g:25548:1: rule__AttributeCS__QualifiersAssignment_5_1_0_13 : ( ( '!unsettable' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25548:1: ( ( ( '!unsettable' ) ) )
-            // InternalOCLinEcore.g:25549:1: ( ( '!unsettable' ) )
+            // InternalOCLinEcore.g:25552:1: ( ( ( '!unsettable' ) ) )
+            // InternalOCLinEcore.g:25553:1: ( ( '!unsettable' ) )
             {
-            // InternalOCLinEcore.g:25549:1: ( ( '!unsettable' ) )
-            // InternalOCLinEcore.g:25550:1: ( '!unsettable' )
+            // InternalOCLinEcore.g:25553:1: ( ( '!unsettable' ) )
+            // InternalOCLinEcore.g:25554:1: ( '!unsettable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
             }
-            // InternalOCLinEcore.g:25551:1: ( '!unsettable' )
-            // InternalOCLinEcore.g:25552:1: '!unsettable'
+            // InternalOCLinEcore.g:25555:1: ( '!unsettable' )
+            // InternalOCLinEcore.g:25556:1: '!unsettable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());
@@ -75143,23 +75143,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_14"
-    // InternalOCLinEcore.g:25567:1: rule__AttributeCS__QualifiersAssignment_5_1_0_14 : ( ( 'volatile' ) ) ;
+    // InternalOCLinEcore.g:25571:1: rule__AttributeCS__QualifiersAssignment_5_1_0_14 : ( ( 'volatile' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_14() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25571:1: ( ( ( 'volatile' ) ) )
-            // InternalOCLinEcore.g:25572:1: ( ( 'volatile' ) )
+            // InternalOCLinEcore.g:25575:1: ( ( ( 'volatile' ) ) )
+            // InternalOCLinEcore.g:25576:1: ( ( 'volatile' ) )
             {
-            // InternalOCLinEcore.g:25572:1: ( ( 'volatile' ) )
-            // InternalOCLinEcore.g:25573:1: ( 'volatile' )
+            // InternalOCLinEcore.g:25576:1: ( ( 'volatile' ) )
+            // InternalOCLinEcore.g:25577:1: ( 'volatile' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
             }
-            // InternalOCLinEcore.g:25574:1: ( 'volatile' )
-            // InternalOCLinEcore.g:25575:1: 'volatile'
+            // InternalOCLinEcore.g:25578:1: ( 'volatile' )
+            // InternalOCLinEcore.g:25579:1: 'volatile'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());
@@ -75196,23 +75196,23 @@
 
 
     // $ANTLR start "rule__AttributeCS__QualifiersAssignment_5_1_0_15"
-    // InternalOCLinEcore.g:25590:1: rule__AttributeCS__QualifiersAssignment_5_1_0_15 : ( ( '!volatile' ) ) ;
+    // InternalOCLinEcore.g:25594:1: rule__AttributeCS__QualifiersAssignment_5_1_0_15 : ( ( '!volatile' ) ) ;
     public final void rule__AttributeCS__QualifiersAssignment_5_1_0_15() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25594:1: ( ( ( '!volatile' ) ) )
-            // InternalOCLinEcore.g:25595:1: ( ( '!volatile' ) )
+            // InternalOCLinEcore.g:25598:1: ( ( ( '!volatile' ) ) )
+            // InternalOCLinEcore.g:25599:1: ( ( '!volatile' ) )
             {
-            // InternalOCLinEcore.g:25595:1: ( ( '!volatile' ) )
-            // InternalOCLinEcore.g:25596:1: ( '!volatile' )
+            // InternalOCLinEcore.g:25599:1: ( ( '!volatile' ) )
+            // InternalOCLinEcore.g:25600:1: ( '!volatile' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
             }
-            // InternalOCLinEcore.g:25597:1: ( '!volatile' )
-            // InternalOCLinEcore.g:25598:1: '!volatile'
+            // InternalOCLinEcore.g:25601:1: ( '!volatile' )
+            // InternalOCLinEcore.g:25602:1: '!volatile'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());
@@ -75249,17 +75249,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0"
-    // InternalOCLinEcore.g:25613:1: rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:25617:1: rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__AttributeCS__OwnedAnnotationsAssignment_6_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25617:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:25618:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25621:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:25622:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:25618:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:25619:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:25622:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25623:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());
@@ -75294,17 +75294,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3"
-    // InternalOCLinEcore.g:25628:1: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:25632:1: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3 : ( ruleSpecificationCS ) ;
     public final void rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25632:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:25633:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:25636:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:25637:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:25633:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:25634:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:25637:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:25638:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_1_3_0());
@@ -75339,17 +75339,17 @@
 
 
     // $ANTLR start "rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3"
-    // InternalOCLinEcore.g:25643:1: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:25647:1: rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3 : ( ruleSpecificationCS ) ;
     public final void rule__AttributeCS__OwnedDefaultExpressionsAssignment_6_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25647:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:25648:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:25651:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:25652:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:25648:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:25649:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:25652:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:25653:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_2_3_0());
@@ -75384,23 +75384,23 @@
 
 
     // $ANTLR start "rule__DataTypeCS__IsPrimitiveAssignment_0"
-    // InternalOCLinEcore.g:25658:1: rule__DataTypeCS__IsPrimitiveAssignment_0 : ( ( 'primitive' ) ) ;
+    // InternalOCLinEcore.g:25662:1: rule__DataTypeCS__IsPrimitiveAssignment_0 : ( ( 'primitive' ) ) ;
     public final void rule__DataTypeCS__IsPrimitiveAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25662:1: ( ( ( 'primitive' ) ) )
-            // InternalOCLinEcore.g:25663:1: ( ( 'primitive' ) )
+            // InternalOCLinEcore.g:25666:1: ( ( ( 'primitive' ) ) )
+            // InternalOCLinEcore.g:25667:1: ( ( 'primitive' ) )
             {
-            // InternalOCLinEcore.g:25663:1: ( ( 'primitive' ) )
-            // InternalOCLinEcore.g:25664:1: ( 'primitive' )
+            // InternalOCLinEcore.g:25667:1: ( ( 'primitive' ) )
+            // InternalOCLinEcore.g:25668:1: ( 'primitive' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
             }
-            // InternalOCLinEcore.g:25665:1: ( 'primitive' )
-            // InternalOCLinEcore.g:25666:1: 'primitive'
+            // InternalOCLinEcore.g:25669:1: ( 'primitive' )
+            // InternalOCLinEcore.g:25670:1: 'primitive'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());
@@ -75437,17 +75437,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__NameAssignment_2"
-    // InternalOCLinEcore.g:25681:1: rule__DataTypeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:25685:1: rule__DataTypeCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
     public final void rule__DataTypeCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25685:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:25686:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25689:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:25690:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:25686:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:25687:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:25690:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25691:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
@@ -75482,17 +75482,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__OwnedSignatureAssignment_3"
-    // InternalOCLinEcore.g:25696:1: rule__DataTypeCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLinEcore.g:25700:1: rule__DataTypeCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
     public final void rule__DataTypeCS__OwnedSignatureAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25700:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLinEcore.g:25701:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:25704:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLinEcore.g:25705:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLinEcore.g:25701:1: ( ruleTemplateSignatureCS )
-            // InternalOCLinEcore.g:25702:1: ruleTemplateSignatureCS
+            // InternalOCLinEcore.g:25705:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:25706:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
@@ -75527,17 +75527,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__InstanceClassNameAssignment_4_1"
-    // InternalOCLinEcore.g:25711:1: rule__DataTypeCS__InstanceClassNameAssignment_4_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:25715:1: rule__DataTypeCS__InstanceClassNameAssignment_4_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__DataTypeCS__InstanceClassNameAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25715:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:25716:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25719:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:25720:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:25716:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:25717:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:25720:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25721:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());
@@ -75568,23 +75568,23 @@
 
 
     // $ANTLR start "rule__DataTypeCS__IsSerializableAssignment_5_1_0"
-    // InternalOCLinEcore.g:25726:1: rule__DataTypeCS__IsSerializableAssignment_5_1_0 : ( ( 'serializable' ) ) ;
+    // InternalOCLinEcore.g:25730:1: rule__DataTypeCS__IsSerializableAssignment_5_1_0 : ( ( 'serializable' ) ) ;
     public final void rule__DataTypeCS__IsSerializableAssignment_5_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25730:1: ( ( ( 'serializable' ) ) )
-            // InternalOCLinEcore.g:25731:1: ( ( 'serializable' ) )
+            // InternalOCLinEcore.g:25734:1: ( ( ( 'serializable' ) ) )
+            // InternalOCLinEcore.g:25735:1: ( ( 'serializable' ) )
             {
-            // InternalOCLinEcore.g:25731:1: ( ( 'serializable' ) )
-            // InternalOCLinEcore.g:25732:1: ( 'serializable' )
+            // InternalOCLinEcore.g:25735:1: ( ( 'serializable' ) )
+            // InternalOCLinEcore.g:25736:1: ( 'serializable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
             }
-            // InternalOCLinEcore.g:25733:1: ( 'serializable' )
-            // InternalOCLinEcore.g:25734:1: 'serializable'
+            // InternalOCLinEcore.g:25737:1: ( 'serializable' )
+            // InternalOCLinEcore.g:25738:1: 'serializable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());
@@ -75621,17 +75621,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0"
-    // InternalOCLinEcore.g:25749:1: rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:25753:1: rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__DataTypeCS__OwnedAnnotationsAssignment_6_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25753:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:25754:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25757:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:25758:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:25754:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:25755:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:25758:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25759:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_6_0_1_0_0());
@@ -75666,17 +75666,17 @@
 
 
     // $ANTLR start "rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1"
-    // InternalOCLinEcore.g:25764:1: rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 : ( ruleInvariantConstraintCS ) ;
+    // InternalOCLinEcore.g:25768:1: rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1 : ( ruleInvariantConstraintCS ) ;
     public final void rule__DataTypeCS__OwnedConstraintsAssignment_6_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25768:1: ( ( ruleInvariantConstraintCS ) )
-            // InternalOCLinEcore.g:25769:1: ( ruleInvariantConstraintCS )
+            // InternalOCLinEcore.g:25772:1: ( ( ruleInvariantConstraintCS ) )
+            // InternalOCLinEcore.g:25773:1: ( ruleInvariantConstraintCS )
             {
-            // InternalOCLinEcore.g:25769:1: ( ruleInvariantConstraintCS )
-            // InternalOCLinEcore.g:25770:1: ruleInvariantConstraintCS
+            // InternalOCLinEcore.g:25773:1: ( ruleInvariantConstraintCS )
+            // InternalOCLinEcore.g:25774:1: ruleInvariantConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataTypeCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_6_0_1_1_0());
@@ -75711,23 +75711,23 @@
 
 
     // $ANTLR start "rule__DetailCS__NameAssignment_0"
-    // InternalOCLinEcore.g:25779:1: rule__DetailCS__NameAssignment_0 : ( ( rule__DetailCS__NameAlternatives_0_0 ) ) ;
+    // InternalOCLinEcore.g:25783:1: rule__DetailCS__NameAssignment_0 : ( ( rule__DetailCS__NameAlternatives_0_0 ) ) ;
     public final void rule__DetailCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25783:1: ( ( ( rule__DetailCS__NameAlternatives_0_0 ) ) )
-            // InternalOCLinEcore.g:25784:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
+            // InternalOCLinEcore.g:25787:1: ( ( ( rule__DetailCS__NameAlternatives_0_0 ) ) )
+            // InternalOCLinEcore.g:25788:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
             {
-            // InternalOCLinEcore.g:25784:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
-            // InternalOCLinEcore.g:25785:1: ( rule__DetailCS__NameAlternatives_0_0 )
+            // InternalOCLinEcore.g:25788:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
+            // InternalOCLinEcore.g:25789:1: ( rule__DetailCS__NameAlternatives_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getNameAlternatives_0_0());
             }
-            // InternalOCLinEcore.g:25786:1: ( rule__DetailCS__NameAlternatives_0_0 )
-            // InternalOCLinEcore.g:25786:2: rule__DetailCS__NameAlternatives_0_0
+            // InternalOCLinEcore.g:25790:1: ( rule__DetailCS__NameAlternatives_0_0 )
+            // InternalOCLinEcore.g:25790:2: rule__DetailCS__NameAlternatives_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__NameAlternatives_0_0();
@@ -75762,23 +75762,23 @@
 
 
     // $ANTLR start "rule__DetailCS__ValuesAssignment_2"
-    // InternalOCLinEcore.g:25795:1: rule__DetailCS__ValuesAssignment_2 : ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) ;
+    // InternalOCLinEcore.g:25799:1: rule__DetailCS__ValuesAssignment_2 : ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) ;
     public final void rule__DetailCS__ValuesAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25799:1: ( ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) )
-            // InternalOCLinEcore.g:25800:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
+            // InternalOCLinEcore.g:25803:1: ( ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) )
+            // InternalOCLinEcore.g:25804:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
             {
-            // InternalOCLinEcore.g:25800:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
-            // InternalOCLinEcore.g:25801:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
+            // InternalOCLinEcore.g:25804:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
+            // InternalOCLinEcore.g:25805:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getValuesAlternatives_2_0());
             }
-            // InternalOCLinEcore.g:25802:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
-            // InternalOCLinEcore.g:25802:2: rule__DetailCS__ValuesAlternatives_2_0
+            // InternalOCLinEcore.g:25806:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
+            // InternalOCLinEcore.g:25806:2: rule__DetailCS__ValuesAlternatives_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__ValuesAlternatives_2_0();
@@ -75813,17 +75813,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__ValueAssignment_2"
-    // InternalOCLinEcore.g:25811:1: rule__DocumentationCS__ValueAssignment_2 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:25815:1: rule__DocumentationCS__ValueAssignment_2 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__DocumentationCS__ValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25815:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:25816:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25819:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:25820:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:25816:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:25817:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:25820:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25821:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getValueSINGLE_QUOTED_STRINGTerminalRuleCall_2_0());
@@ -75854,17 +75854,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__OwnedDetailsAssignment_3_1"
-    // InternalOCLinEcore.g:25826:1: rule__DocumentationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
+    // InternalOCLinEcore.g:25830:1: rule__DocumentationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
     public final void rule__DocumentationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25830:1: ( ( ruleDetailCS ) )
-            // InternalOCLinEcore.g:25831:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25834:1: ( ( ruleDetailCS ) )
+            // InternalOCLinEcore.g:25835:1: ( ruleDetailCS )
             {
-            // InternalOCLinEcore.g:25831:1: ( ruleDetailCS )
-            // InternalOCLinEcore.g:25832:1: ruleDetailCS
+            // InternalOCLinEcore.g:25835:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25836:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
@@ -75899,17 +75899,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__OwnedDetailsAssignment_3_2_1"
-    // InternalOCLinEcore.g:25841:1: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
+    // InternalOCLinEcore.g:25845:1: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
     public final void rule__DocumentationCS__OwnedDetailsAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25845:1: ( ( ruleDetailCS ) )
-            // InternalOCLinEcore.g:25846:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25849:1: ( ( ruleDetailCS ) )
+            // InternalOCLinEcore.g:25850:1: ( ruleDetailCS )
             {
-            // InternalOCLinEcore.g:25846:1: ( ruleDetailCS )
-            // InternalOCLinEcore.g:25847:1: ruleDetailCS
+            // InternalOCLinEcore.g:25850:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:25851:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
@@ -75944,17 +75944,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__NameAssignment_1"
-    // InternalOCLinEcore.g:25856:1: rule__EnumerationCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:25860:1: rule__EnumerationCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
     public final void rule__EnumerationCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25860:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:25861:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25864:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:25865:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:25861:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:25862:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:25865:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25866:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
@@ -75989,17 +75989,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__OwnedSignatureAssignment_2"
-    // InternalOCLinEcore.g:25871:1: rule__EnumerationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLinEcore.g:25875:1: rule__EnumerationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
     public final void rule__EnumerationCS__OwnedSignatureAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25875:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLinEcore.g:25876:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:25879:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLinEcore.g:25880:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLinEcore.g:25876:1: ( ruleTemplateSignatureCS )
-            // InternalOCLinEcore.g:25877:1: ruleTemplateSignatureCS
+            // InternalOCLinEcore.g:25880:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:25881:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
@@ -76034,17 +76034,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__InstanceClassNameAssignment_3_1"
-    // InternalOCLinEcore.g:25886:1: rule__EnumerationCS__InstanceClassNameAssignment_3_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:25890:1: rule__EnumerationCS__InstanceClassNameAssignment_3_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__EnumerationCS__InstanceClassNameAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25890:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:25891:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25894:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:25895:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:25891:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:25892:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:25895:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:25896:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_3_1_0());
@@ -76075,23 +76075,23 @@
 
 
     // $ANTLR start "rule__EnumerationCS__IsSerializableAssignment_4_1_0"
-    // InternalOCLinEcore.g:25901:1: rule__EnumerationCS__IsSerializableAssignment_4_1_0 : ( ( 'serializable' ) ) ;
+    // InternalOCLinEcore.g:25905:1: rule__EnumerationCS__IsSerializableAssignment_4_1_0 : ( ( 'serializable' ) ) ;
     public final void rule__EnumerationCS__IsSerializableAssignment_4_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25905:1: ( ( ( 'serializable' ) ) )
-            // InternalOCLinEcore.g:25906:1: ( ( 'serializable' ) )
+            // InternalOCLinEcore.g:25909:1: ( ( ( 'serializable' ) ) )
+            // InternalOCLinEcore.g:25910:1: ( ( 'serializable' ) )
             {
-            // InternalOCLinEcore.g:25906:1: ( ( 'serializable' ) )
-            // InternalOCLinEcore.g:25907:1: ( 'serializable' )
+            // InternalOCLinEcore.g:25910:1: ( ( 'serializable' ) )
+            // InternalOCLinEcore.g:25911:1: ( 'serializable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
             }
-            // InternalOCLinEcore.g:25908:1: ( 'serializable' )
-            // InternalOCLinEcore.g:25909:1: 'serializable'
+            // InternalOCLinEcore.g:25912:1: ( 'serializable' )
+            // InternalOCLinEcore.g:25913:1: 'serializable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());
@@ -76128,17 +76128,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0"
-    // InternalOCLinEcore.g:25924:1: rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:25928:1: rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__EnumerationCS__OwnedAnnotationsAssignment_5_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25928:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:25929:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25932:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:25933:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:25929:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:25930:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:25933:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:25934:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_5_0_1_0_0());
@@ -76173,17 +76173,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1"
-    // InternalOCLinEcore.g:25939:1: rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 : ( ruleEnumerationLiteralCS ) ;
+    // InternalOCLinEcore.g:25943:1: rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1 : ( ruleEnumerationLiteralCS ) ;
     public final void rule__EnumerationCS__OwnedLiteralsAssignment_5_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25943:1: ( ( ruleEnumerationLiteralCS ) )
-            // InternalOCLinEcore.g:25944:1: ( ruleEnumerationLiteralCS )
+            // InternalOCLinEcore.g:25947:1: ( ( ruleEnumerationLiteralCS ) )
+            // InternalOCLinEcore.g:25948:1: ( ruleEnumerationLiteralCS )
             {
-            // InternalOCLinEcore.g:25944:1: ( ruleEnumerationLiteralCS )
-            // InternalOCLinEcore.g:25945:1: ruleEnumerationLiteralCS
+            // InternalOCLinEcore.g:25948:1: ( ruleEnumerationLiteralCS )
+            // InternalOCLinEcore.g:25949:1: ruleEnumerationLiteralCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsEnumerationLiteralCSParserRuleCall_5_0_1_1_0());
@@ -76218,17 +76218,17 @@
 
 
     // $ANTLR start "rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2"
-    // InternalOCLinEcore.g:25954:1: rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 : ( ruleInvariantConstraintCS ) ;
+    // InternalOCLinEcore.g:25958:1: rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2 : ( ruleInvariantConstraintCS ) ;
     public final void rule__EnumerationCS__OwnedConstraintsAssignment_5_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25958:1: ( ( ruleInvariantConstraintCS ) )
-            // InternalOCLinEcore.g:25959:1: ( ruleInvariantConstraintCS )
+            // InternalOCLinEcore.g:25962:1: ( ( ruleInvariantConstraintCS ) )
+            // InternalOCLinEcore.g:25963:1: ( ruleInvariantConstraintCS )
             {
-            // InternalOCLinEcore.g:25959:1: ( ruleInvariantConstraintCS )
-            // InternalOCLinEcore.g:25960:1: ruleInvariantConstraintCS
+            // InternalOCLinEcore.g:25963:1: ( ruleInvariantConstraintCS )
+            // InternalOCLinEcore.g:25964:1: ruleInvariantConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_5_0_1_2_0());
@@ -76263,17 +76263,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__NameAssignment_0_0_1"
-    // InternalOCLinEcore.g:25969:1: rule__EnumerationLiteralCS__NameAssignment_0_0_1 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:25973:1: rule__EnumerationLiteralCS__NameAssignment_0_0_1 : ( ruleUnrestrictedName ) ;
     public final void rule__EnumerationLiteralCS__NameAssignment_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25973:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:25974:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25977:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:25978:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:25974:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:25975:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:25978:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:25979:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_1_0());
@@ -76308,17 +76308,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__NameAssignment_0_1"
-    // InternalOCLinEcore.g:25984:1: rule__EnumerationLiteralCS__NameAssignment_0_1 : ( ruleEnumerationLiteralName ) ;
+    // InternalOCLinEcore.g:25988:1: rule__EnumerationLiteralCS__NameAssignment_0_1 : ( ruleEnumerationLiteralName ) ;
     public final void rule__EnumerationLiteralCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:25988:1: ( ( ruleEnumerationLiteralName ) )
-            // InternalOCLinEcore.g:25989:1: ( ruleEnumerationLiteralName )
+            // InternalOCLinEcore.g:25992:1: ( ( ruleEnumerationLiteralName ) )
+            // InternalOCLinEcore.g:25993:1: ( ruleEnumerationLiteralName )
             {
-            // InternalOCLinEcore.g:25989:1: ( ruleEnumerationLiteralName )
-            // InternalOCLinEcore.g:25990:1: ruleEnumerationLiteralName
+            // InternalOCLinEcore.g:25993:1: ( ruleEnumerationLiteralName )
+            // InternalOCLinEcore.g:25994:1: ruleEnumerationLiteralName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getNameEnumerationLiteralNameParserRuleCall_0_1_0());
@@ -76353,17 +76353,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__LiteralAssignment_1_1"
-    // InternalOCLinEcore.g:25999:1: rule__EnumerationLiteralCS__LiteralAssignment_1_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:26003:1: rule__EnumerationLiteralCS__LiteralAssignment_1_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__EnumerationLiteralCS__LiteralAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26003:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:26004:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:26007:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:26008:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:26004:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:26005:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:26008:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:26009:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getLiteralSINGLE_QUOTED_STRINGTerminalRuleCall_1_1_0());
@@ -76394,17 +76394,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__ValueAssignment_2_1"
-    // InternalOCLinEcore.g:26014:1: rule__EnumerationLiteralCS__ValueAssignment_2_1 : ( ruleSIGNED ) ;
+    // InternalOCLinEcore.g:26018:1: rule__EnumerationLiteralCS__ValueAssignment_2_1 : ( ruleSIGNED ) ;
     public final void rule__EnumerationLiteralCS__ValueAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26018:1: ( ( ruleSIGNED ) )
-            // InternalOCLinEcore.g:26019:1: ( ruleSIGNED )
+            // InternalOCLinEcore.g:26022:1: ( ( ruleSIGNED ) )
+            // InternalOCLinEcore.g:26023:1: ( ruleSIGNED )
             {
-            // InternalOCLinEcore.g:26019:1: ( ruleSIGNED )
-            // InternalOCLinEcore.g:26020:1: ruleSIGNED
+            // InternalOCLinEcore.g:26023:1: ( ruleSIGNED )
+            // InternalOCLinEcore.g:26024:1: ruleSIGNED
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_2_1_0());
@@ -76439,17 +76439,17 @@
 
 
     // $ANTLR start "rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1"
-    // InternalOCLinEcore.g:26029:1: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:26033:1: rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1 : ( ruleAnnotationElementCS ) ;
     public final void rule__EnumerationLiteralCS__OwnedAnnotationsAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26033:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:26034:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26037:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:26038:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:26034:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:26035:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:26038:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26039:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEnumerationLiteralCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_0_1_0());
@@ -76484,17 +76484,17 @@
 
 
     // $ANTLR start "rule__ImportCS__NameAssignment_1_0"
-    // InternalOCLinEcore.g:26044:1: rule__ImportCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26048:1: rule__ImportCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
     public final void rule__ImportCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26048:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26049:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26052:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:26053:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26049:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:26050:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:26053:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26054:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
@@ -76529,17 +76529,17 @@
 
 
     // $ANTLR start "rule__ImportCS__OwnedPathNameAssignment_2"
-    // InternalOCLinEcore.g:26059:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
+    // InternalOCLinEcore.g:26063:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
     public final void rule__ImportCS__OwnedPathNameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26063:1: ( ( ruleURIPathNameCS ) )
-            // InternalOCLinEcore.g:26064:1: ( ruleURIPathNameCS )
+            // InternalOCLinEcore.g:26067:1: ( ( ruleURIPathNameCS ) )
+            // InternalOCLinEcore.g:26068:1: ( ruleURIPathNameCS )
             {
-            // InternalOCLinEcore.g:26064:1: ( ruleURIPathNameCS )
-            // InternalOCLinEcore.g:26065:1: ruleURIPathNameCS
+            // InternalOCLinEcore.g:26068:1: ( ruleURIPathNameCS )
+            // InternalOCLinEcore.g:26069:1: ruleURIPathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());
@@ -76574,23 +76574,23 @@
 
 
     // $ANTLR start "rule__ImportCS__IsAllAssignment_3"
-    // InternalOCLinEcore.g:26074:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
+    // InternalOCLinEcore.g:26078:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
     public final void rule__ImportCS__IsAllAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26078:1: ( ( ( '::*' ) ) )
-            // InternalOCLinEcore.g:26079:1: ( ( '::*' ) )
+            // InternalOCLinEcore.g:26082:1: ( ( ( '::*' ) ) )
+            // InternalOCLinEcore.g:26083:1: ( ( '::*' ) )
             {
-            // InternalOCLinEcore.g:26079:1: ( ( '::*' ) )
-            // InternalOCLinEcore.g:26080:1: ( '::*' )
+            // InternalOCLinEcore.g:26083:1: ( ( '::*' ) )
+            // InternalOCLinEcore.g:26084:1: ( '::*' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
             }
-            // InternalOCLinEcore.g:26081:1: ( '::*' )
-            // InternalOCLinEcore.g:26082:1: '::*'
+            // InternalOCLinEcore.g:26085:1: ( '::*' )
+            // InternalOCLinEcore.g:26086:1: '::*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
@@ -76627,17 +76627,17 @@
 
 
     // $ANTLR start "rule__ModelElementRefCS__OwnedPathNameAssignment_1"
-    // InternalOCLinEcore.g:26097:1: rule__ModelElementRefCS__OwnedPathNameAssignment_1 : ( rulePathNameCS ) ;
+    // InternalOCLinEcore.g:26101:1: rule__ModelElementRefCS__OwnedPathNameAssignment_1 : ( rulePathNameCS ) ;
     public final void rule__ModelElementRefCS__OwnedPathNameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26101:1: ( ( rulePathNameCS ) )
-            // InternalOCLinEcore.g:26102:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:26105:1: ( ( rulePathNameCS ) )
+            // InternalOCLinEcore.g:26106:1: ( rulePathNameCS )
             {
-            // InternalOCLinEcore.g:26102:1: ( rulePathNameCS )
-            // InternalOCLinEcore.g:26103:1: rulePathNameCS
+            // InternalOCLinEcore.g:26106:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:26107:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getModelElementRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());
@@ -76672,23 +76672,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_0_0"
-    // InternalOCLinEcore.g:26112:1: rule__OperationCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
+    // InternalOCLinEcore.g:26116:1: rule__OperationCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26116:1: ( ( ( 'static' ) ) )
-            // InternalOCLinEcore.g:26117:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26120:1: ( ( ( 'static' ) ) )
+            // InternalOCLinEcore.g:26121:1: ( ( 'static' ) )
             {
-            // InternalOCLinEcore.g:26117:1: ( ( 'static' ) )
-            // InternalOCLinEcore.g:26118:1: ( 'static' )
+            // InternalOCLinEcore.g:26121:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26122:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
             }
-            // InternalOCLinEcore.g:26119:1: ( 'static' )
-            // InternalOCLinEcore.g:26120:1: 'static'
+            // InternalOCLinEcore.g:26123:1: ( 'static' )
+            // InternalOCLinEcore.g:26124:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());
@@ -76725,23 +76725,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_0_1"
-    // InternalOCLinEcore.g:26135:1: rule__OperationCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
+    // InternalOCLinEcore.g:26139:1: rule__OperationCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26139:1: ( ( ( 'definition' ) ) )
-            // InternalOCLinEcore.g:26140:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26143:1: ( ( ( 'definition' ) ) )
+            // InternalOCLinEcore.g:26144:1: ( ( 'definition' ) )
             {
-            // InternalOCLinEcore.g:26140:1: ( ( 'definition' ) )
-            // InternalOCLinEcore.g:26141:1: ( 'definition' )
+            // InternalOCLinEcore.g:26144:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26145:1: ( 'definition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
             }
-            // InternalOCLinEcore.g:26142:1: ( 'definition' )
-            // InternalOCLinEcore.g:26143:1: 'definition'
+            // InternalOCLinEcore.g:26146:1: ( 'definition' )
+            // InternalOCLinEcore.g:26147:1: 'definition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
@@ -76778,23 +76778,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_1_0"
-    // InternalOCLinEcore.g:26158:1: rule__OperationCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
+    // InternalOCLinEcore.g:26162:1: rule__OperationCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26162:1: ( ( ( 'definition' ) ) )
-            // InternalOCLinEcore.g:26163:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26166:1: ( ( ( 'definition' ) ) )
+            // InternalOCLinEcore.g:26167:1: ( ( 'definition' ) )
             {
-            // InternalOCLinEcore.g:26163:1: ( ( 'definition' ) )
-            // InternalOCLinEcore.g:26164:1: ( 'definition' )
+            // InternalOCLinEcore.g:26167:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26168:1: ( 'definition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
             }
-            // InternalOCLinEcore.g:26165:1: ( 'definition' )
-            // InternalOCLinEcore.g:26166:1: 'definition'
+            // InternalOCLinEcore.g:26169:1: ( 'definition' )
+            // InternalOCLinEcore.g:26170:1: 'definition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
@@ -76831,23 +76831,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_0_1_1"
-    // InternalOCLinEcore.g:26181:1: rule__OperationCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
+    // InternalOCLinEcore.g:26185:1: rule__OperationCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26185:1: ( ( ( 'static' ) ) )
-            // InternalOCLinEcore.g:26186:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26189:1: ( ( ( 'static' ) ) )
+            // InternalOCLinEcore.g:26190:1: ( ( 'static' ) )
             {
-            // InternalOCLinEcore.g:26186:1: ( ( 'static' ) )
-            // InternalOCLinEcore.g:26187:1: ( 'static' )
+            // InternalOCLinEcore.g:26190:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26191:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
             }
-            // InternalOCLinEcore.g:26188:1: ( 'static' )
-            // InternalOCLinEcore.g:26189:1: 'static'
+            // InternalOCLinEcore.g:26192:1: ( 'static' )
+            // InternalOCLinEcore.g:26193:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());
@@ -76884,17 +76884,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedSignatureAssignment_2"
-    // InternalOCLinEcore.g:26204:1: rule__OperationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLinEcore.g:26208:1: rule__OperationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
     public final void rule__OperationCS__OwnedSignatureAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26208:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLinEcore.g:26209:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:26212:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLinEcore.g:26213:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLinEcore.g:26209:1: ( ruleTemplateSignatureCS )
-            // InternalOCLinEcore.g:26210:1: ruleTemplateSignatureCS
+            // InternalOCLinEcore.g:26213:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:26214:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
@@ -76929,17 +76929,17 @@
 
 
     // $ANTLR start "rule__OperationCS__NameAssignment_3"
-    // InternalOCLinEcore.g:26219:1: rule__OperationCS__NameAssignment_3 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26223:1: rule__OperationCS__NameAssignment_3 : ( ruleUnrestrictedName ) ;
     public final void rule__OperationCS__NameAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26223:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26224:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26227:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:26228:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26224:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:26225:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:26228:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26229:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());
@@ -76974,17 +76974,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedParametersAssignment_5_0"
-    // InternalOCLinEcore.g:26234:1: rule__OperationCS__OwnedParametersAssignment_5_0 : ( ruleParameterCS ) ;
+    // InternalOCLinEcore.g:26238:1: rule__OperationCS__OwnedParametersAssignment_5_0 : ( ruleParameterCS ) ;
     public final void rule__OperationCS__OwnedParametersAssignment_5_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26238:1: ( ( ruleParameterCS ) )
-            // InternalOCLinEcore.g:26239:1: ( ruleParameterCS )
+            // InternalOCLinEcore.g:26242:1: ( ( ruleParameterCS ) )
+            // InternalOCLinEcore.g:26243:1: ( ruleParameterCS )
             {
-            // InternalOCLinEcore.g:26239:1: ( ruleParameterCS )
-            // InternalOCLinEcore.g:26240:1: ruleParameterCS
+            // InternalOCLinEcore.g:26243:1: ( ruleParameterCS )
+            // InternalOCLinEcore.g:26244:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());
@@ -77019,17 +77019,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedParametersAssignment_5_1_1"
-    // InternalOCLinEcore.g:26249:1: rule__OperationCS__OwnedParametersAssignment_5_1_1 : ( ruleParameterCS ) ;
+    // InternalOCLinEcore.g:26253:1: rule__OperationCS__OwnedParametersAssignment_5_1_1 : ( ruleParameterCS ) ;
     public final void rule__OperationCS__OwnedParametersAssignment_5_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26253:1: ( ( ruleParameterCS ) )
-            // InternalOCLinEcore.g:26254:1: ( ruleParameterCS )
+            // InternalOCLinEcore.g:26257:1: ( ( ruleParameterCS ) )
+            // InternalOCLinEcore.g:26258:1: ( ruleParameterCS )
             {
-            // InternalOCLinEcore.g:26254:1: ( ruleParameterCS )
-            // InternalOCLinEcore.g:26255:1: ruleParameterCS
+            // InternalOCLinEcore.g:26258:1: ( ruleParameterCS )
+            // InternalOCLinEcore.g:26259:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());
@@ -77064,17 +77064,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedTypeAssignment_7_1"
-    // InternalOCLinEcore.g:26264:1: rule__OperationCS__OwnedTypeAssignment_7_1 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLinEcore.g:26268:1: rule__OperationCS__OwnedTypeAssignment_7_1 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__OperationCS__OwnedTypeAssignment_7_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26268:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLinEcore.g:26269:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:26272:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLinEcore.g:26273:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLinEcore.g:26269:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLinEcore.g:26270:1: ruleTypedMultiplicityRefCS
+            // InternalOCLinEcore.g:26273:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:26274:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_7_1_0());
@@ -77109,17 +77109,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedExceptionsAssignment_8_1"
-    // InternalOCLinEcore.g:26279:1: rule__OperationCS__OwnedExceptionsAssignment_8_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:26283:1: rule__OperationCS__OwnedExceptionsAssignment_8_1 : ( ruleTypedRefCS ) ;
     public final void rule__OperationCS__OwnedExceptionsAssignment_8_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26283:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:26284:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:26287:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:26288:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:26284:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:26285:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:26288:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:26289:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_1_0());
@@ -77154,17 +77154,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedExceptionsAssignment_8_2_1"
-    // InternalOCLinEcore.g:26294:1: rule__OperationCS__OwnedExceptionsAssignment_8_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:26298:1: rule__OperationCS__OwnedExceptionsAssignment_8_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__OperationCS__OwnedExceptionsAssignment_8_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26298:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:26299:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:26302:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:26303:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:26299:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:26300:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:26303:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:26304:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_2_1_0());
@@ -77199,23 +77199,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_0"
-    // InternalOCLinEcore.g:26309:1: rule__OperationCS__QualifiersAssignment_9_1_0_0 : ( ( 'derived' ) ) ;
+    // InternalOCLinEcore.g:26313:1: rule__OperationCS__QualifiersAssignment_9_1_0_0 : ( ( 'derived' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26313:1: ( ( ( 'derived' ) ) )
-            // InternalOCLinEcore.g:26314:1: ( ( 'derived' ) )
+            // InternalOCLinEcore.g:26317:1: ( ( ( 'derived' ) ) )
+            // InternalOCLinEcore.g:26318:1: ( ( 'derived' ) )
             {
-            // InternalOCLinEcore.g:26314:1: ( ( 'derived' ) )
-            // InternalOCLinEcore.g:26315:1: ( 'derived' )
+            // InternalOCLinEcore.g:26318:1: ( ( 'derived' ) )
+            // InternalOCLinEcore.g:26319:1: ( 'derived' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
             }
-            // InternalOCLinEcore.g:26316:1: ( 'derived' )
-            // InternalOCLinEcore.g:26317:1: 'derived'
+            // InternalOCLinEcore.g:26320:1: ( 'derived' )
+            // InternalOCLinEcore.g:26321:1: 'derived'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());
@@ -77252,23 +77252,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_1"
-    // InternalOCLinEcore.g:26332:1: rule__OperationCS__QualifiersAssignment_9_1_0_1 : ( ( '!derived' ) ) ;
+    // InternalOCLinEcore.g:26336:1: rule__OperationCS__QualifiersAssignment_9_1_0_1 : ( ( '!derived' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26336:1: ( ( ( '!derived' ) ) )
-            // InternalOCLinEcore.g:26337:1: ( ( '!derived' ) )
+            // InternalOCLinEcore.g:26340:1: ( ( ( '!derived' ) ) )
+            // InternalOCLinEcore.g:26341:1: ( ( '!derived' ) )
             {
-            // InternalOCLinEcore.g:26337:1: ( ( '!derived' ) )
-            // InternalOCLinEcore.g:26338:1: ( '!derived' )
+            // InternalOCLinEcore.g:26341:1: ( ( '!derived' ) )
+            // InternalOCLinEcore.g:26342:1: ( '!derived' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
             }
-            // InternalOCLinEcore.g:26339:1: ( '!derived' )
-            // InternalOCLinEcore.g:26340:1: '!derived'
+            // InternalOCLinEcore.g:26343:1: ( '!derived' )
+            // InternalOCLinEcore.g:26344:1: '!derived'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());
@@ -77305,23 +77305,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_2"
-    // InternalOCLinEcore.g:26355:1: rule__OperationCS__QualifiersAssignment_9_1_0_2 : ( ( 'ordered' ) ) ;
+    // InternalOCLinEcore.g:26359:1: rule__OperationCS__QualifiersAssignment_9_1_0_2 : ( ( 'ordered' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26359:1: ( ( ( 'ordered' ) ) )
-            // InternalOCLinEcore.g:26360:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:26363:1: ( ( ( 'ordered' ) ) )
+            // InternalOCLinEcore.g:26364:1: ( ( 'ordered' ) )
             {
-            // InternalOCLinEcore.g:26360:1: ( ( 'ordered' ) )
-            // InternalOCLinEcore.g:26361:1: ( 'ordered' )
+            // InternalOCLinEcore.g:26364:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:26365:1: ( 'ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
             }
-            // InternalOCLinEcore.g:26362:1: ( 'ordered' )
-            // InternalOCLinEcore.g:26363:1: 'ordered'
+            // InternalOCLinEcore.g:26366:1: ( 'ordered' )
+            // InternalOCLinEcore.g:26367:1: 'ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());
@@ -77358,23 +77358,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_3"
-    // InternalOCLinEcore.g:26378:1: rule__OperationCS__QualifiersAssignment_9_1_0_3 : ( ( '!ordered' ) ) ;
+    // InternalOCLinEcore.g:26382:1: rule__OperationCS__QualifiersAssignment_9_1_0_3 : ( ( '!ordered' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26382:1: ( ( ( '!ordered' ) ) )
-            // InternalOCLinEcore.g:26383:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:26386:1: ( ( ( '!ordered' ) ) )
+            // InternalOCLinEcore.g:26387:1: ( ( '!ordered' ) )
             {
-            // InternalOCLinEcore.g:26383:1: ( ( '!ordered' ) )
-            // InternalOCLinEcore.g:26384:1: ( '!ordered' )
+            // InternalOCLinEcore.g:26387:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:26388:1: ( '!ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
             }
-            // InternalOCLinEcore.g:26385:1: ( '!ordered' )
-            // InternalOCLinEcore.g:26386:1: '!ordered'
+            // InternalOCLinEcore.g:26389:1: ( '!ordered' )
+            // InternalOCLinEcore.g:26390:1: '!ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());
@@ -77411,23 +77411,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_4"
-    // InternalOCLinEcore.g:26401:1: rule__OperationCS__QualifiersAssignment_9_1_0_4 : ( ( 'transient' ) ) ;
+    // InternalOCLinEcore.g:26405:1: rule__OperationCS__QualifiersAssignment_9_1_0_4 : ( ( 'transient' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26405:1: ( ( ( 'transient' ) ) )
-            // InternalOCLinEcore.g:26406:1: ( ( 'transient' ) )
+            // InternalOCLinEcore.g:26409:1: ( ( ( 'transient' ) ) )
+            // InternalOCLinEcore.g:26410:1: ( ( 'transient' ) )
             {
-            // InternalOCLinEcore.g:26406:1: ( ( 'transient' ) )
-            // InternalOCLinEcore.g:26407:1: ( 'transient' )
+            // InternalOCLinEcore.g:26410:1: ( ( 'transient' ) )
+            // InternalOCLinEcore.g:26411:1: ( 'transient' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
             }
-            // InternalOCLinEcore.g:26408:1: ( 'transient' )
-            // InternalOCLinEcore.g:26409:1: 'transient'
+            // InternalOCLinEcore.g:26412:1: ( 'transient' )
+            // InternalOCLinEcore.g:26413:1: 'transient'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_4_0());
@@ -77464,23 +77464,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_5"
-    // InternalOCLinEcore.g:26424:1: rule__OperationCS__QualifiersAssignment_9_1_0_5 : ( ( '!transient' ) ) ;
+    // InternalOCLinEcore.g:26428:1: rule__OperationCS__QualifiersAssignment_9_1_0_5 : ( ( '!transient' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26428:1: ( ( ( '!transient' ) ) )
-            // InternalOCLinEcore.g:26429:1: ( ( '!transient' ) )
+            // InternalOCLinEcore.g:26432:1: ( ( ( '!transient' ) ) )
+            // InternalOCLinEcore.g:26433:1: ( ( '!transient' ) )
             {
-            // InternalOCLinEcore.g:26429:1: ( ( '!transient' ) )
-            // InternalOCLinEcore.g:26430:1: ( '!transient' )
+            // InternalOCLinEcore.g:26433:1: ( ( '!transient' ) )
+            // InternalOCLinEcore.g:26434:1: ( '!transient' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
             }
-            // InternalOCLinEcore.g:26431:1: ( '!transient' )
-            // InternalOCLinEcore.g:26432:1: '!transient'
+            // InternalOCLinEcore.g:26435:1: ( '!transient' )
+            // InternalOCLinEcore.g:26436:1: '!transient'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersTransientKeyword_9_1_0_5_0());
@@ -77517,23 +77517,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_6"
-    // InternalOCLinEcore.g:26447:1: rule__OperationCS__QualifiersAssignment_9_1_0_6 : ( ( 'unique' ) ) ;
+    // InternalOCLinEcore.g:26451:1: rule__OperationCS__QualifiersAssignment_9_1_0_6 : ( ( 'unique' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26451:1: ( ( ( 'unique' ) ) )
-            // InternalOCLinEcore.g:26452:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:26455:1: ( ( ( 'unique' ) ) )
+            // InternalOCLinEcore.g:26456:1: ( ( 'unique' ) )
             {
-            // InternalOCLinEcore.g:26452:1: ( ( 'unique' ) )
-            // InternalOCLinEcore.g:26453:1: ( 'unique' )
+            // InternalOCLinEcore.g:26456:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:26457:1: ( 'unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
             }
-            // InternalOCLinEcore.g:26454:1: ( 'unique' )
-            // InternalOCLinEcore.g:26455:1: 'unique'
+            // InternalOCLinEcore.g:26458:1: ( 'unique' )
+            // InternalOCLinEcore.g:26459:1: 'unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_6_0());
@@ -77570,23 +77570,23 @@
 
 
     // $ANTLR start "rule__OperationCS__QualifiersAssignment_9_1_0_7"
-    // InternalOCLinEcore.g:26470:1: rule__OperationCS__QualifiersAssignment_9_1_0_7 : ( ( '!unique' ) ) ;
+    // InternalOCLinEcore.g:26474:1: rule__OperationCS__QualifiersAssignment_9_1_0_7 : ( ( '!unique' ) ) ;
     public final void rule__OperationCS__QualifiersAssignment_9_1_0_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26474:1: ( ( ( '!unique' ) ) )
-            // InternalOCLinEcore.g:26475:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:26478:1: ( ( ( '!unique' ) ) )
+            // InternalOCLinEcore.g:26479:1: ( ( '!unique' ) )
             {
-            // InternalOCLinEcore.g:26475:1: ( ( '!unique' ) )
-            // InternalOCLinEcore.g:26476:1: ( '!unique' )
+            // InternalOCLinEcore.g:26479:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:26480:1: ( '!unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
             }
-            // InternalOCLinEcore.g:26477:1: ( '!unique' )
-            // InternalOCLinEcore.g:26478:1: '!unique'
+            // InternalOCLinEcore.g:26481:1: ( '!unique' )
+            // InternalOCLinEcore.g:26482:1: '!unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_7_0());
@@ -77623,17 +77623,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0"
-    // InternalOCLinEcore.g:26493:1: rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:26497:1: rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__OperationCS__OwnedAnnotationsAssignment_10_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26497:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:26498:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26501:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:26502:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:26498:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:26499:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:26502:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26503:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_10_0_1_0_0());
@@ -77668,17 +77668,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1"
-    // InternalOCLinEcore.g:26508:1: rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 : ( rulePreconditionConstraintCS ) ;
+    // InternalOCLinEcore.g:26512:1: rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1 : ( rulePreconditionConstraintCS ) ;
     public final void rule__OperationCS__OwnedPreconditionsAssignment_10_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26512:1: ( ( rulePreconditionConstraintCS ) )
-            // InternalOCLinEcore.g:26513:1: ( rulePreconditionConstraintCS )
+            // InternalOCLinEcore.g:26516:1: ( ( rulePreconditionConstraintCS ) )
+            // InternalOCLinEcore.g:26517:1: ( rulePreconditionConstraintCS )
             {
-            // InternalOCLinEcore.g:26513:1: ( rulePreconditionConstraintCS )
-            // InternalOCLinEcore.g:26514:1: rulePreconditionConstraintCS
+            // InternalOCLinEcore.g:26517:1: ( rulePreconditionConstraintCS )
+            // InternalOCLinEcore.g:26518:1: rulePreconditionConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedPreconditionsPreconditionConstraintCSParserRuleCall_10_0_1_1_0());
@@ -77713,17 +77713,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3"
-    // InternalOCLinEcore.g:26523:1: rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:26527:1: rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3 : ( ruleSpecificationCS ) ;
     public final void rule__OperationCS__OwnedBodyExpressionsAssignment_10_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26527:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:26528:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:26531:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:26532:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:26528:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:26529:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:26532:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:26533:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_10_0_1_2_3_0());
@@ -77758,17 +77758,17 @@
 
 
     // $ANTLR start "rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3"
-    // InternalOCLinEcore.g:26538:1: rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 : ( rulePostconditionConstraintCS ) ;
+    // InternalOCLinEcore.g:26542:1: rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3 : ( rulePostconditionConstraintCS ) ;
     public final void rule__OperationCS__OwnedPostconditionsAssignment_10_0_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26542:1: ( ( rulePostconditionConstraintCS ) )
-            // InternalOCLinEcore.g:26543:1: ( rulePostconditionConstraintCS )
+            // InternalOCLinEcore.g:26546:1: ( ( rulePostconditionConstraintCS ) )
+            // InternalOCLinEcore.g:26547:1: ( rulePostconditionConstraintCS )
             {
-            // InternalOCLinEcore.g:26543:1: ( rulePostconditionConstraintCS )
-            // InternalOCLinEcore.g:26544:1: rulePostconditionConstraintCS
+            // InternalOCLinEcore.g:26547:1: ( rulePostconditionConstraintCS )
+            // InternalOCLinEcore.g:26548:1: rulePostconditionConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOperationCSAccess().getOwnedPostconditionsPostconditionConstraintCSParserRuleCall_10_0_1_3_0());
@@ -77803,17 +77803,17 @@
 
 
     // $ANTLR start "rule__PackageCS__NameAssignment_1"
-    // InternalOCLinEcore.g:26553:1: rule__PackageCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26557:1: rule__PackageCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
     public final void rule__PackageCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26557:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26558:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26561:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:26562:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26558:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:26559:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:26562:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26563:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
@@ -77848,17 +77848,17 @@
 
 
     // $ANTLR start "rule__PackageCS__NsPrefixAssignment_2_1"
-    // InternalOCLinEcore.g:26568:1: rule__PackageCS__NsPrefixAssignment_2_1 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26572:1: rule__PackageCS__NsPrefixAssignment_2_1 : ( ruleUnrestrictedName ) ;
     public final void rule__PackageCS__NsPrefixAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26572:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26573:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26576:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:26577:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26573:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:26574:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:26577:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26578:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsPrefixUnrestrictedNameParserRuleCall_2_1_0());
@@ -77893,17 +77893,17 @@
 
 
     // $ANTLR start "rule__PackageCS__NsURIAssignment_3_1"
-    // InternalOCLinEcore.g:26583:1: rule__PackageCS__NsURIAssignment_3_1 : ( ruleURI ) ;
+    // InternalOCLinEcore.g:26587:1: rule__PackageCS__NsURIAssignment_3_1 : ( ruleURI ) ;
     public final void rule__PackageCS__NsURIAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26587:1: ( ( ruleURI ) )
-            // InternalOCLinEcore.g:26588:1: ( ruleURI )
+            // InternalOCLinEcore.g:26591:1: ( ( ruleURI ) )
+            // InternalOCLinEcore.g:26592:1: ( ruleURI )
             {
-            // InternalOCLinEcore.g:26588:1: ( ruleURI )
-            // InternalOCLinEcore.g:26589:1: ruleURI
+            // InternalOCLinEcore.g:26592:1: ( ruleURI )
+            // InternalOCLinEcore.g:26593:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsURIURIParserRuleCall_3_1_0());
@@ -77938,17 +77938,17 @@
 
 
     // $ANTLR start "rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0"
-    // InternalOCLinEcore.g:26598:1: rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:26602:1: rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__PackageCS__OwnedAnnotationsAssignment_4_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26602:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:26603:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26606:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:26607:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:26603:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:26604:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:26607:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26608:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_0_1_0_0());
@@ -77983,17 +77983,17 @@
 
 
     // $ANTLR start "rule__PackageCS__OwnedPackagesAssignment_4_0_1_1"
-    // InternalOCLinEcore.g:26613:1: rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 : ( rulePackageCS ) ;
+    // InternalOCLinEcore.g:26617:1: rule__PackageCS__OwnedPackagesAssignment_4_0_1_1 : ( rulePackageCS ) ;
     public final void rule__PackageCS__OwnedPackagesAssignment_4_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26617:1: ( ( rulePackageCS ) )
-            // InternalOCLinEcore.g:26618:1: ( rulePackageCS )
+            // InternalOCLinEcore.g:26621:1: ( ( rulePackageCS ) )
+            // InternalOCLinEcore.g:26622:1: ( rulePackageCS )
             {
-            // InternalOCLinEcore.g:26618:1: ( rulePackageCS )
-            // InternalOCLinEcore.g:26619:1: rulePackageCS
+            // InternalOCLinEcore.g:26622:1: ( rulePackageCS )
+            // InternalOCLinEcore.g:26623:1: rulePackageCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getOwnedPackagesPackageCSParserRuleCall_4_0_1_1_0());
@@ -78028,17 +78028,17 @@
 
 
     // $ANTLR start "rule__PackageCS__OwnedClassesAssignment_4_0_1_2"
-    // InternalOCLinEcore.g:26628:1: rule__PackageCS__OwnedClassesAssignment_4_0_1_2 : ( ruleClassCS ) ;
+    // InternalOCLinEcore.g:26632:1: rule__PackageCS__OwnedClassesAssignment_4_0_1_2 : ( ruleClassCS ) ;
     public final void rule__PackageCS__OwnedClassesAssignment_4_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26632:1: ( ( ruleClassCS ) )
-            // InternalOCLinEcore.g:26633:1: ( ruleClassCS )
+            // InternalOCLinEcore.g:26636:1: ( ( ruleClassCS ) )
+            // InternalOCLinEcore.g:26637:1: ( ruleClassCS )
             {
-            // InternalOCLinEcore.g:26633:1: ( ruleClassCS )
-            // InternalOCLinEcore.g:26634:1: ruleClassCS
+            // InternalOCLinEcore.g:26637:1: ( ruleClassCS )
+            // InternalOCLinEcore.g:26638:1: ruleClassCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getOwnedClassesClassCSParserRuleCall_4_0_1_2_0());
@@ -78073,17 +78073,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__NameAssignment_0"
-    // InternalOCLinEcore.g:26643:1: rule__ParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26647:1: rule__ParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__ParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26647:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26648:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26651:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:26652:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26648:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:26649:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:26652:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26653:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -78118,17 +78118,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__OwnedTypeAssignment_1_1"
-    // InternalOCLinEcore.g:26658:1: rule__ParameterCS__OwnedTypeAssignment_1_1 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLinEcore.g:26662:1: rule__ParameterCS__OwnedTypeAssignment_1_1 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__ParameterCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26662:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLinEcore.g:26663:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:26666:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLinEcore.g:26667:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLinEcore.g:26663:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLinEcore.g:26664:1: ruleTypedMultiplicityRefCS
+            // InternalOCLinEcore.g:26667:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:26668:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_1_1_0());
@@ -78163,23 +78163,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_0"
-    // InternalOCLinEcore.g:26673:1: rule__ParameterCS__QualifiersAssignment_2_1_0_0 : ( ( 'ordered' ) ) ;
+    // InternalOCLinEcore.g:26677:1: rule__ParameterCS__QualifiersAssignment_2_1_0_0 : ( ( 'ordered' ) ) ;
     public final void rule__ParameterCS__QualifiersAssignment_2_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26677:1: ( ( ( 'ordered' ) ) )
-            // InternalOCLinEcore.g:26678:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:26681:1: ( ( ( 'ordered' ) ) )
+            // InternalOCLinEcore.g:26682:1: ( ( 'ordered' ) )
             {
-            // InternalOCLinEcore.g:26678:1: ( ( 'ordered' ) )
-            // InternalOCLinEcore.g:26679:1: ( 'ordered' )
+            // InternalOCLinEcore.g:26682:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:26683:1: ( 'ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
             }
-            // InternalOCLinEcore.g:26680:1: ( 'ordered' )
-            // InternalOCLinEcore.g:26681:1: 'ordered'
+            // InternalOCLinEcore.g:26684:1: ( 'ordered' )
+            // InternalOCLinEcore.g:26685:1: 'ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());
@@ -78216,23 +78216,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_1"
-    // InternalOCLinEcore.g:26696:1: rule__ParameterCS__QualifiersAssignment_2_1_0_1 : ( ( '!ordered' ) ) ;
+    // InternalOCLinEcore.g:26700:1: rule__ParameterCS__QualifiersAssignment_2_1_0_1 : ( ( '!ordered' ) ) ;
     public final void rule__ParameterCS__QualifiersAssignment_2_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26700:1: ( ( ( '!ordered' ) ) )
-            // InternalOCLinEcore.g:26701:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:26704:1: ( ( ( '!ordered' ) ) )
+            // InternalOCLinEcore.g:26705:1: ( ( '!ordered' ) )
             {
-            // InternalOCLinEcore.g:26701:1: ( ( '!ordered' ) )
-            // InternalOCLinEcore.g:26702:1: ( '!ordered' )
+            // InternalOCLinEcore.g:26705:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:26706:1: ( '!ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
             }
-            // InternalOCLinEcore.g:26703:1: ( '!ordered' )
-            // InternalOCLinEcore.g:26704:1: '!ordered'
+            // InternalOCLinEcore.g:26707:1: ( '!ordered' )
+            // InternalOCLinEcore.g:26708:1: '!ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());
@@ -78269,23 +78269,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_2"
-    // InternalOCLinEcore.g:26719:1: rule__ParameterCS__QualifiersAssignment_2_1_0_2 : ( ( 'unique' ) ) ;
+    // InternalOCLinEcore.g:26723:1: rule__ParameterCS__QualifiersAssignment_2_1_0_2 : ( ( 'unique' ) ) ;
     public final void rule__ParameterCS__QualifiersAssignment_2_1_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26723:1: ( ( ( 'unique' ) ) )
-            // InternalOCLinEcore.g:26724:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:26727:1: ( ( ( 'unique' ) ) )
+            // InternalOCLinEcore.g:26728:1: ( ( 'unique' ) )
             {
-            // InternalOCLinEcore.g:26724:1: ( ( 'unique' ) )
-            // InternalOCLinEcore.g:26725:1: ( 'unique' )
+            // InternalOCLinEcore.g:26728:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:26729:1: ( 'unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
             }
-            // InternalOCLinEcore.g:26726:1: ( 'unique' )
-            // InternalOCLinEcore.g:26727:1: 'unique'
+            // InternalOCLinEcore.g:26730:1: ( 'unique' )
+            // InternalOCLinEcore.g:26731:1: 'unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());
@@ -78322,23 +78322,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__QualifiersAssignment_2_1_0_3"
-    // InternalOCLinEcore.g:26742:1: rule__ParameterCS__QualifiersAssignment_2_1_0_3 : ( ( '!unique' ) ) ;
+    // InternalOCLinEcore.g:26746:1: rule__ParameterCS__QualifiersAssignment_2_1_0_3 : ( ( '!unique' ) ) ;
     public final void rule__ParameterCS__QualifiersAssignment_2_1_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26746:1: ( ( ( '!unique' ) ) )
-            // InternalOCLinEcore.g:26747:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:26750:1: ( ( ( '!unique' ) ) )
+            // InternalOCLinEcore.g:26751:1: ( ( '!unique' ) )
             {
-            // InternalOCLinEcore.g:26747:1: ( ( '!unique' ) )
-            // InternalOCLinEcore.g:26748:1: ( '!unique' )
+            // InternalOCLinEcore.g:26751:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:26752:1: ( '!unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
             }
-            // InternalOCLinEcore.g:26749:1: ( '!unique' )
-            // InternalOCLinEcore.g:26750:1: '!unique'
+            // InternalOCLinEcore.g:26753:1: ( '!unique' )
+            // InternalOCLinEcore.g:26754:1: '!unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());
@@ -78375,17 +78375,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__OwnedAnnotationsAssignment_3_1"
-    // InternalOCLinEcore.g:26765:1: rule__ParameterCS__OwnedAnnotationsAssignment_3_1 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:26769:1: rule__ParameterCS__OwnedAnnotationsAssignment_3_1 : ( ruleAnnotationElementCS ) ;
     public final void rule__ParameterCS__OwnedAnnotationsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26769:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:26770:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26773:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:26774:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:26770:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:26771:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:26774:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:26775:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_1_0());
@@ -78420,17 +78420,17 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__NameAssignment_1"
-    // InternalOCLinEcore.g:26780:1: rule__ImplicitOppositeCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26784:1: rule__ImplicitOppositeCS__NameAssignment_1 : ( ruleUnrestrictedName ) ;
     public final void rule__ImplicitOppositeCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26784:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26785:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26788:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:26789:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26785:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:26786:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:26789:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:26790:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());
@@ -78465,17 +78465,17 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__OwnedTypeAssignment_3"
-    // InternalOCLinEcore.g:26795:1: rule__ImplicitOppositeCS__OwnedTypeAssignment_3 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLinEcore.g:26799:1: rule__ImplicitOppositeCS__OwnedTypeAssignment_3 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__ImplicitOppositeCS__OwnedTypeAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26799:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLinEcore.g:26800:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:26803:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLinEcore.g:26804:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLinEcore.g:26800:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLinEcore.g:26801:1: ruleTypedMultiplicityRefCS
+            // InternalOCLinEcore.g:26804:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:26805:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_0());
@@ -78510,23 +78510,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0"
-    // InternalOCLinEcore.g:26810:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 : ( ( 'ordered' ) ) ;
+    // InternalOCLinEcore.g:26814:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0 : ( ( 'ordered' ) ) ;
     public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26814:1: ( ( ( 'ordered' ) ) )
-            // InternalOCLinEcore.g:26815:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:26818:1: ( ( ( 'ordered' ) ) )
+            // InternalOCLinEcore.g:26819:1: ( ( 'ordered' ) )
             {
-            // InternalOCLinEcore.g:26815:1: ( ( 'ordered' ) )
-            // InternalOCLinEcore.g:26816:1: ( 'ordered' )
+            // InternalOCLinEcore.g:26819:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:26820:1: ( 'ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());
             }
-            // InternalOCLinEcore.g:26817:1: ( 'ordered' )
-            // InternalOCLinEcore.g:26818:1: 'ordered'
+            // InternalOCLinEcore.g:26821:1: ( 'ordered' )
+            // InternalOCLinEcore.g:26822:1: 'ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_0_0());
@@ -78563,23 +78563,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1"
-    // InternalOCLinEcore.g:26833:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 : ( ( '!ordered' ) ) ;
+    // InternalOCLinEcore.g:26837:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1 : ( ( '!ordered' ) ) ;
     public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26837:1: ( ( ( '!ordered' ) ) )
-            // InternalOCLinEcore.g:26838:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:26841:1: ( ( ( '!ordered' ) ) )
+            // InternalOCLinEcore.g:26842:1: ( ( '!ordered' ) )
             {
-            // InternalOCLinEcore.g:26838:1: ( ( '!ordered' ) )
-            // InternalOCLinEcore.g:26839:1: ( '!ordered' )
+            // InternalOCLinEcore.g:26842:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:26843:1: ( '!ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());
             }
-            // InternalOCLinEcore.g:26840:1: ( '!ordered' )
-            // InternalOCLinEcore.g:26841:1: '!ordered'
+            // InternalOCLinEcore.g:26844:1: ( '!ordered' )
+            // InternalOCLinEcore.g:26845:1: '!ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersOrderedKeyword_4_1_0_1_0());
@@ -78616,23 +78616,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2"
-    // InternalOCLinEcore.g:26856:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 : ( ( 'unique' ) ) ;
+    // InternalOCLinEcore.g:26860:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2 : ( ( 'unique' ) ) ;
     public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26860:1: ( ( ( 'unique' ) ) )
-            // InternalOCLinEcore.g:26861:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:26864:1: ( ( ( 'unique' ) ) )
+            // InternalOCLinEcore.g:26865:1: ( ( 'unique' ) )
             {
-            // InternalOCLinEcore.g:26861:1: ( ( 'unique' ) )
-            // InternalOCLinEcore.g:26862:1: ( 'unique' )
+            // InternalOCLinEcore.g:26865:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:26866:1: ( 'unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());
             }
-            // InternalOCLinEcore.g:26863:1: ( 'unique' )
-            // InternalOCLinEcore.g:26864:1: 'unique'
+            // InternalOCLinEcore.g:26867:1: ( 'unique' )
+            // InternalOCLinEcore.g:26868:1: 'unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_2_0());
@@ -78669,23 +78669,23 @@
 
 
     // $ANTLR start "rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3"
-    // InternalOCLinEcore.g:26879:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 : ( ( '!unique' ) ) ;
+    // InternalOCLinEcore.g:26883:1: rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3 : ( ( '!unique' ) ) ;
     public final void rule__ImplicitOppositeCS__QualifiersAssignment_4_1_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26883:1: ( ( ( '!unique' ) ) )
-            // InternalOCLinEcore.g:26884:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:26887:1: ( ( ( '!unique' ) ) )
+            // InternalOCLinEcore.g:26888:1: ( ( '!unique' ) )
             {
-            // InternalOCLinEcore.g:26884:1: ( ( '!unique' ) )
-            // InternalOCLinEcore.g:26885:1: ( '!unique' )
+            // InternalOCLinEcore.g:26888:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:26889:1: ( '!unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());
             }
-            // InternalOCLinEcore.g:26886:1: ( '!unique' )
-            // InternalOCLinEcore.g:26887:1: '!unique'
+            // InternalOCLinEcore.g:26890:1: ( '!unique' )
+            // InternalOCLinEcore.g:26891:1: '!unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImplicitOppositeCSAccess().getQualifiersUniqueKeyword_4_1_0_3_0());
@@ -78722,23 +78722,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_0_0"
-    // InternalOCLinEcore.g:26902:1: rule__ReferenceCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
+    // InternalOCLinEcore.g:26906:1: rule__ReferenceCS__QualifiersAssignment_0_0_0 : ( ( 'static' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26906:1: ( ( ( 'static' ) ) )
-            // InternalOCLinEcore.g:26907:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26910:1: ( ( ( 'static' ) ) )
+            // InternalOCLinEcore.g:26911:1: ( ( 'static' ) )
             {
-            // InternalOCLinEcore.g:26907:1: ( ( 'static' ) )
-            // InternalOCLinEcore.g:26908:1: ( 'static' )
+            // InternalOCLinEcore.g:26911:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26912:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
             }
-            // InternalOCLinEcore.g:26909:1: ( 'static' )
-            // InternalOCLinEcore.g:26910:1: 'static'
+            // InternalOCLinEcore.g:26913:1: ( 'static' )
+            // InternalOCLinEcore.g:26914:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());
@@ -78775,23 +78775,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_0_1"
-    // InternalOCLinEcore.g:26925:1: rule__ReferenceCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
+    // InternalOCLinEcore.g:26929:1: rule__ReferenceCS__QualifiersAssignment_0_0_1 : ( ( 'definition' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26929:1: ( ( ( 'definition' ) ) )
-            // InternalOCLinEcore.g:26930:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26933:1: ( ( ( 'definition' ) ) )
+            // InternalOCLinEcore.g:26934:1: ( ( 'definition' ) )
             {
-            // InternalOCLinEcore.g:26930:1: ( ( 'definition' ) )
-            // InternalOCLinEcore.g:26931:1: ( 'definition' )
+            // InternalOCLinEcore.g:26934:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26935:1: ( 'definition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
             }
-            // InternalOCLinEcore.g:26932:1: ( 'definition' )
-            // InternalOCLinEcore.g:26933:1: 'definition'
+            // InternalOCLinEcore.g:26936:1: ( 'definition' )
+            // InternalOCLinEcore.g:26937:1: 'definition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());
@@ -78828,23 +78828,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_1_0"
-    // InternalOCLinEcore.g:26948:1: rule__ReferenceCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
+    // InternalOCLinEcore.g:26952:1: rule__ReferenceCS__QualifiersAssignment_0_1_0 : ( ( 'definition' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26952:1: ( ( ( 'definition' ) ) )
-            // InternalOCLinEcore.g:26953:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26956:1: ( ( ( 'definition' ) ) )
+            // InternalOCLinEcore.g:26957:1: ( ( 'definition' ) )
             {
-            // InternalOCLinEcore.g:26953:1: ( ( 'definition' ) )
-            // InternalOCLinEcore.g:26954:1: ( 'definition' )
+            // InternalOCLinEcore.g:26957:1: ( ( 'definition' ) )
+            // InternalOCLinEcore.g:26958:1: ( 'definition' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
             }
-            // InternalOCLinEcore.g:26955:1: ( 'definition' )
-            // InternalOCLinEcore.g:26956:1: 'definition'
+            // InternalOCLinEcore.g:26959:1: ( 'definition' )
+            // InternalOCLinEcore.g:26960:1: 'definition'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());
@@ -78881,23 +78881,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_0_1_1"
-    // InternalOCLinEcore.g:26971:1: rule__ReferenceCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
+    // InternalOCLinEcore.g:26975:1: rule__ReferenceCS__QualifiersAssignment_0_1_1 : ( ( 'static' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26975:1: ( ( ( 'static' ) ) )
-            // InternalOCLinEcore.g:26976:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26979:1: ( ( ( 'static' ) ) )
+            // InternalOCLinEcore.g:26980:1: ( ( 'static' ) )
             {
-            // InternalOCLinEcore.g:26976:1: ( ( 'static' ) )
-            // InternalOCLinEcore.g:26977:1: ( 'static' )
+            // InternalOCLinEcore.g:26980:1: ( ( 'static' ) )
+            // InternalOCLinEcore.g:26981:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
             }
-            // InternalOCLinEcore.g:26978:1: ( 'static' )
-            // InternalOCLinEcore.g:26979:1: 'static'
+            // InternalOCLinEcore.g:26982:1: ( 'static' )
+            // InternalOCLinEcore.g:26983:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());
@@ -78934,17 +78934,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__NameAssignment_2"
-    // InternalOCLinEcore.g:26994:1: rule__ReferenceCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:26998:1: rule__ReferenceCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
     public final void rule__ReferenceCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:26998:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:26999:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27002:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27003:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:26999:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:27000:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:27003:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27004:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
@@ -78979,23 +78979,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__ReferredOppositeAssignment_3_1"
-    // InternalOCLinEcore.g:27009:1: rule__ReferenceCS__ReferredOppositeAssignment_3_1 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:27013:1: rule__ReferenceCS__ReferredOppositeAssignment_3_1 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ReferenceCS__ReferredOppositeAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27013:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:27014:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27017:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:27018:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:27014:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:27015:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27018:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27019:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyCrossReference_3_1_0());
             }
-            // InternalOCLinEcore.g:27016:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:27017:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:27020:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27021:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyUnrestrictedNameParserRuleCall_3_1_0_1());
@@ -79036,17 +79036,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__OwnedTypeAssignment_4_1"
-    // InternalOCLinEcore.g:27028:1: rule__ReferenceCS__OwnedTypeAssignment_4_1 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLinEcore.g:27032:1: rule__ReferenceCS__OwnedTypeAssignment_4_1 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__ReferenceCS__OwnedTypeAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27032:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLinEcore.g:27033:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:27036:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLinEcore.g:27037:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLinEcore.g:27033:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLinEcore.g:27034:1: ruleTypedMultiplicityRefCS
+            // InternalOCLinEcore.g:27037:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLinEcore.g:27038:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_1_0());
@@ -79081,17 +79081,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__DefaultAssignment_5_1"
-    // InternalOCLinEcore.g:27043:1: rule__ReferenceCS__DefaultAssignment_5_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:27047:1: rule__ReferenceCS__DefaultAssignment_5_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__ReferenceCS__DefaultAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27047:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:27048:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:27051:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:27052:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:27048:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:27049:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:27052:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:27053:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());
@@ -79122,23 +79122,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_0"
-    // InternalOCLinEcore.g:27058:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_0 : ( ( 'composes' ) ) ;
+    // InternalOCLinEcore.g:27062:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_0 : ( ( 'composes' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27062:1: ( ( ( 'composes' ) ) )
-            // InternalOCLinEcore.g:27063:1: ( ( 'composes' ) )
+            // InternalOCLinEcore.g:27066:1: ( ( ( 'composes' ) ) )
+            // InternalOCLinEcore.g:27067:1: ( ( 'composes' ) )
             {
-            // InternalOCLinEcore.g:27063:1: ( ( 'composes' ) )
-            // InternalOCLinEcore.g:27064:1: ( 'composes' )
+            // InternalOCLinEcore.g:27067:1: ( ( 'composes' ) )
+            // InternalOCLinEcore.g:27068:1: ( 'composes' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
             }
-            // InternalOCLinEcore.g:27065:1: ( 'composes' )
-            // InternalOCLinEcore.g:27066:1: 'composes'
+            // InternalOCLinEcore.g:27069:1: ( 'composes' )
+            // InternalOCLinEcore.g:27070:1: 'composes'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());
@@ -79175,23 +79175,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_1"
-    // InternalOCLinEcore.g:27081:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_1 : ( ( '!composes' ) ) ;
+    // InternalOCLinEcore.g:27085:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_1 : ( ( '!composes' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27085:1: ( ( ( '!composes' ) ) )
-            // InternalOCLinEcore.g:27086:1: ( ( '!composes' ) )
+            // InternalOCLinEcore.g:27089:1: ( ( ( '!composes' ) ) )
+            // InternalOCLinEcore.g:27090:1: ( ( '!composes' ) )
             {
-            // InternalOCLinEcore.g:27086:1: ( ( '!composes' ) )
-            // InternalOCLinEcore.g:27087:1: ( '!composes' )
+            // InternalOCLinEcore.g:27090:1: ( ( '!composes' ) )
+            // InternalOCLinEcore.g:27091:1: ( '!composes' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
             }
-            // InternalOCLinEcore.g:27088:1: ( '!composes' )
-            // InternalOCLinEcore.g:27089:1: '!composes'
+            // InternalOCLinEcore.g:27092:1: ( '!composes' )
+            // InternalOCLinEcore.g:27093:1: '!composes'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());
@@ -79228,23 +79228,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_2"
-    // InternalOCLinEcore.g:27104:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_2 : ( ( 'derived' ) ) ;
+    // InternalOCLinEcore.g:27108:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_2 : ( ( 'derived' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27108:1: ( ( ( 'derived' ) ) )
-            // InternalOCLinEcore.g:27109:1: ( ( 'derived' ) )
+            // InternalOCLinEcore.g:27112:1: ( ( ( 'derived' ) ) )
+            // InternalOCLinEcore.g:27113:1: ( ( 'derived' ) )
             {
-            // InternalOCLinEcore.g:27109:1: ( ( 'derived' ) )
-            // InternalOCLinEcore.g:27110:1: ( 'derived' )
+            // InternalOCLinEcore.g:27113:1: ( ( 'derived' ) )
+            // InternalOCLinEcore.g:27114:1: ( 'derived' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
             }
-            // InternalOCLinEcore.g:27111:1: ( 'derived' )
-            // InternalOCLinEcore.g:27112:1: 'derived'
+            // InternalOCLinEcore.g:27115:1: ( 'derived' )
+            // InternalOCLinEcore.g:27116:1: 'derived'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());
@@ -79281,23 +79281,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_3"
-    // InternalOCLinEcore.g:27127:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_3 : ( ( '!derived' ) ) ;
+    // InternalOCLinEcore.g:27131:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_3 : ( ( '!derived' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27131:1: ( ( ( '!derived' ) ) )
-            // InternalOCLinEcore.g:27132:1: ( ( '!derived' ) )
+            // InternalOCLinEcore.g:27135:1: ( ( ( '!derived' ) ) )
+            // InternalOCLinEcore.g:27136:1: ( ( '!derived' ) )
             {
-            // InternalOCLinEcore.g:27132:1: ( ( '!derived' ) )
-            // InternalOCLinEcore.g:27133:1: ( '!derived' )
+            // InternalOCLinEcore.g:27136:1: ( ( '!derived' ) )
+            // InternalOCLinEcore.g:27137:1: ( '!derived' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
             }
-            // InternalOCLinEcore.g:27134:1: ( '!derived' )
-            // InternalOCLinEcore.g:27135:1: '!derived'
+            // InternalOCLinEcore.g:27138:1: ( '!derived' )
+            // InternalOCLinEcore.g:27139:1: '!derived'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());
@@ -79334,23 +79334,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_4"
-    // InternalOCLinEcore.g:27150:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_4 : ( ( 'ordered' ) ) ;
+    // InternalOCLinEcore.g:27154:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_4 : ( ( 'ordered' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27154:1: ( ( ( 'ordered' ) ) )
-            // InternalOCLinEcore.g:27155:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:27158:1: ( ( ( 'ordered' ) ) )
+            // InternalOCLinEcore.g:27159:1: ( ( 'ordered' ) )
             {
-            // InternalOCLinEcore.g:27155:1: ( ( 'ordered' ) )
-            // InternalOCLinEcore.g:27156:1: ( 'ordered' )
+            // InternalOCLinEcore.g:27159:1: ( ( 'ordered' ) )
+            // InternalOCLinEcore.g:27160:1: ( 'ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
             }
-            // InternalOCLinEcore.g:27157:1: ( 'ordered' )
-            // InternalOCLinEcore.g:27158:1: 'ordered'
+            // InternalOCLinEcore.g:27161:1: ( 'ordered' )
+            // InternalOCLinEcore.g:27162:1: 'ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());
@@ -79387,23 +79387,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_5"
-    // InternalOCLinEcore.g:27173:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_5 : ( ( '!ordered' ) ) ;
+    // InternalOCLinEcore.g:27177:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_5 : ( ( '!ordered' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27177:1: ( ( ( '!ordered' ) ) )
-            // InternalOCLinEcore.g:27178:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:27181:1: ( ( ( '!ordered' ) ) )
+            // InternalOCLinEcore.g:27182:1: ( ( '!ordered' ) )
             {
-            // InternalOCLinEcore.g:27178:1: ( ( '!ordered' ) )
-            // InternalOCLinEcore.g:27179:1: ( '!ordered' )
+            // InternalOCLinEcore.g:27182:1: ( ( '!ordered' ) )
+            // InternalOCLinEcore.g:27183:1: ( '!ordered' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
             }
-            // InternalOCLinEcore.g:27180:1: ( '!ordered' )
-            // InternalOCLinEcore.g:27181:1: '!ordered'
+            // InternalOCLinEcore.g:27184:1: ( '!ordered' )
+            // InternalOCLinEcore.g:27185:1: '!ordered'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());
@@ -79440,23 +79440,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_6"
-    // InternalOCLinEcore.g:27196:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_6 : ( ( 'readonly' ) ) ;
+    // InternalOCLinEcore.g:27200:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_6 : ( ( 'readonly' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27200:1: ( ( ( 'readonly' ) ) )
-            // InternalOCLinEcore.g:27201:1: ( ( 'readonly' ) )
+            // InternalOCLinEcore.g:27204:1: ( ( ( 'readonly' ) ) )
+            // InternalOCLinEcore.g:27205:1: ( ( 'readonly' ) )
             {
-            // InternalOCLinEcore.g:27201:1: ( ( 'readonly' ) )
-            // InternalOCLinEcore.g:27202:1: ( 'readonly' )
+            // InternalOCLinEcore.g:27205:1: ( ( 'readonly' ) )
+            // InternalOCLinEcore.g:27206:1: ( 'readonly' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
             }
-            // InternalOCLinEcore.g:27203:1: ( 'readonly' )
-            // InternalOCLinEcore.g:27204:1: 'readonly'
+            // InternalOCLinEcore.g:27207:1: ( 'readonly' )
+            // InternalOCLinEcore.g:27208:1: 'readonly'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());
@@ -79493,23 +79493,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_7"
-    // InternalOCLinEcore.g:27219:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_7 : ( ( '!readonly' ) ) ;
+    // InternalOCLinEcore.g:27223:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_7 : ( ( '!readonly' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27223:1: ( ( ( '!readonly' ) ) )
-            // InternalOCLinEcore.g:27224:1: ( ( '!readonly' ) )
+            // InternalOCLinEcore.g:27227:1: ( ( ( '!readonly' ) ) )
+            // InternalOCLinEcore.g:27228:1: ( ( '!readonly' ) )
             {
-            // InternalOCLinEcore.g:27224:1: ( ( '!readonly' ) )
-            // InternalOCLinEcore.g:27225:1: ( '!readonly' )
+            // InternalOCLinEcore.g:27228:1: ( ( '!readonly' ) )
+            // InternalOCLinEcore.g:27229:1: ( '!readonly' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
             }
-            // InternalOCLinEcore.g:27226:1: ( '!readonly' )
-            // InternalOCLinEcore.g:27227:1: '!readonly'
+            // InternalOCLinEcore.g:27230:1: ( '!readonly' )
+            // InternalOCLinEcore.g:27231:1: '!readonly'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());
@@ -79546,23 +79546,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_8"
-    // InternalOCLinEcore.g:27242:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_8 : ( ( 'resolve' ) ) ;
+    // InternalOCLinEcore.g:27246:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_8 : ( ( 'resolve' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27246:1: ( ( ( 'resolve' ) ) )
-            // InternalOCLinEcore.g:27247:1: ( ( 'resolve' ) )
+            // InternalOCLinEcore.g:27250:1: ( ( ( 'resolve' ) ) )
+            // InternalOCLinEcore.g:27251:1: ( ( 'resolve' ) )
             {
-            // InternalOCLinEcore.g:27247:1: ( ( 'resolve' ) )
-            // InternalOCLinEcore.g:27248:1: ( 'resolve' )
+            // InternalOCLinEcore.g:27251:1: ( ( 'resolve' ) )
+            // InternalOCLinEcore.g:27252:1: ( 'resolve' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
             }
-            // InternalOCLinEcore.g:27249:1: ( 'resolve' )
-            // InternalOCLinEcore.g:27250:1: 'resolve'
+            // InternalOCLinEcore.g:27253:1: ( 'resolve' )
+            // InternalOCLinEcore.g:27254:1: 'resolve'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());
@@ -79599,23 +79599,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_9"
-    // InternalOCLinEcore.g:27265:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_9 : ( ( '!resolve' ) ) ;
+    // InternalOCLinEcore.g:27269:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_9 : ( ( '!resolve' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27269:1: ( ( ( '!resolve' ) ) )
-            // InternalOCLinEcore.g:27270:1: ( ( '!resolve' ) )
+            // InternalOCLinEcore.g:27273:1: ( ( ( '!resolve' ) ) )
+            // InternalOCLinEcore.g:27274:1: ( ( '!resolve' ) )
             {
-            // InternalOCLinEcore.g:27270:1: ( ( '!resolve' ) )
-            // InternalOCLinEcore.g:27271:1: ( '!resolve' )
+            // InternalOCLinEcore.g:27274:1: ( ( '!resolve' ) )
+            // InternalOCLinEcore.g:27275:1: ( '!resolve' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
             }
-            // InternalOCLinEcore.g:27272:1: ( '!resolve' )
-            // InternalOCLinEcore.g:27273:1: '!resolve'
+            // InternalOCLinEcore.g:27276:1: ( '!resolve' )
+            // InternalOCLinEcore.g:27277:1: '!resolve'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());
@@ -79652,23 +79652,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_10"
-    // InternalOCLinEcore.g:27288:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_10 : ( ( 'transient' ) ) ;
+    // InternalOCLinEcore.g:27292:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_10 : ( ( 'transient' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27292:1: ( ( ( 'transient' ) ) )
-            // InternalOCLinEcore.g:27293:1: ( ( 'transient' ) )
+            // InternalOCLinEcore.g:27296:1: ( ( ( 'transient' ) ) )
+            // InternalOCLinEcore.g:27297:1: ( ( 'transient' ) )
             {
-            // InternalOCLinEcore.g:27293:1: ( ( 'transient' ) )
-            // InternalOCLinEcore.g:27294:1: ( 'transient' )
+            // InternalOCLinEcore.g:27297:1: ( ( 'transient' ) )
+            // InternalOCLinEcore.g:27298:1: ( 'transient' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
             }
-            // InternalOCLinEcore.g:27295:1: ( 'transient' )
-            // InternalOCLinEcore.g:27296:1: 'transient'
+            // InternalOCLinEcore.g:27299:1: ( 'transient' )
+            // InternalOCLinEcore.g:27300:1: 'transient'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());
@@ -79705,23 +79705,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_11"
-    // InternalOCLinEcore.g:27311:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_11 : ( ( '!transient' ) ) ;
+    // InternalOCLinEcore.g:27315:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_11 : ( ( '!transient' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27315:1: ( ( ( '!transient' ) ) )
-            // InternalOCLinEcore.g:27316:1: ( ( '!transient' ) )
+            // InternalOCLinEcore.g:27319:1: ( ( ( '!transient' ) ) )
+            // InternalOCLinEcore.g:27320:1: ( ( '!transient' ) )
             {
-            // InternalOCLinEcore.g:27316:1: ( ( '!transient' ) )
-            // InternalOCLinEcore.g:27317:1: ( '!transient' )
+            // InternalOCLinEcore.g:27320:1: ( ( '!transient' ) )
+            // InternalOCLinEcore.g:27321:1: ( '!transient' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
             }
-            // InternalOCLinEcore.g:27318:1: ( '!transient' )
-            // InternalOCLinEcore.g:27319:1: '!transient'
+            // InternalOCLinEcore.g:27322:1: ( '!transient' )
+            // InternalOCLinEcore.g:27323:1: '!transient'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());
@@ -79758,23 +79758,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_12"
-    // InternalOCLinEcore.g:27334:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_12 : ( ( 'unique' ) ) ;
+    // InternalOCLinEcore.g:27338:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_12 : ( ( 'unique' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27338:1: ( ( ( 'unique' ) ) )
-            // InternalOCLinEcore.g:27339:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:27342:1: ( ( ( 'unique' ) ) )
+            // InternalOCLinEcore.g:27343:1: ( ( 'unique' ) )
             {
-            // InternalOCLinEcore.g:27339:1: ( ( 'unique' ) )
-            // InternalOCLinEcore.g:27340:1: ( 'unique' )
+            // InternalOCLinEcore.g:27343:1: ( ( 'unique' ) )
+            // InternalOCLinEcore.g:27344:1: ( 'unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
             }
-            // InternalOCLinEcore.g:27341:1: ( 'unique' )
-            // InternalOCLinEcore.g:27342:1: 'unique'
+            // InternalOCLinEcore.g:27345:1: ( 'unique' )
+            // InternalOCLinEcore.g:27346:1: 'unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());
@@ -79811,23 +79811,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_13"
-    // InternalOCLinEcore.g:27357:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_13 : ( ( '!unique' ) ) ;
+    // InternalOCLinEcore.g:27361:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_13 : ( ( '!unique' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27361:1: ( ( ( '!unique' ) ) )
-            // InternalOCLinEcore.g:27362:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:27365:1: ( ( ( '!unique' ) ) )
+            // InternalOCLinEcore.g:27366:1: ( ( '!unique' ) )
             {
-            // InternalOCLinEcore.g:27362:1: ( ( '!unique' ) )
-            // InternalOCLinEcore.g:27363:1: ( '!unique' )
+            // InternalOCLinEcore.g:27366:1: ( ( '!unique' ) )
+            // InternalOCLinEcore.g:27367:1: ( '!unique' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
             }
-            // InternalOCLinEcore.g:27364:1: ( '!unique' )
-            // InternalOCLinEcore.g:27365:1: '!unique'
+            // InternalOCLinEcore.g:27368:1: ( '!unique' )
+            // InternalOCLinEcore.g:27369:1: '!unique'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());
@@ -79864,23 +79864,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_14"
-    // InternalOCLinEcore.g:27380:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_14 : ( ( 'unsettable' ) ) ;
+    // InternalOCLinEcore.g:27384:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_14 : ( ( 'unsettable' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_14() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27384:1: ( ( ( 'unsettable' ) ) )
-            // InternalOCLinEcore.g:27385:1: ( ( 'unsettable' ) )
+            // InternalOCLinEcore.g:27388:1: ( ( ( 'unsettable' ) ) )
+            // InternalOCLinEcore.g:27389:1: ( ( 'unsettable' ) )
             {
-            // InternalOCLinEcore.g:27385:1: ( ( 'unsettable' ) )
-            // InternalOCLinEcore.g:27386:1: ( 'unsettable' )
+            // InternalOCLinEcore.g:27389:1: ( ( 'unsettable' ) )
+            // InternalOCLinEcore.g:27390:1: ( 'unsettable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
             }
-            // InternalOCLinEcore.g:27387:1: ( 'unsettable' )
-            // InternalOCLinEcore.g:27388:1: 'unsettable'
+            // InternalOCLinEcore.g:27391:1: ( 'unsettable' )
+            // InternalOCLinEcore.g:27392:1: 'unsettable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());
@@ -79917,23 +79917,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_15"
-    // InternalOCLinEcore.g:27403:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_15 : ( ( '!unsettable' ) ) ;
+    // InternalOCLinEcore.g:27407:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_15 : ( ( '!unsettable' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_15() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27407:1: ( ( ( '!unsettable' ) ) )
-            // InternalOCLinEcore.g:27408:1: ( ( '!unsettable' ) )
+            // InternalOCLinEcore.g:27411:1: ( ( ( '!unsettable' ) ) )
+            // InternalOCLinEcore.g:27412:1: ( ( '!unsettable' ) )
             {
-            // InternalOCLinEcore.g:27408:1: ( ( '!unsettable' ) )
-            // InternalOCLinEcore.g:27409:1: ( '!unsettable' )
+            // InternalOCLinEcore.g:27412:1: ( ( '!unsettable' ) )
+            // InternalOCLinEcore.g:27413:1: ( '!unsettable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
             }
-            // InternalOCLinEcore.g:27410:1: ( '!unsettable' )
-            // InternalOCLinEcore.g:27411:1: '!unsettable'
+            // InternalOCLinEcore.g:27414:1: ( '!unsettable' )
+            // InternalOCLinEcore.g:27415:1: '!unsettable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());
@@ -79970,23 +79970,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_16"
-    // InternalOCLinEcore.g:27426:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_16 : ( ( 'volatile' ) ) ;
+    // InternalOCLinEcore.g:27430:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_16 : ( ( 'volatile' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_16() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27430:1: ( ( ( 'volatile' ) ) )
-            // InternalOCLinEcore.g:27431:1: ( ( 'volatile' ) )
+            // InternalOCLinEcore.g:27434:1: ( ( ( 'volatile' ) ) )
+            // InternalOCLinEcore.g:27435:1: ( ( 'volatile' ) )
             {
-            // InternalOCLinEcore.g:27431:1: ( ( 'volatile' ) )
-            // InternalOCLinEcore.g:27432:1: ( 'volatile' )
+            // InternalOCLinEcore.g:27435:1: ( ( 'volatile' ) )
+            // InternalOCLinEcore.g:27436:1: ( 'volatile' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
             }
-            // InternalOCLinEcore.g:27433:1: ( 'volatile' )
-            // InternalOCLinEcore.g:27434:1: 'volatile'
+            // InternalOCLinEcore.g:27437:1: ( 'volatile' )
+            // InternalOCLinEcore.g:27438:1: 'volatile'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());
@@ -80023,23 +80023,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__QualifiersAssignment_6_1_0_17"
-    // InternalOCLinEcore.g:27449:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_17 : ( ( '!volatile' ) ) ;
+    // InternalOCLinEcore.g:27453:1: rule__ReferenceCS__QualifiersAssignment_6_1_0_17 : ( ( '!volatile' ) ) ;
     public final void rule__ReferenceCS__QualifiersAssignment_6_1_0_17() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27453:1: ( ( ( '!volatile' ) ) )
-            // InternalOCLinEcore.g:27454:1: ( ( '!volatile' ) )
+            // InternalOCLinEcore.g:27457:1: ( ( ( '!volatile' ) ) )
+            // InternalOCLinEcore.g:27458:1: ( ( '!volatile' ) )
             {
-            // InternalOCLinEcore.g:27454:1: ( ( '!volatile' ) )
-            // InternalOCLinEcore.g:27455:1: ( '!volatile' )
+            // InternalOCLinEcore.g:27458:1: ( ( '!volatile' ) )
+            // InternalOCLinEcore.g:27459:1: ( '!volatile' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
             }
-            // InternalOCLinEcore.g:27456:1: ( '!volatile' )
-            // InternalOCLinEcore.g:27457:1: '!volatile'
+            // InternalOCLinEcore.g:27460:1: ( '!volatile' )
+            // InternalOCLinEcore.g:27461:1: '!volatile'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());
@@ -80076,17 +80076,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0"
-    // InternalOCLinEcore.g:27472:1: rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:27476:1: rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__ReferenceCS__OwnedAnnotationsAssignment_7_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27476:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:27477:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:27480:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:27481:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:27477:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:27478:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:27481:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:27482:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
@@ -80121,23 +80121,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1"
-    // InternalOCLinEcore.g:27487:1: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:27491:1: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27491:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:27492:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27495:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:27496:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:27492:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:27493:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27496:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27497:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_1_0());
             }
-            // InternalOCLinEcore.g:27494:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:27495:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:27498:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27499:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyUnrestrictedNameParserRuleCall_7_0_1_1_1_0_1());
@@ -80178,23 +80178,23 @@
 
 
     // $ANTLR start "rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1"
-    // InternalOCLinEcore.g:27506:1: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:27510:1: rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ReferenceCS__ReferredKeysAssignment_7_0_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27510:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:27511:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27514:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:27515:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:27511:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:27512:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27515:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27516:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyCrossReference_7_0_1_1_2_1_0());
             }
-            // InternalOCLinEcore.g:27513:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:27514:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:27517:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27518:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getReferredKeysPropertyUnrestrictedNameParserRuleCall_7_0_1_1_2_1_0_1());
@@ -80235,17 +80235,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3"
-    // InternalOCLinEcore.g:27525:1: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:27529:1: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3 : ( ruleSpecificationCS ) ;
     public final void rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27529:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:27530:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:27533:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:27534:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:27530:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:27531:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:27534:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:27535:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_2_3_0());
@@ -80280,17 +80280,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3"
-    // InternalOCLinEcore.g:27540:1: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLinEcore.g:27544:1: rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3 : ( ruleSpecificationCS ) ;
     public final void rule__ReferenceCS__OwnedDefaultExpressionsAssignment_7_0_1_3_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27544:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLinEcore.g:27545:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:27548:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLinEcore.g:27549:1: ( ruleSpecificationCS )
             {
-            // InternalOCLinEcore.g:27545:1: ( ruleSpecificationCS )
-            // InternalOCLinEcore.g:27546:1: ruleSpecificationCS
+            // InternalOCLinEcore.g:27549:1: ( ruleSpecificationCS )
+            // InternalOCLinEcore.g:27550:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_3_3_0());
@@ -80325,17 +80325,17 @@
 
 
     // $ANTLR start "rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0"
-    // InternalOCLinEcore.g:27555:1: rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 : ( ruleImplicitOppositeCS ) ;
+    // InternalOCLinEcore.g:27559:1: rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0 : ( ruleImplicitOppositeCS ) ;
     public final void rule__ReferenceCS__OwnedImplicitOppositesAssignment_7_0_1_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27559:1: ( ( ruleImplicitOppositeCS ) )
-            // InternalOCLinEcore.g:27560:1: ( ruleImplicitOppositeCS )
+            // InternalOCLinEcore.g:27563:1: ( ( ruleImplicitOppositeCS ) )
+            // InternalOCLinEcore.g:27564:1: ( ruleImplicitOppositeCS )
             {
-            // InternalOCLinEcore.g:27560:1: ( ruleImplicitOppositeCS )
-            // InternalOCLinEcore.g:27561:1: ruleImplicitOppositeCS
+            // InternalOCLinEcore.g:27564:1: ( ruleImplicitOppositeCS )
+            // InternalOCLinEcore.g:27565:1: ruleImplicitOppositeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getReferenceCSAccess().getOwnedImplicitOppositesImplicitOppositeCSParserRuleCall_7_0_1_4_0_0());
@@ -80370,17 +80370,17 @@
 
 
     // $ANTLR start "rule__SpecificationCS__OwnedExpressionAssignment_0"
-    // InternalOCLinEcore.g:27570:1: rule__SpecificationCS__OwnedExpressionAssignment_0 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:27574:1: rule__SpecificationCS__OwnedExpressionAssignment_0 : ( ruleExpCS ) ;
     public final void rule__SpecificationCS__OwnedExpressionAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27574:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:27575:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:27578:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:27579:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:27575:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:27576:1: ruleExpCS
+            // InternalOCLinEcore.g:27579:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:27580:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0());
@@ -80415,17 +80415,17 @@
 
 
     // $ANTLR start "rule__SpecificationCS__ExprStringAssignment_1"
-    // InternalOCLinEcore.g:27585:1: rule__SpecificationCS__ExprStringAssignment_1 : ( RULE_UNQUOTED_STRING ) ;
+    // InternalOCLinEcore.g:27589:1: rule__SpecificationCS__ExprStringAssignment_1 : ( RULE_UNQUOTED_STRING ) ;
     public final void rule__SpecificationCS__ExprStringAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27589:1: ( ( RULE_UNQUOTED_STRING ) )
-            // InternalOCLinEcore.g:27590:1: ( RULE_UNQUOTED_STRING )
+            // InternalOCLinEcore.g:27593:1: ( ( RULE_UNQUOTED_STRING ) )
+            // InternalOCLinEcore.g:27594:1: ( RULE_UNQUOTED_STRING )
             {
-            // InternalOCLinEcore.g:27590:1: ( RULE_UNQUOTED_STRING )
-            // InternalOCLinEcore.g:27591:1: RULE_UNQUOTED_STRING
+            // InternalOCLinEcore.g:27594:1: ( RULE_UNQUOTED_STRING )
+            // InternalOCLinEcore.g:27595:1: RULE_UNQUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSpecificationCSAccess().getExprStringUNQUOTED_STRINGTerminalRuleCall_1_0());
@@ -80456,23 +80456,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__IsAbstractAssignment_0"
-    // InternalOCLinEcore.g:27600:1: rule__StructuredClassCS__IsAbstractAssignment_0 : ( ( 'abstract' ) ) ;
+    // InternalOCLinEcore.g:27604:1: rule__StructuredClassCS__IsAbstractAssignment_0 : ( ( 'abstract' ) ) ;
     public final void rule__StructuredClassCS__IsAbstractAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27604:1: ( ( ( 'abstract' ) ) )
-            // InternalOCLinEcore.g:27605:1: ( ( 'abstract' ) )
+            // InternalOCLinEcore.g:27608:1: ( ( ( 'abstract' ) ) )
+            // InternalOCLinEcore.g:27609:1: ( ( 'abstract' ) )
             {
-            // InternalOCLinEcore.g:27605:1: ( ( 'abstract' ) )
-            // InternalOCLinEcore.g:27606:1: ( 'abstract' )
+            // InternalOCLinEcore.g:27609:1: ( ( 'abstract' ) )
+            // InternalOCLinEcore.g:27610:1: ( 'abstract' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
             }
-            // InternalOCLinEcore.g:27607:1: ( 'abstract' )
-            // InternalOCLinEcore.g:27608:1: 'abstract'
+            // InternalOCLinEcore.g:27611:1: ( 'abstract' )
+            // InternalOCLinEcore.g:27612:1: 'abstract'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());
@@ -80509,17 +80509,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__NameAssignment_2"
-    // InternalOCLinEcore.g:27623:1: rule__StructuredClassCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:27627:1: rule__StructuredClassCS__NameAssignment_2 : ( ruleUnrestrictedName ) ;
     public final void rule__StructuredClassCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27627:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:27628:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27631:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27632:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:27628:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:27629:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:27632:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27633:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());
@@ -80554,17 +80554,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedSignatureAssignment_3"
-    // InternalOCLinEcore.g:27638:1: rule__StructuredClassCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLinEcore.g:27642:1: rule__StructuredClassCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
     public final void rule__StructuredClassCS__OwnedSignatureAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27642:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLinEcore.g:27643:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:27646:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLinEcore.g:27647:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLinEcore.g:27643:1: ( ruleTemplateSignatureCS )
-            // InternalOCLinEcore.g:27644:1: ruleTemplateSignatureCS
+            // InternalOCLinEcore.g:27647:1: ( ruleTemplateSignatureCS )
+            // InternalOCLinEcore.g:27648:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
@@ -80599,17 +80599,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1"
-    // InternalOCLinEcore.g:27653:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:27657:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1 : ( ruleTypedRefCS ) ;
     public final void rule__StructuredClassCS__OwnedSuperTypesAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27657:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:27658:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:27661:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:27662:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:27658:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:27659:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:27662:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:27663:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_1_0());
@@ -80644,17 +80644,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1"
-    // InternalOCLinEcore.g:27668:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:27672:1: rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__StructuredClassCS__OwnedSuperTypesAssignment_4_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27672:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:27673:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:27676:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:27677:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:27673:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:27674:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:27677:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:27678:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_2_1_0());
@@ -80689,17 +80689,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__InstanceClassNameAssignment_5_1"
-    // InternalOCLinEcore.g:27683:1: rule__StructuredClassCS__InstanceClassNameAssignment_5_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLinEcore.g:27687:1: rule__StructuredClassCS__InstanceClassNameAssignment_5_1 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__StructuredClassCS__InstanceClassNameAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27687:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLinEcore.g:27688:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:27691:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLinEcore.g:27692:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLinEcore.g:27688:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:27689:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:27692:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:27693:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());
@@ -80730,23 +80730,23 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__IsInterfaceAssignment_6_1"
-    // InternalOCLinEcore.g:27698:1: rule__StructuredClassCS__IsInterfaceAssignment_6_1 : ( ( 'interface' ) ) ;
+    // InternalOCLinEcore.g:27702:1: rule__StructuredClassCS__IsInterfaceAssignment_6_1 : ( ( 'interface' ) ) ;
     public final void rule__StructuredClassCS__IsInterfaceAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27702:1: ( ( ( 'interface' ) ) )
-            // InternalOCLinEcore.g:27703:1: ( ( 'interface' ) )
+            // InternalOCLinEcore.g:27706:1: ( ( ( 'interface' ) ) )
+            // InternalOCLinEcore.g:27707:1: ( ( 'interface' ) )
             {
-            // InternalOCLinEcore.g:27703:1: ( ( 'interface' ) )
-            // InternalOCLinEcore.g:27704:1: ( 'interface' )
+            // InternalOCLinEcore.g:27707:1: ( ( 'interface' ) )
+            // InternalOCLinEcore.g:27708:1: ( 'interface' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
             }
-            // InternalOCLinEcore.g:27705:1: ( 'interface' )
-            // InternalOCLinEcore.g:27706:1: 'interface'
+            // InternalOCLinEcore.g:27709:1: ( 'interface' )
+            // InternalOCLinEcore.g:27710:1: 'interface'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());
@@ -80783,17 +80783,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0"
-    // InternalOCLinEcore.g:27721:1: rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLinEcore.g:27725:1: rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__StructuredClassCS__OwnedAnnotationsAssignment_7_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27725:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLinEcore.g:27726:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:27729:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLinEcore.g:27730:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLinEcore.g:27726:1: ( ruleAnnotationElementCS )
-            // InternalOCLinEcore.g:27727:1: ruleAnnotationElementCS
+            // InternalOCLinEcore.g:27730:1: ( ruleAnnotationElementCS )
+            // InternalOCLinEcore.g:27731:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
@@ -80828,17 +80828,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1"
-    // InternalOCLinEcore.g:27736:1: rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 : ( ruleOperationCS ) ;
+    // InternalOCLinEcore.g:27740:1: rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1 : ( ruleOperationCS ) ;
     public final void rule__StructuredClassCS__OwnedOperationsAssignment_7_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27740:1: ( ( ruleOperationCS ) )
-            // InternalOCLinEcore.g:27741:1: ( ruleOperationCS )
+            // InternalOCLinEcore.g:27744:1: ( ( ruleOperationCS ) )
+            // InternalOCLinEcore.g:27745:1: ( ruleOperationCS )
             {
-            // InternalOCLinEcore.g:27741:1: ( ruleOperationCS )
-            // InternalOCLinEcore.g:27742:1: ruleOperationCS
+            // InternalOCLinEcore.g:27745:1: ( ruleOperationCS )
+            // InternalOCLinEcore.g:27746:1: ruleOperationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_1_1_0());
@@ -80873,17 +80873,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2"
-    // InternalOCLinEcore.g:27751:1: rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 : ( ruleStructuralFeatureCS ) ;
+    // InternalOCLinEcore.g:27755:1: rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2 : ( ruleStructuralFeatureCS ) ;
     public final void rule__StructuredClassCS__OwnedPropertiesAssignment_7_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27755:1: ( ( ruleStructuralFeatureCS ) )
-            // InternalOCLinEcore.g:27756:1: ( ruleStructuralFeatureCS )
+            // InternalOCLinEcore.g:27759:1: ( ( ruleStructuralFeatureCS ) )
+            // InternalOCLinEcore.g:27760:1: ( ruleStructuralFeatureCS )
             {
-            // InternalOCLinEcore.g:27756:1: ( ruleStructuralFeatureCS )
-            // InternalOCLinEcore.g:27757:1: ruleStructuralFeatureCS
+            // InternalOCLinEcore.g:27760:1: ( ruleStructuralFeatureCS )
+            // InternalOCLinEcore.g:27761:1: ruleStructuralFeatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_7_0_1_2_0());
@@ -80918,17 +80918,17 @@
 
 
     // $ANTLR start "rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3"
-    // InternalOCLinEcore.g:27766:1: rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 : ( ruleInvariantConstraintCS ) ;
+    // InternalOCLinEcore.g:27770:1: rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3 : ( ruleInvariantConstraintCS ) ;
     public final void rule__StructuredClassCS__OwnedConstraintsAssignment_7_0_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27770:1: ( ( ruleInvariantConstraintCS ) )
-            // InternalOCLinEcore.g:27771:1: ( ruleInvariantConstraintCS )
+            // InternalOCLinEcore.g:27774:1: ( ( ruleInvariantConstraintCS ) )
+            // InternalOCLinEcore.g:27775:1: ( ruleInvariantConstraintCS )
             {
-            // InternalOCLinEcore.g:27771:1: ( ruleInvariantConstraintCS )
-            // InternalOCLinEcore.g:27772:1: ruleInvariantConstraintCS
+            // InternalOCLinEcore.g:27775:1: ( ruleInvariantConstraintCS )
+            // InternalOCLinEcore.g:27776:1: ruleInvariantConstraintCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStructuredClassCSAccess().getOwnedConstraintsInvariantConstraintCSParserRuleCall_7_0_1_3_0());
@@ -80963,17 +80963,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__OwnedDetailsAssignment_2_0_0"
-    // InternalOCLinEcore.g:27781:1: rule__SysMLCS__OwnedDetailsAssignment_2_0_0 : ( ruleDetailCS ) ;
+    // InternalOCLinEcore.g:27785:1: rule__SysMLCS__OwnedDetailsAssignment_2_0_0 : ( ruleDetailCS ) ;
     public final void rule__SysMLCS__OwnedDetailsAssignment_2_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27785:1: ( ( ruleDetailCS ) )
-            // InternalOCLinEcore.g:27786:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:27789:1: ( ( ruleDetailCS ) )
+            // InternalOCLinEcore.g:27790:1: ( ruleDetailCS )
             {
-            // InternalOCLinEcore.g:27786:1: ( ruleDetailCS )
-            // InternalOCLinEcore.g:27787:1: ruleDetailCS
+            // InternalOCLinEcore.g:27790:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:27791:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_0_0_0());
@@ -81008,17 +81008,17 @@
 
 
     // $ANTLR start "rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0"
-    // InternalOCLinEcore.g:27796:1: rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 : ( ruleDetailCS ) ;
+    // InternalOCLinEcore.g:27800:1: rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0 : ( ruleDetailCS ) ;
     public final void rule__SysMLCS__OwnedDetailsAssignment_2_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27800:1: ( ( ruleDetailCS ) )
-            // InternalOCLinEcore.g:27801:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:27804:1: ( ( ruleDetailCS ) )
+            // InternalOCLinEcore.g:27805:1: ( ruleDetailCS )
             {
-            // InternalOCLinEcore.g:27801:1: ( ruleDetailCS )
-            // InternalOCLinEcore.g:27802:1: ruleDetailCS
+            // InternalOCLinEcore.g:27805:1: ( ruleDetailCS )
+            // InternalOCLinEcore.g:27806:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSysMLCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_1_1_0_0());
@@ -81053,17 +81053,17 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1"
-    // InternalOCLinEcore.g:27811:1: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalOCLinEcore.g:27815:1: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27815:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLinEcore.g:27816:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:27819:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLinEcore.g:27820:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLinEcore.g:27816:1: ( ruleMultiplicityCS )
-            // InternalOCLinEcore.g:27817:1: ruleMultiplicityCS
+            // InternalOCLinEcore.g:27820:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:27821:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -81098,17 +81098,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_0_1"
-    // InternalOCLinEcore.g:27826:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 : ( ruleTypeParameterCS ) ;
+    // InternalOCLinEcore.g:27830:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27830:1: ( ( ruleTypeParameterCS ) )
-            // InternalOCLinEcore.g:27831:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27834:1: ( ( ruleTypeParameterCS ) )
+            // InternalOCLinEcore.g:27835:1: ( ruleTypeParameterCS )
             {
-            // InternalOCLinEcore.g:27831:1: ( ruleTypeParameterCS )
-            // InternalOCLinEcore.g:27832:1: ruleTypeParameterCS
+            // InternalOCLinEcore.g:27835:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27836:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_1_0());
@@ -81143,17 +81143,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1"
-    // InternalOCLinEcore.g:27841:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 : ( ruleTypeParameterCS ) ;
+    // InternalOCLinEcore.g:27845:1: rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27845:1: ( ( ruleTypeParameterCS ) )
-            // InternalOCLinEcore.g:27846:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27849:1: ( ( ruleTypeParameterCS ) )
+            // InternalOCLinEcore.g:27850:1: ( ruleTypeParameterCS )
             {
-            // InternalOCLinEcore.g:27846:1: ( ruleTypeParameterCS )
-            // InternalOCLinEcore.g:27847:1: ruleTypeParameterCS
+            // InternalOCLinEcore.g:27850:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27851:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_0_2_1_0());
@@ -81188,17 +81188,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1_1"
-    // InternalOCLinEcore.g:27856:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 : ( ruleTypeParameterCS ) ;
+    // InternalOCLinEcore.g:27860:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27860:1: ( ( ruleTypeParameterCS ) )
-            // InternalOCLinEcore.g:27861:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27864:1: ( ( ruleTypeParameterCS ) )
+            // InternalOCLinEcore.g:27865:1: ( ruleTypeParameterCS )
             {
-            // InternalOCLinEcore.g:27861:1: ( ruleTypeParameterCS )
-            // InternalOCLinEcore.g:27862:1: ruleTypeParameterCS
+            // InternalOCLinEcore.g:27865:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27866:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_1_0());
@@ -81233,17 +81233,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1"
-    // InternalOCLinEcore.g:27871:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 : ( ruleTypeParameterCS ) ;
+    // InternalOCLinEcore.g:27875:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27875:1: ( ( ruleTypeParameterCS ) )
-            // InternalOCLinEcore.g:27876:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27879:1: ( ( ruleTypeParameterCS ) )
+            // InternalOCLinEcore.g:27880:1: ( ruleTypeParameterCS )
             {
-            // InternalOCLinEcore.g:27876:1: ( ruleTypeParameterCS )
-            // InternalOCLinEcore.g:27877:1: ruleTypeParameterCS
+            // InternalOCLinEcore.g:27880:1: ( ruleTypeParameterCS )
+            // InternalOCLinEcore.g:27881:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_2_1_0());
@@ -81278,17 +81278,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_0"
-    // InternalOCLinEcore.g:27886:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalOCLinEcore.g:27890:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27890:1: ( ( rulePathNameCS ) )
-            // InternalOCLinEcore.g:27891:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:27894:1: ( ( rulePathNameCS ) )
+            // InternalOCLinEcore.g:27895:1: ( rulePathNameCS )
             {
-            // InternalOCLinEcore.g:27891:1: ( rulePathNameCS )
-            // InternalOCLinEcore.g:27892:1: rulePathNameCS
+            // InternalOCLinEcore.g:27895:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:27896:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -81323,17 +81323,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1"
-    // InternalOCLinEcore.g:27901:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 : ( ruleTemplateBindingCS ) ;
+    // InternalOCLinEcore.g:27905:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1 : ( ruleTemplateBindingCS ) ;
     public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27905:1: ( ( ruleTemplateBindingCS ) )
-            // InternalOCLinEcore.g:27906:1: ( ruleTemplateBindingCS )
+            // InternalOCLinEcore.g:27909:1: ( ( ruleTemplateBindingCS ) )
+            // InternalOCLinEcore.g:27910:1: ( ruleTemplateBindingCS )
             {
-            // InternalOCLinEcore.g:27906:1: ( ruleTemplateBindingCS )
-            // InternalOCLinEcore.g:27907:1: ruleTemplateBindingCS
+            // InternalOCLinEcore.g:27910:1: ( ruleTemplateBindingCS )
+            // InternalOCLinEcore.g:27911:1: ruleTemplateBindingCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_0_1_0());
@@ -81368,17 +81368,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1"
-    // InternalOCLinEcore.g:27916:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 : ( ruleTemplateBindingCS ) ;
+    // InternalOCLinEcore.g:27920:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 : ( ruleTemplateBindingCS ) ;
     public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27920:1: ( ( ruleTemplateBindingCS ) )
-            // InternalOCLinEcore.g:27921:1: ( ruleTemplateBindingCS )
+            // InternalOCLinEcore.g:27924:1: ( ( ruleTemplateBindingCS ) )
+            // InternalOCLinEcore.g:27925:1: ( ruleTemplateBindingCS )
             {
-            // InternalOCLinEcore.g:27921:1: ( ruleTemplateBindingCS )
-            // InternalOCLinEcore.g:27922:1: ruleTemplateBindingCS
+            // InternalOCLinEcore.g:27925:1: ( ruleTemplateBindingCS )
+            // InternalOCLinEcore.g:27926:1: ruleTemplateBindingCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_1_0());
@@ -81413,17 +81413,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_0"
-    // InternalOCLinEcore.g:27932:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
+    // InternalOCLinEcore.g:27936:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
     public final void rule__URIPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27936:1: ( ( ruleURIFirstPathElementCS ) )
-            // InternalOCLinEcore.g:27937:1: ( ruleURIFirstPathElementCS )
+            // InternalOCLinEcore.g:27940:1: ( ( ruleURIFirstPathElementCS ) )
+            // InternalOCLinEcore.g:27941:1: ( ruleURIFirstPathElementCS )
             {
-            // InternalOCLinEcore.g:27937:1: ( ruleURIFirstPathElementCS )
-            // InternalOCLinEcore.g:27938:1: ruleURIFirstPathElementCS
+            // InternalOCLinEcore.g:27941:1: ( ruleURIFirstPathElementCS )
+            // InternalOCLinEcore.g:27942:1: ruleURIFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());
@@ -81458,17 +81458,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalOCLinEcore.g:27947:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalOCLinEcore.g:27951:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__URIPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27951:1: ( ( ruleNextPathElementCS ) )
-            // InternalOCLinEcore.g:27952:1: ( ruleNextPathElementCS )
+            // InternalOCLinEcore.g:27955:1: ( ( ruleNextPathElementCS ) )
+            // InternalOCLinEcore.g:27956:1: ( ruleNextPathElementCS )
             {
-            // InternalOCLinEcore.g:27952:1: ( ruleNextPathElementCS )
-            // InternalOCLinEcore.g:27953:1: ruleNextPathElementCS
+            // InternalOCLinEcore.g:27956:1: ( ruleNextPathElementCS )
+            // InternalOCLinEcore.g:27957:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -81503,23 +81503,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_0"
-    // InternalOCLinEcore.g:27962:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:27966:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27966:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:27967:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27970:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:27971:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:27967:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:27968:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27971:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:27972:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
             }
-            // InternalOCLinEcore.g:27969:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:27970:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:27973:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:27974:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_0_1());
@@ -81560,23 +81560,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_1_1"
-    // InternalOCLinEcore.g:27981:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
+    // InternalOCLinEcore.g:27985:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:27985:1: ( ( ( ruleURI ) ) )
-            // InternalOCLinEcore.g:27986:1: ( ( ruleURI ) )
+            // InternalOCLinEcore.g:27989:1: ( ( ( ruleURI ) ) )
+            // InternalOCLinEcore.g:27990:1: ( ( ruleURI ) )
             {
-            // InternalOCLinEcore.g:27986:1: ( ( ruleURI ) )
-            // InternalOCLinEcore.g:27987:1: ( ruleURI )
+            // InternalOCLinEcore.g:27990:1: ( ( ruleURI ) )
+            // InternalOCLinEcore.g:27991:1: ( ruleURI )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
             }
-            // InternalOCLinEcore.g:27988:1: ( ruleURI )
-            // InternalOCLinEcore.g:27989:1: ruleURI
+            // InternalOCLinEcore.g:27992:1: ( ruleURI )
+            // InternalOCLinEcore.g:27993:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceURIParserRuleCall_1_1_0_1());
@@ -81617,17 +81617,17 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeCS__NameAssignment"
-    // InternalOCLinEcore.g:28001:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
+    // InternalOCLinEcore.g:28005:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
     public final void rule__PrimitiveTypeCS__NameAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28005:1: ( ( rulePrimitiveTypeIdentifier ) )
-            // InternalOCLinEcore.g:28006:1: ( rulePrimitiveTypeIdentifier )
+            // InternalOCLinEcore.g:28009:1: ( ( rulePrimitiveTypeIdentifier ) )
+            // InternalOCLinEcore.g:28010:1: ( rulePrimitiveTypeIdentifier )
             {
-            // InternalOCLinEcore.g:28006:1: ( rulePrimitiveTypeIdentifier )
-            // InternalOCLinEcore.g:28007:1: rulePrimitiveTypeIdentifier
+            // InternalOCLinEcore.g:28010:1: ( rulePrimitiveTypeIdentifier )
+            // InternalOCLinEcore.g:28011:1: rulePrimitiveTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());
@@ -81662,17 +81662,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__NameAssignment_0"
-    // InternalOCLinEcore.g:28016:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
+    // InternalOCLinEcore.g:28020:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
     public final void rule__CollectionTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28020:1: ( ( ruleCollectionTypeIdentifier ) )
-            // InternalOCLinEcore.g:28021:1: ( ruleCollectionTypeIdentifier )
+            // InternalOCLinEcore.g:28024:1: ( ( ruleCollectionTypeIdentifier ) )
+            // InternalOCLinEcore.g:28025:1: ( ruleCollectionTypeIdentifier )
             {
-            // InternalOCLinEcore.g:28021:1: ( ruleCollectionTypeIdentifier )
-            // InternalOCLinEcore.g:28022:1: ruleCollectionTypeIdentifier
+            // InternalOCLinEcore.g:28025:1: ( ruleCollectionTypeIdentifier )
+            // InternalOCLinEcore.g:28026:1: ruleCollectionTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());
@@ -81707,17 +81707,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedTypeAssignment_1_1"
-    // InternalOCLinEcore.g:28031:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalOCLinEcore.g:28035:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28035:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalOCLinEcore.g:28036:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLinEcore.g:28039:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalOCLinEcore.g:28040:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalOCLinEcore.g:28036:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalOCLinEcore.g:28037:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalOCLinEcore.g:28040:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLinEcore.g:28041:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());
@@ -81752,17 +81752,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2"
-    // InternalOCLinEcore.g:28046:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
+    // InternalOCLinEcore.g:28050:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28050:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLinEcore.g:28051:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:28054:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLinEcore.g:28055:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLinEcore.g:28051:1: ( ruleMultiplicityCS )
-            // InternalOCLinEcore.g:28052:1: ruleMultiplicityCS
+            // InternalOCLinEcore.g:28055:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:28056:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());
@@ -81797,23 +81797,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__NameAssignment_0"
-    // InternalOCLinEcore.g:28061:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
+    // InternalOCLinEcore.g:28065:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
     public final void rule__MapTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28065:1: ( ( ( 'Map' ) ) )
-            // InternalOCLinEcore.g:28066:1: ( ( 'Map' ) )
+            // InternalOCLinEcore.g:28069:1: ( ( ( 'Map' ) ) )
+            // InternalOCLinEcore.g:28070:1: ( ( 'Map' ) )
             {
-            // InternalOCLinEcore.g:28066:1: ( ( 'Map' ) )
-            // InternalOCLinEcore.g:28067:1: ( 'Map' )
+            // InternalOCLinEcore.g:28070:1: ( ( 'Map' ) )
+            // InternalOCLinEcore.g:28071:1: ( 'Map' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
             }
-            // InternalOCLinEcore.g:28068:1: ( 'Map' )
-            // InternalOCLinEcore.g:28069:1: 'Map'
+            // InternalOCLinEcore.g:28072:1: ( 'Map' )
+            // InternalOCLinEcore.g:28073:1: 'Map'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
@@ -81850,17 +81850,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedKeyTypeAssignment_1_1"
-    // InternalOCLinEcore.g:28084:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:28088:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedKeyTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28088:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:28089:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28092:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:28093:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:28089:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:28090:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:28093:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28094:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());
@@ -81895,17 +81895,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedValueTypeAssignment_1_3"
-    // InternalOCLinEcore.g:28099:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:28103:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedValueTypeAssignment_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28103:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:28104:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28107:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:28108:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:28104:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:28105:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:28108:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28109:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());
@@ -81940,23 +81940,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__NameAssignment_0"
-    // InternalOCLinEcore.g:28114:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
+    // InternalOCLinEcore.g:28118:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
     public final void rule__TupleTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28118:1: ( ( ( 'Tuple' ) ) )
-            // InternalOCLinEcore.g:28119:1: ( ( 'Tuple' ) )
+            // InternalOCLinEcore.g:28122:1: ( ( ( 'Tuple' ) ) )
+            // InternalOCLinEcore.g:28123:1: ( ( 'Tuple' ) )
             {
-            // InternalOCLinEcore.g:28119:1: ( ( 'Tuple' ) )
-            // InternalOCLinEcore.g:28120:1: ( 'Tuple' )
+            // InternalOCLinEcore.g:28123:1: ( ( 'Tuple' ) )
+            // InternalOCLinEcore.g:28124:1: ( 'Tuple' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
             }
-            // InternalOCLinEcore.g:28121:1: ( 'Tuple' )
-            // InternalOCLinEcore.g:28122:1: 'Tuple'
+            // InternalOCLinEcore.g:28125:1: ( 'Tuple' )
+            // InternalOCLinEcore.g:28126:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
@@ -81993,17 +81993,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_0"
-    // InternalOCLinEcore.g:28137:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
+    // InternalOCLinEcore.g:28141:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28141:1: ( ( ruleTuplePartCS ) )
-            // InternalOCLinEcore.g:28142:1: ( ruleTuplePartCS )
+            // InternalOCLinEcore.g:28145:1: ( ( ruleTuplePartCS ) )
+            // InternalOCLinEcore.g:28146:1: ( ruleTuplePartCS )
             {
-            // InternalOCLinEcore.g:28142:1: ( ruleTuplePartCS )
-            // InternalOCLinEcore.g:28143:1: ruleTuplePartCS
+            // InternalOCLinEcore.g:28146:1: ( ruleTuplePartCS )
+            // InternalOCLinEcore.g:28147:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
@@ -82038,17 +82038,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1"
-    // InternalOCLinEcore.g:28152:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
+    // InternalOCLinEcore.g:28156:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28156:1: ( ( ruleTuplePartCS ) )
-            // InternalOCLinEcore.g:28157:1: ( ruleTuplePartCS )
+            // InternalOCLinEcore.g:28160:1: ( ( ruleTuplePartCS ) )
+            // InternalOCLinEcore.g:28161:1: ( ruleTuplePartCS )
             {
-            // InternalOCLinEcore.g:28157:1: ( ruleTuplePartCS )
-            // InternalOCLinEcore.g:28158:1: ruleTuplePartCS
+            // InternalOCLinEcore.g:28161:1: ( ruleTuplePartCS )
+            // InternalOCLinEcore.g:28162:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
@@ -82083,17 +82083,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__NameAssignment_0"
-    // InternalOCLinEcore.g:28167:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:28171:1: rule__TuplePartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TuplePartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28171:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:28172:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28175:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:28176:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:28172:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:28173:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:28176:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28177:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -82128,17 +82128,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__OwnedTypeAssignment_2"
-    // InternalOCLinEcore.g:28182:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:28186:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__TuplePartCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28186:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:28187:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28190:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:28191:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:28187:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:28188:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:28191:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28192:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());
@@ -82173,17 +82173,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalOCLinEcore.g:28197:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalOCLinEcore.g:28201:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28201:1: ( ( ruleCollectionTypeCS ) )
-            // InternalOCLinEcore.g:28202:1: ( ruleCollectionTypeCS )
+            // InternalOCLinEcore.g:28205:1: ( ( ruleCollectionTypeCS ) )
+            // InternalOCLinEcore.g:28206:1: ( ruleCollectionTypeCS )
             {
-            // InternalOCLinEcore.g:28202:1: ( ruleCollectionTypeCS )
-            // InternalOCLinEcore.g:28203:1: ruleCollectionTypeCS
+            // InternalOCLinEcore.g:28206:1: ( ruleCollectionTypeCS )
+            // InternalOCLinEcore.g:28207:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -82218,17 +82218,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalOCLinEcore.g:28212:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalOCLinEcore.g:28216:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28216:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalOCLinEcore.g:28217:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLinEcore.g:28220:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalOCLinEcore.g:28221:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalOCLinEcore.g:28217:1: ( ruleCollectionLiteralPartCS )
-            // InternalOCLinEcore.g:28218:1: ruleCollectionLiteralPartCS
+            // InternalOCLinEcore.g:28221:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLinEcore.g:28222:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());
@@ -82263,17 +82263,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLinEcore.g:28227:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalOCLinEcore.g:28231:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28231:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalOCLinEcore.g:28232:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLinEcore.g:28235:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalOCLinEcore.g:28236:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalOCLinEcore.g:28232:1: ( ruleCollectionLiteralPartCS )
-            // InternalOCLinEcore.g:28233:1: ruleCollectionLiteralPartCS
+            // InternalOCLinEcore.g:28236:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLinEcore.g:28237:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());
@@ -82308,17 +82308,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0"
-    // InternalOCLinEcore.g:28242:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28246:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28246:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28247:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28250:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28251:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28247:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28248:1: ruleExpCS
+            // InternalOCLinEcore.g:28251:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28252:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());
@@ -82353,17 +82353,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1"
-    // InternalOCLinEcore.g:28257:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28261:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28261:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28262:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28265:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28266:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28262:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28263:1: ruleExpCS
+            // InternalOCLinEcore.g:28266:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28267:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());
@@ -82398,17 +82398,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1"
-    // InternalOCLinEcore.g:28272:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
+    // InternalOCLinEcore.g:28276:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28276:1: ( ( rulePatternExpCS ) )
-            // InternalOCLinEcore.g:28277:1: ( rulePatternExpCS )
+            // InternalOCLinEcore.g:28280:1: ( ( rulePatternExpCS ) )
+            // InternalOCLinEcore.g:28281:1: ( rulePatternExpCS )
             {
-            // InternalOCLinEcore.g:28277:1: ( rulePatternExpCS )
-            // InternalOCLinEcore.g:28278:1: rulePatternExpCS
+            // InternalOCLinEcore.g:28281:1: ( rulePatternExpCS )
+            // InternalOCLinEcore.g:28282:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());
@@ -82443,17 +82443,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedTypeAssignment_0"
-    // InternalOCLinEcore.g:28287:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalOCLinEcore.g:28291:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionPatternCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28291:1: ( ( ruleCollectionTypeCS ) )
-            // InternalOCLinEcore.g:28292:1: ( ruleCollectionTypeCS )
+            // InternalOCLinEcore.g:28295:1: ( ( ruleCollectionTypeCS ) )
+            // InternalOCLinEcore.g:28296:1: ( ruleCollectionTypeCS )
             {
-            // InternalOCLinEcore.g:28292:1: ( ruleCollectionTypeCS )
-            // InternalOCLinEcore.g:28293:1: ruleCollectionTypeCS
+            // InternalOCLinEcore.g:28296:1: ( ruleCollectionTypeCS )
+            // InternalOCLinEcore.g:28297:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -82488,17 +82488,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_0"
-    // InternalOCLinEcore.g:28302:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
+    // InternalOCLinEcore.g:28306:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28306:1: ( ( rulePatternExpCS ) )
-            // InternalOCLinEcore.g:28307:1: ( rulePatternExpCS )
+            // InternalOCLinEcore.g:28310:1: ( ( rulePatternExpCS ) )
+            // InternalOCLinEcore.g:28311:1: ( rulePatternExpCS )
             {
-            // InternalOCLinEcore.g:28307:1: ( rulePatternExpCS )
-            // InternalOCLinEcore.g:28308:1: rulePatternExpCS
+            // InternalOCLinEcore.g:28311:1: ( rulePatternExpCS )
+            // InternalOCLinEcore.g:28312:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());
@@ -82533,17 +82533,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLinEcore.g:28317:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
+    // InternalOCLinEcore.g:28321:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28321:1: ( ( rulePatternExpCS ) )
-            // InternalOCLinEcore.g:28322:1: ( rulePatternExpCS )
+            // InternalOCLinEcore.g:28325:1: ( ( rulePatternExpCS ) )
+            // InternalOCLinEcore.g:28326:1: ( rulePatternExpCS )
             {
-            // InternalOCLinEcore.g:28322:1: ( rulePatternExpCS )
-            // InternalOCLinEcore.g:28323:1: rulePatternExpCS
+            // InternalOCLinEcore.g:28326:1: ( rulePatternExpCS )
+            // InternalOCLinEcore.g:28327:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());
@@ -82578,17 +82578,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1"
-    // InternalOCLinEcore.g:28332:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
+    // InternalOCLinEcore.g:28336:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
     public final void rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28336:1: ( ( ruleIdentifier ) )
-            // InternalOCLinEcore.g:28337:1: ( ruleIdentifier )
+            // InternalOCLinEcore.g:28340:1: ( ( ruleIdentifier ) )
+            // InternalOCLinEcore.g:28341:1: ( ruleIdentifier )
             {
-            // InternalOCLinEcore.g:28337:1: ( ruleIdentifier )
-            // InternalOCLinEcore.g:28338:1: ruleIdentifier
+            // InternalOCLinEcore.g:28341:1: ( ruleIdentifier )
+            // InternalOCLinEcore.g:28342:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());
@@ -82623,23 +82623,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__ReferredPropertyAssignment_0_0"
-    // InternalOCLinEcore.g:28347:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:28351:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ShadowPartCS__ReferredPropertyAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28351:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:28352:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:28355:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:28356:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:28352:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:28353:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28356:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:28357:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
             }
-            // InternalOCLinEcore.g:28354:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:28355:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:28358:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28359:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_0_1());
@@ -82680,23 +82680,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2"
-    // InternalOCLinEcore.g:28366:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
+    // InternalOCLinEcore.g:28370:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28370:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
-            // InternalOCLinEcore.g:28371:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalOCLinEcore.g:28374:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
+            // InternalOCLinEcore.g:28375:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
             {
-            // InternalOCLinEcore.g:28371:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
-            // InternalOCLinEcore.g:28372:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalOCLinEcore.g:28375:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalOCLinEcore.g:28376:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_0_2_0());
             }
-            // InternalOCLinEcore.g:28373:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
-            // InternalOCLinEcore.g:28373:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
+            // InternalOCLinEcore.g:28377:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalOCLinEcore.g:28377:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0();
@@ -82731,17 +82731,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_1"
-    // InternalOCLinEcore.g:28382:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
+    // InternalOCLinEcore.g:28386:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28386:1: ( ( ruleStringLiteralExpCS ) )
-            // InternalOCLinEcore.g:28387:1: ( ruleStringLiteralExpCS )
+            // InternalOCLinEcore.g:28390:1: ( ( ruleStringLiteralExpCS ) )
+            // InternalOCLinEcore.g:28391:1: ( ruleStringLiteralExpCS )
             {
-            // InternalOCLinEcore.g:28387:1: ( ruleStringLiteralExpCS )
-            // InternalOCLinEcore.g:28388:1: ruleStringLiteralExpCS
+            // InternalOCLinEcore.g:28391:1: ( ruleStringLiteralExpCS )
+            // InternalOCLinEcore.g:28392:1: ruleStringLiteralExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());
@@ -82776,17 +82776,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__PatternVariableNameAssignment_0"
-    // InternalOCLinEcore.g:28397:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:28401:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PatternExpCS__PatternVariableNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28401:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:28402:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28405:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:28406:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:28402:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:28403:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:28406:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28407:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());
@@ -82821,17 +82821,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__OwnedPatternTypeAssignment_2"
-    // InternalOCLinEcore.g:28412:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:28416:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__PatternExpCS__OwnedPatternTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28416:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:28417:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28420:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:28421:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:28417:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:28418:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:28421:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28422:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());
@@ -82866,17 +82866,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2"
-    // InternalOCLinEcore.g:28427:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28431:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
     public final void rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28431:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28432:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28435:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28436:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28432:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28433:1: ruleExpCS
+            // InternalOCLinEcore.g:28436:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28437:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());
@@ -82911,17 +82911,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalOCLinEcore.g:28442:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
+    // InternalOCLinEcore.g:28446:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
     public final void rule__MapLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28446:1: ( ( ruleMapTypeCS ) )
-            // InternalOCLinEcore.g:28447:1: ( ruleMapTypeCS )
+            // InternalOCLinEcore.g:28450:1: ( ( ruleMapTypeCS ) )
+            // InternalOCLinEcore.g:28451:1: ( ruleMapTypeCS )
             {
-            // InternalOCLinEcore.g:28447:1: ( ruleMapTypeCS )
-            // InternalOCLinEcore.g:28448:1: ruleMapTypeCS
+            // InternalOCLinEcore.g:28451:1: ( ruleMapTypeCS )
+            // InternalOCLinEcore.g:28452:1: ruleMapTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());
@@ -82956,17 +82956,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalOCLinEcore.g:28457:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
+    // InternalOCLinEcore.g:28461:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28461:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalOCLinEcore.g:28462:1: ( ruleMapLiteralPartCS )
+            // InternalOCLinEcore.g:28465:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalOCLinEcore.g:28466:1: ( ruleMapLiteralPartCS )
             {
-            // InternalOCLinEcore.g:28462:1: ( ruleMapLiteralPartCS )
-            // InternalOCLinEcore.g:28463:1: ruleMapLiteralPartCS
+            // InternalOCLinEcore.g:28466:1: ( ruleMapLiteralPartCS )
+            // InternalOCLinEcore.g:28467:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());
@@ -83001,17 +83001,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLinEcore.g:28472:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
+    // InternalOCLinEcore.g:28476:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28476:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalOCLinEcore.g:28477:1: ( ruleMapLiteralPartCS )
+            // InternalOCLinEcore.g:28480:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalOCLinEcore.g:28481:1: ( ruleMapLiteralPartCS )
             {
-            // InternalOCLinEcore.g:28477:1: ( ruleMapLiteralPartCS )
-            // InternalOCLinEcore.g:28478:1: ruleMapLiteralPartCS
+            // InternalOCLinEcore.g:28481:1: ( ruleMapLiteralPartCS )
+            // InternalOCLinEcore.g:28482:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());
@@ -83046,17 +83046,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedKeyAssignment_0"
-    // InternalOCLinEcore.g:28487:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28491:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedKeyAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28491:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28492:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28495:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28496:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28492:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28493:1: ruleExpCS
+            // InternalOCLinEcore.g:28496:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28497:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());
@@ -83091,17 +83091,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedValueAssignment_2"
-    // InternalOCLinEcore.g:28502:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28506:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28506:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28507:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28510:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28511:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28507:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28508:1: ruleExpCS
+            // InternalOCLinEcore.g:28511:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28512:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());
@@ -83136,17 +83136,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_2"
-    // InternalOCLinEcore.g:28517:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
+    // InternalOCLinEcore.g:28521:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28521:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalOCLinEcore.g:28522:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLinEcore.g:28525:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalOCLinEcore.g:28526:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalOCLinEcore.g:28522:1: ( ruleTupleLiteralPartCS )
-            // InternalOCLinEcore.g:28523:1: ruleTupleLiteralPartCS
+            // InternalOCLinEcore.g:28526:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLinEcore.g:28527:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());
@@ -83181,17 +83181,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1"
-    // InternalOCLinEcore.g:28532:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
+    // InternalOCLinEcore.g:28536:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28536:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalOCLinEcore.g:28537:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLinEcore.g:28540:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalOCLinEcore.g:28541:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalOCLinEcore.g:28537:1: ( ruleTupleLiteralPartCS )
-            // InternalOCLinEcore.g:28538:1: ruleTupleLiteralPartCS
+            // InternalOCLinEcore.g:28541:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLinEcore.g:28542:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());
@@ -83226,17 +83226,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__NameAssignment_0"
-    // InternalOCLinEcore.g:28547:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:28551:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TupleLiteralPartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28551:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:28552:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28555:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:28556:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:28552:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:28553:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:28556:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:28557:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -83271,17 +83271,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1"
-    // InternalOCLinEcore.g:28562:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:28566:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28566:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:28567:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28570:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:28571:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:28567:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:28568:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:28571:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:28572:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -83316,17 +83316,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3"
-    // InternalOCLinEcore.g:28577:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28581:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28581:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28582:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28585:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28586:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28582:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28583:1: ruleExpCS
+            // InternalOCLinEcore.g:28586:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28587:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());
@@ -83361,17 +83361,17 @@
 
 
     // $ANTLR start "rule__NumberLiteralExpCS__SymbolAssignment"
-    // InternalOCLinEcore.g:28592:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
+    // InternalOCLinEcore.g:28596:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
     public final void rule__NumberLiteralExpCS__SymbolAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28596:1: ( ( ruleNUMBER_LITERAL ) )
-            // InternalOCLinEcore.g:28597:1: ( ruleNUMBER_LITERAL )
+            // InternalOCLinEcore.g:28600:1: ( ( ruleNUMBER_LITERAL ) )
+            // InternalOCLinEcore.g:28601:1: ( ruleNUMBER_LITERAL )
             {
-            // InternalOCLinEcore.g:28597:1: ( ruleNUMBER_LITERAL )
-            // InternalOCLinEcore.g:28598:1: ruleNUMBER_LITERAL
+            // InternalOCLinEcore.g:28601:1: ( ruleNUMBER_LITERAL )
+            // InternalOCLinEcore.g:28602:1: ruleNUMBER_LITERAL
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());
@@ -83406,17 +83406,17 @@
 
 
     // $ANTLR start "rule__StringLiteralExpCS__SegmentsAssignment"
-    // InternalOCLinEcore.g:28607:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
+    // InternalOCLinEcore.g:28611:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
     public final void rule__StringLiteralExpCS__SegmentsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28611:1: ( ( ruleStringLiteral ) )
-            // InternalOCLinEcore.g:28612:1: ( ruleStringLiteral )
+            // InternalOCLinEcore.g:28615:1: ( ( ruleStringLiteral ) )
+            // InternalOCLinEcore.g:28616:1: ( ruleStringLiteral )
             {
-            // InternalOCLinEcore.g:28612:1: ( ruleStringLiteral )
-            // InternalOCLinEcore.g:28613:1: ruleStringLiteral
+            // InternalOCLinEcore.g:28616:1: ( ruleStringLiteral )
+            // InternalOCLinEcore.g:28617:1: ruleStringLiteral
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());
@@ -83451,23 +83451,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_0"
-    // InternalOCLinEcore.g:28622:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
+    // InternalOCLinEcore.g:28626:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28626:1: ( ( ( 'true' ) ) )
-            // InternalOCLinEcore.g:28627:1: ( ( 'true' ) )
+            // InternalOCLinEcore.g:28630:1: ( ( ( 'true' ) ) )
+            // InternalOCLinEcore.g:28631:1: ( ( 'true' ) )
             {
-            // InternalOCLinEcore.g:28627:1: ( ( 'true' ) )
-            // InternalOCLinEcore.g:28628:1: ( 'true' )
+            // InternalOCLinEcore.g:28631:1: ( ( 'true' ) )
+            // InternalOCLinEcore.g:28632:1: ( 'true' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
             }
-            // InternalOCLinEcore.g:28629:1: ( 'true' )
-            // InternalOCLinEcore.g:28630:1: 'true'
+            // InternalOCLinEcore.g:28633:1: ( 'true' )
+            // InternalOCLinEcore.g:28634:1: 'true'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
@@ -83504,23 +83504,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_1"
-    // InternalOCLinEcore.g:28645:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
+    // InternalOCLinEcore.g:28649:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28649:1: ( ( ( 'false' ) ) )
-            // InternalOCLinEcore.g:28650:1: ( ( 'false' ) )
+            // InternalOCLinEcore.g:28653:1: ( ( ( 'false' ) ) )
+            // InternalOCLinEcore.g:28654:1: ( ( 'false' ) )
             {
-            // InternalOCLinEcore.g:28650:1: ( ( 'false' ) )
-            // InternalOCLinEcore.g:28651:1: ( 'false' )
+            // InternalOCLinEcore.g:28654:1: ( ( 'false' ) )
+            // InternalOCLinEcore.g:28655:1: ( 'false' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
             }
-            // InternalOCLinEcore.g:28652:1: ( 'false' )
-            // InternalOCLinEcore.g:28653:1: 'false'
+            // InternalOCLinEcore.g:28656:1: ( 'false' )
+            // InternalOCLinEcore.g:28657:1: 'false'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
@@ -83557,17 +83557,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1"
-    // InternalOCLinEcore.g:28668:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalOCLinEcore.g:28672:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28672:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLinEcore.g:28673:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:28676:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLinEcore.g:28677:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLinEcore.g:28673:1: ( ruleMultiplicityCS )
-            // InternalOCLinEcore.g:28674:1: ruleMultiplicityCS
+            // InternalOCLinEcore.g:28677:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:28678:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -83602,17 +83602,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralExpCS__OwnedTypeAssignment"
-    // InternalOCLinEcore.g:28683:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
+    // InternalOCLinEcore.g:28687:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
     public final void rule__TypeLiteralExpCS__OwnedTypeAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28687:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
-            // InternalOCLinEcore.g:28688:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalOCLinEcore.g:28691:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
+            // InternalOCLinEcore.g:28692:1: ( ruleTypeLiteralWithMultiplicityCS )
             {
-            // InternalOCLinEcore.g:28688:1: ( ruleTypeLiteralWithMultiplicityCS )
-            // InternalOCLinEcore.g:28689:1: ruleTypeLiteralWithMultiplicityCS
+            // InternalOCLinEcore.g:28692:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalOCLinEcore.g:28693:1: ruleTypeLiteralWithMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());
@@ -83647,17 +83647,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPathNameAssignment_0"
-    // InternalOCLinEcore.g:28698:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalOCLinEcore.g:28702:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypeNameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28702:1: ( ( rulePathNameCS ) )
-            // InternalOCLinEcore.g:28703:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:28706:1: ( ( rulePathNameCS ) )
+            // InternalOCLinEcore.g:28707:1: ( rulePathNameCS )
             {
-            // InternalOCLinEcore.g:28703:1: ( rulePathNameCS )
-            // InternalOCLinEcore.g:28704:1: rulePathNameCS
+            // InternalOCLinEcore.g:28707:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:28708:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -83692,17 +83692,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0"
-    // InternalOCLinEcore.g:28713:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalOCLinEcore.g:28717:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28717:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalOCLinEcore.g:28718:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLinEcore.g:28721:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalOCLinEcore.g:28722:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalOCLinEcore.g:28718:1: ( ruleCurlyBracketedClauseCS )
-            // InternalOCLinEcore.g:28719:1: ruleCurlyBracketedClauseCS
+            // InternalOCLinEcore.g:28722:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLinEcore.g:28723:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());
@@ -83737,17 +83737,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1"
-    // InternalOCLinEcore.g:28728:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28732:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
     public final void rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28732:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28733:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28736:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28737:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28733:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28734:1: ruleExpCS
+            // InternalOCLinEcore.g:28737:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28738:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());
@@ -83782,17 +83782,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__OwnedMultiplicityAssignment_1"
-    // InternalOCLinEcore.g:28743:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalOCLinEcore.g:28747:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeExpCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28747:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLinEcore.g:28748:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:28751:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLinEcore.g:28752:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLinEcore.g:28748:1: ( ruleMultiplicityCS )
-            // InternalOCLinEcore.g:28749:1: ruleMultiplicityCS
+            // InternalOCLinEcore.g:28752:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:28753:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -83827,17 +83827,17 @@
 
 
     // $ANTLR start "rule__ExpCS__NameAssignment_0_1_1"
-    // InternalOCLinEcore.g:28758:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
+    // InternalOCLinEcore.g:28762:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
     public final void rule__ExpCS__NameAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28762:1: ( ( ruleBinaryOperatorName ) )
-            // InternalOCLinEcore.g:28763:1: ( ruleBinaryOperatorName )
+            // InternalOCLinEcore.g:28766:1: ( ( ruleBinaryOperatorName ) )
+            // InternalOCLinEcore.g:28767:1: ( ruleBinaryOperatorName )
             {
-            // InternalOCLinEcore.g:28763:1: ( ruleBinaryOperatorName )
-            // InternalOCLinEcore.g:28764:1: ruleBinaryOperatorName
+            // InternalOCLinEcore.g:28767:1: ( ruleBinaryOperatorName )
+            // InternalOCLinEcore.g:28768:1: ruleBinaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());
@@ -83872,17 +83872,17 @@
 
 
     // $ANTLR start "rule__ExpCS__OwnedRightAssignment_0_1_2"
-    // InternalOCLinEcore.g:28773:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28777:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
     public final void rule__ExpCS__OwnedRightAssignment_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28777:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28778:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28781:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:28782:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28778:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28779:1: ruleExpCS
+            // InternalOCLinEcore.g:28782:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:28783:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());
@@ -83917,17 +83917,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__NameAssignment_0_1"
-    // InternalOCLinEcore.g:28788:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalOCLinEcore.g:28792:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedLetExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28792:1: ( ( ruleUnaryOperatorName ) )
-            // InternalOCLinEcore.g:28793:1: ( ruleUnaryOperatorName )
+            // InternalOCLinEcore.g:28796:1: ( ( ruleUnaryOperatorName ) )
+            // InternalOCLinEcore.g:28797:1: ( ruleUnaryOperatorName )
             {
-            // InternalOCLinEcore.g:28793:1: ( ruleUnaryOperatorName )
-            // InternalOCLinEcore.g:28794:1: ruleUnaryOperatorName
+            // InternalOCLinEcore.g:28797:1: ( ruleUnaryOperatorName )
+            // InternalOCLinEcore.g:28798:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -83962,17 +83962,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__OwnedRightAssignment_0_2"
-    // InternalOCLinEcore.g:28803:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
+    // InternalOCLinEcore.g:28807:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
     public final void rule__PrefixedLetExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28807:1: ( ( rulePrefixedLetExpCS ) )
-            // InternalOCLinEcore.g:28808:1: ( rulePrefixedLetExpCS )
+            // InternalOCLinEcore.g:28811:1: ( ( rulePrefixedLetExpCS ) )
+            // InternalOCLinEcore.g:28812:1: ( rulePrefixedLetExpCS )
             {
-            // InternalOCLinEcore.g:28808:1: ( rulePrefixedLetExpCS )
-            // InternalOCLinEcore.g:28809:1: rulePrefixedLetExpCS
+            // InternalOCLinEcore.g:28812:1: ( rulePrefixedLetExpCS )
+            // InternalOCLinEcore.g:28813:1: rulePrefixedLetExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());
@@ -84007,17 +84007,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__NameAssignment_0_1"
-    // InternalOCLinEcore.g:28818:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalOCLinEcore.g:28822:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedPrimaryExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28822:1: ( ( ruleUnaryOperatorName ) )
-            // InternalOCLinEcore.g:28823:1: ( ruleUnaryOperatorName )
+            // InternalOCLinEcore.g:28826:1: ( ( ruleUnaryOperatorName ) )
+            // InternalOCLinEcore.g:28827:1: ( ruleUnaryOperatorName )
             {
-            // InternalOCLinEcore.g:28823:1: ( ruleUnaryOperatorName )
-            // InternalOCLinEcore.g:28824:1: ruleUnaryOperatorName
+            // InternalOCLinEcore.g:28827:1: ( ruleUnaryOperatorName )
+            // InternalOCLinEcore.g:28828:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -84052,17 +84052,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2"
-    // InternalOCLinEcore.g:28833:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalOCLinEcore.g:28837:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28837:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalOCLinEcore.g:28838:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLinEcore.g:28841:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalOCLinEcore.g:28842:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalOCLinEcore.g:28838:1: ( rulePrefixedPrimaryExpCS )
-            // InternalOCLinEcore.g:28839:1: rulePrefixedPrimaryExpCS
+            // InternalOCLinEcore.g:28842:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLinEcore.g:28843:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());
@@ -84097,17 +84097,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedPathNameAssignment_0"
-    // InternalOCLinEcore.g:28848:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalOCLinEcore.g:28852:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__NameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28852:1: ( ( rulePathNameCS ) )
-            // InternalOCLinEcore.g:28853:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:28856:1: ( ( rulePathNameCS ) )
+            // InternalOCLinEcore.g:28857:1: ( rulePathNameCS )
             {
-            // InternalOCLinEcore.g:28853:1: ( rulePathNameCS )
-            // InternalOCLinEcore.g:28854:1: rulePathNameCS
+            // InternalOCLinEcore.g:28857:1: ( rulePathNameCS )
+            // InternalOCLinEcore.g:28858:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -84142,17 +84142,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1"
-    // InternalOCLinEcore.g:28863:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
+    // InternalOCLinEcore.g:28867:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28867:1: ( ( ruleSquareBracketedClauseCS ) )
-            // InternalOCLinEcore.g:28868:1: ( ruleSquareBracketedClauseCS )
+            // InternalOCLinEcore.g:28871:1: ( ( ruleSquareBracketedClauseCS ) )
+            // InternalOCLinEcore.g:28872:1: ( ruleSquareBracketedClauseCS )
             {
-            // InternalOCLinEcore.g:28868:1: ( ruleSquareBracketedClauseCS )
-            // InternalOCLinEcore.g:28869:1: ruleSquareBracketedClauseCS
+            // InternalOCLinEcore.g:28872:1: ( ruleSquareBracketedClauseCS )
+            // InternalOCLinEcore.g:28873:1: ruleSquareBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
@@ -84187,17 +84187,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2"
-    // InternalOCLinEcore.g:28878:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalOCLinEcore.g:28882:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28882:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalOCLinEcore.g:28883:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLinEcore.g:28886:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalOCLinEcore.g:28887:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalOCLinEcore.g:28883:1: ( ruleRoundBracketedClauseCS )
-            // InternalOCLinEcore.g:28884:1: ruleRoundBracketedClauseCS
+            // InternalOCLinEcore.g:28887:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLinEcore.g:28888:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
@@ -84232,17 +84232,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3"
-    // InternalOCLinEcore.g:28893:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalOCLinEcore.g:28897:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28897:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalOCLinEcore.g:28898:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLinEcore.g:28901:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalOCLinEcore.g:28902:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalOCLinEcore.g:28898:1: ( ruleCurlyBracketedClauseCS )
-            // InternalOCLinEcore.g:28899:1: ruleCurlyBracketedClauseCS
+            // InternalOCLinEcore.g:28902:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLinEcore.g:28903:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
@@ -84277,23 +84277,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__IsPreAssignment_4_0"
-    // InternalOCLinEcore.g:28908:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
+    // InternalOCLinEcore.g:28912:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
     public final void rule__NameExpCS__IsPreAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28912:1: ( ( ( '@' ) ) )
-            // InternalOCLinEcore.g:28913:1: ( ( '@' ) )
+            // InternalOCLinEcore.g:28916:1: ( ( ( '@' ) ) )
+            // InternalOCLinEcore.g:28917:1: ( ( '@' ) )
             {
-            // InternalOCLinEcore.g:28913:1: ( ( '@' ) )
-            // InternalOCLinEcore.g:28914:1: ( '@' )
+            // InternalOCLinEcore.g:28917:1: ( ( '@' ) )
+            // InternalOCLinEcore.g:28918:1: ( '@' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
             }
-            // InternalOCLinEcore.g:28915:1: ( '@' )
-            // InternalOCLinEcore.g:28916:1: '@'
+            // InternalOCLinEcore.g:28919:1: ( '@' )
+            // InternalOCLinEcore.g:28920:1: '@'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
@@ -84330,17 +84330,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0"
-    // InternalOCLinEcore.g:28931:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
+    // InternalOCLinEcore.g:28935:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28935:1: ( ( ruleShadowPartCS ) )
-            // InternalOCLinEcore.g:28936:1: ( ruleShadowPartCS )
+            // InternalOCLinEcore.g:28939:1: ( ( ruleShadowPartCS ) )
+            // InternalOCLinEcore.g:28940:1: ( ruleShadowPartCS )
             {
-            // InternalOCLinEcore.g:28936:1: ( ruleShadowPartCS )
-            // InternalOCLinEcore.g:28937:1: ruleShadowPartCS
+            // InternalOCLinEcore.g:28940:1: ( ruleShadowPartCS )
+            // InternalOCLinEcore.g:28941:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());
@@ -84375,17 +84375,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLinEcore.g:28946:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
+    // InternalOCLinEcore.g:28950:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28950:1: ( ( ruleShadowPartCS ) )
-            // InternalOCLinEcore.g:28951:1: ( ruleShadowPartCS )
+            // InternalOCLinEcore.g:28954:1: ( ( ruleShadowPartCS ) )
+            // InternalOCLinEcore.g:28955:1: ( ruleShadowPartCS )
             {
-            // InternalOCLinEcore.g:28951:1: ( ruleShadowPartCS )
-            // InternalOCLinEcore.g:28952:1: ruleShadowPartCS
+            // InternalOCLinEcore.g:28955:1: ( ruleShadowPartCS )
+            // InternalOCLinEcore.g:28956:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());
@@ -84420,17 +84420,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0"
-    // InternalOCLinEcore.g:28961:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
+    // InternalOCLinEcore.g:28965:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28965:1: ( ( ruleNavigatingArgCS ) )
-            // InternalOCLinEcore.g:28966:1: ( ruleNavigatingArgCS )
+            // InternalOCLinEcore.g:28969:1: ( ( ruleNavigatingArgCS ) )
+            // InternalOCLinEcore.g:28970:1: ( ruleNavigatingArgCS )
             {
-            // InternalOCLinEcore.g:28966:1: ( ruleNavigatingArgCS )
-            // InternalOCLinEcore.g:28967:1: ruleNavigatingArgCS
+            // InternalOCLinEcore.g:28970:1: ( ruleNavigatingArgCS )
+            // InternalOCLinEcore.g:28971:1: ruleNavigatingArgCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
@@ -84465,23 +84465,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1"
-    // InternalOCLinEcore.g:28976:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
+    // InternalOCLinEcore.g:28980:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28980:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
-            // InternalOCLinEcore.g:28981:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalOCLinEcore.g:28984:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
+            // InternalOCLinEcore.g:28985:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
             {
-            // InternalOCLinEcore.g:28981:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
-            // InternalOCLinEcore.g:28982:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalOCLinEcore.g:28985:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalOCLinEcore.g:28986:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAlternatives_2_1_0());
             }
-            // InternalOCLinEcore.g:28983:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
-            // InternalOCLinEcore.g:28983:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
+            // InternalOCLinEcore.g:28987:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalOCLinEcore.g:28987:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0();
@@ -84516,17 +84516,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_1"
-    // InternalOCLinEcore.g:28992:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:28996:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:28996:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:28997:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29000:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29001:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:28997:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:28998:1: ruleExpCS
+            // InternalOCLinEcore.g:29001:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29002:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
@@ -84561,17 +84561,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1"
-    // InternalOCLinEcore.g:29007:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29011:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29011:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29012:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29015:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29016:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29012:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29013:1: ruleExpCS
+            // InternalOCLinEcore.g:29016:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29017:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
@@ -84606,17 +84606,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0"
-    // InternalOCLinEcore.g:29022:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLinEcore.g:29026:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29026:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLinEcore.g:29027:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29030:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLinEcore.g:29031:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLinEcore.g:29027:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLinEcore.g:29028:1: ruleNavigatingArgExpCS
+            // InternalOCLinEcore.g:29031:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29032:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
@@ -84651,17 +84651,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1"
-    // InternalOCLinEcore.g:29037:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLinEcore.g:29041:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29041:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLinEcore.g:29042:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29045:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLinEcore.g:29046:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLinEcore.g:29042:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLinEcore.g:29043:1: ruleCoIteratorVariableCS
+            // InternalOCLinEcore.g:29046:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29047:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
@@ -84696,17 +84696,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"
-    // InternalOCLinEcore.g:29052:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29056:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29056:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29057:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29060:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29061:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29057:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29058:1: ruleExpCS
+            // InternalOCLinEcore.g:29061:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29062:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());
@@ -84741,17 +84741,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1"
-    // InternalOCLinEcore.g:29067:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29071:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29071:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29072:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29075:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29076:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29072:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29073:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29076:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29077:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
@@ -84786,17 +84786,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1"
-    // InternalOCLinEcore.g:29082:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLinEcore.g:29086:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29086:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLinEcore.g:29087:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29090:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLinEcore.g:29091:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLinEcore.g:29087:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLinEcore.g:29088:1: ruleCoIteratorVariableCS
+            // InternalOCLinEcore.g:29091:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29092:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
@@ -84831,17 +84831,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1"
-    // InternalOCLinEcore.g:29097:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29101:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29101:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29102:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29105:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29106:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29102:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29103:1: ruleExpCS
+            // InternalOCLinEcore.g:29106:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29107:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());
@@ -84876,17 +84876,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1"
-    // InternalOCLinEcore.g:29112:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29116:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29116:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29117:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29120:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29121:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29117:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29118:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29121:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29122:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
@@ -84921,17 +84921,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1"
-    // InternalOCLinEcore.g:29127:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLinEcore.g:29131:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29131:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLinEcore.g:29132:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29135:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLinEcore.g:29136:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLinEcore.g:29132:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLinEcore.g:29133:1: ruleCoIteratorVariableCS
+            // InternalOCLinEcore.g:29136:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29137:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
@@ -84966,17 +84966,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3"
-    // InternalOCLinEcore.g:29142:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29146:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29146:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29147:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29150:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29151:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29147:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29148:1: ruleExpCS
+            // InternalOCLinEcore.g:29151:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29152:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());
@@ -85011,17 +85011,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_1_1"
-    // InternalOCLinEcore.g:29157:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29161:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29161:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29162:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29165:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29166:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29162:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29163:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29166:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29167:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -85056,23 +85056,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__PrefixAssignment_0"
-    // InternalOCLinEcore.g:29172:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
+    // InternalOCLinEcore.g:29176:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
     public final void rule__NavigatingBarArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29176:1: ( ( ( '|' ) ) )
-            // InternalOCLinEcore.g:29177:1: ( ( '|' ) )
+            // InternalOCLinEcore.g:29180:1: ( ( ( '|' ) ) )
+            // InternalOCLinEcore.g:29181:1: ( ( '|' ) )
             {
-            // InternalOCLinEcore.g:29177:1: ( ( '|' ) )
-            // InternalOCLinEcore.g:29178:1: ( '|' )
+            // InternalOCLinEcore.g:29181:1: ( ( '|' ) )
+            // InternalOCLinEcore.g:29182:1: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
             }
-            // InternalOCLinEcore.g:29179:1: ( '|' )
-            // InternalOCLinEcore.g:29180:1: '|'
+            // InternalOCLinEcore.g:29183:1: ( '|' )
+            // InternalOCLinEcore.g:29184:1: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
@@ -85109,17 +85109,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1"
-    // InternalOCLinEcore.g:29195:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLinEcore.g:29199:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29199:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLinEcore.g:29200:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29203:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLinEcore.g:29204:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLinEcore.g:29200:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLinEcore.g:29201:1: ruleNavigatingArgExpCS
+            // InternalOCLinEcore.g:29204:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29205:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -85154,17 +85154,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1"
-    // InternalOCLinEcore.g:29210:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29214:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29214:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29215:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29218:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29219:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29215:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29216:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29219:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29220:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -85199,17 +85199,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalOCLinEcore.g:29225:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29229:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29229:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29230:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29233:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29234:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29230:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29231:1: ruleExpCS
+            // InternalOCLinEcore.g:29234:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29235:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -85244,23 +85244,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__PrefixAssignment_0"
-    // InternalOCLinEcore.g:29240:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
+    // InternalOCLinEcore.g:29244:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
     public final void rule__NavigatingCommaArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29244:1: ( ( ( ',' ) ) )
-            // InternalOCLinEcore.g:29245:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:29248:1: ( ( ( ',' ) ) )
+            // InternalOCLinEcore.g:29249:1: ( ( ',' ) )
             {
-            // InternalOCLinEcore.g:29245:1: ( ( ',' ) )
-            // InternalOCLinEcore.g:29246:1: ( ',' )
+            // InternalOCLinEcore.g:29249:1: ( ( ',' ) )
+            // InternalOCLinEcore.g:29250:1: ( ',' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
             }
-            // InternalOCLinEcore.g:29247:1: ( ',' )
-            // InternalOCLinEcore.g:29248:1: ','
+            // InternalOCLinEcore.g:29251:1: ( ',' )
+            // InternalOCLinEcore.g:29252:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
@@ -85297,17 +85297,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1"
-    // InternalOCLinEcore.g:29263:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLinEcore.g:29267:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29267:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLinEcore.g:29268:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29271:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLinEcore.g:29272:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLinEcore.g:29268:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLinEcore.g:29269:1: ruleNavigatingArgExpCS
+            // InternalOCLinEcore.g:29272:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29273:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -85342,17 +85342,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1"
-    // InternalOCLinEcore.g:29278:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLinEcore.g:29282:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29282:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLinEcore.g:29283:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29286:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLinEcore.g:29287:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLinEcore.g:29283:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLinEcore.g:29284:1: ruleCoIteratorVariableCS
+            // InternalOCLinEcore.g:29287:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29288:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
@@ -85387,17 +85387,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"
-    // InternalOCLinEcore.g:29293:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29297:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29297:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29298:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29301:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29302:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29298:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29299:1: ruleExpCS
+            // InternalOCLinEcore.g:29302:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29303:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());
@@ -85432,17 +85432,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1"
-    // InternalOCLinEcore.g:29308:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29312:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29312:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29313:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29316:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29317:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29313:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29314:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29317:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29318:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
@@ -85477,17 +85477,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1"
-    // InternalOCLinEcore.g:29323:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLinEcore.g:29327:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29327:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLinEcore.g:29328:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29331:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLinEcore.g:29332:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLinEcore.g:29328:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLinEcore.g:29329:1: ruleCoIteratorVariableCS
+            // InternalOCLinEcore.g:29332:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29333:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
@@ -85522,17 +85522,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1"
-    // InternalOCLinEcore.g:29338:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29342:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29342:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29343:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29346:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29347:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29343:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29344:1: ruleExpCS
+            // InternalOCLinEcore.g:29347:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29348:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());
@@ -85567,17 +85567,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1"
-    // InternalOCLinEcore.g:29353:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29357:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29357:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29358:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29361:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29362:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29358:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29359:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29362:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29363:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
@@ -85612,17 +85612,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1"
-    // InternalOCLinEcore.g:29368:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLinEcore.g:29372:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29372:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLinEcore.g:29373:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29376:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLinEcore.g:29377:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLinEcore.g:29373:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLinEcore.g:29374:1: ruleCoIteratorVariableCS
+            // InternalOCLinEcore.g:29377:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLinEcore.g:29378:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
@@ -85657,17 +85657,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3"
-    // InternalOCLinEcore.g:29383:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29387:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29387:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29388:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29391:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29392:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29388:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29389:1: ruleExpCS
+            // InternalOCLinEcore.g:29392:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29393:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());
@@ -85702,23 +85702,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__PrefixAssignment_0"
-    // InternalOCLinEcore.g:29398:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
+    // InternalOCLinEcore.g:29402:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
     public final void rule__NavigatingSemiArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29402:1: ( ( ( ';' ) ) )
-            // InternalOCLinEcore.g:29403:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:29406:1: ( ( ( ';' ) ) )
+            // InternalOCLinEcore.g:29407:1: ( ( ';' ) )
             {
-            // InternalOCLinEcore.g:29403:1: ( ( ';' ) )
-            // InternalOCLinEcore.g:29404:1: ( ';' )
+            // InternalOCLinEcore.g:29407:1: ( ( ';' ) )
+            // InternalOCLinEcore.g:29408:1: ( ';' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
             }
-            // InternalOCLinEcore.g:29405:1: ( ';' )
-            // InternalOCLinEcore.g:29406:1: ';'
+            // InternalOCLinEcore.g:29409:1: ( ';' )
+            // InternalOCLinEcore.g:29410:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
@@ -85755,17 +85755,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1"
-    // InternalOCLinEcore.g:29421:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLinEcore.g:29425:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29425:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLinEcore.g:29426:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29429:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLinEcore.g:29430:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLinEcore.g:29426:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLinEcore.g:29427:1: ruleNavigatingArgExpCS
+            // InternalOCLinEcore.g:29430:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLinEcore.g:29431:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -85800,17 +85800,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1"
-    // InternalOCLinEcore.g:29436:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29440:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29440:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29441:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29444:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29445:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29441:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29442:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29445:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29446:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -85845,17 +85845,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalOCLinEcore.g:29451:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29455:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29455:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29456:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29459:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29460:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29456:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29457:1: ruleExpCS
+            // InternalOCLinEcore.g:29460:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29461:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -85890,17 +85890,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__NameAssignment_0"
-    // InternalOCLinEcore.g:29466:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:29470:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__CoIteratorVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29470:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:29471:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29474:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:29475:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:29471:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:29472:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:29475:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29476:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -85935,17 +85935,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1"
-    // InternalOCLinEcore.g:29481:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29485:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29485:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29486:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29489:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29490:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29486:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29487:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29490:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29491:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -85980,23 +85980,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAssignment_1"
-    // InternalOCLinEcore.g:29496:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
+    // InternalOCLinEcore.g:29500:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
     public final void rule__IfExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29500:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
-            // InternalOCLinEcore.g:29501:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalOCLinEcore.g:29504:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
+            // InternalOCLinEcore.g:29505:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
             {
-            // InternalOCLinEcore.g:29501:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
-            // InternalOCLinEcore.g:29502:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalOCLinEcore.g:29505:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalOCLinEcore.g:29506:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
             }
-            // InternalOCLinEcore.g:29503:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
-            // InternalOCLinEcore.g:29503:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
+            // InternalOCLinEcore.g:29507:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalOCLinEcore.g:29507:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAlternatives_1_0();
@@ -86031,17 +86031,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedThenExpressionAssignment_3"
-    // InternalOCLinEcore.g:29512:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29516:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29516:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29517:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29520:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29521:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29517:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29518:1: ruleExpCS
+            // InternalOCLinEcore.g:29521:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29522:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -86076,17 +86076,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedIfThenExpressionsAssignment_4"
-    // InternalOCLinEcore.g:29527:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
+    // InternalOCLinEcore.g:29531:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
     public final void rule__IfExpCS__OwnedIfThenExpressionsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29531:1: ( ( ruleElseIfThenExpCS ) )
-            // InternalOCLinEcore.g:29532:1: ( ruleElseIfThenExpCS )
+            // InternalOCLinEcore.g:29535:1: ( ( ruleElseIfThenExpCS ) )
+            // InternalOCLinEcore.g:29536:1: ( ruleElseIfThenExpCS )
             {
-            // InternalOCLinEcore.g:29532:1: ( ruleElseIfThenExpCS )
-            // InternalOCLinEcore.g:29533:1: ruleElseIfThenExpCS
+            // InternalOCLinEcore.g:29536:1: ( ruleElseIfThenExpCS )
+            // InternalOCLinEcore.g:29537:1: ruleElseIfThenExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
@@ -86121,17 +86121,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedElseExpressionAssignment_6"
-    // InternalOCLinEcore.g:29542:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29546:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedElseExpressionAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29546:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29547:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29550:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29551:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29547:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29548:1: ruleExpCS
+            // InternalOCLinEcore.g:29551:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29552:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
@@ -86166,17 +86166,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedConditionAssignment_1"
-    // InternalOCLinEcore.g:29557:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29561:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29561:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29562:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29565:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29566:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29562:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29563:1: ruleExpCS
+            // InternalOCLinEcore.g:29566:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29567:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
@@ -86211,17 +86211,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3"
-    // InternalOCLinEcore.g:29572:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29576:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29576:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29577:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29580:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29581:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29577:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29578:1: ruleExpCS
+            // InternalOCLinEcore.g:29581:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29582:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -86256,17 +86256,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_1"
-    // InternalOCLinEcore.g:29587:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
+    // InternalOCLinEcore.g:29591:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29591:1: ( ( ruleLetVariableCS ) )
-            // InternalOCLinEcore.g:29592:1: ( ruleLetVariableCS )
+            // InternalOCLinEcore.g:29595:1: ( ( ruleLetVariableCS ) )
+            // InternalOCLinEcore.g:29596:1: ( ruleLetVariableCS )
             {
-            // InternalOCLinEcore.g:29592:1: ( ruleLetVariableCS )
-            // InternalOCLinEcore.g:29593:1: ruleLetVariableCS
+            // InternalOCLinEcore.g:29596:1: ( ruleLetVariableCS )
+            // InternalOCLinEcore.g:29597:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
@@ -86301,17 +86301,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_2_1"
-    // InternalOCLinEcore.g:29602:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
+    // InternalOCLinEcore.g:29606:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29606:1: ( ( ruleLetVariableCS ) )
-            // InternalOCLinEcore.g:29607:1: ( ruleLetVariableCS )
+            // InternalOCLinEcore.g:29610:1: ( ( ruleLetVariableCS ) )
+            // InternalOCLinEcore.g:29611:1: ( ruleLetVariableCS )
             {
-            // InternalOCLinEcore.g:29607:1: ( ruleLetVariableCS )
-            // InternalOCLinEcore.g:29608:1: ruleLetVariableCS
+            // InternalOCLinEcore.g:29611:1: ( ruleLetVariableCS )
+            // InternalOCLinEcore.g:29612:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
@@ -86346,17 +86346,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedInExpressionAssignment_4"
-    // InternalOCLinEcore.g:29617:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29621:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetExpCS__OwnedInExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29621:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29622:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29625:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29626:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29622:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29623:1: ruleExpCS
+            // InternalOCLinEcore.g:29626:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29627:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());
@@ -86391,17 +86391,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__NameAssignment_0"
-    // InternalOCLinEcore.g:29632:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:29636:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__LetVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29636:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:29637:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29640:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:29641:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:29637:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:29638:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:29641:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29642:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -86436,17 +86436,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1"
-    // InternalOCLinEcore.g:29647:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalOCLinEcore.g:29651:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29651:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalOCLinEcore.g:29652:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLinEcore.g:29655:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalOCLinEcore.g:29656:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalOCLinEcore.g:29652:1: ( ruleRoundBracketedClauseCS )
-            // InternalOCLinEcore.g:29653:1: ruleRoundBracketedClauseCS
+            // InternalOCLinEcore.g:29656:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLinEcore.g:29657:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());
@@ -86481,17 +86481,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedTypeAssignment_2_1"
-    // InternalOCLinEcore.g:29662:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLinEcore.g:29666:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__LetVariableCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29666:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLinEcore.g:29667:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29670:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLinEcore.g:29671:1: ( ruleTypeExpCS )
             {
-            // InternalOCLinEcore.g:29667:1: ( ruleTypeExpCS )
-            // InternalOCLinEcore.g:29668:1: ruleTypeExpCS
+            // InternalOCLinEcore.g:29671:1: ( ruleTypeExpCS )
+            // InternalOCLinEcore.g:29672:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -86526,17 +86526,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedInitExpressionAssignment_4"
-    // InternalOCLinEcore.g:29677:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29681:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetVariableCS__OwnedInitExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29681:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29682:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29685:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29686:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29682:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29683:1: ruleExpCS
+            // InternalOCLinEcore.g:29686:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29687:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());
@@ -86571,17 +86571,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__OwnedExpressionAssignment_1"
-    // InternalOCLinEcore.g:29692:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
+    // InternalOCLinEcore.g:29696:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__NestedExpCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29696:1: ( ( ruleExpCS ) )
-            // InternalOCLinEcore.g:29697:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29700:1: ( ( ruleExpCS ) )
+            // InternalOCLinEcore.g:29701:1: ( ruleExpCS )
             {
-            // InternalOCLinEcore.g:29697:1: ( ruleExpCS )
-            // InternalOCLinEcore.g:29698:1: ruleExpCS
+            // InternalOCLinEcore.g:29701:1: ( ruleExpCS )
+            // InternalOCLinEcore.g:29702:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());
@@ -86616,17 +86616,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"
-    // InternalOCLinEcore.g:29707:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
+    // InternalOCLinEcore.g:29711:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
     public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29711:1: ( ( ruleLOWER ) )
-            // InternalOCLinEcore.g:29712:1: ( ruleLOWER )
+            // InternalOCLinEcore.g:29715:1: ( ( ruleLOWER ) )
+            // InternalOCLinEcore.g:29716:1: ( ruleLOWER )
             {
-            // InternalOCLinEcore.g:29712:1: ( ruleLOWER )
-            // InternalOCLinEcore.g:29713:1: ruleLOWER
+            // InternalOCLinEcore.g:29716:1: ( ruleLOWER )
+            // InternalOCLinEcore.g:29717:1: ruleLOWER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
@@ -86661,17 +86661,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"
-    // InternalOCLinEcore.g:29722:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
+    // InternalOCLinEcore.g:29726:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
     public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29726:1: ( ( ruleUPPER ) )
-            // InternalOCLinEcore.g:29727:1: ( ruleUPPER )
+            // InternalOCLinEcore.g:29730:1: ( ( ruleUPPER ) )
+            // InternalOCLinEcore.g:29731:1: ( ruleUPPER )
             {
-            // InternalOCLinEcore.g:29727:1: ( ruleUPPER )
-            // InternalOCLinEcore.g:29728:1: ruleUPPER
+            // InternalOCLinEcore.g:29731:1: ( ruleUPPER )
+            // InternalOCLinEcore.g:29732:1: ruleUPPER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
@@ -86706,23 +86706,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__IsNullFreeAssignment_2_1"
-    // InternalOCLinEcore.g:29737:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
+    // InternalOCLinEcore.g:29741:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
     public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29741:1: ( ( ( '|1' ) ) )
-            // InternalOCLinEcore.g:29742:1: ( ( '|1' ) )
+            // InternalOCLinEcore.g:29745:1: ( ( ( '|1' ) ) )
+            // InternalOCLinEcore.g:29746:1: ( ( '|1' ) )
             {
-            // InternalOCLinEcore.g:29742:1: ( ( '|1' ) )
-            // InternalOCLinEcore.g:29743:1: ( '|1' )
+            // InternalOCLinEcore.g:29746:1: ( ( '|1' ) )
+            // InternalOCLinEcore.g:29747:1: ( '|1' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
             }
-            // InternalOCLinEcore.g:29744:1: ( '|1' )
-            // InternalOCLinEcore.g:29745:1: '|1'
+            // InternalOCLinEcore.g:29748:1: ( '|1' )
+            // InternalOCLinEcore.g:29749:1: '|1'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
@@ -86759,23 +86759,23 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAssignment"
-    // InternalOCLinEcore.g:29760:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
+    // InternalOCLinEcore.g:29764:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
     public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29764:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
-            // InternalOCLinEcore.g:29765:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalOCLinEcore.g:29768:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
+            // InternalOCLinEcore.g:29769:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
             {
-            // InternalOCLinEcore.g:29765:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
-            // InternalOCLinEcore.g:29766:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalOCLinEcore.g:29769:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalOCLinEcore.g:29770:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
             }
-            // InternalOCLinEcore.g:29767:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
-            // InternalOCLinEcore.g:29767:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
+            // InternalOCLinEcore.g:29771:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalOCLinEcore.g:29771:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityStringCS__StringBoundsAlternatives_0();
@@ -86810,17 +86810,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_0"
-    // InternalOCLinEcore.g:29776:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
+    // InternalOCLinEcore.g:29780:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29780:1: ( ( ruleFirstPathElementCS ) )
-            // InternalOCLinEcore.g:29781:1: ( ruleFirstPathElementCS )
+            // InternalOCLinEcore.g:29784:1: ( ( ruleFirstPathElementCS ) )
+            // InternalOCLinEcore.g:29785:1: ( ruleFirstPathElementCS )
             {
-            // InternalOCLinEcore.g:29781:1: ( ruleFirstPathElementCS )
-            // InternalOCLinEcore.g:29782:1: ruleFirstPathElementCS
+            // InternalOCLinEcore.g:29785:1: ( ruleFirstPathElementCS )
+            // InternalOCLinEcore.g:29786:1: ruleFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
@@ -86855,17 +86855,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalOCLinEcore.g:29791:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalOCLinEcore.g:29795:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29795:1: ( ( ruleNextPathElementCS ) )
-            // InternalOCLinEcore.g:29796:1: ( ruleNextPathElementCS )
+            // InternalOCLinEcore.g:29799:1: ( ( ruleNextPathElementCS ) )
+            // InternalOCLinEcore.g:29800:1: ( ruleNextPathElementCS )
             {
-            // InternalOCLinEcore.g:29796:1: ( ruleNextPathElementCS )
-            // InternalOCLinEcore.g:29797:1: ruleNextPathElementCS
+            // InternalOCLinEcore.g:29800:1: ( ruleNextPathElementCS )
+            // InternalOCLinEcore.g:29801:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -86900,23 +86900,23 @@
 
 
     // $ANTLR start "rule__FirstPathElementCS__ReferredElementAssignment"
-    // InternalOCLinEcore.g:29806:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:29812:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29810:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:29811:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:29816:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:29817:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:29811:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:29812:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29817:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:29818:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalOCLinEcore.g:29813:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:29814:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:29819:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29820:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
@@ -86957,23 +86957,23 @@
 
 
     // $ANTLR start "rule__NextPathElementCS__ReferredElementAssignment"
-    // InternalOCLinEcore.g:29825:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
+    // InternalOCLinEcore.g:29831:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
     public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29829:1: ( ( ( ruleUnreservedName ) ) )
-            // InternalOCLinEcore.g:29830:1: ( ( ruleUnreservedName ) )
+            // InternalOCLinEcore.g:29835:1: ( ( ( ruleUnreservedName ) ) )
+            // InternalOCLinEcore.g:29836:1: ( ( ruleUnreservedName ) )
             {
-            // InternalOCLinEcore.g:29830:1: ( ( ruleUnreservedName ) )
-            // InternalOCLinEcore.g:29831:1: ( ruleUnreservedName )
+            // InternalOCLinEcore.g:29836:1: ( ( ruleUnreservedName ) )
+            // InternalOCLinEcore.g:29837:1: ( ruleUnreservedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalOCLinEcore.g:29832:1: ( ruleUnreservedName )
-            // InternalOCLinEcore.g:29833:1: ruleUnreservedName
+            // InternalOCLinEcore.g:29838:1: ( ruleUnreservedName )
+            // InternalOCLinEcore.g:29839:1: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
@@ -87014,17 +87014,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"
-    // InternalOCLinEcore.g:29844:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalOCLinEcore.g:29850:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29848:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalOCLinEcore.g:29849:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLinEcore.g:29854:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalOCLinEcore.g:29855:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalOCLinEcore.g:29849:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalOCLinEcore.g:29850:1: ruleTemplateParameterSubstitutionCS
+            // InternalOCLinEcore.g:29855:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLinEcore.g:29856:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
@@ -87059,17 +87059,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"
-    // InternalOCLinEcore.g:29859:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalOCLinEcore.g:29865:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29863:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalOCLinEcore.g:29864:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLinEcore.g:29869:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalOCLinEcore.g:29870:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalOCLinEcore.g:29864:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalOCLinEcore.g:29865:1: ruleTemplateParameterSubstitutionCS
+            // InternalOCLinEcore.g:29870:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLinEcore.g:29871:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
@@ -87104,17 +87104,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"
-    // InternalOCLinEcore.g:29874:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
+    // InternalOCLinEcore.g:29880:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
     public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29878:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLinEcore.g:29879:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:29884:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLinEcore.g:29885:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLinEcore.g:29879:1: ( ruleMultiplicityCS )
-            // InternalOCLinEcore.g:29880:1: ruleMultiplicityCS
+            // InternalOCLinEcore.g:29885:1: ( ruleMultiplicityCS )
+            // InternalOCLinEcore.g:29886:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
@@ -87149,17 +87149,17 @@
 
 
     // $ANTLR start "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"
-    // InternalOCLinEcore.g:29889:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
+    // InternalOCLinEcore.g:29895:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
     public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29893:1: ( ( ruleTypeRefCS ) )
-            // InternalOCLinEcore.g:29894:1: ( ruleTypeRefCS )
+            // InternalOCLinEcore.g:29899:1: ( ( ruleTypeRefCS ) )
+            // InternalOCLinEcore.g:29900:1: ( ruleTypeRefCS )
             {
-            // InternalOCLinEcore.g:29894:1: ( ruleTypeRefCS )
-            // InternalOCLinEcore.g:29895:1: ruleTypeRefCS
+            // InternalOCLinEcore.g:29900:1: ( ruleTypeRefCS )
+            // InternalOCLinEcore.g:29901:1: ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
@@ -87194,17 +87194,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__NameAssignment_0"
-    // InternalOCLinEcore.g:29904:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLinEcore.g:29910:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29908:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:29909:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29914:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:29915:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:29909:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:29910:1: ruleUnrestrictedName
+            // InternalOCLinEcore.g:29915:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:29916:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -87239,17 +87239,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"
-    // InternalOCLinEcore.g:29919:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:29925:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29923:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:29924:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:29929:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:29930:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:29924:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:29925:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:29930:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:29931:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
@@ -87284,17 +87284,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"
-    // InternalOCLinEcore.g:29934:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:29940:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29938:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:29939:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:29944:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:29945:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:29939:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:29940:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:29945:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:29946:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
@@ -87329,17 +87329,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"
-    // InternalOCLinEcore.g:29949:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLinEcore.g:29955:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLinEcore.g:29953:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLinEcore.g:29954:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:29959:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLinEcore.g:29960:1: ( ruleTypedRefCS )
             {
-            // InternalOCLinEcore.g:29954:1: ( ruleTypedRefCS )
-            // InternalOCLinEcore.g:29955:1: ruleTypedRefCS
+            // InternalOCLinEcore.g:29960:1: ( ruleTypedRefCS )
+            // InternalOCLinEcore.g:29961:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
@@ -87374,11 +87374,11 @@
 
     // $ANTLR start synpred194_InternalOCLinEcore
     public final void synpred194_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5500:6: ( ( ruleTypeLiteralCS ) )
-        // InternalOCLinEcore.g:5500:6: ( ruleTypeLiteralCS )
+        // InternalOCLinEcore.g:5502:6: ( ( ruleTypeLiteralCS ) )
+        // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
         {
-        // InternalOCLinEcore.g:5500:6: ( ruleTypeLiteralCS )
-        // InternalOCLinEcore.g:5501:1: ruleTypeLiteralCS
+        // InternalOCLinEcore.g:5502:6: ( ruleTypeLiteralCS )
+        // InternalOCLinEcore.g:5503:1: ruleTypeLiteralCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -87398,17 +87398,17 @@
 
     // $ANTLR start synpred195_InternalOCLinEcore
     public final void synpred195_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5522:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
-        // InternalOCLinEcore.g:5522:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalOCLinEcore.g:5524:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
+        // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
         {
-        // InternalOCLinEcore.g:5522:1: ( ( rule__ExpCS__Group_0__0 ) )
-        // InternalOCLinEcore.g:5523:1: ( rule__ExpCS__Group_0__0 )
+        // InternalOCLinEcore.g:5524:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalOCLinEcore.g:5525:1: ( rule__ExpCS__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getExpCSAccess().getGroup_0());
         }
-        // InternalOCLinEcore.g:5524:1: ( rule__ExpCS__Group_0__0 )
-        // InternalOCLinEcore.g:5524:2: rule__ExpCS__Group_0__0
+        // InternalOCLinEcore.g:5526:1: ( rule__ExpCS__Group_0__0 )
+        // InternalOCLinEcore.g:5526:2: rule__ExpCS__Group_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__ExpCS__Group_0__0();
@@ -87428,11 +87428,11 @@
 
     // $ANTLR start synpred202_InternalOCLinEcore
     public final void synpred202_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5612:6: ( ( ruleTupleLiteralExpCS ) )
-        // InternalOCLinEcore.g:5612:6: ( ruleTupleLiteralExpCS )
+        // InternalOCLinEcore.g:5614:6: ( ( ruleTupleLiteralExpCS ) )
+        // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
         {
-        // InternalOCLinEcore.g:5612:6: ( ruleTupleLiteralExpCS )
-        // InternalOCLinEcore.g:5613:1: ruleTupleLiteralExpCS
+        // InternalOCLinEcore.g:5614:6: ( ruleTupleLiteralExpCS )
+        // InternalOCLinEcore.g:5615:1: ruleTupleLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -87452,11 +87452,11 @@
 
     // $ANTLR start synpred203_InternalOCLinEcore
     public final void synpred203_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5618:6: ( ( ruleMapLiteralExpCS ) )
-        // InternalOCLinEcore.g:5618:6: ( ruleMapLiteralExpCS )
+        // InternalOCLinEcore.g:5620:6: ( ( ruleMapLiteralExpCS ) )
+        // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
         {
-        // InternalOCLinEcore.g:5618:6: ( ruleMapLiteralExpCS )
-        // InternalOCLinEcore.g:5619:1: ruleMapLiteralExpCS
+        // InternalOCLinEcore.g:5620:6: ( ruleMapLiteralExpCS )
+        // InternalOCLinEcore.g:5621:1: ruleMapLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -87476,11 +87476,11 @@
 
     // $ANTLR start synpred204_InternalOCLinEcore
     public final void synpred204_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5624:6: ( ( ruleCollectionLiteralExpCS ) )
-        // InternalOCLinEcore.g:5624:6: ( ruleCollectionLiteralExpCS )
+        // InternalOCLinEcore.g:5626:6: ( ( ruleCollectionLiteralExpCS ) )
+        // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
         {
-        // InternalOCLinEcore.g:5624:6: ( ruleCollectionLiteralExpCS )
-        // InternalOCLinEcore.g:5625:1: ruleCollectionLiteralExpCS
+        // InternalOCLinEcore.g:5626:6: ( ruleCollectionLiteralExpCS )
+        // InternalOCLinEcore.g:5627:1: ruleCollectionLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -87500,11 +87500,11 @@
 
     // $ANTLR start synpred206_InternalOCLinEcore
     public final void synpred206_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5636:6: ( ( ruleTypeLiteralExpCS ) )
-        // InternalOCLinEcore.g:5636:6: ( ruleTypeLiteralExpCS )
+        // InternalOCLinEcore.g:5638:6: ( ( ruleTypeLiteralExpCS ) )
+        // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
         {
-        // InternalOCLinEcore.g:5636:6: ( ruleTypeLiteralExpCS )
-        // InternalOCLinEcore.g:5637:1: ruleTypeLiteralExpCS
+        // InternalOCLinEcore.g:5638:6: ( ruleTypeLiteralExpCS )
+        // InternalOCLinEcore.g:5639:1: ruleTypeLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -87524,17 +87524,17 @@
 
     // $ANTLR start synpred210_InternalOCLinEcore
     public final void synpred210_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5708:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
-        // InternalOCLinEcore.g:5708:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalOCLinEcore.g:5710:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
+        // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
         {
-        // InternalOCLinEcore.g:5708:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-        // InternalOCLinEcore.g:5709:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalOCLinEcore.g:5710:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalOCLinEcore.g:5711:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
         }
-        // InternalOCLinEcore.g:5710:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-        // InternalOCLinEcore.g:5710:2: rule__NavigatingArgCS__Group_0_1_0__0
+        // InternalOCLinEcore.g:5712:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalOCLinEcore.g:5712:2: rule__NavigatingArgCS__Group_0_1_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_0__0();
@@ -87554,17 +87554,17 @@
 
     // $ANTLR start synpred211_InternalOCLinEcore
     public final void synpred211_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5714:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
-        // InternalOCLinEcore.g:5714:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalOCLinEcore.g:5716:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
+        // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
         {
-        // InternalOCLinEcore.g:5714:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-        // InternalOCLinEcore.g:5715:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalOCLinEcore.g:5716:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalOCLinEcore.g:5717:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
         }
-        // InternalOCLinEcore.g:5716:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-        // InternalOCLinEcore.g:5716:2: rule__NavigatingArgCS__Group_0_1_1__0
+        // InternalOCLinEcore.g:5718:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalOCLinEcore.g:5718:2: rule__NavigatingArgCS__Group_0_1_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_1__0();
@@ -87584,17 +87584,17 @@
 
     // $ANTLR start synpred212_InternalOCLinEcore
     public final void synpred212_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5736:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
-        // InternalOCLinEcore.g:5736:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalOCLinEcore.g:5738:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
+        // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
         {
-        // InternalOCLinEcore.g:5736:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-        // InternalOCLinEcore.g:5737:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalOCLinEcore.g:5738:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalOCLinEcore.g:5739:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
         }
-        // InternalOCLinEcore.g:5738:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-        // InternalOCLinEcore.g:5738:2: rule__NavigatingCommaArgCS__Group_2_0__0
+        // InternalOCLinEcore.g:5740:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalOCLinEcore.g:5740:2: rule__NavigatingCommaArgCS__Group_2_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -87614,17 +87614,17 @@
 
     // $ANTLR start synpred213_InternalOCLinEcore
     public final void synpred213_InternalOCLinEcore_fragment() throws RecognitionException {
-        // InternalOCLinEcore.g:5742:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
-        // InternalOCLinEcore.g:5742:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalOCLinEcore.g:5744:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
+        // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
         {
-        // InternalOCLinEcore.g:5742:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-        // InternalOCLinEcore.g:5743:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalOCLinEcore.g:5744:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalOCLinEcore.g:5745:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
         }
-        // InternalOCLinEcore.g:5744:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-        // InternalOCLinEcore.g:5744:2: rule__NavigatingCommaArgCS__Group_2_1__0
+        // InternalOCLinEcore.g:5746:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalOCLinEcore.g:5746:2: rule__NavigatingCommaArgCS__Group_2_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -87842,7 +87842,7 @@
             this.transition = dfa_6;
         }
         public String getDescription() {
-            return "4113:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );";
+            return "4115:1: rule__ModelElementCS__Alternatives : ( ( ruleClassCS ) | ( ruleEnumerationLiteralCS ) | ( ruleOperationCS ) | ( rulePackageCS ) | ( ruleStructuralFeatureCS ) );";
         }
     }
     static final String dfa_7s = "\57\uffff";
@@ -87923,7 +87923,7 @@
             this.transition = dfa_13;
         }
         public String getDescription() {
-            return "5321:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );";
+            return "5323:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );";
         }
     }
     static final String[] dfa_14s = {
@@ -87991,7 +87991,7 @@
             this.transition = dfa_14;
         }
         public String getDescription() {
-            return "5365:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
+            return "5367:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
         }
     }
     static final String dfa_15s = "\75\uffff";
@@ -88084,7 +88084,7 @@
             this.transition = dfa_20;
         }
         public String getDescription() {
-            return "5489:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
+            return "5491:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -88277,7 +88277,7 @@
             this.transition = dfa_26;
         }
         public String getDescription() {
-            return "5517:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
+            return "5519:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -88439,7 +88439,7 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "5583:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
+            return "5585:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -88623,7 +88623,7 @@
             this.transition = dfa_33;
         }
         public String getDescription() {
-            return "5759:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
+            return "5761:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
         }
     }
     static final String dfa_34s = "\1\5\54\64\2\uffff";
@@ -88697,7 +88697,7 @@
             this.transition = dfa_37;
         }
         public String getDescription() {
-            return "10502:1: ( rule__ImportCS__Group_1__0 )?";
+            return "10504:1: ( rule__ImportCS__Group_1__0 )?";
         }
     }
 
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcore.xtextbin b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcore.xtextbin
index 0108388..a92140a 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcore.xtextbin
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcore.xtextbin
Binary files differ
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcoreGrammarResource.java b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcoreGrammarResource.java
index 659e16b..2a2e0bd 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcoreGrammarResource.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/OCLinEcoreGrammarResource.java
@@ -1558,6 +1558,7 @@
 		private static final @NonNull ParserRule PR_UPPER = createParserRule("UPPER", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.EINT));
 		private static final @NonNull ParserRule PR_URI = createParserRule("URI", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_UnreservedName = createParserRule("UnreservedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
+		private static final @NonNull ParserRule PR_UnreservedPathNameCS = createParserRule("UnreservedPathNameCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.PATH_NAME_CS));
 		private static final @NonNull ParserRule PR_UnrestrictedName = createParserRule("UnrestrictedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_WildcardTypeRefCS = createParserRule("WildcardTypeRefCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.WILDCARD_TYPE_REF_CS));
 
@@ -1654,6 +1655,12 @@
 				createRuleCall(TR_SINGLE_QUOTED_STRING));
 			PR_UnreservedName.setAlternatives(
 				createRuleCall(_OCLinEcore.PR_UnrestrictedName));
+			PR_UnreservedPathNameCS.setAlternatives(
+				createGroup(
+					createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS)),
+					setCardinality("*", createGroup(
+						createKeyword("::"),
+						createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS))))));
 			PR_UnrestrictedName.setAlternatives(
 				createRuleCall(PR_Identifier));
 			PR_WildcardTypeRefCS.setAlternatives(
@@ -1682,6 +1689,7 @@
 				rules.add(PR_MultiplicityCS);
 				rules.add(PR_MultiplicityStringCS);
 				rules.add(PR_PathNameCS);
+				rules.add(PR_UnreservedPathNameCS);
 				rules.add(PR_FirstPathElementCS);
 				rules.add(PR_NextPathElementCS);
 				rules.add(PR_TemplateBindingCS);
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcore.g b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcore.g
index 818aee4..589ab5b 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcore.g
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcore.g
@@ -9839,6 +9839,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS returns [EObject current=null]
 	:
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreLexer.java b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreLexer.java
index c4fee71..d2c7aab 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreLexer.java
@@ -2828,8 +2828,8 @@
         try {
             int _type = RULE_UNQUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10438:22: ( '\\u00A3$%^\\u00A3$%^' )
-            // InternalOCLinEcore.g:10438:24: '\\u00A3$%^\\u00A3$%^'
+            // InternalOCLinEcore.g:10440:22: ( '\\u00A3$%^\\u00A3$%^' )
+            // InternalOCLinEcore.g:10440:24: '\\u00A3$%^\\u00A3$%^'
             {
             match("\u00A3$%^\u00A3$%^");
 
@@ -2847,8 +2847,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:10440:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalOCLinEcore.g:10440:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalOCLinEcore.g:10442:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalOCLinEcore.g:10442:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -2872,8 +2872,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLinEcore.g:10442:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalOCLinEcore.g:10442:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalOCLinEcore.g:10444:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalOCLinEcore.g:10444:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2898,11 +2898,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10444:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalOCLinEcore.g:10444:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalOCLinEcore.g:10446:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalOCLinEcore.g:10446:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalOCLinEcore.g:10444:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalOCLinEcore.g:10446:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -2918,14 +2918,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10444:34: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLinEcore.g:10446:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLinEcore.g:10444:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalOCLinEcore.g:10446:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2962,11 +2962,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10446:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalOCLinEcore.g:10446:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalOCLinEcore.g:10448:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalOCLinEcore.g:10448:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalOCLinEcore.g:10446:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalOCLinEcore.g:10448:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -2982,14 +2982,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10446:35: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLinEcore.g:10448:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLinEcore.g:10446:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalOCLinEcore.g:10448:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3026,12 +3026,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10448:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalOCLinEcore.g:10448:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalOCLinEcore.g:10450:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalOCLinEcore.g:10450:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalOCLinEcore.g:10448:38: ( options {greedy=false; } : . )*
+            // InternalOCLinEcore.g:10450:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -3056,7 +3056,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10448:66: .
+            	    // InternalOCLinEcore.g:10450:66: .
             	    {
             	    matchAny();
 
@@ -3086,11 +3086,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10450:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalOCLinEcore.g:10450:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLinEcore.g:10452:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalOCLinEcore.g:10452:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalOCLinEcore.g:10450:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLinEcore.g:10452:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -3139,8 +3139,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10452:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:10452:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:10454:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:10454:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -3160,10 +3160,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10454:10: ( ( '0' .. '9' )+ )
-            // InternalOCLinEcore.g:10454:12: ( '0' .. '9' )+
+            // InternalOCLinEcore.g:10456:10: ( ( '0' .. '9' )+ )
+            // InternalOCLinEcore.g:10456:12: ( '0' .. '9' )+
             {
-            // InternalOCLinEcore.g:10454:12: ( '0' .. '9' )+
+            // InternalOCLinEcore.g:10456:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -3177,7 +3177,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10454:13: '0' .. '9'
+            	    // InternalOCLinEcore.g:10456:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -3209,12 +3209,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10456:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalOCLinEcore.g:10456:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalOCLinEcore.g:10458:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalOCLinEcore.g:10458:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalOCLinEcore.g:10456:24: ( options {greedy=false; } : . )*
+            // InternalOCLinEcore.g:10458:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -3239,7 +3239,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10456:52: .
+            	    // InternalOCLinEcore.g:10458:52: .
             	    {
             	    matchAny();
 
@@ -3269,12 +3269,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10458:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalOCLinEcore.g:10458:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalOCLinEcore.g:10460:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalOCLinEcore.g:10460:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalOCLinEcore.g:10458:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalOCLinEcore.g:10460:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -3287,7 +3287,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalOCLinEcore.g:10458:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalOCLinEcore.g:10460:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3307,7 +3307,7 @@
                 }
             } while (true);
 
-            // InternalOCLinEcore.g:10458:40: ( ( '\\r' )? '\\n' )?
+            // InternalOCLinEcore.g:10460:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -3316,9 +3316,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalOCLinEcore.g:10458:41: ( '\\r' )? '\\n'
+                    // InternalOCLinEcore.g:10460:41: ( '\\r' )? '\\n'
                     {
-                    // InternalOCLinEcore.g:10458:41: ( '\\r' )?
+                    // InternalOCLinEcore.g:10460:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -3327,7 +3327,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalOCLinEcore.g:10458:41: '\\r'
+                            // InternalOCLinEcore.g:10460:41: '\\r'
                             {
                             match('\r');
 
@@ -3359,10 +3359,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10460:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalOCLinEcore.g:10460:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLinEcore.g:10462:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalOCLinEcore.g:10462:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalOCLinEcore.g:10460:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLinEcore.g:10462:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -3416,8 +3416,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLinEcore.g:10462:16: ( . )
-            // InternalOCLinEcore.g:10462:18: .
+            // InternalOCLinEcore.g:10464:16: ( . )
+            // InternalOCLinEcore.g:10464:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreParser.java b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreParser.java
index 64b6b6a..65b39e9 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreParser.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/parser/antlr/internal/InternalOCLinEcoreParser.java
@@ -28500,7 +28500,7 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalOCLinEcore.g:9843:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
+    // InternalOCLinEcore.g:9845:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
     public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -28508,8 +28508,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:9844:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
-            // InternalOCLinEcore.g:9845:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
+            // InternalOCLinEcore.g:9846:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
+            // InternalOCLinEcore.g:9847:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFirstPathElementCSRule());
@@ -28540,21 +28540,21 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalOCLinEcore.g:9852:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLinEcore.g:9854:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
     public final EObject ruleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:9855:28: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLinEcore.g:9856:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:9857:28: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLinEcore.g:9858:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLinEcore.g:9856:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:9857:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:9858:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:9859:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:9857:1: ( ruleUnrestrictedName )
-            // InternalOCLinEcore.g:9858:3: ruleUnrestrictedName
+            // InternalOCLinEcore.g:9859:1: ( ruleUnrestrictedName )
+            // InternalOCLinEcore.g:9860:3: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -28609,7 +28609,7 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalOCLinEcore.g:9882:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
+    // InternalOCLinEcore.g:9884:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
     public final EObject entryRuleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -28617,8 +28617,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:9883:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
-            // InternalOCLinEcore.g:9884:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
+            // InternalOCLinEcore.g:9885:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
+            // InternalOCLinEcore.g:9886:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNextPathElementCSRule());
@@ -28649,21 +28649,21 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalOCLinEcore.g:9891:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
+    // InternalOCLinEcore.g:9893:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
     public final EObject ruleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:9894:28: ( ( ( ruleUnreservedName ) ) )
-            // InternalOCLinEcore.g:9895:1: ( ( ruleUnreservedName ) )
+            // InternalOCLinEcore.g:9896:28: ( ( ( ruleUnreservedName ) ) )
+            // InternalOCLinEcore.g:9897:1: ( ( ruleUnreservedName ) )
             {
-            // InternalOCLinEcore.g:9895:1: ( ( ruleUnreservedName ) )
-            // InternalOCLinEcore.g:9896:1: ( ruleUnreservedName )
+            // InternalOCLinEcore.g:9897:1: ( ( ruleUnreservedName ) )
+            // InternalOCLinEcore.g:9898:1: ( ruleUnreservedName )
             {
-            // InternalOCLinEcore.g:9896:1: ( ruleUnreservedName )
-            // InternalOCLinEcore.g:9897:3: ruleUnreservedName
+            // InternalOCLinEcore.g:9898:1: ( ruleUnreservedName )
+            // InternalOCLinEcore.g:9899:3: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
 
@@ -28718,7 +28718,7 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalOCLinEcore.g:9921:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
+    // InternalOCLinEcore.g:9923:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
     public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -28726,8 +28726,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:9922:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
-            // InternalOCLinEcore.g:9923:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
+            // InternalOCLinEcore.g:9924:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
+            // InternalOCLinEcore.g:9925:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateBindingCSRule());
@@ -28758,7 +28758,7 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalOCLinEcore.g:9930:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
+    // InternalOCLinEcore.g:9932:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
     public final EObject ruleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -28773,17 +28773,17 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:9933:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
-            // InternalOCLinEcore.g:9934:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalOCLinEcore.g:9935:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
+            // InternalOCLinEcore.g:9936:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
             {
-            // InternalOCLinEcore.g:9934:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
-            // InternalOCLinEcore.g:9934:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalOCLinEcore.g:9936:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalOCLinEcore.g:9936:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             {
-            // InternalOCLinEcore.g:9934:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
-            // InternalOCLinEcore.g:9935:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalOCLinEcore.g:9936:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
+            // InternalOCLinEcore.g:9937:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
             {
-            // InternalOCLinEcore.g:9935:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
-            // InternalOCLinEcore.g:9936:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
+            // InternalOCLinEcore.g:9937:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalOCLinEcore.g:9938:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
 
@@ -28814,7 +28814,7 @@
 
             }
 
-            // InternalOCLinEcore.g:9952:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
+            // InternalOCLinEcore.g:9954:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
             loop217:
             do {
                 int alt217=2;
@@ -28827,7 +28827,7 @@
 
                 switch (alt217) {
             	case 1 :
-            	    // InternalOCLinEcore.g:9952:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalOCLinEcore.g:9954:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
             	    {
             	    otherlv_1=(Token)match(input,59,FollowSets000.FOLLOW_88); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -28835,11 +28835,11 @@
             	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
 
             	    }
-            	    // InternalOCLinEcore.g:9956:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
-            	    // InternalOCLinEcore.g:9957:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalOCLinEcore.g:9958:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalOCLinEcore.g:9959:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
             	    {
-            	    // InternalOCLinEcore.g:9957:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
-            	    // InternalOCLinEcore.g:9958:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
+            	    // InternalOCLinEcore.g:9959:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalOCLinEcore.g:9960:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -28879,7 +28879,7 @@
                 }
             } while (true);
 
-            // InternalOCLinEcore.g:9974:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalOCLinEcore.g:9976:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             int alt218=2;
             int LA218_0 = input.LA(1);
 
@@ -28888,10 +28888,10 @@
             }
             switch (alt218) {
                 case 1 :
-                    // InternalOCLinEcore.g:9975:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalOCLinEcore.g:9977:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                     {
-                    // InternalOCLinEcore.g:9975:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
-                    // InternalOCLinEcore.g:9976:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
+                    // InternalOCLinEcore.g:9977:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalOCLinEcore.g:9978:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -28948,7 +28948,7 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalOCLinEcore.g:10000:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalOCLinEcore.g:10002:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
     public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -28956,8 +28956,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10001:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
-            // InternalOCLinEcore.g:10002:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
+            // InternalOCLinEcore.g:10003:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
+            // InternalOCLinEcore.g:10004:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -28988,7 +28988,7 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalOCLinEcore.g:10009:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
+    // InternalOCLinEcore.g:10011:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
     public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -28998,14 +28998,14 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10012:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
-            // InternalOCLinEcore.g:10013:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalOCLinEcore.g:10014:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
+            // InternalOCLinEcore.g:10015:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
             {
-            // InternalOCLinEcore.g:10013:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
-            // InternalOCLinEcore.g:10014:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalOCLinEcore.g:10015:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalOCLinEcore.g:10016:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
             {
-            // InternalOCLinEcore.g:10014:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
-            // InternalOCLinEcore.g:10015:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
+            // InternalOCLinEcore.g:10016:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalOCLinEcore.g:10017:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -29056,7 +29056,7 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalOCLinEcore.g:10039:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
+    // InternalOCLinEcore.g:10041:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
     public final EObject entryRuleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -29064,8 +29064,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10040:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
-            // InternalOCLinEcore.g:10041:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
+            // InternalOCLinEcore.g:10042:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
+            // InternalOCLinEcore.g:10043:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeParameterCSRule());
@@ -29096,7 +29096,7 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalOCLinEcore.g:10048:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
+    // InternalOCLinEcore.g:10050:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
     public final EObject ruleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -29112,17 +29112,17 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10051:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
-            // InternalOCLinEcore.g:10052:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalOCLinEcore.g:10053:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
+            // InternalOCLinEcore.g:10054:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
             {
-            // InternalOCLinEcore.g:10052:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
-            // InternalOCLinEcore.g:10052:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalOCLinEcore.g:10054:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalOCLinEcore.g:10054:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             {
-            // InternalOCLinEcore.g:10052:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
-            // InternalOCLinEcore.g:10053:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalOCLinEcore.g:10054:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
+            // InternalOCLinEcore.g:10055:1: (lv_name_0_0= ruleUnrestrictedName )
             {
-            // InternalOCLinEcore.g:10053:1: (lv_name_0_0= ruleUnrestrictedName )
-            // InternalOCLinEcore.g:10054:3: lv_name_0_0= ruleUnrestrictedName
+            // InternalOCLinEcore.g:10055:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalOCLinEcore.g:10056:3: lv_name_0_0= ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -29153,7 +29153,7 @@
 
             }
 
-            // InternalOCLinEcore.g:10070:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalOCLinEcore.g:10072:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             int alt220=2;
             int LA220_0 = input.LA(1);
 
@@ -29162,7 +29162,7 @@
             }
             switch (alt220) {
                 case 1 :
-                    // InternalOCLinEcore.g:10070:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalOCLinEcore.g:10072:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     {
                     otherlv_1=(Token)match(input,30,FollowSets000.FOLLOW_29); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -29170,11 +29170,11 @@
                           	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
 
                     }
-                    // InternalOCLinEcore.g:10074:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
-                    // InternalOCLinEcore.g:10075:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalOCLinEcore.g:10076:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
+                    // InternalOCLinEcore.g:10077:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                     {
-                    // InternalOCLinEcore.g:10075:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
-                    // InternalOCLinEcore.g:10076:3: lv_ownedExtends_2_0= ruleTypedRefCS
+                    // InternalOCLinEcore.g:10077:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalOCLinEcore.g:10078:3: lv_ownedExtends_2_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -29205,7 +29205,7 @@
 
                     }
 
-                    // InternalOCLinEcore.g:10092:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalOCLinEcore.g:10094:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     loop219:
                     do {
                         int alt219=2;
@@ -29218,7 +29218,7 @@
 
                         switch (alt219) {
                     	case 1 :
-                    	    // InternalOCLinEcore.g:10092:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalOCLinEcore.g:10094:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                     	    {
                     	    otherlv_3=(Token)match(input,143,FollowSets000.FOLLOW_29); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -29226,11 +29226,11 @@
                     	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
 
                     	    }
-                    	    // InternalOCLinEcore.g:10096:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
-                    	    // InternalOCLinEcore.g:10097:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalOCLinEcore.g:10098:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalOCLinEcore.g:10099:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                     	    {
-                    	    // InternalOCLinEcore.g:10097:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
-                    	    // InternalOCLinEcore.g:10098:3: lv_ownedExtends_4_0= ruleTypedRefCS
+                    	    // InternalOCLinEcore.g:10099:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalOCLinEcore.g:10100:3: lv_ownedExtends_4_0= ruleTypedRefCS
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -29299,7 +29299,7 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalOCLinEcore.g:10122:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
+    // InternalOCLinEcore.g:10124:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
     public final EObject entryRuleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -29307,8 +29307,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10123:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
-            // InternalOCLinEcore.g:10124:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
+            // InternalOCLinEcore.g:10125:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
+            // InternalOCLinEcore.g:10126:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeRefCSRule());
@@ -29339,7 +29339,7 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalOCLinEcore.g:10131:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
+    // InternalOCLinEcore.g:10133:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
     public final EObject ruleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -29351,10 +29351,10 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10134:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
-            // InternalOCLinEcore.g:10135:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalOCLinEcore.g:10136:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
+            // InternalOCLinEcore.g:10137:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             {
-            // InternalOCLinEcore.g:10135:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalOCLinEcore.g:10137:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             int alt221=2;
             int LA221_0 = input.LA(1);
 
@@ -29373,7 +29373,7 @@
             }
             switch (alt221) {
                 case 1 :
-                    // InternalOCLinEcore.g:10136:2: this_TypedRefCS_0= ruleTypedRefCS
+                    // InternalOCLinEcore.g:10138:2: this_TypedRefCS_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -29400,7 +29400,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:10149:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
+                    // InternalOCLinEcore.g:10151:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -29449,7 +29449,7 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalOCLinEcore.g:10168:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
+    // InternalOCLinEcore.g:10170:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
     public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -29457,8 +29457,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10169:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
-            // InternalOCLinEcore.g:10170:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
+            // InternalOCLinEcore.g:10171:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
+            // InternalOCLinEcore.g:10172:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
@@ -29489,7 +29489,7 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalOCLinEcore.g:10177:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
+    // InternalOCLinEcore.g:10179:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
     public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -29501,14 +29501,14 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10180:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
-            // InternalOCLinEcore.g:10181:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalOCLinEcore.g:10182:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
+            // InternalOCLinEcore.g:10183:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
             {
-            // InternalOCLinEcore.g:10181:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
-            // InternalOCLinEcore.g:10181:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalOCLinEcore.g:10183:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalOCLinEcore.g:10183:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             {
-            // InternalOCLinEcore.g:10181:2: ()
-            // InternalOCLinEcore.g:10182:2:
+            // InternalOCLinEcore.g:10183:2: ()
+            // InternalOCLinEcore.g:10184:2:
             {
             if ( state.backtracking==0 ) {
 
@@ -29531,7 +29531,7 @@
                   	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
 
             }
-            // InternalOCLinEcore.g:10194:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalOCLinEcore.g:10196:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             int alt222=2;
             int LA222_0 = input.LA(1);
 
@@ -29540,7 +29540,7 @@
             }
             switch (alt222) {
                 case 1 :
-                    // InternalOCLinEcore.g:10194:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalOCLinEcore.g:10196:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                     {
                     otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_29); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -29548,11 +29548,11 @@
                           	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
 
                     }
-                    // InternalOCLinEcore.g:10198:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
-                    // InternalOCLinEcore.g:10199:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalOCLinEcore.g:10200:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalOCLinEcore.g:10201:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                     {
-                    // InternalOCLinEcore.g:10199:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
-                    // InternalOCLinEcore.g:10200:3: lv_ownedExtends_3_0= ruleTypedRefCS
+                    // InternalOCLinEcore.g:10201:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalOCLinEcore.g:10202:3: lv_ownedExtends_3_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -29612,7 +29612,7 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalOCLinEcore.g:10224:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
+    // InternalOCLinEcore.g:10226:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
     public final String entryRuleID() throws RecognitionException {
         String current = null;
 
@@ -29620,8 +29620,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10225:2: (iv_ruleID= ruleID EOF )
-            // InternalOCLinEcore.g:10226:2: iv_ruleID= ruleID EOF
+            // InternalOCLinEcore.g:10227:2: (iv_ruleID= ruleID EOF )
+            // InternalOCLinEcore.g:10228:2: iv_ruleID= ruleID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIDRule());
@@ -29652,7 +29652,7 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalOCLinEcore.g:10233:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
+    // InternalOCLinEcore.g:10235:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
     public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -29662,10 +29662,10 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10236:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
-            // InternalOCLinEcore.g:10237:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalOCLinEcore.g:10238:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
+            // InternalOCLinEcore.g:10239:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             {
-            // InternalOCLinEcore.g:10237:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalOCLinEcore.g:10239:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             int alt223=2;
             int LA223_0 = input.LA(1);
 
@@ -29684,7 +29684,7 @@
             }
             switch (alt223) {
                 case 1 :
-                    // InternalOCLinEcore.g:10237:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
+                    // InternalOCLinEcore.g:10239:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                     {
                     this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -29701,7 +29701,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:10245:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
+                    // InternalOCLinEcore.g:10247:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                     {
                     this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -29740,7 +29740,7 @@
 
 
     // $ANTLR start "entryRuleIdentifier"
-    // InternalOCLinEcore.g:10260:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
+    // InternalOCLinEcore.g:10262:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
     public final String entryRuleIdentifier() throws RecognitionException {
         String current = null;
 
@@ -29748,8 +29748,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10261:2: (iv_ruleIdentifier= ruleIdentifier EOF )
-            // InternalOCLinEcore.g:10262:2: iv_ruleIdentifier= ruleIdentifier EOF
+            // InternalOCLinEcore.g:10263:2: (iv_ruleIdentifier= ruleIdentifier EOF )
+            // InternalOCLinEcore.g:10264:2: iv_ruleIdentifier= ruleIdentifier EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIdentifierRule());
@@ -29780,7 +29780,7 @@
 
 
     // $ANTLR start "ruleIdentifier"
-    // InternalOCLinEcore.g:10269:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
+    // InternalOCLinEcore.g:10271:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
     public final AntlrDatatypeRuleToken ruleIdentifier() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -29790,8 +29790,8 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10272:28: (this_ID_0= ruleID )
-            // InternalOCLinEcore.g:10274:5: this_ID_0= ruleID
+            // InternalOCLinEcore.g:10274:28: (this_ID_0= ruleID )
+            // InternalOCLinEcore.g:10276:5: this_ID_0= ruleID
             {
             if ( state.backtracking==0 ) {
 
@@ -29833,7 +29833,7 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalOCLinEcore.g:10292:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
+    // InternalOCLinEcore.g:10294:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
     public final String entryRuleLOWER() throws RecognitionException {
         String current = null;
 
@@ -29841,8 +29841,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10293:2: (iv_ruleLOWER= ruleLOWER EOF )
-            // InternalOCLinEcore.g:10294:2: iv_ruleLOWER= ruleLOWER EOF
+            // InternalOCLinEcore.g:10295:2: (iv_ruleLOWER= ruleLOWER EOF )
+            // InternalOCLinEcore.g:10296:2: iv_ruleLOWER= ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLOWERRule());
@@ -29873,7 +29873,7 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalOCLinEcore.g:10301:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalOCLinEcore.g:10303:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -29882,8 +29882,8 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10304:28: (this_INT_0= RULE_INT )
-            // InternalOCLinEcore.g:10305:5: this_INT_0= RULE_INT
+            // InternalOCLinEcore.g:10306:28: (this_INT_0= RULE_INT )
+            // InternalOCLinEcore.g:10307:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -29916,7 +29916,7 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalOCLinEcore.g:10320:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
+    // InternalOCLinEcore.g:10322:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
     public final String entryRuleNUMBER_LITERAL() throws RecognitionException {
         String current = null;
 
@@ -29924,8 +29924,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10321:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
-            // InternalOCLinEcore.g:10322:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
+            // InternalOCLinEcore.g:10323:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
+            // InternalOCLinEcore.g:10324:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNUMBER_LITERALRule());
@@ -29956,7 +29956,7 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalOCLinEcore.g:10329:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalOCLinEcore.g:10331:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleNUMBER_LITERAL() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -29965,8 +29965,8 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10332:28: (this_INT_0= RULE_INT )
-            // InternalOCLinEcore.g:10333:5: this_INT_0= RULE_INT
+            // InternalOCLinEcore.g:10334:28: (this_INT_0= RULE_INT )
+            // InternalOCLinEcore.g:10335:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -29999,7 +29999,7 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalOCLinEcore.g:10348:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
+    // InternalOCLinEcore.g:10350:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
     public final String entryRuleStringLiteral() throws RecognitionException {
         String current = null;
 
@@ -30007,8 +30007,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10349:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
-            // InternalOCLinEcore.g:10350:2: iv_ruleStringLiteral= ruleStringLiteral EOF
+            // InternalOCLinEcore.g:10351:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
+            // InternalOCLinEcore.g:10352:2: iv_ruleStringLiteral= ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getStringLiteralRule());
@@ -30039,7 +30039,7 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalOCLinEcore.g:10357:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalOCLinEcore.g:10359:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleStringLiteral() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -30048,8 +30048,8 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10360:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:10361:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:10362:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:10363:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -30082,7 +30082,7 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalOCLinEcore.g:10376:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
+    // InternalOCLinEcore.g:10378:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
     public final String entryRuleUPPER() throws RecognitionException {
         String current = null;
 
@@ -30090,8 +30090,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10377:2: (iv_ruleUPPER= ruleUPPER EOF )
-            // InternalOCLinEcore.g:10378:2: iv_ruleUPPER= ruleUPPER EOF
+            // InternalOCLinEcore.g:10379:2: (iv_ruleUPPER= ruleUPPER EOF )
+            // InternalOCLinEcore.g:10380:2: iv_ruleUPPER= ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUPPERRule());
@@ -30122,7 +30122,7 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalOCLinEcore.g:10385:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
+    // InternalOCLinEcore.g:10387:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -30132,10 +30132,10 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10388:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
-            // InternalOCLinEcore.g:10389:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalOCLinEcore.g:10390:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
+            // InternalOCLinEcore.g:10391:1: (this_INT_0= RULE_INT | kw= '*' )
             {
-            // InternalOCLinEcore.g:10389:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalOCLinEcore.g:10391:1: (this_INT_0= RULE_INT | kw= '*' )
             int alt224=2;
             int LA224_0 = input.LA(1);
 
@@ -30154,7 +30154,7 @@
             }
             switch (alt224) {
                 case 1 :
-                    // InternalOCLinEcore.g:10389:6: this_INT_0= RULE_INT
+                    // InternalOCLinEcore.g:10391:6: this_INT_0= RULE_INT
                     {
                     this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -30171,7 +30171,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLinEcore.g:10398:2: kw= '*'
+                    // InternalOCLinEcore.g:10400:2: kw= '*'
                     {
                     kw=(Token)match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -30206,7 +30206,7 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalOCLinEcore.g:10411:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
+    // InternalOCLinEcore.g:10413:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
     public final String entryRuleURI() throws RecognitionException {
         String current = null;
 
@@ -30214,8 +30214,8 @@
 
 
         try {
-            // InternalOCLinEcore.g:10412:2: (iv_ruleURI= ruleURI EOF )
-            // InternalOCLinEcore.g:10413:2: iv_ruleURI= ruleURI EOF
+            // InternalOCLinEcore.g:10414:2: (iv_ruleURI= ruleURI EOF )
+            // InternalOCLinEcore.g:10415:2: iv_ruleURI= ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getURIRule());
@@ -30246,7 +30246,7 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalOCLinEcore.g:10420:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalOCLinEcore.g:10422:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleURI() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -30255,8 +30255,8 @@
          enterRule();
 
         try {
-            // InternalOCLinEcore.g:10423:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLinEcore.g:10424:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalOCLinEcore.g:10425:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLinEcore.g:10426:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/serializer/AbstractOCLinEcoreSemanticSequencer.java b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/serializer/AbstractOCLinEcoreSemanticSequencer.java
index 25a8333..cff6260 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/serializer/AbstractOCLinEcoreSemanticSequencer.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/serializer/AbstractOCLinEcoreSemanticSequencer.java
@@ -197,6 +197,10 @@
 					sequence_URIPathNameCS(context, (PathNameCS) semanticObject);
 					return;
 				}
+				else if (rule == grammarAccess.getUnreservedPathNameCSRule()) {
+					sequence_UnreservedPathNameCS(context, (PathNameCS) semanticObject);
+					return;
+				}
 				else break;
 			case BaseCSPackage.PRIMITIVE_TYPE_REF_CS:
 				if (rule == grammarAccess.getTypedRefCSRule()
@@ -743,18 +747,18 @@
 	 *         (ownedParameters+=ParameterCS ownedParameters+=ParameterCS*)?
 	 *         ownedType=TypedMultiplicityRefCS?
 	 *         (ownedExceptions+=TypedRefCS ownedExceptions+=TypedRefCS*)?
-	 *         qualifiers+='!transient'?
+	 *         qualifiers+='transient'?
 	 *         (
 	 *             (
 	 *                 qualifiers+='derived' |
 	 *                 qualifiers+='!derived' |
 	 *                 qualifiers+='ordered' |
 	 *                 qualifiers+='!ordered' |
-	 *                 qualifiers+='transient' |
+	 *                 qualifiers+='!transient' |
 	 *                 qualifiers+='unique' |
 	 *                 qualifiers+='!unique'
 	 *             )?
-	 *             qualifiers+='!transient'?
+	 *             qualifiers+='transient'?
 	 *         )*
 	 *         (
 	 *             ownedAnnotations+=AnnotationElementCS |
@@ -853,14 +857,13 @@
 	 *         referredOpposite=[Property|UnrestrictedName]?
 	 *         ownedType=TypedMultiplicityRefCS?
 	 *         default=SINGLE_QUOTED_STRING?
-	 *         qualifiers+='unsettable'?
+	 *         qualifiers+='ordered'?
 	 *         (
 	 *             (
 	 *                 qualifiers+='composes' |
 	 *                 qualifiers+='!composes' |
 	 *                 qualifiers+='derived' |
 	 *                 qualifiers+='!derived' |
-	 *                 qualifiers+='ordered' |
 	 *                 qualifiers+='!ordered' |
 	 *                 qualifiers+='readonly' |
 	 *                 qualifiers+='!readonly' |
@@ -870,11 +873,12 @@
 	 *                 qualifiers+='!transient' |
 	 *                 qualifiers+='unique' |
 	 *                 qualifiers+='!unique' |
+	 *                 qualifiers+='unsettable' |
 	 *                 qualifiers+='!unsettable' |
 	 *                 qualifiers+='volatile' |
 	 *                 qualifiers+='!volatile'
 	 *             )?
-	 *             qualifiers+='unsettable'?
+	 *             qualifiers+='ordered'?
 	 *         )*
 	 *         (
 	 *             (
diff --git a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/services/OCLinEcoreGrammarAccess.java b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/services/OCLinEcoreGrammarAccess.java
index 54a4898..be425ba 100644
--- a/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/services/OCLinEcoreGrammarAccess.java
+++ b/plugins/org.eclipse.ocl.xtext.oclinecore/src-gen/org/eclipse/ocl/xtext/oclinecore/services/OCLinEcoreGrammarAccess.java
@@ -1533,8 +1533,8 @@
 		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
 
 		//EnumerationLiteralCS base::EnumerationLiteralCS:
-		//	('literal' name=UnrestrictedName | name=EnumerationLiteralName) (':' literal=SINGLE_QUOTED_STRING)? ('=' value=SIGNED)
-		//	? ('{' ownedAnnotations+=AnnotationElementCS* '}' | ';');
+		//	('literal' name=UnrestrictedName | name=EnumerationLiteralName) (':' literal=SINGLE_QUOTED_STRING)? ('=' value=SIGNED
+		//	)? ('{' ownedAnnotations+=AnnotationElementCS* '}' | ';');
 		@Override public ParserRule getRule() { return rule; }
 
 		//('literal' name=UnrestrictedName | name=EnumerationLiteralName) (':' literal=SINGLE_QUOTED_STRING)? ('=' value=SIGNED)? (
@@ -3805,8 +3805,8 @@
 	}
 
 	//EnumerationLiteralCS base::EnumerationLiteralCS:
-	//	('literal' name=UnrestrictedName | name=EnumerationLiteralName) (':' literal=SINGLE_QUOTED_STRING)? ('=' value=SIGNED)
-	//	? ('{' ownedAnnotations+=AnnotationElementCS* '}' | ';');
+	//	('literal' name=UnrestrictedName | name=EnumerationLiteralName) (':' literal=SINGLE_QUOTED_STRING)? ('=' value=SIGNED
+	//	)? ('{' ownedAnnotations+=AnnotationElementCS* '}' | ';');
 	public EnumerationLiteralCSElements getEnumerationLiteralCSAccess() {
 		return pEnumerationLiteralCS;
 	}
@@ -4268,8 +4268,8 @@
 	}
 
 	//CollectionTypeCS:
-	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS?
-	//	')')?;
+	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS
+	//	? ')')?;
 	public EssentialOCLGrammarAccess.CollectionTypeCSElements getCollectionTypeCSAccess() {
 		return gaEssentialOCL.getCollectionTypeCSAccess();
 	}
@@ -4858,6 +4858,16 @@
 		return getPathNameCSAccess().getRule();
 	}
 
+	//UnreservedPathNameCS PathNameCS:
+	//	ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*;
+	public BaseGrammarAccess.UnreservedPathNameCSElements getUnreservedPathNameCSAccess() {
+		return gaBase.getUnreservedPathNameCSAccess();
+	}
+
+	public ParserRule getUnreservedPathNameCSRule() {
+		return getUnreservedPathNameCSAccess().getRule();
+	}
+
 	//FirstPathElementCS PathElementCS:
 	//	referredElement=[pivot::NamedElement|super::UnrestrictedName];
 	public BaseGrammarAccess.FirstPathElementCSElements getFirstPathElementCSAccess() {
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/OCLstdlibParser.java b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/OCLstdlibParser.java
index 69cb5f2..4a4ac53 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/OCLstdlibParser.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/OCLstdlibParser.java
@@ -257,6 +257,8 @@
 					put(grammarAccess.getMultiplicityCSAccess().getGroup(), "rule__MultiplicityCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup(), "rule__PathNameCS__Group__0");
 					put(grammarAccess.getPathNameCSAccess().getGroup_1(), "rule__PathNameCS__Group_1__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup(), "rule__UnreservedPathNameCS__Group__0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getGroup_1(), "rule__UnreservedPathNameCS__Group_1__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup(), "rule__TemplateBindingCS__Group__0");
 					put(grammarAccess.getTemplateBindingCSAccess().getGroup_1(), "rule__TemplateBindingCS__Group_1__0");
 					put(grammarAccess.getTemplateSignatureCSAccess().getGroup(), "rule__TemplateSignatureCS__Group__0");
@@ -503,6 +505,8 @@
 					put(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAssignment(), "rule__MultiplicityStringCS__StringBoundsAssignment");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__PathNameCS__OwnedPathElementsAssignment_0");
 					put(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__PathNameCS__OwnedPathElementsAssignment_1_1");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_0(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_0");
+					put(grammarAccess.getUnreservedPathNameCSAccess().getOwnedPathElementsAssignment_1_1(), "rule__UnreservedPathNameCS__OwnedPathElementsAssignment_1_1");
 					put(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment(), "rule__FirstPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment(), "rule__NextPathElementCS__ReferredElementAssignment");
 					put(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0(), "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0");
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlib.g b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlib.g
index f52271c..9245a96 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlib.g
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlib.g
@@ -2959,6 +2959,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS
 :
@@ -20888,6 +20890,8 @@
 
 
 
+
+
 rule__TemplateBindingCS__Group__0
     @init {
 		int stackSize = keepStackSize();
@@ -25369,6 +25373,8 @@
 	restoreStackSize(stackSize);
 }
 
+
+
 rule__FirstPathElementCS__ReferredElementAssignment
     @init {
 		int stackSize = keepStackSize();
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibLexer.java b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibLexer.java
index 752df70..94b4af6 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibLexer.java
@@ -2188,8 +2188,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:25561:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalOCLstdlib.g:25561:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalOCLstdlib.g:25567:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalOCLstdlib.g:25567:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -2213,8 +2213,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:25563:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalOCLstdlib.g:25563:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalOCLstdlib.g:25569:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalOCLstdlib.g:25569:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2239,11 +2239,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25565:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalOCLstdlib.g:25565:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalOCLstdlib.g:25571:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalOCLstdlib.g:25571:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalOCLstdlib.g:25565:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalOCLstdlib.g:25571:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -2259,14 +2259,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalOCLstdlib.g:25565:34: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLstdlib.g:25571:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLstdlib.g:25565:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalOCLstdlib.g:25571:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2303,11 +2303,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25567:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalOCLstdlib.g:25567:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalOCLstdlib.g:25573:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalOCLstdlib.g:25573:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalOCLstdlib.g:25567:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalOCLstdlib.g:25573:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -2323,14 +2323,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalOCLstdlib.g:25567:35: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLstdlib.g:25573:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLstdlib.g:25567:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalOCLstdlib.g:25573:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2367,12 +2367,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25569:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalOCLstdlib.g:25569:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalOCLstdlib.g:25575:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalOCLstdlib.g:25575:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalOCLstdlib.g:25569:38: ( options {greedy=false; } : . )*
+            // InternalOCLstdlib.g:25575:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -2397,7 +2397,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalOCLstdlib.g:25569:66: .
+            	    // InternalOCLstdlib.g:25575:66: .
             	    {
             	    matchAny();
 
@@ -2427,11 +2427,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25571:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalOCLstdlib.g:25571:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLstdlib.g:25577:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalOCLstdlib.g:25577:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalOCLstdlib.g:25571:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLstdlib.g:25577:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -2480,8 +2480,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25573:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:25573:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:25579:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:25579:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -2501,10 +2501,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25575:10: ( ( '0' .. '9' )+ )
-            // InternalOCLstdlib.g:25575:12: ( '0' .. '9' )+
+            // InternalOCLstdlib.g:25581:10: ( ( '0' .. '9' )+ )
+            // InternalOCLstdlib.g:25581:12: ( '0' .. '9' )+
             {
-            // InternalOCLstdlib.g:25575:12: ( '0' .. '9' )+
+            // InternalOCLstdlib.g:25581:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -2518,7 +2518,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalOCLstdlib.g:25575:13: '0' .. '9'
+            	    // InternalOCLstdlib.g:25581:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -2550,12 +2550,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25577:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalOCLstdlib.g:25577:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalOCLstdlib.g:25583:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalOCLstdlib.g:25583:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalOCLstdlib.g:25577:24: ( options {greedy=false; } : . )*
+            // InternalOCLstdlib.g:25583:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -2580,7 +2580,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalOCLstdlib.g:25577:52: .
+            	    // InternalOCLstdlib.g:25583:52: .
             	    {
             	    matchAny();
 
@@ -2610,12 +2610,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25579:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalOCLstdlib.g:25579:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalOCLstdlib.g:25585:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalOCLstdlib.g:25585:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalOCLstdlib.g:25579:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalOCLstdlib.g:25585:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -2628,7 +2628,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalOCLstdlib.g:25579:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalOCLstdlib.g:25585:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2648,7 +2648,7 @@
                 }
             } while (true);
 
-            // InternalOCLstdlib.g:25579:40: ( ( '\\r' )? '\\n' )?
+            // InternalOCLstdlib.g:25585:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2657,9 +2657,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalOCLstdlib.g:25579:41: ( '\\r' )? '\\n'
+                    // InternalOCLstdlib.g:25585:41: ( '\\r' )? '\\n'
                     {
-                    // InternalOCLstdlib.g:25579:41: ( '\\r' )?
+                    // InternalOCLstdlib.g:25585:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -2668,7 +2668,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalOCLstdlib.g:25579:41: '\\r'
+                            // InternalOCLstdlib.g:25585:41: '\\r'
                             {
                             match('\r');
 
@@ -2700,10 +2700,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25581:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalOCLstdlib.g:25581:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLstdlib.g:25587:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalOCLstdlib.g:25587:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalOCLstdlib.g:25581:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLstdlib.g:25587:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -2757,8 +2757,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:25583:16: ( . )
-            // InternalOCLstdlib.g:25583:18: .
+            // InternalOCLstdlib.g:25589:16: ( . )
+            // InternalOCLstdlib.g:25589:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibParser.java b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibParser.java
index 2141163..31c8f45 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibParser.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib.ui/src-gen/org/eclipse/ocl/xtext/oclstdlib/ui/contentassist/antlr/internal/InternalOCLstdlibParser.java
@@ -8939,11 +8939,11 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalOCLstdlib.g:2963:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
+    // InternalOCLstdlib.g:2965:1: entryRuleFirstPathElementCS : ruleFirstPathElementCS EOF ;
     public final void entryRuleFirstPathElementCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:2964:1: ( ruleFirstPathElementCS EOF )
-            // InternalOCLstdlib.g:2965:1: ruleFirstPathElementCS EOF
+            // InternalOCLstdlib.g:2966:1: ( ruleFirstPathElementCS EOF )
+            // InternalOCLstdlib.g:2967:1: ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSRule());
@@ -8973,23 +8973,23 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalOCLstdlib.g:2972:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalOCLstdlib.g:2974:1: ruleFirstPathElementCS : ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleFirstPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:2976:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
-            // InternalOCLstdlib.g:2977:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLstdlib.g:2978:2: ( ( ( rule__FirstPathElementCS__ReferredElementAssignment ) ) )
+            // InternalOCLstdlib.g:2979:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalOCLstdlib.g:2977:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
-            // InternalOCLstdlib.g:2978:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalOCLstdlib.g:2979:1: ( ( rule__FirstPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLstdlib.g:2980:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalOCLstdlib.g:2979:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
-            // InternalOCLstdlib.g:2979:2: rule__FirstPathElementCS__ReferredElementAssignment
+            // InternalOCLstdlib.g:2981:1: ( rule__FirstPathElementCS__ReferredElementAssignment )
+            // InternalOCLstdlib.g:2981:2: rule__FirstPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__FirstPathElementCS__ReferredElementAssignment();
@@ -9024,11 +9024,11 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalOCLstdlib.g:2991:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
+    // InternalOCLstdlib.g:2993:1: entryRuleNextPathElementCS : ruleNextPathElementCS EOF ;
     public final void entryRuleNextPathElementCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:2992:1: ( ruleNextPathElementCS EOF )
-            // InternalOCLstdlib.g:2993:1: ruleNextPathElementCS EOF
+            // InternalOCLstdlib.g:2994:1: ( ruleNextPathElementCS EOF )
+            // InternalOCLstdlib.g:2995:1: ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSRule());
@@ -9058,23 +9058,23 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalOCLstdlib.g:3000:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
+    // InternalOCLstdlib.g:3002:1: ruleNextPathElementCS : ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) ;
     public final void ruleNextPathElementCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3004:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
-            // InternalOCLstdlib.g:3005:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLstdlib.g:3006:2: ( ( ( rule__NextPathElementCS__ReferredElementAssignment ) ) )
+            // InternalOCLstdlib.g:3007:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
             {
-            // InternalOCLstdlib.g:3005:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
-            // InternalOCLstdlib.g:3006:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalOCLstdlib.g:3007:1: ( ( rule__NextPathElementCS__ReferredElementAssignment ) )
+            // InternalOCLstdlib.g:3008:1: ( rule__NextPathElementCS__ReferredElementAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementAssignment());
             }
-            // InternalOCLstdlib.g:3007:1: ( rule__NextPathElementCS__ReferredElementAssignment )
-            // InternalOCLstdlib.g:3007:2: rule__NextPathElementCS__ReferredElementAssignment
+            // InternalOCLstdlib.g:3009:1: ( rule__NextPathElementCS__ReferredElementAssignment )
+            // InternalOCLstdlib.g:3009:2: rule__NextPathElementCS__ReferredElementAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NextPathElementCS__ReferredElementAssignment();
@@ -9109,11 +9109,11 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalOCLstdlib.g:3019:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
+    // InternalOCLstdlib.g:3021:1: entryRuleTemplateBindingCS : ruleTemplateBindingCS EOF ;
     public final void entryRuleTemplateBindingCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3020:1: ( ruleTemplateBindingCS EOF )
-            // InternalOCLstdlib.g:3021:1: ruleTemplateBindingCS EOF
+            // InternalOCLstdlib.g:3022:1: ( ruleTemplateBindingCS EOF )
+            // InternalOCLstdlib.g:3023:1: ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSRule());
@@ -9143,23 +9143,23 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalOCLstdlib.g:3028:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
+    // InternalOCLstdlib.g:3030:1: ruleTemplateBindingCS : ( ( rule__TemplateBindingCS__Group__0 ) ) ;
     public final void ruleTemplateBindingCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3032:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
-            // InternalOCLstdlib.g:3033:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalOCLstdlib.g:3034:2: ( ( ( rule__TemplateBindingCS__Group__0 ) ) )
+            // InternalOCLstdlib.g:3035:1: ( ( rule__TemplateBindingCS__Group__0 ) )
             {
-            // InternalOCLstdlib.g:3033:1: ( ( rule__TemplateBindingCS__Group__0 ) )
-            // InternalOCLstdlib.g:3034:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalOCLstdlib.g:3035:1: ( ( rule__TemplateBindingCS__Group__0 ) )
+            // InternalOCLstdlib.g:3036:1: ( rule__TemplateBindingCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup());
             }
-            // InternalOCLstdlib.g:3035:1: ( rule__TemplateBindingCS__Group__0 )
-            // InternalOCLstdlib.g:3035:2: rule__TemplateBindingCS__Group__0
+            // InternalOCLstdlib.g:3037:1: ( rule__TemplateBindingCS__Group__0 )
+            // InternalOCLstdlib.g:3037:2: rule__TemplateBindingCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__0();
@@ -9194,11 +9194,11 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalOCLstdlib.g:3047:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalOCLstdlib.g:3049:1: entryRuleTemplateParameterSubstitutionCS : ruleTemplateParameterSubstitutionCS EOF ;
     public final void entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3048:1: ( ruleTemplateParameterSubstitutionCS EOF )
-            // InternalOCLstdlib.g:3049:1: ruleTemplateParameterSubstitutionCS EOF
+            // InternalOCLstdlib.g:3050:1: ( ruleTemplateParameterSubstitutionCS EOF )
+            // InternalOCLstdlib.g:3051:1: ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -9228,23 +9228,23 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalOCLstdlib.g:3056:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
+    // InternalOCLstdlib.g:3058:1: ruleTemplateParameterSubstitutionCS : ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) ;
     public final void ruleTemplateParameterSubstitutionCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3060:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
-            // InternalOCLstdlib.g:3061:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalOCLstdlib.g:3062:2: ( ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) ) )
+            // InternalOCLstdlib.g:3063:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
             {
-            // InternalOCLstdlib.g:3061:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
-            // InternalOCLstdlib.g:3062:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalOCLstdlib.g:3063:1: ( ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment ) )
+            // InternalOCLstdlib.g:3064:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterAssignment());
             }
-            // InternalOCLstdlib.g:3063:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
-            // InternalOCLstdlib.g:3063:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
+            // InternalOCLstdlib.g:3065:1: ( rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment )
+            // InternalOCLstdlib.g:3065:2: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment();
@@ -9279,11 +9279,11 @@
 
 
     // $ANTLR start "entryRuleTemplateSignatureCS"
-    // InternalOCLstdlib.g:3075:1: entryRuleTemplateSignatureCS : ruleTemplateSignatureCS EOF ;
+    // InternalOCLstdlib.g:3077:1: entryRuleTemplateSignatureCS : ruleTemplateSignatureCS EOF ;
     public final void entryRuleTemplateSignatureCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3076:1: ( ruleTemplateSignatureCS EOF )
-            // InternalOCLstdlib.g:3077:1: ruleTemplateSignatureCS EOF
+            // InternalOCLstdlib.g:3078:1: ( ruleTemplateSignatureCS EOF )
+            // InternalOCLstdlib.g:3079:1: ruleTemplateSignatureCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSRule());
@@ -9313,23 +9313,23 @@
 
 
     // $ANTLR start "ruleTemplateSignatureCS"
-    // InternalOCLstdlib.g:3084:1: ruleTemplateSignatureCS : ( ( rule__TemplateSignatureCS__Group__0 ) ) ;
+    // InternalOCLstdlib.g:3086:1: ruleTemplateSignatureCS : ( ( rule__TemplateSignatureCS__Group__0 ) ) ;
     public final void ruleTemplateSignatureCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3088:2: ( ( ( rule__TemplateSignatureCS__Group__0 ) ) )
-            // InternalOCLstdlib.g:3089:1: ( ( rule__TemplateSignatureCS__Group__0 ) )
+            // InternalOCLstdlib.g:3090:2: ( ( ( rule__TemplateSignatureCS__Group__0 ) ) )
+            // InternalOCLstdlib.g:3091:1: ( ( rule__TemplateSignatureCS__Group__0 ) )
             {
-            // InternalOCLstdlib.g:3089:1: ( ( rule__TemplateSignatureCS__Group__0 ) )
-            // InternalOCLstdlib.g:3090:1: ( rule__TemplateSignatureCS__Group__0 )
+            // InternalOCLstdlib.g:3091:1: ( ( rule__TemplateSignatureCS__Group__0 ) )
+            // InternalOCLstdlib.g:3092:1: ( rule__TemplateSignatureCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGroup());
             }
-            // InternalOCLstdlib.g:3091:1: ( rule__TemplateSignatureCS__Group__0 )
-            // InternalOCLstdlib.g:3091:2: rule__TemplateSignatureCS__Group__0
+            // InternalOCLstdlib.g:3093:1: ( rule__TemplateSignatureCS__Group__0 )
+            // InternalOCLstdlib.g:3093:2: rule__TemplateSignatureCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group__0();
@@ -9364,11 +9364,11 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalOCLstdlib.g:3103:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
+    // InternalOCLstdlib.g:3105:1: entryRuleTypeParameterCS : ruleTypeParameterCS EOF ;
     public final void entryRuleTypeParameterCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3104:1: ( ruleTypeParameterCS EOF )
-            // InternalOCLstdlib.g:3105:1: ruleTypeParameterCS EOF
+            // InternalOCLstdlib.g:3106:1: ( ruleTypeParameterCS EOF )
+            // InternalOCLstdlib.g:3107:1: ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSRule());
@@ -9398,23 +9398,23 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalOCLstdlib.g:3112:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
+    // InternalOCLstdlib.g:3114:1: ruleTypeParameterCS : ( ( rule__TypeParameterCS__Group__0 ) ) ;
     public final void ruleTypeParameterCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3116:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
-            // InternalOCLstdlib.g:3117:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalOCLstdlib.g:3118:2: ( ( ( rule__TypeParameterCS__Group__0 ) ) )
+            // InternalOCLstdlib.g:3119:1: ( ( rule__TypeParameterCS__Group__0 ) )
             {
-            // InternalOCLstdlib.g:3117:1: ( ( rule__TypeParameterCS__Group__0 ) )
-            // InternalOCLstdlib.g:3118:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalOCLstdlib.g:3119:1: ( ( rule__TypeParameterCS__Group__0 ) )
+            // InternalOCLstdlib.g:3120:1: ( rule__TypeParameterCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup());
             }
-            // InternalOCLstdlib.g:3119:1: ( rule__TypeParameterCS__Group__0 )
-            // InternalOCLstdlib.g:3119:2: rule__TypeParameterCS__Group__0
+            // InternalOCLstdlib.g:3121:1: ( rule__TypeParameterCS__Group__0 )
+            // InternalOCLstdlib.g:3121:2: rule__TypeParameterCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__0();
@@ -9449,11 +9449,11 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalOCLstdlib.g:3131:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
+    // InternalOCLstdlib.g:3133:1: entryRuleTypeRefCS : ruleTypeRefCS EOF ;
     public final void entryRuleTypeRefCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3132:1: ( ruleTypeRefCS EOF )
-            // InternalOCLstdlib.g:3133:1: ruleTypeRefCS EOF
+            // InternalOCLstdlib.g:3134:1: ( ruleTypeRefCS EOF )
+            // InternalOCLstdlib.g:3135:1: ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSRule());
@@ -9483,23 +9483,23 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalOCLstdlib.g:3140:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
+    // InternalOCLstdlib.g:3142:1: ruleTypeRefCS : ( ( rule__TypeRefCS__Alternatives ) ) ;
     public final void ruleTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3144:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
-            // InternalOCLstdlib.g:3145:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalOCLstdlib.g:3146:2: ( ( ( rule__TypeRefCS__Alternatives ) ) )
+            // InternalOCLstdlib.g:3147:1: ( ( rule__TypeRefCS__Alternatives ) )
             {
-            // InternalOCLstdlib.g:3145:1: ( ( rule__TypeRefCS__Alternatives ) )
-            // InternalOCLstdlib.g:3146:1: ( rule__TypeRefCS__Alternatives )
+            // InternalOCLstdlib.g:3147:1: ( ( rule__TypeRefCS__Alternatives ) )
+            // InternalOCLstdlib.g:3148:1: ( rule__TypeRefCS__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeRefCSAccess().getAlternatives());
             }
-            // InternalOCLstdlib.g:3147:1: ( rule__TypeRefCS__Alternatives )
-            // InternalOCLstdlib.g:3147:2: rule__TypeRefCS__Alternatives
+            // InternalOCLstdlib.g:3149:1: ( rule__TypeRefCS__Alternatives )
+            // InternalOCLstdlib.g:3149:2: rule__TypeRefCS__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeRefCS__Alternatives();
@@ -9534,11 +9534,11 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalOCLstdlib.g:3159:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
+    // InternalOCLstdlib.g:3161:1: entryRuleWildcardTypeRefCS : ruleWildcardTypeRefCS EOF ;
     public final void entryRuleWildcardTypeRefCS() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3160:1: ( ruleWildcardTypeRefCS EOF )
-            // InternalOCLstdlib.g:3161:1: ruleWildcardTypeRefCS EOF
+            // InternalOCLstdlib.g:3162:1: ( ruleWildcardTypeRefCS EOF )
+            // InternalOCLstdlib.g:3163:1: ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSRule());
@@ -9568,23 +9568,23 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalOCLstdlib.g:3168:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
+    // InternalOCLstdlib.g:3170:1: ruleWildcardTypeRefCS : ( ( rule__WildcardTypeRefCS__Group__0 ) ) ;
     public final void ruleWildcardTypeRefCS() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3172:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
-            // InternalOCLstdlib.g:3173:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalOCLstdlib.g:3174:2: ( ( ( rule__WildcardTypeRefCS__Group__0 ) ) )
+            // InternalOCLstdlib.g:3175:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
             {
-            // InternalOCLstdlib.g:3173:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
-            // InternalOCLstdlib.g:3174:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalOCLstdlib.g:3175:1: ( ( rule__WildcardTypeRefCS__Group__0 ) )
+            // InternalOCLstdlib.g:3176:1: ( rule__WildcardTypeRefCS__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup());
             }
-            // InternalOCLstdlib.g:3175:1: ( rule__WildcardTypeRefCS__Group__0 )
-            // InternalOCLstdlib.g:3175:2: rule__WildcardTypeRefCS__Group__0
+            // InternalOCLstdlib.g:3177:1: ( rule__WildcardTypeRefCS__Group__0 )
+            // InternalOCLstdlib.g:3177:2: rule__WildcardTypeRefCS__Group__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__0();
@@ -9619,11 +9619,11 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalOCLstdlib.g:3187:1: entryRuleID : ruleID EOF ;
+    // InternalOCLstdlib.g:3189:1: entryRuleID : ruleID EOF ;
     public final void entryRuleID() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3188:1: ( ruleID EOF )
-            // InternalOCLstdlib.g:3189:1: ruleID EOF
+            // InternalOCLstdlib.g:3190:1: ( ruleID EOF )
+            // InternalOCLstdlib.g:3191:1: ruleID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDRule());
@@ -9653,23 +9653,23 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalOCLstdlib.g:3196:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
+    // InternalOCLstdlib.g:3198:1: ruleID : ( ( rule__ID__Alternatives ) ) ;
     public final void ruleID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3200:2: ( ( ( rule__ID__Alternatives ) ) )
-            // InternalOCLstdlib.g:3201:1: ( ( rule__ID__Alternatives ) )
+            // InternalOCLstdlib.g:3202:2: ( ( ( rule__ID__Alternatives ) ) )
+            // InternalOCLstdlib.g:3203:1: ( ( rule__ID__Alternatives ) )
             {
-            // InternalOCLstdlib.g:3201:1: ( ( rule__ID__Alternatives ) )
-            // InternalOCLstdlib.g:3202:1: ( rule__ID__Alternatives )
+            // InternalOCLstdlib.g:3203:1: ( ( rule__ID__Alternatives ) )
+            // InternalOCLstdlib.g:3204:1: ( rule__ID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIDAccess().getAlternatives());
             }
-            // InternalOCLstdlib.g:3203:1: ( rule__ID__Alternatives )
-            // InternalOCLstdlib.g:3203:2: rule__ID__Alternatives
+            // InternalOCLstdlib.g:3205:1: ( rule__ID__Alternatives )
+            // InternalOCLstdlib.g:3205:2: rule__ID__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ID__Alternatives();
@@ -9704,11 +9704,11 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalOCLstdlib.g:3215:1: entryRuleLOWER : ruleLOWER EOF ;
+    // InternalOCLstdlib.g:3217:1: entryRuleLOWER : ruleLOWER EOF ;
     public final void entryRuleLOWER() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3216:1: ( ruleLOWER EOF )
-            // InternalOCLstdlib.g:3217:1: ruleLOWER EOF
+            // InternalOCLstdlib.g:3218:1: ( ruleLOWER EOF )
+            // InternalOCLstdlib.g:3219:1: ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERRule());
@@ -9738,17 +9738,17 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalOCLstdlib.g:3224:1: ruleLOWER : ( RULE_INT ) ;
+    // InternalOCLstdlib.g:3226:1: ruleLOWER : ( RULE_INT ) ;
     public final void ruleLOWER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3228:2: ( ( RULE_INT ) )
-            // InternalOCLstdlib.g:3229:1: ( RULE_INT )
+            // InternalOCLstdlib.g:3230:2: ( ( RULE_INT ) )
+            // InternalOCLstdlib.g:3231:1: ( RULE_INT )
             {
-            // InternalOCLstdlib.g:3229:1: ( RULE_INT )
-            // InternalOCLstdlib.g:3230:1: RULE_INT
+            // InternalOCLstdlib.g:3231:1: ( RULE_INT )
+            // InternalOCLstdlib.g:3232:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLOWERAccess().getINTTerminalRuleCall());
@@ -9779,11 +9779,11 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalOCLstdlib.g:3243:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
+    // InternalOCLstdlib.g:3245:1: entryRuleNUMBER_LITERAL : ruleNUMBER_LITERAL EOF ;
     public final void entryRuleNUMBER_LITERAL() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3244:1: ( ruleNUMBER_LITERAL EOF )
-            // InternalOCLstdlib.g:3245:1: ruleNUMBER_LITERAL EOF
+            // InternalOCLstdlib.g:3246:1: ( ruleNUMBER_LITERAL EOF )
+            // InternalOCLstdlib.g:3247:1: ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALRule());
@@ -9813,17 +9813,17 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalOCLstdlib.g:3252:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
+    // InternalOCLstdlib.g:3254:1: ruleNUMBER_LITERAL : ( RULE_INT ) ;
     public final void ruleNUMBER_LITERAL() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3256:2: ( ( RULE_INT ) )
-            // InternalOCLstdlib.g:3257:1: ( RULE_INT )
+            // InternalOCLstdlib.g:3258:2: ( ( RULE_INT ) )
+            // InternalOCLstdlib.g:3259:1: ( RULE_INT )
             {
-            // InternalOCLstdlib.g:3257:1: ( RULE_INT )
-            // InternalOCLstdlib.g:3258:1: RULE_INT
+            // InternalOCLstdlib.g:3259:1: ( RULE_INT )
+            // InternalOCLstdlib.g:3260:1: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());
@@ -9854,11 +9854,11 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalOCLstdlib.g:3271:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
+    // InternalOCLstdlib.g:3273:1: entryRuleStringLiteral : ruleStringLiteral EOF ;
     public final void entryRuleStringLiteral() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3272:1: ( ruleStringLiteral EOF )
-            // InternalOCLstdlib.g:3273:1: ruleStringLiteral EOF
+            // InternalOCLstdlib.g:3274:1: ( ruleStringLiteral EOF )
+            // InternalOCLstdlib.g:3275:1: ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralRule());
@@ -9888,17 +9888,17 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalOCLstdlib.g:3280:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLstdlib.g:3282:1: ruleStringLiteral : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleStringLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3284:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:3285:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:3286:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:3287:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLstdlib.g:3285:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:3286:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:3287:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:3288:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -9929,11 +9929,11 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalOCLstdlib.g:3299:1: entryRuleUPPER : ruleUPPER EOF ;
+    // InternalOCLstdlib.g:3301:1: entryRuleUPPER : ruleUPPER EOF ;
     public final void entryRuleUPPER() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3300:1: ( ruleUPPER EOF )
-            // InternalOCLstdlib.g:3301:1: ruleUPPER EOF
+            // InternalOCLstdlib.g:3302:1: ( ruleUPPER EOF )
+            // InternalOCLstdlib.g:3303:1: ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERRule());
@@ -9963,23 +9963,23 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalOCLstdlib.g:3308:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
+    // InternalOCLstdlib.g:3310:1: ruleUPPER : ( ( rule__UPPER__Alternatives ) ) ;
     public final void ruleUPPER() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3312:2: ( ( ( rule__UPPER__Alternatives ) ) )
-            // InternalOCLstdlib.g:3313:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalOCLstdlib.g:3314:2: ( ( ( rule__UPPER__Alternatives ) ) )
+            // InternalOCLstdlib.g:3315:1: ( ( rule__UPPER__Alternatives ) )
             {
-            // InternalOCLstdlib.g:3313:1: ( ( rule__UPPER__Alternatives ) )
-            // InternalOCLstdlib.g:3314:1: ( rule__UPPER__Alternatives )
+            // InternalOCLstdlib.g:3315:1: ( ( rule__UPPER__Alternatives ) )
+            // InternalOCLstdlib.g:3316:1: ( rule__UPPER__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUPPERAccess().getAlternatives());
             }
-            // InternalOCLstdlib.g:3315:1: ( rule__UPPER__Alternatives )
-            // InternalOCLstdlib.g:3315:2: rule__UPPER__Alternatives
+            // InternalOCLstdlib.g:3317:1: ( rule__UPPER__Alternatives )
+            // InternalOCLstdlib.g:3317:2: rule__UPPER__Alternatives
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UPPER__Alternatives();
@@ -10014,11 +10014,11 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalOCLstdlib.g:3327:1: entryRuleURI : ruleURI EOF ;
+    // InternalOCLstdlib.g:3329:1: entryRuleURI : ruleURI EOF ;
     public final void entryRuleURI() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:3328:1: ( ruleURI EOF )
-            // InternalOCLstdlib.g:3329:1: ruleURI EOF
+            // InternalOCLstdlib.g:3330:1: ( ruleURI EOF )
+            // InternalOCLstdlib.g:3331:1: ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIRule());
@@ -10048,17 +10048,17 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalOCLstdlib.g:3336:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLstdlib.g:3338:1: ruleURI : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void ruleURI() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3340:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:3341:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:3342:2: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:3343:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLstdlib.g:3341:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:3342:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:3343:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:3344:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());
@@ -10089,13 +10089,13 @@
 
 
     // $ANTLR start "rule__Identifier__Alternatives"
-    // InternalOCLstdlib.g:3355:1: rule__Identifier__Alternatives : ( ( ruleID ) | ( ruleRestrictedKeywords ) );
+    // InternalOCLstdlib.g:3357:1: rule__Identifier__Alternatives : ( ( ruleID ) | ( ruleRestrictedKeywords ) );
     public final void rule__Identifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3359:1: ( ( ruleID ) | ( ruleRestrictedKeywords ) )
+            // InternalOCLstdlib.g:3361:1: ( ( ruleID ) | ( ruleRestrictedKeywords ) )
             int alt2=2;
             int LA2_0 = input.LA(1);
 
@@ -10114,10 +10114,10 @@
             }
             switch (alt2) {
                 case 1 :
-                    // InternalOCLstdlib.g:3360:1: ( ruleID )
+                    // InternalOCLstdlib.g:3362:1: ( ruleID )
                     {
-                    // InternalOCLstdlib.g:3360:1: ( ruleID )
-                    // InternalOCLstdlib.g:3361:1: ruleID
+                    // InternalOCLstdlib.g:3362:1: ( ruleID )
+                    // InternalOCLstdlib.g:3363:1: ruleID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIdentifierAccess().getIDParserRuleCall_0());
@@ -10137,10 +10137,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3366:6: ( ruleRestrictedKeywords )
+                    // InternalOCLstdlib.g:3368:6: ( ruleRestrictedKeywords )
                     {
-                    // InternalOCLstdlib.g:3366:6: ( ruleRestrictedKeywords )
-                    // InternalOCLstdlib.g:3367:1: ruleRestrictedKeywords
+                    // InternalOCLstdlib.g:3368:6: ( ruleRestrictedKeywords )
+                    // InternalOCLstdlib.g:3369:1: ruleRestrictedKeywords
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIdentifierAccess().getRestrictedKeywordsParserRuleCall_1());
@@ -10177,13 +10177,13 @@
 
 
     // $ANTLR start "rule__RestrictedKeywords__Alternatives"
-    // InternalOCLstdlib.g:3377:1: rule__RestrictedKeywords__Alternatives : ( ( 'abstract' ) | ( 'annotation' ) | ( 'conformsTo' ) | ( 'documentation' ) | ( 'extends' ) | ( 'import' ) | ( 'inv' ) | ( 'invalidating' ) | ( 'iteration' ) | ( 'left' ) | ( 'library' ) | ( 'operation' ) | ( 'opposite' ) | ( 'package' ) | ( 'post' ) | ( 'pre' ) | ( 'precedence' ) | ( 'property' ) | ( 'right' ) | ( 'static' ) | ( 'type' ) | ( 'validating' ) );
+    // InternalOCLstdlib.g:3379:1: rule__RestrictedKeywords__Alternatives : ( ( 'abstract' ) | ( 'annotation' ) | ( 'conformsTo' ) | ( 'documentation' ) | ( 'extends' ) | ( 'import' ) | ( 'inv' ) | ( 'invalidating' ) | ( 'iteration' ) | ( 'left' ) | ( 'library' ) | ( 'operation' ) | ( 'opposite' ) | ( 'package' ) | ( 'post' ) | ( 'pre' ) | ( 'precedence' ) | ( 'property' ) | ( 'right' ) | ( 'static' ) | ( 'type' ) | ( 'validating' ) );
     public final void rule__RestrictedKeywords__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3381:1: ( ( 'abstract' ) | ( 'annotation' ) | ( 'conformsTo' ) | ( 'documentation' ) | ( 'extends' ) | ( 'import' ) | ( 'inv' ) | ( 'invalidating' ) | ( 'iteration' ) | ( 'left' ) | ( 'library' ) | ( 'operation' ) | ( 'opposite' ) | ( 'package' ) | ( 'post' ) | ( 'pre' ) | ( 'precedence' ) | ( 'property' ) | ( 'right' ) | ( 'static' ) | ( 'type' ) | ( 'validating' ) )
+            // InternalOCLstdlib.g:3383:1: ( ( 'abstract' ) | ( 'annotation' ) | ( 'conformsTo' ) | ( 'documentation' ) | ( 'extends' ) | ( 'import' ) | ( 'inv' ) | ( 'invalidating' ) | ( 'iteration' ) | ( 'left' ) | ( 'library' ) | ( 'operation' ) | ( 'opposite' ) | ( 'package' ) | ( 'post' ) | ( 'pre' ) | ( 'precedence' ) | ( 'property' ) | ( 'right' ) | ( 'static' ) | ( 'type' ) | ( 'validating' ) )
             int alt3=22;
             switch ( input.LA(1) ) {
             case 16:
@@ -10306,10 +10306,10 @@
 
             switch (alt3) {
                 case 1 :
-                    // InternalOCLstdlib.g:3382:1: ( 'abstract' )
+                    // InternalOCLstdlib.g:3384:1: ( 'abstract' )
                     {
-                    // InternalOCLstdlib.g:3382:1: ( 'abstract' )
-                    // InternalOCLstdlib.g:3383:1: 'abstract'
+                    // InternalOCLstdlib.g:3384:1: ( 'abstract' )
+                    // InternalOCLstdlib.g:3385:1: 'abstract'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getAbstractKeyword_0());
@@ -10325,10 +10325,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3390:6: ( 'annotation' )
+                    // InternalOCLstdlib.g:3392:6: ( 'annotation' )
                     {
-                    // InternalOCLstdlib.g:3390:6: ( 'annotation' )
-                    // InternalOCLstdlib.g:3391:1: 'annotation'
+                    // InternalOCLstdlib.g:3392:6: ( 'annotation' )
+                    // InternalOCLstdlib.g:3393:1: 'annotation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getAnnotationKeyword_1());
@@ -10344,10 +10344,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3398:6: ( 'conformsTo' )
+                    // InternalOCLstdlib.g:3400:6: ( 'conformsTo' )
                     {
-                    // InternalOCLstdlib.g:3398:6: ( 'conformsTo' )
-                    // InternalOCLstdlib.g:3399:1: 'conformsTo'
+                    // InternalOCLstdlib.g:3400:6: ( 'conformsTo' )
+                    // InternalOCLstdlib.g:3401:1: 'conformsTo'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getConformsToKeyword_2());
@@ -10363,10 +10363,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:3406:6: ( 'documentation' )
+                    // InternalOCLstdlib.g:3408:6: ( 'documentation' )
                     {
-                    // InternalOCLstdlib.g:3406:6: ( 'documentation' )
-                    // InternalOCLstdlib.g:3407:1: 'documentation'
+                    // InternalOCLstdlib.g:3408:6: ( 'documentation' )
+                    // InternalOCLstdlib.g:3409:1: 'documentation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getDocumentationKeyword_3());
@@ -10382,10 +10382,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:3414:6: ( 'extends' )
+                    // InternalOCLstdlib.g:3416:6: ( 'extends' )
                     {
-                    // InternalOCLstdlib.g:3414:6: ( 'extends' )
-                    // InternalOCLstdlib.g:3415:1: 'extends'
+                    // InternalOCLstdlib.g:3416:6: ( 'extends' )
+                    // InternalOCLstdlib.g:3417:1: 'extends'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getExtendsKeyword_4());
@@ -10401,10 +10401,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLstdlib.g:3422:6: ( 'import' )
+                    // InternalOCLstdlib.g:3424:6: ( 'import' )
                     {
-                    // InternalOCLstdlib.g:3422:6: ( 'import' )
-                    // InternalOCLstdlib.g:3423:1: 'import'
+                    // InternalOCLstdlib.g:3424:6: ( 'import' )
+                    // InternalOCLstdlib.g:3425:1: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getImportKeyword_5());
@@ -10420,10 +10420,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLstdlib.g:3430:6: ( 'inv' )
+                    // InternalOCLstdlib.g:3432:6: ( 'inv' )
                     {
-                    // InternalOCLstdlib.g:3430:6: ( 'inv' )
-                    // InternalOCLstdlib.g:3431:1: 'inv'
+                    // InternalOCLstdlib.g:3432:6: ( 'inv' )
+                    // InternalOCLstdlib.g:3433:1: 'inv'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getInvKeyword_6());
@@ -10439,10 +10439,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLstdlib.g:3438:6: ( 'invalidating' )
+                    // InternalOCLstdlib.g:3440:6: ( 'invalidating' )
                     {
-                    // InternalOCLstdlib.g:3438:6: ( 'invalidating' )
-                    // InternalOCLstdlib.g:3439:1: 'invalidating'
+                    // InternalOCLstdlib.g:3440:6: ( 'invalidating' )
+                    // InternalOCLstdlib.g:3441:1: 'invalidating'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getInvalidatingKeyword_7());
@@ -10458,10 +10458,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLstdlib.g:3446:6: ( 'iteration' )
+                    // InternalOCLstdlib.g:3448:6: ( 'iteration' )
                     {
-                    // InternalOCLstdlib.g:3446:6: ( 'iteration' )
-                    // InternalOCLstdlib.g:3447:1: 'iteration'
+                    // InternalOCLstdlib.g:3448:6: ( 'iteration' )
+                    // InternalOCLstdlib.g:3449:1: 'iteration'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getIterationKeyword_8());
@@ -10477,10 +10477,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLstdlib.g:3454:6: ( 'left' )
+                    // InternalOCLstdlib.g:3456:6: ( 'left' )
                     {
-                    // InternalOCLstdlib.g:3454:6: ( 'left' )
-                    // InternalOCLstdlib.g:3455:1: 'left'
+                    // InternalOCLstdlib.g:3456:6: ( 'left' )
+                    // InternalOCLstdlib.g:3457:1: 'left'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getLeftKeyword_9());
@@ -10496,10 +10496,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLstdlib.g:3462:6: ( 'library' )
+                    // InternalOCLstdlib.g:3464:6: ( 'library' )
                     {
-                    // InternalOCLstdlib.g:3462:6: ( 'library' )
-                    // InternalOCLstdlib.g:3463:1: 'library'
+                    // InternalOCLstdlib.g:3464:6: ( 'library' )
+                    // InternalOCLstdlib.g:3465:1: 'library'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getLibraryKeyword_10());
@@ -10515,10 +10515,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLstdlib.g:3470:6: ( 'operation' )
+                    // InternalOCLstdlib.g:3472:6: ( 'operation' )
                     {
-                    // InternalOCLstdlib.g:3470:6: ( 'operation' )
-                    // InternalOCLstdlib.g:3471:1: 'operation'
+                    // InternalOCLstdlib.g:3472:6: ( 'operation' )
+                    // InternalOCLstdlib.g:3473:1: 'operation'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getOperationKeyword_11());
@@ -10534,10 +10534,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLstdlib.g:3478:6: ( 'opposite' )
+                    // InternalOCLstdlib.g:3480:6: ( 'opposite' )
                     {
-                    // InternalOCLstdlib.g:3478:6: ( 'opposite' )
-                    // InternalOCLstdlib.g:3479:1: 'opposite'
+                    // InternalOCLstdlib.g:3480:6: ( 'opposite' )
+                    // InternalOCLstdlib.g:3481:1: 'opposite'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getOppositeKeyword_12());
@@ -10553,10 +10553,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLstdlib.g:3486:6: ( 'package' )
+                    // InternalOCLstdlib.g:3488:6: ( 'package' )
                     {
-                    // InternalOCLstdlib.g:3486:6: ( 'package' )
-                    // InternalOCLstdlib.g:3487:1: 'package'
+                    // InternalOCLstdlib.g:3488:6: ( 'package' )
+                    // InternalOCLstdlib.g:3489:1: 'package'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getPackageKeyword_13());
@@ -10572,10 +10572,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLstdlib.g:3494:6: ( 'post' )
+                    // InternalOCLstdlib.g:3496:6: ( 'post' )
                     {
-                    // InternalOCLstdlib.g:3494:6: ( 'post' )
-                    // InternalOCLstdlib.g:3495:1: 'post'
+                    // InternalOCLstdlib.g:3496:6: ( 'post' )
+                    // InternalOCLstdlib.g:3497:1: 'post'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getPostKeyword_14());
@@ -10591,10 +10591,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLstdlib.g:3502:6: ( 'pre' )
+                    // InternalOCLstdlib.g:3504:6: ( 'pre' )
                     {
-                    // InternalOCLstdlib.g:3502:6: ( 'pre' )
-                    // InternalOCLstdlib.g:3503:1: 'pre'
+                    // InternalOCLstdlib.g:3504:6: ( 'pre' )
+                    // InternalOCLstdlib.g:3505:1: 'pre'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getPreKeyword_15());
@@ -10610,10 +10610,10 @@
                     }
                     break;
                 case 17 :
-                    // InternalOCLstdlib.g:3510:6: ( 'precedence' )
+                    // InternalOCLstdlib.g:3512:6: ( 'precedence' )
                     {
-                    // InternalOCLstdlib.g:3510:6: ( 'precedence' )
-                    // InternalOCLstdlib.g:3511:1: 'precedence'
+                    // InternalOCLstdlib.g:3512:6: ( 'precedence' )
+                    // InternalOCLstdlib.g:3513:1: 'precedence'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getPrecedenceKeyword_16());
@@ -10629,10 +10629,10 @@
                     }
                     break;
                 case 18 :
-                    // InternalOCLstdlib.g:3518:6: ( 'property' )
+                    // InternalOCLstdlib.g:3520:6: ( 'property' )
                     {
-                    // InternalOCLstdlib.g:3518:6: ( 'property' )
-                    // InternalOCLstdlib.g:3519:1: 'property'
+                    // InternalOCLstdlib.g:3520:6: ( 'property' )
+                    // InternalOCLstdlib.g:3521:1: 'property'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getPropertyKeyword_17());
@@ -10648,10 +10648,10 @@
                     }
                     break;
                 case 19 :
-                    // InternalOCLstdlib.g:3526:6: ( 'right' )
+                    // InternalOCLstdlib.g:3528:6: ( 'right' )
                     {
-                    // InternalOCLstdlib.g:3526:6: ( 'right' )
-                    // InternalOCLstdlib.g:3527:1: 'right'
+                    // InternalOCLstdlib.g:3528:6: ( 'right' )
+                    // InternalOCLstdlib.g:3529:1: 'right'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getRightKeyword_18());
@@ -10667,10 +10667,10 @@
                     }
                     break;
                 case 20 :
-                    // InternalOCLstdlib.g:3534:6: ( 'static' )
+                    // InternalOCLstdlib.g:3536:6: ( 'static' )
                     {
-                    // InternalOCLstdlib.g:3534:6: ( 'static' )
-                    // InternalOCLstdlib.g:3535:1: 'static'
+                    // InternalOCLstdlib.g:3536:6: ( 'static' )
+                    // InternalOCLstdlib.g:3537:1: 'static'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getStaticKeyword_19());
@@ -10686,10 +10686,10 @@
                     }
                     break;
                 case 21 :
-                    // InternalOCLstdlib.g:3542:6: ( 'type' )
+                    // InternalOCLstdlib.g:3544:6: ( 'type' )
                     {
-                    // InternalOCLstdlib.g:3542:6: ( 'type' )
-                    // InternalOCLstdlib.g:3543:1: 'type'
+                    // InternalOCLstdlib.g:3544:6: ( 'type' )
+                    // InternalOCLstdlib.g:3545:1: 'type'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getTypeKeyword_20());
@@ -10705,10 +10705,10 @@
                     }
                     break;
                 case 22 :
-                    // InternalOCLstdlib.g:3550:6: ( 'validating' )
+                    // InternalOCLstdlib.g:3552:6: ( 'validating' )
                     {
-                    // InternalOCLstdlib.g:3550:6: ( 'validating' )
-                    // InternalOCLstdlib.g:3551:1: 'validating'
+                    // InternalOCLstdlib.g:3552:6: ( 'validating' )
+                    // InternalOCLstdlib.g:3553:1: 'validating'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRestrictedKeywordsAccess().getValidatingKeyword_21());
@@ -10741,13 +10741,13 @@
 
 
     // $ANTLR start "rule__Name__Alternatives"
-    // InternalOCLstdlib.g:3563:1: rule__Name__Alternatives : ( ( ruleIdentifier ) | ( RULE_DOUBLE_QUOTED_STRING ) | ( ruleEssentialOCLReservedKeyword ) | ( rulePrimitiveTypeIdentifier ) | ( ruleCollectionTypeIdentifier ) );
+    // InternalOCLstdlib.g:3565:1: rule__Name__Alternatives : ( ( ruleIdentifier ) | ( RULE_DOUBLE_QUOTED_STRING ) | ( ruleEssentialOCLReservedKeyword ) | ( rulePrimitiveTypeIdentifier ) | ( ruleCollectionTypeIdentifier ) );
     public final void rule__Name__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3567:1: ( ( ruleIdentifier ) | ( RULE_DOUBLE_QUOTED_STRING ) | ( ruleEssentialOCLReservedKeyword ) | ( rulePrimitiveTypeIdentifier ) | ( ruleCollectionTypeIdentifier ) )
+            // InternalOCLstdlib.g:3569:1: ( ( ruleIdentifier ) | ( RULE_DOUBLE_QUOTED_STRING ) | ( ruleEssentialOCLReservedKeyword ) | ( rulePrimitiveTypeIdentifier ) | ( ruleCollectionTypeIdentifier ) )
             int alt4=5;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -10834,10 +10834,10 @@
 
             switch (alt4) {
                 case 1 :
-                    // InternalOCLstdlib.g:3568:1: ( ruleIdentifier )
+                    // InternalOCLstdlib.g:3570:1: ( ruleIdentifier )
                     {
-                    // InternalOCLstdlib.g:3568:1: ( ruleIdentifier )
-                    // InternalOCLstdlib.g:3569:1: ruleIdentifier
+                    // InternalOCLstdlib.g:3570:1: ( ruleIdentifier )
+                    // InternalOCLstdlib.g:3571:1: ruleIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNameAccess().getIdentifierParserRuleCall_0());
@@ -10857,10 +10857,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3574:6: ( RULE_DOUBLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3576:6: ( RULE_DOUBLE_QUOTED_STRING )
                     {
-                    // InternalOCLstdlib.g:3574:6: ( RULE_DOUBLE_QUOTED_STRING )
-                    // InternalOCLstdlib.g:3575:1: RULE_DOUBLE_QUOTED_STRING
+                    // InternalOCLstdlib.g:3576:6: ( RULE_DOUBLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3577:1: RULE_DOUBLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNameAccess().getDOUBLE_QUOTED_STRINGTerminalRuleCall_1());
@@ -10876,10 +10876,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3580:6: ( ruleEssentialOCLReservedKeyword )
+                    // InternalOCLstdlib.g:3582:6: ( ruleEssentialOCLReservedKeyword )
                     {
-                    // InternalOCLstdlib.g:3580:6: ( ruleEssentialOCLReservedKeyword )
-                    // InternalOCLstdlib.g:3581:1: ruleEssentialOCLReservedKeyword
+                    // InternalOCLstdlib.g:3582:6: ( ruleEssentialOCLReservedKeyword )
+                    // InternalOCLstdlib.g:3583:1: ruleEssentialOCLReservedKeyword
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNameAccess().getEssentialOCLReservedKeywordParserRuleCall_2());
@@ -10899,10 +10899,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:3586:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalOCLstdlib.g:3588:6: ( rulePrimitiveTypeIdentifier )
                     {
-                    // InternalOCLstdlib.g:3586:6: ( rulePrimitiveTypeIdentifier )
-                    // InternalOCLstdlib.g:3587:1: rulePrimitiveTypeIdentifier
+                    // InternalOCLstdlib.g:3588:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalOCLstdlib.g:3589:1: rulePrimitiveTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNameAccess().getPrimitiveTypeIdentifierParserRuleCall_3());
@@ -10922,10 +10922,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:3592:6: ( ruleCollectionTypeIdentifier )
+                    // InternalOCLstdlib.g:3594:6: ( ruleCollectionTypeIdentifier )
                     {
-                    // InternalOCLstdlib.g:3592:6: ( ruleCollectionTypeIdentifier )
-                    // InternalOCLstdlib.g:3593:1: ruleCollectionTypeIdentifier
+                    // InternalOCLstdlib.g:3594:6: ( ruleCollectionTypeIdentifier )
+                    // InternalOCLstdlib.g:3595:1: ruleCollectionTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNameAccess().getCollectionTypeIdentifierParserRuleCall_4());
@@ -10962,13 +10962,13 @@
 
 
     // $ANTLR start "rule__AnyName__Alternatives"
-    // InternalOCLstdlib.g:3603:1: rule__AnyName__Alternatives : ( ( ruleName ) | ( 'Lambda' ) | ( 'Map' ) | ( 'Tuple' ) );
+    // InternalOCLstdlib.g:3605:1: rule__AnyName__Alternatives : ( ( ruleName ) | ( 'Lambda' ) | ( 'Map' ) | ( 'Tuple' ) );
     public final void rule__AnyName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3607:1: ( ( ruleName ) | ( 'Lambda' ) | ( 'Map' ) | ( 'Tuple' ) )
+            // InternalOCLstdlib.g:3609:1: ( ( ruleName ) | ( 'Lambda' ) | ( 'Map' ) | ( 'Tuple' ) )
             int alt5=4;
             switch ( input.LA(1) ) {
             case RULE_DOUBLE_QUOTED_STRING:
@@ -11054,10 +11054,10 @@
 
             switch (alt5) {
                 case 1 :
-                    // InternalOCLstdlib.g:3608:1: ( ruleName )
+                    // InternalOCLstdlib.g:3610:1: ( ruleName )
                     {
-                    // InternalOCLstdlib.g:3608:1: ( ruleName )
-                    // InternalOCLstdlib.g:3609:1: ruleName
+                    // InternalOCLstdlib.g:3610:1: ( ruleName )
+                    // InternalOCLstdlib.g:3611:1: ruleName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnyNameAccess().getNameParserRuleCall_0());
@@ -11077,10 +11077,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3614:6: ( 'Lambda' )
+                    // InternalOCLstdlib.g:3616:6: ( 'Lambda' )
                     {
-                    // InternalOCLstdlib.g:3614:6: ( 'Lambda' )
-                    // InternalOCLstdlib.g:3615:1: 'Lambda'
+                    // InternalOCLstdlib.g:3616:6: ( 'Lambda' )
+                    // InternalOCLstdlib.g:3617:1: 'Lambda'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnyNameAccess().getLambdaKeyword_1());
@@ -11096,10 +11096,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3622:6: ( 'Map' )
+                    // InternalOCLstdlib.g:3624:6: ( 'Map' )
                     {
-                    // InternalOCLstdlib.g:3622:6: ( 'Map' )
-                    // InternalOCLstdlib.g:3623:1: 'Map'
+                    // InternalOCLstdlib.g:3624:6: ( 'Map' )
+                    // InternalOCLstdlib.g:3625:1: 'Map'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnyNameAccess().getMapKeyword_2());
@@ -11115,10 +11115,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:3630:6: ( 'Tuple' )
+                    // InternalOCLstdlib.g:3632:6: ( 'Tuple' )
                     {
-                    // InternalOCLstdlib.g:3630:6: ( 'Tuple' )
-                    // InternalOCLstdlib.g:3631:1: 'Tuple'
+                    // InternalOCLstdlib.g:3632:6: ( 'Tuple' )
+                    // InternalOCLstdlib.g:3633:1: 'Tuple'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnyNameAccess().getTupleKeyword_3());
@@ -11151,13 +11151,13 @@
 
 
     // $ANTLR start "rule__AnnotationCS__NameAlternatives_1_0"
-    // InternalOCLstdlib.g:3643:1: rule__AnnotationCS__NameAlternatives_1_0 : ( ( ruleIdentifier ) | ( RULE_SINGLE_QUOTED_STRING ) );
+    // InternalOCLstdlib.g:3645:1: rule__AnnotationCS__NameAlternatives_1_0 : ( ( ruleIdentifier ) | ( RULE_SINGLE_QUOTED_STRING ) );
     public final void rule__AnnotationCS__NameAlternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3647:1: ( ( ruleIdentifier ) | ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:3649:1: ( ( ruleIdentifier ) | ( RULE_SINGLE_QUOTED_STRING ) )
             int alt6=2;
             int LA6_0 = input.LA(1);
 
@@ -11176,10 +11176,10 @@
             }
             switch (alt6) {
                 case 1 :
-                    // InternalOCLstdlib.g:3648:1: ( ruleIdentifier )
+                    // InternalOCLstdlib.g:3650:1: ( ruleIdentifier )
                     {
-                    // InternalOCLstdlib.g:3648:1: ( ruleIdentifier )
-                    // InternalOCLstdlib.g:3649:1: ruleIdentifier
+                    // InternalOCLstdlib.g:3650:1: ( ruleIdentifier )
+                    // InternalOCLstdlib.g:3651:1: ruleIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getNameIdentifierParserRuleCall_1_0_0());
@@ -11199,10 +11199,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3654:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3656:6: ( RULE_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLstdlib.g:3654:6: ( RULE_SINGLE_QUOTED_STRING )
-                    // InternalOCLstdlib.g:3655:1: RULE_SINGLE_QUOTED_STRING
+                    // InternalOCLstdlib.g:3656:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3657:1: RULE_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_1_0_1());
@@ -11235,13 +11235,13 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Alternatives_3"
-    // InternalOCLstdlib.g:3665:1: rule__AnnotationCS__Alternatives_3 : ( ( ( rule__AnnotationCS__Group_3_0__0 ) ) | ( ';' ) );
+    // InternalOCLstdlib.g:3667:1: rule__AnnotationCS__Alternatives_3 : ( ( ( rule__AnnotationCS__Group_3_0__0 ) ) | ( ';' ) );
     public final void rule__AnnotationCS__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3669:1: ( ( ( rule__AnnotationCS__Group_3_0__0 ) ) | ( ';' ) )
+            // InternalOCLstdlib.g:3671:1: ( ( ( rule__AnnotationCS__Group_3_0__0 ) ) | ( ';' ) )
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -11260,16 +11260,16 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalOCLstdlib.g:3670:1: ( ( rule__AnnotationCS__Group_3_0__0 ) )
+                    // InternalOCLstdlib.g:3672:1: ( ( rule__AnnotationCS__Group_3_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:3670:1: ( ( rule__AnnotationCS__Group_3_0__0 ) )
-                    // InternalOCLstdlib.g:3671:1: ( rule__AnnotationCS__Group_3_0__0 )
+                    // InternalOCLstdlib.g:3672:1: ( ( rule__AnnotationCS__Group_3_0__0 ) )
+                    // InternalOCLstdlib.g:3673:1: ( rule__AnnotationCS__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getGroup_3_0());
                     }
-                    // InternalOCLstdlib.g:3672:1: ( rule__AnnotationCS__Group_3_0__0 )
-                    // InternalOCLstdlib.g:3672:2: rule__AnnotationCS__Group_3_0__0
+                    // InternalOCLstdlib.g:3674:1: ( rule__AnnotationCS__Group_3_0__0 )
+                    // InternalOCLstdlib.g:3674:2: rule__AnnotationCS__Group_3_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__Group_3_0__0();
@@ -11289,10 +11289,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3676:6: ( ';' )
+                    // InternalOCLstdlib.g:3678:6: ( ';' )
                     {
-                    // InternalOCLstdlib.g:3676:6: ( ';' )
-                    // InternalOCLstdlib.g:3677:1: ';'
+                    // InternalOCLstdlib.g:3678:6: ( ';' )
+                    // InternalOCLstdlib.g:3679:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationCSAccess().getSemicolonKeyword_3_1());
@@ -11325,13 +11325,13 @@
 
 
     // $ANTLR start "rule__AnnotationElementCS__Alternatives"
-    // InternalOCLstdlib.g:3689:1: rule__AnnotationElementCS__Alternatives : ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) );
+    // InternalOCLstdlib.g:3691:1: rule__AnnotationElementCS__Alternatives : ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) );
     public final void rule__AnnotationElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3693:1: ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) )
+            // InternalOCLstdlib.g:3695:1: ( ( ruleAnnotationCS ) | ( ruleDocumentationCS ) )
             int alt8=2;
             int LA8_0 = input.LA(1);
 
@@ -11350,10 +11350,10 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalOCLstdlib.g:3694:1: ( ruleAnnotationCS )
+                    // InternalOCLstdlib.g:3696:1: ( ruleAnnotationCS )
                     {
-                    // InternalOCLstdlib.g:3694:1: ( ruleAnnotationCS )
-                    // InternalOCLstdlib.g:3695:1: ruleAnnotationCS
+                    // InternalOCLstdlib.g:3696:1: ( ruleAnnotationCS )
+                    // InternalOCLstdlib.g:3697:1: ruleAnnotationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationElementCSAccess().getAnnotationCSParserRuleCall_0());
@@ -11373,10 +11373,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3700:6: ( ruleDocumentationCS )
+                    // InternalOCLstdlib.g:3702:6: ( ruleDocumentationCS )
                     {
-                    // InternalOCLstdlib.g:3700:6: ( ruleDocumentationCS )
-                    // InternalOCLstdlib.g:3701:1: ruleDocumentationCS
+                    // InternalOCLstdlib.g:3702:6: ( ruleDocumentationCS )
+                    // InternalOCLstdlib.g:3703:1: ruleDocumentationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getAnnotationElementCSAccess().getDocumentationCSParserRuleCall_1());
@@ -11413,13 +11413,13 @@
 
 
     // $ANTLR start "rule__LibClassCS__Alternatives_7"
-    // InternalOCLstdlib.g:3711:1: rule__LibClassCS__Alternatives_7 : ( ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) ) | ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) ) | ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) ) | ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) ) );
+    // InternalOCLstdlib.g:3713:1: rule__LibClassCS__Alternatives_7 : ( ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) ) | ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) ) | ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) ) | ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) ) );
     public final void rule__LibClassCS__Alternatives_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3715:1: ( ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) ) | ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) ) | ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) ) | ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) ) )
+            // InternalOCLstdlib.g:3717:1: ( ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) ) | ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) ) | ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) ) | ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) ) )
             int alt9=4;
             switch ( input.LA(1) ) {
             case 24:
@@ -11474,16 +11474,16 @@
 
             switch (alt9) {
                 case 1 :
-                    // InternalOCLstdlib.g:3716:1: ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) )
+                    // InternalOCLstdlib.g:3718:1: ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) )
                     {
-                    // InternalOCLstdlib.g:3716:1: ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) )
-                    // InternalOCLstdlib.g:3717:1: ( rule__LibClassCS__OwnedOperationsAssignment_7_0 )
+                    // InternalOCLstdlib.g:3718:1: ( ( rule__LibClassCS__OwnedOperationsAssignment_7_0 ) )
+                    // InternalOCLstdlib.g:3719:1: ( rule__LibClassCS__OwnedOperationsAssignment_7_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibClassCSAccess().getOwnedOperationsAssignment_7_0());
                     }
-                    // InternalOCLstdlib.g:3718:1: ( rule__LibClassCS__OwnedOperationsAssignment_7_0 )
-                    // InternalOCLstdlib.g:3718:2: rule__LibClassCS__OwnedOperationsAssignment_7_0
+                    // InternalOCLstdlib.g:3720:1: ( rule__LibClassCS__OwnedOperationsAssignment_7_0 )
+                    // InternalOCLstdlib.g:3720:2: rule__LibClassCS__OwnedOperationsAssignment_7_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__OwnedOperationsAssignment_7_0();
@@ -11503,16 +11503,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3722:6: ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) )
+                    // InternalOCLstdlib.g:3724:6: ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) )
                     {
-                    // InternalOCLstdlib.g:3722:6: ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) )
-                    // InternalOCLstdlib.g:3723:1: ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 )
+                    // InternalOCLstdlib.g:3724:6: ( ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 ) )
+                    // InternalOCLstdlib.g:3725:1: ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibClassCSAccess().getOwnedPropertiesAssignment_7_1());
                     }
-                    // InternalOCLstdlib.g:3724:1: ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 )
-                    // InternalOCLstdlib.g:3724:2: rule__LibClassCS__OwnedPropertiesAssignment_7_1
+                    // InternalOCLstdlib.g:3726:1: ( rule__LibClassCS__OwnedPropertiesAssignment_7_1 )
+                    // InternalOCLstdlib.g:3726:2: rule__LibClassCS__OwnedPropertiesAssignment_7_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__OwnedPropertiesAssignment_7_1();
@@ -11532,16 +11532,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3728:6: ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) )
+                    // InternalOCLstdlib.g:3730:6: ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) )
                     {
-                    // InternalOCLstdlib.g:3728:6: ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) )
-                    // InternalOCLstdlib.g:3729:1: ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 )
+                    // InternalOCLstdlib.g:3730:6: ( ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 ) )
+                    // InternalOCLstdlib.g:3731:1: ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibClassCSAccess().getOwnedConstraintsAssignment_7_2());
                     }
-                    // InternalOCLstdlib.g:3730:1: ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 )
-                    // InternalOCLstdlib.g:3730:2: rule__LibClassCS__OwnedConstraintsAssignment_7_2
+                    // InternalOCLstdlib.g:3732:1: ( rule__LibClassCS__OwnedConstraintsAssignment_7_2 )
+                    // InternalOCLstdlib.g:3732:2: rule__LibClassCS__OwnedConstraintsAssignment_7_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__OwnedConstraintsAssignment_7_2();
@@ -11561,16 +11561,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:3734:6: ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) )
+                    // InternalOCLstdlib.g:3736:6: ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) )
                     {
-                    // InternalOCLstdlib.g:3734:6: ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) )
-                    // InternalOCLstdlib.g:3735:1: ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 )
+                    // InternalOCLstdlib.g:3736:6: ( ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 ) )
+                    // InternalOCLstdlib.g:3737:1: ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibClassCSAccess().getOwnedAnnotationsAssignment_7_3());
                     }
-                    // InternalOCLstdlib.g:3736:1: ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 )
-                    // InternalOCLstdlib.g:3736:2: rule__LibClassCS__OwnedAnnotationsAssignment_7_3
+                    // InternalOCLstdlib.g:3738:1: ( rule__LibClassCS__OwnedAnnotationsAssignment_7_3 )
+                    // InternalOCLstdlib.g:3738:2: rule__LibClassCS__OwnedAnnotationsAssignment_7_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__OwnedAnnotationsAssignment_7_3();
@@ -11607,13 +11607,13 @@
 
 
     // $ANTLR start "rule__DetailCS__NameAlternatives_0_0"
-    // InternalOCLstdlib.g:3745:1: rule__DetailCS__NameAlternatives_0_0 : ( ( ruleName ) | ( RULE_SINGLE_QUOTED_STRING ) );
+    // InternalOCLstdlib.g:3747:1: rule__DetailCS__NameAlternatives_0_0 : ( ( ruleName ) | ( RULE_SINGLE_QUOTED_STRING ) );
     public final void rule__DetailCS__NameAlternatives_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3749:1: ( ( ruleName ) | ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:3751:1: ( ( ruleName ) | ( RULE_SINGLE_QUOTED_STRING ) )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -11632,10 +11632,10 @@
             }
             switch (alt10) {
                 case 1 :
-                    // InternalOCLstdlib.g:3750:1: ( ruleName )
+                    // InternalOCLstdlib.g:3752:1: ( ruleName )
                     {
-                    // InternalOCLstdlib.g:3750:1: ( ruleName )
-                    // InternalOCLstdlib.g:3751:1: ruleName
+                    // InternalOCLstdlib.g:3752:1: ( ruleName )
+                    // InternalOCLstdlib.g:3753:1: ruleName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getNameNameParserRuleCall_0_0_0());
@@ -11655,10 +11655,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3756:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3758:6: ( RULE_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLstdlib.g:3756:6: ( RULE_SINGLE_QUOTED_STRING )
-                    // InternalOCLstdlib.g:3757:1: RULE_SINGLE_QUOTED_STRING
+                    // InternalOCLstdlib.g:3758:6: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3759:1: RULE_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getNameSINGLE_QUOTED_STRINGTerminalRuleCall_0_0_1());
@@ -11691,13 +11691,13 @@
 
 
     // $ANTLR start "rule__DetailCS__ValuesAlternatives_2_0"
-    // InternalOCLstdlib.g:3767:1: rule__DetailCS__ValuesAlternatives_2_0 : ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) );
+    // InternalOCLstdlib.g:3769:1: rule__DetailCS__ValuesAlternatives_2_0 : ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) );
     public final void rule__DetailCS__ValuesAlternatives_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3771:1: ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:3773:1: ( ( RULE_SINGLE_QUOTED_STRING ) | ( RULE_ML_SINGLE_QUOTED_STRING ) )
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -11716,10 +11716,10 @@
             }
             switch (alt11) {
                 case 1 :
-                    // InternalOCLstdlib.g:3772:1: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3774:1: ( RULE_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLstdlib.g:3772:1: ( RULE_SINGLE_QUOTED_STRING )
-                    // InternalOCLstdlib.g:3773:1: RULE_SINGLE_QUOTED_STRING
+                    // InternalOCLstdlib.g:3774:1: ( RULE_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3775:1: RULE_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getValuesSINGLE_QUOTED_STRINGTerminalRuleCall_2_0_0());
@@ -11735,10 +11735,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3778:6: ( RULE_ML_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3780:6: ( RULE_ML_SINGLE_QUOTED_STRING )
                     {
-                    // InternalOCLstdlib.g:3778:6: ( RULE_ML_SINGLE_QUOTED_STRING )
-                    // InternalOCLstdlib.g:3779:1: RULE_ML_SINGLE_QUOTED_STRING
+                    // InternalOCLstdlib.g:3780:6: ( RULE_ML_SINGLE_QUOTED_STRING )
+                    // InternalOCLstdlib.g:3781:1: RULE_ML_SINGLE_QUOTED_STRING
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDetailCSAccess().getValuesML_SINGLE_QUOTED_STRINGTerminalRuleCall_2_0_1());
@@ -11771,13 +11771,13 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Alternatives_7"
-    // InternalOCLstdlib.g:3789:1: rule__LibCoercionCS__Alternatives_7 : ( ( ( rule__LibCoercionCS__Group_7_0__0 ) ) | ( ';' ) );
+    // InternalOCLstdlib.g:3791:1: rule__LibCoercionCS__Alternatives_7 : ( ( ( rule__LibCoercionCS__Group_7_0__0 ) ) | ( ';' ) );
     public final void rule__LibCoercionCS__Alternatives_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3793:1: ( ( ( rule__LibCoercionCS__Group_7_0__0 ) ) | ( ';' ) )
+            // InternalOCLstdlib.g:3795:1: ( ( ( rule__LibCoercionCS__Group_7_0__0 ) ) | ( ';' ) )
             int alt12=2;
             int LA12_0 = input.LA(1);
 
@@ -11796,16 +11796,16 @@
             }
             switch (alt12) {
                 case 1 :
-                    // InternalOCLstdlib.g:3794:1: ( ( rule__LibCoercionCS__Group_7_0__0 ) )
+                    // InternalOCLstdlib.g:3796:1: ( ( rule__LibCoercionCS__Group_7_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:3794:1: ( ( rule__LibCoercionCS__Group_7_0__0 ) )
-                    // InternalOCLstdlib.g:3795:1: ( rule__LibCoercionCS__Group_7_0__0 )
+                    // InternalOCLstdlib.g:3796:1: ( ( rule__LibCoercionCS__Group_7_0__0 ) )
+                    // InternalOCLstdlib.g:3797:1: ( rule__LibCoercionCS__Group_7_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibCoercionCSAccess().getGroup_7_0());
                     }
-                    // InternalOCLstdlib.g:3796:1: ( rule__LibCoercionCS__Group_7_0__0 )
-                    // InternalOCLstdlib.g:3796:2: rule__LibCoercionCS__Group_7_0__0
+                    // InternalOCLstdlib.g:3798:1: ( rule__LibCoercionCS__Group_7_0__0 )
+                    // InternalOCLstdlib.g:3798:2: rule__LibCoercionCS__Group_7_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibCoercionCS__Group_7_0__0();
@@ -11825,10 +11825,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3800:6: ( ';' )
+                    // InternalOCLstdlib.g:3802:6: ( ';' )
                     {
-                    // InternalOCLstdlib.g:3800:6: ( ';' )
-                    // InternalOCLstdlib.g:3801:1: ';'
+                    // InternalOCLstdlib.g:3802:6: ( ';' )
+                    // InternalOCLstdlib.g:3803:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibCoercionCSAccess().getSemicolonKeyword_7_1());
@@ -11861,13 +11861,13 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Alternatives_7_0_1"
-    // InternalOCLstdlib.g:3813:1: rule__LibCoercionCS__Alternatives_7_0_1 : ( ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) ) | ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) ) );
+    // InternalOCLstdlib.g:3815:1: rule__LibCoercionCS__Alternatives_7_0_1 : ( ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) ) | ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) ) );
     public final void rule__LibCoercionCS__Alternatives_7_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3817:1: ( ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) ) | ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) ) )
+            // InternalOCLstdlib.g:3819:1: ( ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) ) | ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) ) | ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) ) )
             int alt13=3;
             switch ( input.LA(1) ) {
             case 17:
@@ -11896,16 +11896,16 @@
 
             switch (alt13) {
                 case 1 :
-                    // InternalOCLstdlib.g:3818:1: ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
+                    // InternalOCLstdlib.g:3820:1: ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
                     {
-                    // InternalOCLstdlib.g:3818:1: ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
-                    // InternalOCLstdlib.g:3819:1: ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 )
+                    // InternalOCLstdlib.g:3820:1: ( ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 ) )
+                    // InternalOCLstdlib.g:3821:1: ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibCoercionCSAccess().getOwnedAnnotationsAssignment_7_0_1_0());
                     }
-                    // InternalOCLstdlib.g:3820:1: ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 )
-                    // InternalOCLstdlib.g:3820:2: rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0
+                    // InternalOCLstdlib.g:3822:1: ( rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 )
+                    // InternalOCLstdlib.g:3822:2: rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0();
@@ -11925,16 +11925,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3824:6: ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) )
+                    // InternalOCLstdlib.g:3826:6: ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) )
                     {
-                    // InternalOCLstdlib.g:3824:6: ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) )
-                    // InternalOCLstdlib.g:3825:1: ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 )
+                    // InternalOCLstdlib.g:3826:6: ( ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 ) )
+                    // InternalOCLstdlib.g:3827:1: ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibCoercionCSAccess().getOwnedPreconditionsAssignment_7_0_1_1());
                     }
-                    // InternalOCLstdlib.g:3826:1: ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 )
-                    // InternalOCLstdlib.g:3826:2: rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1
+                    // InternalOCLstdlib.g:3828:1: ( rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 )
+                    // InternalOCLstdlib.g:3828:2: rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1();
@@ -11954,16 +11954,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3830:6: ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) )
+                    // InternalOCLstdlib.g:3832:6: ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) )
                     {
-                    // InternalOCLstdlib.g:3830:6: ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) )
-                    // InternalOCLstdlib.g:3831:1: ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 )
+                    // InternalOCLstdlib.g:3832:6: ( ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 ) )
+                    // InternalOCLstdlib.g:3833:1: ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibCoercionCSAccess().getOwnedPostconditionsAssignment_7_0_1_2());
                     }
-                    // InternalOCLstdlib.g:3832:1: ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 )
-                    // InternalOCLstdlib.g:3832:2: rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2
+                    // InternalOCLstdlib.g:3834:1: ( rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 )
+                    // InternalOCLstdlib.g:3834:2: rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2();
@@ -12000,13 +12000,13 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Alternatives_14"
-    // InternalOCLstdlib.g:3841:1: rule__LibIterationCS__Alternatives_14 : ( ( ( rule__LibIterationCS__Group_14_0__0 ) ) | ( ';' ) );
+    // InternalOCLstdlib.g:3843:1: rule__LibIterationCS__Alternatives_14 : ( ( ( rule__LibIterationCS__Group_14_0__0 ) ) | ( ';' ) );
     public final void rule__LibIterationCS__Alternatives_14() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3845:1: ( ( ( rule__LibIterationCS__Group_14_0__0 ) ) | ( ';' ) )
+            // InternalOCLstdlib.g:3847:1: ( ( ( rule__LibIterationCS__Group_14_0__0 ) ) | ( ';' ) )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -12025,16 +12025,16 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalOCLstdlib.g:3846:1: ( ( rule__LibIterationCS__Group_14_0__0 ) )
+                    // InternalOCLstdlib.g:3848:1: ( ( rule__LibIterationCS__Group_14_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:3846:1: ( ( rule__LibIterationCS__Group_14_0__0 ) )
-                    // InternalOCLstdlib.g:3847:1: ( rule__LibIterationCS__Group_14_0__0 )
+                    // InternalOCLstdlib.g:3848:1: ( ( rule__LibIterationCS__Group_14_0__0 ) )
+                    // InternalOCLstdlib.g:3849:1: ( rule__LibIterationCS__Group_14_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibIterationCSAccess().getGroup_14_0());
                     }
-                    // InternalOCLstdlib.g:3848:1: ( rule__LibIterationCS__Group_14_0__0 )
-                    // InternalOCLstdlib.g:3848:2: rule__LibIterationCS__Group_14_0__0
+                    // InternalOCLstdlib.g:3850:1: ( rule__LibIterationCS__Group_14_0__0 )
+                    // InternalOCLstdlib.g:3850:2: rule__LibIterationCS__Group_14_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__Group_14_0__0();
@@ -12054,10 +12054,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3852:6: ( ';' )
+                    // InternalOCLstdlib.g:3854:6: ( ';' )
                     {
-                    // InternalOCLstdlib.g:3852:6: ( ';' )
-                    // InternalOCLstdlib.g:3853:1: ';'
+                    // InternalOCLstdlib.g:3854:6: ( ';' )
+                    // InternalOCLstdlib.g:3855:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibIterationCSAccess().getSemicolonKeyword_14_1());
@@ -12090,13 +12090,13 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Alternatives_14_0_1"
-    // InternalOCLstdlib.g:3865:1: rule__LibIterationCS__Alternatives_14_0_1 : ( ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) ) | ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) ) | ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) ) );
+    // InternalOCLstdlib.g:3867:1: rule__LibIterationCS__Alternatives_14_0_1 : ( ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) ) | ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) ) | ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) ) );
     public final void rule__LibIterationCS__Alternatives_14_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3869:1: ( ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) ) | ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) ) | ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) ) )
+            // InternalOCLstdlib.g:3871:1: ( ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) ) | ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) ) | ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) ) )
             int alt15=3;
             switch ( input.LA(1) ) {
             case 17:
@@ -12125,16 +12125,16 @@
 
             switch (alt15) {
                 case 1 :
-                    // InternalOCLstdlib.g:3870:1: ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) )
+                    // InternalOCLstdlib.g:3872:1: ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) )
                     {
-                    // InternalOCLstdlib.g:3870:1: ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) )
-                    // InternalOCLstdlib.g:3871:1: ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 )
+                    // InternalOCLstdlib.g:3872:1: ( ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 ) )
+                    // InternalOCLstdlib.g:3873:1: ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibIterationCSAccess().getOwnedAnnotationsAssignment_14_0_1_0());
                     }
-                    // InternalOCLstdlib.g:3872:1: ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 )
-                    // InternalOCLstdlib.g:3872:2: rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0
+                    // InternalOCLstdlib.g:3874:1: ( rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 )
+                    // InternalOCLstdlib.g:3874:2: rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0();
@@ -12154,16 +12154,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3876:6: ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) )
+                    // InternalOCLstdlib.g:3878:6: ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) )
                     {
-                    // InternalOCLstdlib.g:3876:6: ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) )
-                    // InternalOCLstdlib.g:3877:1: ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 )
+                    // InternalOCLstdlib.g:3878:6: ( ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 ) )
+                    // InternalOCLstdlib.g:3879:1: ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibIterationCSAccess().getOwnedPreconditionsAssignment_14_0_1_1());
                     }
-                    // InternalOCLstdlib.g:3878:1: ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 )
-                    // InternalOCLstdlib.g:3878:2: rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1
+                    // InternalOCLstdlib.g:3880:1: ( rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 )
+                    // InternalOCLstdlib.g:3880:2: rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1();
@@ -12183,16 +12183,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3882:6: ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) )
+                    // InternalOCLstdlib.g:3884:6: ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) )
                     {
-                    // InternalOCLstdlib.g:3882:6: ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) )
-                    // InternalOCLstdlib.g:3883:1: ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 )
+                    // InternalOCLstdlib.g:3884:6: ( ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 ) )
+                    // InternalOCLstdlib.g:3885:1: ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibIterationCSAccess().getOwnedPostconditionsAssignment_14_0_1_2());
                     }
-                    // InternalOCLstdlib.g:3884:1: ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 )
-                    // InternalOCLstdlib.g:3884:2: rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2
+                    // InternalOCLstdlib.g:3886:1: ( rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 )
+                    // InternalOCLstdlib.g:3886:2: rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2();
@@ -12229,13 +12229,13 @@
 
 
     // $ANTLR start "rule__OperationCS__Alternatives"
-    // InternalOCLstdlib.g:3893:1: rule__OperationCS__Alternatives : ( ( ruleLibCoercionCS ) | ( ruleLibIterationCS ) | ( ruleLibOperationCS ) );
+    // InternalOCLstdlib.g:3895:1: rule__OperationCS__Alternatives : ( ( ruleLibCoercionCS ) | ( ruleLibIterationCS ) | ( ruleLibOperationCS ) );
     public final void rule__OperationCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3897:1: ( ( ruleLibCoercionCS ) | ( ruleLibIterationCS ) | ( ruleLibOperationCS ) )
+            // InternalOCLstdlib.g:3899:1: ( ( ruleLibCoercionCS ) | ( ruleLibIterationCS ) | ( ruleLibOperationCS ) )
             int alt16=3;
             switch ( input.LA(1) ) {
             case 94:
@@ -12264,10 +12264,10 @@
 
             switch (alt16) {
                 case 1 :
-                    // InternalOCLstdlib.g:3898:1: ( ruleLibCoercionCS )
+                    // InternalOCLstdlib.g:3900:1: ( ruleLibCoercionCS )
                     {
-                    // InternalOCLstdlib.g:3898:1: ( ruleLibCoercionCS )
-                    // InternalOCLstdlib.g:3899:1: ruleLibCoercionCS
+                    // InternalOCLstdlib.g:3900:1: ( ruleLibCoercionCS )
+                    // InternalOCLstdlib.g:3901:1: ruleLibCoercionCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getLibCoercionCSParserRuleCall_0());
@@ -12287,10 +12287,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3904:6: ( ruleLibIterationCS )
+                    // InternalOCLstdlib.g:3906:6: ( ruleLibIterationCS )
                     {
-                    // InternalOCLstdlib.g:3904:6: ( ruleLibIterationCS )
-                    // InternalOCLstdlib.g:3905:1: ruleLibIterationCS
+                    // InternalOCLstdlib.g:3906:6: ( ruleLibIterationCS )
+                    // InternalOCLstdlib.g:3907:1: ruleLibIterationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getLibIterationCSParserRuleCall_1());
@@ -12310,10 +12310,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3910:6: ( ruleLibOperationCS )
+                    // InternalOCLstdlib.g:3912:6: ( ruleLibOperationCS )
                     {
-                    // InternalOCLstdlib.g:3910:6: ( ruleLibOperationCS )
-                    // InternalOCLstdlib.g:3911:1: ruleLibOperationCS
+                    // InternalOCLstdlib.g:3912:6: ( ruleLibOperationCS )
+                    // InternalOCLstdlib.g:3913:1: ruleLibOperationCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOperationCSAccess().getLibOperationCSParserRuleCall_2());
@@ -12350,13 +12350,13 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Alternatives_13"
-    // InternalOCLstdlib.g:3921:1: rule__LibOperationCS__Alternatives_13 : ( ( ( rule__LibOperationCS__Group_13_0__0 ) ) | ( ';' ) );
+    // InternalOCLstdlib.g:3923:1: rule__LibOperationCS__Alternatives_13 : ( ( ( rule__LibOperationCS__Group_13_0__0 ) ) | ( ';' ) );
     public final void rule__LibOperationCS__Alternatives_13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3925:1: ( ( ( rule__LibOperationCS__Group_13_0__0 ) ) | ( ';' ) )
+            // InternalOCLstdlib.g:3927:1: ( ( ( rule__LibOperationCS__Group_13_0__0 ) ) | ( ';' ) )
             int alt17=2;
             int LA17_0 = input.LA(1);
 
@@ -12375,16 +12375,16 @@
             }
             switch (alt17) {
                 case 1 :
-                    // InternalOCLstdlib.g:3926:1: ( ( rule__LibOperationCS__Group_13_0__0 ) )
+                    // InternalOCLstdlib.g:3928:1: ( ( rule__LibOperationCS__Group_13_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:3926:1: ( ( rule__LibOperationCS__Group_13_0__0 ) )
-                    // InternalOCLstdlib.g:3927:1: ( rule__LibOperationCS__Group_13_0__0 )
+                    // InternalOCLstdlib.g:3928:1: ( ( rule__LibOperationCS__Group_13_0__0 ) )
+                    // InternalOCLstdlib.g:3929:1: ( rule__LibOperationCS__Group_13_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibOperationCSAccess().getGroup_13_0());
                     }
-                    // InternalOCLstdlib.g:3928:1: ( rule__LibOperationCS__Group_13_0__0 )
-                    // InternalOCLstdlib.g:3928:2: rule__LibOperationCS__Group_13_0__0
+                    // InternalOCLstdlib.g:3930:1: ( rule__LibOperationCS__Group_13_0__0 )
+                    // InternalOCLstdlib.g:3930:2: rule__LibOperationCS__Group_13_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__Group_13_0__0();
@@ -12404,10 +12404,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3932:6: ( ';' )
+                    // InternalOCLstdlib.g:3934:6: ( ';' )
                     {
-                    // InternalOCLstdlib.g:3932:6: ( ';' )
-                    // InternalOCLstdlib.g:3933:1: ';'
+                    // InternalOCLstdlib.g:3934:6: ( ';' )
+                    // InternalOCLstdlib.g:3935:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibOperationCSAccess().getSemicolonKeyword_13_1());
@@ -12440,13 +12440,13 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Alternatives_13_0_1"
-    // InternalOCLstdlib.g:3945:1: rule__LibOperationCS__Alternatives_13_0_1 : ( ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) ) | ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) ) | ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) ) | ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) ) );
+    // InternalOCLstdlib.g:3947:1: rule__LibOperationCS__Alternatives_13_0_1 : ( ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) ) | ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) ) | ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) ) | ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) ) );
     public final void rule__LibOperationCS__Alternatives_13_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3949:1: ( ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) ) | ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) ) | ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) ) | ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) ) )
+            // InternalOCLstdlib.g:3951:1: ( ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) ) | ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) ) | ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) ) | ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) ) )
             int alt18=4;
             switch ( input.LA(1) ) {
             case 17:
@@ -12480,16 +12480,16 @@
 
             switch (alt18) {
                 case 1 :
-                    // InternalOCLstdlib.g:3950:1: ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) )
+                    // InternalOCLstdlib.g:3952:1: ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) )
                     {
-                    // InternalOCLstdlib.g:3950:1: ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) )
-                    // InternalOCLstdlib.g:3951:1: ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 )
+                    // InternalOCLstdlib.g:3952:1: ( ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 ) )
+                    // InternalOCLstdlib.g:3953:1: ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibOperationCSAccess().getOwnedAnnotationsAssignment_13_0_1_0());
                     }
-                    // InternalOCLstdlib.g:3952:1: ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 )
-                    // InternalOCLstdlib.g:3952:2: rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0
+                    // InternalOCLstdlib.g:3954:1: ( rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 )
+                    // InternalOCLstdlib.g:3954:2: rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0();
@@ -12509,16 +12509,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3956:6: ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) )
+                    // InternalOCLstdlib.g:3958:6: ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:3956:6: ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) )
-                    // InternalOCLstdlib.g:3957:1: ( rule__LibOperationCS__Group_13_0_1_1__0 )
+                    // InternalOCLstdlib.g:3958:6: ( ( rule__LibOperationCS__Group_13_0_1_1__0 ) )
+                    // InternalOCLstdlib.g:3959:1: ( rule__LibOperationCS__Group_13_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibOperationCSAccess().getGroup_13_0_1_1());
                     }
-                    // InternalOCLstdlib.g:3958:1: ( rule__LibOperationCS__Group_13_0_1_1__0 )
-                    // InternalOCLstdlib.g:3958:2: rule__LibOperationCS__Group_13_0_1_1__0
+                    // InternalOCLstdlib.g:3960:1: ( rule__LibOperationCS__Group_13_0_1_1__0 )
+                    // InternalOCLstdlib.g:3960:2: rule__LibOperationCS__Group_13_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__Group_13_0_1_1__0();
@@ -12538,16 +12538,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3962:6: ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) )
+                    // InternalOCLstdlib.g:3964:6: ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) )
                     {
-                    // InternalOCLstdlib.g:3962:6: ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) )
-                    // InternalOCLstdlib.g:3963:1: ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 )
+                    // InternalOCLstdlib.g:3964:6: ( ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 ) )
+                    // InternalOCLstdlib.g:3965:1: ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibOperationCSAccess().getOwnedPostconditionsAssignment_13_0_1_2());
                     }
-                    // InternalOCLstdlib.g:3964:1: ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 )
-                    // InternalOCLstdlib.g:3964:2: rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2
+                    // InternalOCLstdlib.g:3966:1: ( rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 )
+                    // InternalOCLstdlib.g:3966:2: rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2();
@@ -12567,16 +12567,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:3968:6: ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) )
+                    // InternalOCLstdlib.g:3970:6: ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) )
                     {
-                    // InternalOCLstdlib.g:3968:6: ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) )
-                    // InternalOCLstdlib.g:3969:1: ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 )
+                    // InternalOCLstdlib.g:3970:6: ( ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 ) )
+                    // InternalOCLstdlib.g:3971:1: ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibOperationCSAccess().getOwnedPreconditionsAssignment_13_0_1_3());
                     }
-                    // InternalOCLstdlib.g:3970:1: ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 )
-                    // InternalOCLstdlib.g:3970:2: rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3
+                    // InternalOCLstdlib.g:3972:1: ( rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 )
+                    // InternalOCLstdlib.g:3972:2: rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3();
@@ -12613,13 +12613,13 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Alternatives_4"
-    // InternalOCLstdlib.g:3979:1: rule__LibPackageCS__Alternatives_4 : ( ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__LibPackageCS__Group_4_1__0 ) ) | ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) ) | ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) ) );
+    // InternalOCLstdlib.g:3981:1: rule__LibPackageCS__Alternatives_4 : ( ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__LibPackageCS__Group_4_1__0 ) ) | ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) ) | ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) ) );
     public final void rule__LibPackageCS__Alternatives_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:3983:1: ( ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__LibPackageCS__Group_4_1__0 ) ) | ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) ) | ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) ) )
+            // InternalOCLstdlib.g:3985:1: ( ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__LibPackageCS__Group_4_1__0 ) ) | ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) ) | ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) ) )
             int alt19=4;
             switch ( input.LA(1) ) {
             case 29:
@@ -12654,16 +12654,16 @@
 
             switch (alt19) {
                 case 1 :
-                    // InternalOCLstdlib.g:3984:1: ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) )
+                    // InternalOCLstdlib.g:3986:1: ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) )
                     {
-                    // InternalOCLstdlib.g:3984:1: ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) )
-                    // InternalOCLstdlib.g:3985:1: ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 )
+                    // InternalOCLstdlib.g:3986:1: ( ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 ) )
+                    // InternalOCLstdlib.g:3987:1: ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibPackageCSAccess().getOwnedPackagesAssignment_4_0());
                     }
-                    // InternalOCLstdlib.g:3986:1: ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 )
-                    // InternalOCLstdlib.g:3986:2: rule__LibPackageCS__OwnedPackagesAssignment_4_0
+                    // InternalOCLstdlib.g:3988:1: ( rule__LibPackageCS__OwnedPackagesAssignment_4_0 )
+                    // InternalOCLstdlib.g:3988:2: rule__LibPackageCS__OwnedPackagesAssignment_4_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPackageCS__OwnedPackagesAssignment_4_0();
@@ -12683,16 +12683,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:3990:6: ( ( rule__LibPackageCS__Group_4_1__0 ) )
+                    // InternalOCLstdlib.g:3992:6: ( ( rule__LibPackageCS__Group_4_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:3990:6: ( ( rule__LibPackageCS__Group_4_1__0 ) )
-                    // InternalOCLstdlib.g:3991:1: ( rule__LibPackageCS__Group_4_1__0 )
+                    // InternalOCLstdlib.g:3992:6: ( ( rule__LibPackageCS__Group_4_1__0 ) )
+                    // InternalOCLstdlib.g:3993:1: ( rule__LibPackageCS__Group_4_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibPackageCSAccess().getGroup_4_1());
                     }
-                    // InternalOCLstdlib.g:3992:1: ( rule__LibPackageCS__Group_4_1__0 )
-                    // InternalOCLstdlib.g:3992:2: rule__LibPackageCS__Group_4_1__0
+                    // InternalOCLstdlib.g:3994:1: ( rule__LibPackageCS__Group_4_1__0 )
+                    // InternalOCLstdlib.g:3994:2: rule__LibPackageCS__Group_4_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPackageCS__Group_4_1__0();
@@ -12712,16 +12712,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:3996:6: ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) )
+                    // InternalOCLstdlib.g:3998:6: ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) )
                     {
-                    // InternalOCLstdlib.g:3996:6: ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) )
-                    // InternalOCLstdlib.g:3997:1: ( rule__LibPackageCS__OwnedClassesAssignment_4_2 )
+                    // InternalOCLstdlib.g:3998:6: ( ( rule__LibPackageCS__OwnedClassesAssignment_4_2 ) )
+                    // InternalOCLstdlib.g:3999:1: ( rule__LibPackageCS__OwnedClassesAssignment_4_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibPackageCSAccess().getOwnedClassesAssignment_4_2());
                     }
-                    // InternalOCLstdlib.g:3998:1: ( rule__LibPackageCS__OwnedClassesAssignment_4_2 )
-                    // InternalOCLstdlib.g:3998:2: rule__LibPackageCS__OwnedClassesAssignment_4_2
+                    // InternalOCLstdlib.g:4000:1: ( rule__LibPackageCS__OwnedClassesAssignment_4_2 )
+                    // InternalOCLstdlib.g:4000:2: rule__LibPackageCS__OwnedClassesAssignment_4_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPackageCS__OwnedClassesAssignment_4_2();
@@ -12741,16 +12741,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4002:6: ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) )
+                    // InternalOCLstdlib.g:4004:6: ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) )
                     {
-                    // InternalOCLstdlib.g:4002:6: ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) )
-                    // InternalOCLstdlib.g:4003:1: ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 )
+                    // InternalOCLstdlib.g:4004:6: ( ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 ) )
+                    // InternalOCLstdlib.g:4005:1: ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibPackageCSAccess().getOwnedAnnotationsAssignment_4_3());
                     }
-                    // InternalOCLstdlib.g:4004:1: ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 )
-                    // InternalOCLstdlib.g:4004:2: rule__LibPackageCS__OwnedAnnotationsAssignment_4_3
+                    // InternalOCLstdlib.g:4006:1: ( rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 )
+                    // InternalOCLstdlib.g:4006:2: rule__LibPackageCS__OwnedAnnotationsAssignment_4_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPackageCS__OwnedAnnotationsAssignment_4_3();
@@ -12787,13 +12787,13 @@
 
 
     // $ANTLR start "rule__PackageCS__Alternatives_4"
-    // InternalOCLstdlib.g:4013:1: rule__PackageCS__Alternatives_4 : ( ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) ) | ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) ) );
+    // InternalOCLstdlib.g:4015:1: rule__PackageCS__Alternatives_4 : ( ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) ) | ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) ) );
     public final void rule__PackageCS__Alternatives_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4017:1: ( ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) ) | ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) ) )
+            // InternalOCLstdlib.g:4019:1: ( ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) ) | ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) ) | ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) ) )
             int alt20=3;
             switch ( input.LA(1) ) {
             case 29:
@@ -12823,16 +12823,16 @@
 
             switch (alt20) {
                 case 1 :
-                    // InternalOCLstdlib.g:4018:1: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) )
+                    // InternalOCLstdlib.g:4020:1: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) )
                     {
-                    // InternalOCLstdlib.g:4018:1: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) )
-                    // InternalOCLstdlib.g:4019:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0 )
+                    // InternalOCLstdlib.g:4020:1: ( ( rule__PackageCS__OwnedPackagesAssignment_4_0 ) )
+                    // InternalOCLstdlib.g:4021:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getOwnedPackagesAssignment_4_0());
                     }
-                    // InternalOCLstdlib.g:4020:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0 )
-                    // InternalOCLstdlib.g:4020:2: rule__PackageCS__OwnedPackagesAssignment_4_0
+                    // InternalOCLstdlib.g:4022:1: ( rule__PackageCS__OwnedPackagesAssignment_4_0 )
+                    // InternalOCLstdlib.g:4022:2: rule__PackageCS__OwnedPackagesAssignment_4_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__OwnedPackagesAssignment_4_0();
@@ -12852,16 +12852,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4024:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) )
+                    // InternalOCLstdlib.g:4026:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) )
                     {
-                    // InternalOCLstdlib.g:4024:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) )
-                    // InternalOCLstdlib.g:4025:1: ( rule__PackageCS__OwnedClassesAssignment_4_1 )
+                    // InternalOCLstdlib.g:4026:6: ( ( rule__PackageCS__OwnedClassesAssignment_4_1 ) )
+                    // InternalOCLstdlib.g:4027:1: ( rule__PackageCS__OwnedClassesAssignment_4_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getOwnedClassesAssignment_4_1());
                     }
-                    // InternalOCLstdlib.g:4026:1: ( rule__PackageCS__OwnedClassesAssignment_4_1 )
-                    // InternalOCLstdlib.g:4026:2: rule__PackageCS__OwnedClassesAssignment_4_1
+                    // InternalOCLstdlib.g:4028:1: ( rule__PackageCS__OwnedClassesAssignment_4_1 )
+                    // InternalOCLstdlib.g:4028:2: rule__PackageCS__OwnedClassesAssignment_4_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__OwnedClassesAssignment_4_1();
@@ -12881,16 +12881,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4030:6: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) )
+                    // InternalOCLstdlib.g:4032:6: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) )
                     {
-                    // InternalOCLstdlib.g:4030:6: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) )
-                    // InternalOCLstdlib.g:4031:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 )
+                    // InternalOCLstdlib.g:4032:6: ( ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 ) )
+                    // InternalOCLstdlib.g:4033:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAssignment_4_2());
                     }
-                    // InternalOCLstdlib.g:4032:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 )
-                    // InternalOCLstdlib.g:4032:2: rule__PackageCS__OwnedAnnotationsAssignment_4_2
+                    // InternalOCLstdlib.g:4034:1: ( rule__PackageCS__OwnedAnnotationsAssignment_4_2 )
+                    // InternalOCLstdlib.g:4034:2: rule__PackageCS__OwnedAnnotationsAssignment_4_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__OwnedAnnotationsAssignment_4_2();
@@ -12927,13 +12927,13 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Alternatives_7"
-    // InternalOCLstdlib.g:4041:1: rule__LibPropertyCS__Alternatives_7 : ( ( ( rule__LibPropertyCS__Group_7_0__0 ) ) | ( ';' ) );
+    // InternalOCLstdlib.g:4043:1: rule__LibPropertyCS__Alternatives_7 : ( ( ( rule__LibPropertyCS__Group_7_0__0 ) ) | ( ';' ) );
     public final void rule__LibPropertyCS__Alternatives_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4045:1: ( ( ( rule__LibPropertyCS__Group_7_0__0 ) ) | ( ';' ) )
+            // InternalOCLstdlib.g:4047:1: ( ( ( rule__LibPropertyCS__Group_7_0__0 ) ) | ( ';' ) )
             int alt21=2;
             int LA21_0 = input.LA(1);
 
@@ -12952,16 +12952,16 @@
             }
             switch (alt21) {
                 case 1 :
-                    // InternalOCLstdlib.g:4046:1: ( ( rule__LibPropertyCS__Group_7_0__0 ) )
+                    // InternalOCLstdlib.g:4048:1: ( ( rule__LibPropertyCS__Group_7_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:4046:1: ( ( rule__LibPropertyCS__Group_7_0__0 ) )
-                    // InternalOCLstdlib.g:4047:1: ( rule__LibPropertyCS__Group_7_0__0 )
+                    // InternalOCLstdlib.g:4048:1: ( ( rule__LibPropertyCS__Group_7_0__0 ) )
+                    // InternalOCLstdlib.g:4049:1: ( rule__LibPropertyCS__Group_7_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibPropertyCSAccess().getGroup_7_0());
                     }
-                    // InternalOCLstdlib.g:4048:1: ( rule__LibPropertyCS__Group_7_0__0 )
-                    // InternalOCLstdlib.g:4048:2: rule__LibPropertyCS__Group_7_0__0
+                    // InternalOCLstdlib.g:4050:1: ( rule__LibPropertyCS__Group_7_0__0 )
+                    // InternalOCLstdlib.g:4050:2: rule__LibPropertyCS__Group_7_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPropertyCS__Group_7_0__0();
@@ -12981,10 +12981,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4052:6: ( ';' )
+                    // InternalOCLstdlib.g:4054:6: ( ';' )
                     {
-                    // InternalOCLstdlib.g:4052:6: ( ';' )
-                    // InternalOCLstdlib.g:4053:1: ';'
+                    // InternalOCLstdlib.g:4054:6: ( ';' )
+                    // InternalOCLstdlib.g:4055:1: ';'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getLibPropertyCSAccess().getSemicolonKeyword_7_1());
@@ -13017,13 +13017,13 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Alternatives_0"
-    // InternalOCLstdlib.g:4065:1: rule__PrecedenceCS__Alternatives_0 : ( ( 'left' ) | ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) ) );
+    // InternalOCLstdlib.g:4067:1: rule__PrecedenceCS__Alternatives_0 : ( ( 'left' ) | ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) ) );
     public final void rule__PrecedenceCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4069:1: ( ( 'left' ) | ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) ) )
+            // InternalOCLstdlib.g:4071:1: ( ( 'left' ) | ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) ) )
             int alt22=2;
             int LA22_0 = input.LA(1);
 
@@ -13042,10 +13042,10 @@
             }
             switch (alt22) {
                 case 1 :
-                    // InternalOCLstdlib.g:4070:1: ( 'left' )
+                    // InternalOCLstdlib.g:4072:1: ( 'left' )
                     {
-                    // InternalOCLstdlib.g:4070:1: ( 'left' )
-                    // InternalOCLstdlib.g:4071:1: 'left'
+                    // InternalOCLstdlib.g:4072:1: ( 'left' )
+                    // InternalOCLstdlib.g:4073:1: 'left'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrecedenceCSAccess().getLeftKeyword_0_0());
@@ -13061,16 +13061,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4078:6: ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) )
+                    // InternalOCLstdlib.g:4080:6: ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) )
                     {
-                    // InternalOCLstdlib.g:4078:6: ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) )
-                    // InternalOCLstdlib.g:4079:1: ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 )
+                    // InternalOCLstdlib.g:4080:6: ( ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 ) )
+                    // InternalOCLstdlib.g:4081:1: ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrecedenceCSAccess().getIsRightAssociativeAssignment_0_1());
                     }
-                    // InternalOCLstdlib.g:4080:1: ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 )
-                    // InternalOCLstdlib.g:4080:2: rule__PrecedenceCS__IsRightAssociativeAssignment_0_1
+                    // InternalOCLstdlib.g:4082:1: ( rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 )
+                    // InternalOCLstdlib.g:4082:2: rule__PrecedenceCS__IsRightAssociativeAssignment_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrecedenceCS__IsRightAssociativeAssignment_0_1();
@@ -13107,13 +13107,13 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Alternatives_0"
-    // InternalOCLstdlib.g:4089:1: rule__TypedMultiplicityRefCS__Alternatives_0 : ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) );
+    // InternalOCLstdlib.g:4091:1: rule__TypedMultiplicityRefCS__Alternatives_0 : ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) );
     public final void rule__TypedMultiplicityRefCS__Alternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4093:1: ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) )
+            // InternalOCLstdlib.g:4095:1: ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) )
             int alt23=4;
             switch ( input.LA(1) ) {
             case 39:
@@ -13200,10 +13200,10 @@
 
             switch (alt23) {
                 case 1 :
-                    // InternalOCLstdlib.g:4094:1: ( ruleMapTypeCS )
+                    // InternalOCLstdlib.g:4096:1: ( ruleMapTypeCS )
                     {
-                    // InternalOCLstdlib.g:4094:1: ( ruleMapTypeCS )
-                    // InternalOCLstdlib.g:4095:1: ruleMapTypeCS
+                    // InternalOCLstdlib.g:4096:1: ( ruleMapTypeCS )
+                    // InternalOCLstdlib.g:4097:1: ruleMapTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedMultiplicityRefCSAccess().getMapTypeCSParserRuleCall_0_0());
@@ -13223,10 +13223,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4100:6: ( ruleTupleTypeCS )
+                    // InternalOCLstdlib.g:4102:6: ( ruleTupleTypeCS )
                     {
-                    // InternalOCLstdlib.g:4100:6: ( ruleTupleTypeCS )
-                    // InternalOCLstdlib.g:4101:1: ruleTupleTypeCS
+                    // InternalOCLstdlib.g:4102:6: ( ruleTupleTypeCS )
+                    // InternalOCLstdlib.g:4103:1: ruleTupleTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedMultiplicityRefCSAccess().getTupleTypeCSParserRuleCall_0_1());
@@ -13246,10 +13246,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4106:6: ( ruleTypedTypeRefCS )
+                    // InternalOCLstdlib.g:4108:6: ( ruleTypedTypeRefCS )
                     {
-                    // InternalOCLstdlib.g:4106:6: ( ruleTypedTypeRefCS )
-                    // InternalOCLstdlib.g:4107:1: ruleTypedTypeRefCS
+                    // InternalOCLstdlib.g:4108:6: ( ruleTypedTypeRefCS )
+                    // InternalOCLstdlib.g:4109:1: ruleTypedTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedMultiplicityRefCSAccess().getTypedTypeRefCSParserRuleCall_0_2());
@@ -13269,10 +13269,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4112:6: ( ruleLambdaTypeCS )
+                    // InternalOCLstdlib.g:4114:6: ( ruleLambdaTypeCS )
                     {
-                    // InternalOCLstdlib.g:4112:6: ( ruleLambdaTypeCS )
-                    // InternalOCLstdlib.g:4113:1: ruleLambdaTypeCS
+                    // InternalOCLstdlib.g:4114:6: ( ruleLambdaTypeCS )
+                    // InternalOCLstdlib.g:4115:1: ruleLambdaTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedMultiplicityRefCSAccess().getLambdaTypeCSParserRuleCall_0_3());
@@ -13309,13 +13309,13 @@
 
 
     // $ANTLR start "rule__TypedRefCS__Alternatives"
-    // InternalOCLstdlib.g:4123:1: rule__TypedRefCS__Alternatives : ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) );
+    // InternalOCLstdlib.g:4125:1: rule__TypedRefCS__Alternatives : ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) );
     public final void rule__TypedRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4127:1: ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) )
+            // InternalOCLstdlib.g:4129:1: ( ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) | ( ruleTypedTypeRefCS ) | ( ruleLambdaTypeCS ) )
             int alt24=4;
             switch ( input.LA(1) ) {
             case 39:
@@ -13402,10 +13402,10 @@
 
             switch (alt24) {
                 case 1 :
-                    // InternalOCLstdlib.g:4128:1: ( ruleMapTypeCS )
+                    // InternalOCLstdlib.g:4130:1: ( ruleMapTypeCS )
                     {
-                    // InternalOCLstdlib.g:4128:1: ( ruleMapTypeCS )
-                    // InternalOCLstdlib.g:4129:1: ruleMapTypeCS
+                    // InternalOCLstdlib.g:4130:1: ( ruleMapTypeCS )
+                    // InternalOCLstdlib.g:4131:1: ruleMapTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getMapTypeCSParserRuleCall_0());
@@ -13425,10 +13425,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4134:6: ( ruleTupleTypeCS )
+                    // InternalOCLstdlib.g:4136:6: ( ruleTupleTypeCS )
                     {
-                    // InternalOCLstdlib.g:4134:6: ( ruleTupleTypeCS )
-                    // InternalOCLstdlib.g:4135:1: ruleTupleTypeCS
+                    // InternalOCLstdlib.g:4136:6: ( ruleTupleTypeCS )
+                    // InternalOCLstdlib.g:4137:1: ruleTupleTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getTupleTypeCSParserRuleCall_1());
@@ -13448,10 +13448,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4140:6: ( ruleTypedTypeRefCS )
+                    // InternalOCLstdlib.g:4142:6: ( ruleTypedTypeRefCS )
                     {
-                    // InternalOCLstdlib.g:4140:6: ( ruleTypedTypeRefCS )
-                    // InternalOCLstdlib.g:4141:1: ruleTypedTypeRefCS
+                    // InternalOCLstdlib.g:4142:6: ( ruleTypedTypeRefCS )
+                    // InternalOCLstdlib.g:4143:1: ruleTypedTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_2());
@@ -13471,10 +13471,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4146:6: ( ruleLambdaTypeCS )
+                    // InternalOCLstdlib.g:4148:6: ( ruleLambdaTypeCS )
                     {
-                    // InternalOCLstdlib.g:4146:6: ( ruleLambdaTypeCS )
-                    // InternalOCLstdlib.g:4147:1: ruleLambdaTypeCS
+                    // InternalOCLstdlib.g:4148:6: ( ruleLambdaTypeCS )
+                    // InternalOCLstdlib.g:4149:1: ruleLambdaTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedRefCSAccess().getLambdaTypeCSParserRuleCall_3());
@@ -13511,13 +13511,13 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Alternatives"
-    // InternalOCLstdlib.g:4157:1: rule__TypedTypeRefCS__Alternatives : ( ( ( rule__TypedTypeRefCS__Group_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1__0 ) ) );
+    // InternalOCLstdlib.g:4159:1: rule__TypedTypeRefCS__Alternatives : ( ( ( rule__TypedTypeRefCS__Group_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1__0 ) ) );
     public final void rule__TypedTypeRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4161:1: ( ( ( rule__TypedTypeRefCS__Group_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1__0 ) ) )
+            // InternalOCLstdlib.g:4163:1: ( ( ( rule__TypedTypeRefCS__Group_0__0 ) ) | ( ( rule__TypedTypeRefCS__Group_1__0 ) ) )
             int alt25=2;
             int LA25_0 = input.LA(1);
 
@@ -13536,16 +13536,16 @@
             }
             switch (alt25) {
                 case 1 :
-                    // InternalOCLstdlib.g:4162:1: ( ( rule__TypedTypeRefCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4164:1: ( ( rule__TypedTypeRefCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:4162:1: ( ( rule__TypedTypeRefCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:4163:1: ( rule__TypedTypeRefCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4164:1: ( ( rule__TypedTypeRefCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4165:1: ( rule__TypedTypeRefCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedTypeRefCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:4164:1: ( rule__TypedTypeRefCS__Group_0__0 )
-                    // InternalOCLstdlib.g:4164:2: rule__TypedTypeRefCS__Group_0__0
+                    // InternalOCLstdlib.g:4166:1: ( rule__TypedTypeRefCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4166:2: rule__TypedTypeRefCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_0__0();
@@ -13565,16 +13565,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4168:6: ( ( rule__TypedTypeRefCS__Group_1__0 ) )
+                    // InternalOCLstdlib.g:4170:6: ( ( rule__TypedTypeRefCS__Group_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:4168:6: ( ( rule__TypedTypeRefCS__Group_1__0 ) )
-                    // InternalOCLstdlib.g:4169:1: ( rule__TypedTypeRefCS__Group_1__0 )
+                    // InternalOCLstdlib.g:4170:6: ( ( rule__TypedTypeRefCS__Group_1__0 ) )
+                    // InternalOCLstdlib.g:4171:1: ( rule__TypedTypeRefCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1());
                     }
-                    // InternalOCLstdlib.g:4170:1: ( rule__TypedTypeRefCS__Group_1__0 )
-                    // InternalOCLstdlib.g:4170:2: rule__TypedTypeRefCS__Group_1__0
+                    // InternalOCLstdlib.g:4172:1: ( rule__TypedTypeRefCS__Group_1__0 )
+                    // InternalOCLstdlib.g:4172:2: rule__TypedTypeRefCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1__0();
@@ -13611,13 +13611,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLReservedKeyword__Alternatives"
-    // InternalOCLstdlib.g:4179:1: rule__EssentialOCLReservedKeyword__Alternatives : ( ( 'and' ) | ( 'and2' ) | ( 'else' ) | ( 'endif' ) | ( 'if' ) | ( 'implies' ) | ( 'implies2' ) | ( 'in' ) | ( 'let' ) | ( 'not' ) | ( 'not2' ) | ( 'or' ) | ( 'or2' ) | ( 'then' ) | ( 'xor' ) | ( 'xor2' ) );
+    // InternalOCLstdlib.g:4181:1: rule__EssentialOCLReservedKeyword__Alternatives : ( ( 'and' ) | ( 'and2' ) | ( 'else' ) | ( 'endif' ) | ( 'if' ) | ( 'implies' ) | ( 'implies2' ) | ( 'in' ) | ( 'let' ) | ( 'not' ) | ( 'not2' ) | ( 'or' ) | ( 'or2' ) | ( 'then' ) | ( 'xor' ) | ( 'xor2' ) );
     public final void rule__EssentialOCLReservedKeyword__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4183:1: ( ( 'and' ) | ( 'and2' ) | ( 'else' ) | ( 'endif' ) | ( 'if' ) | ( 'implies' ) | ( 'implies2' ) | ( 'in' ) | ( 'let' ) | ( 'not' ) | ( 'not2' ) | ( 'or' ) | ( 'or2' ) | ( 'then' ) | ( 'xor' ) | ( 'xor2' ) )
+            // InternalOCLstdlib.g:4185:1: ( ( 'and' ) | ( 'and2' ) | ( 'else' ) | ( 'endif' ) | ( 'if' ) | ( 'implies' ) | ( 'implies2' ) | ( 'in' ) | ( 'let' ) | ( 'not' ) | ( 'not2' ) | ( 'or' ) | ( 'or2' ) | ( 'then' ) | ( 'xor' ) | ( 'xor2' ) )
             int alt26=16;
             switch ( input.LA(1) ) {
             case 42:
@@ -13710,10 +13710,10 @@
 
             switch (alt26) {
                 case 1 :
-                    // InternalOCLstdlib.g:4184:1: ( 'and' )
+                    // InternalOCLstdlib.g:4186:1: ( 'and' )
                     {
-                    // InternalOCLstdlib.g:4184:1: ( 'and' )
-                    // InternalOCLstdlib.g:4185:1: 'and'
+                    // InternalOCLstdlib.g:4186:1: ( 'and' )
+                    // InternalOCLstdlib.g:4187:1: 'and'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getAndKeyword_0());
@@ -13729,10 +13729,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4192:6: ( 'and2' )
+                    // InternalOCLstdlib.g:4194:6: ( 'and2' )
                     {
-                    // InternalOCLstdlib.g:4192:6: ( 'and2' )
-                    // InternalOCLstdlib.g:4193:1: 'and2'
+                    // InternalOCLstdlib.g:4194:6: ( 'and2' )
+                    // InternalOCLstdlib.g:4195:1: 'and2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getAnd2Keyword_1());
@@ -13748,10 +13748,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4200:6: ( 'else' )
+                    // InternalOCLstdlib.g:4202:6: ( 'else' )
                     {
-                    // InternalOCLstdlib.g:4200:6: ( 'else' )
-                    // InternalOCLstdlib.g:4201:1: 'else'
+                    // InternalOCLstdlib.g:4202:6: ( 'else' )
+                    // InternalOCLstdlib.g:4203:1: 'else'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getElseKeyword_2());
@@ -13767,10 +13767,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4208:6: ( 'endif' )
+                    // InternalOCLstdlib.g:4210:6: ( 'endif' )
                     {
-                    // InternalOCLstdlib.g:4208:6: ( 'endif' )
-                    // InternalOCLstdlib.g:4209:1: 'endif'
+                    // InternalOCLstdlib.g:4210:6: ( 'endif' )
+                    // InternalOCLstdlib.g:4211:1: 'endif'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getEndifKeyword_3());
@@ -13786,10 +13786,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:4216:6: ( 'if' )
+                    // InternalOCLstdlib.g:4218:6: ( 'if' )
                     {
-                    // InternalOCLstdlib.g:4216:6: ( 'if' )
-                    // InternalOCLstdlib.g:4217:1: 'if'
+                    // InternalOCLstdlib.g:4218:6: ( 'if' )
+                    // InternalOCLstdlib.g:4219:1: 'if'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getIfKeyword_4());
@@ -13805,10 +13805,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLstdlib.g:4224:6: ( 'implies' )
+                    // InternalOCLstdlib.g:4226:6: ( 'implies' )
                     {
-                    // InternalOCLstdlib.g:4224:6: ( 'implies' )
-                    // InternalOCLstdlib.g:4225:1: 'implies'
+                    // InternalOCLstdlib.g:4226:6: ( 'implies' )
+                    // InternalOCLstdlib.g:4227:1: 'implies'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getImpliesKeyword_5());
@@ -13824,10 +13824,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLstdlib.g:4232:6: ( 'implies2' )
+                    // InternalOCLstdlib.g:4234:6: ( 'implies2' )
                     {
-                    // InternalOCLstdlib.g:4232:6: ( 'implies2' )
-                    // InternalOCLstdlib.g:4233:1: 'implies2'
+                    // InternalOCLstdlib.g:4234:6: ( 'implies2' )
+                    // InternalOCLstdlib.g:4235:1: 'implies2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getImplies2Keyword_6());
@@ -13843,10 +13843,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLstdlib.g:4240:6: ( 'in' )
+                    // InternalOCLstdlib.g:4242:6: ( 'in' )
                     {
-                    // InternalOCLstdlib.g:4240:6: ( 'in' )
-                    // InternalOCLstdlib.g:4241:1: 'in'
+                    // InternalOCLstdlib.g:4242:6: ( 'in' )
+                    // InternalOCLstdlib.g:4243:1: 'in'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getInKeyword_7());
@@ -13862,10 +13862,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLstdlib.g:4248:6: ( 'let' )
+                    // InternalOCLstdlib.g:4250:6: ( 'let' )
                     {
-                    // InternalOCLstdlib.g:4248:6: ( 'let' )
-                    // InternalOCLstdlib.g:4249:1: 'let'
+                    // InternalOCLstdlib.g:4250:6: ( 'let' )
+                    // InternalOCLstdlib.g:4251:1: 'let'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getLetKeyword_8());
@@ -13881,10 +13881,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLstdlib.g:4256:6: ( 'not' )
+                    // InternalOCLstdlib.g:4258:6: ( 'not' )
                     {
-                    // InternalOCLstdlib.g:4256:6: ( 'not' )
-                    // InternalOCLstdlib.g:4257:1: 'not'
+                    // InternalOCLstdlib.g:4258:6: ( 'not' )
+                    // InternalOCLstdlib.g:4259:1: 'not'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getNotKeyword_9());
@@ -13900,10 +13900,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLstdlib.g:4264:6: ( 'not2' )
+                    // InternalOCLstdlib.g:4266:6: ( 'not2' )
                     {
-                    // InternalOCLstdlib.g:4264:6: ( 'not2' )
-                    // InternalOCLstdlib.g:4265:1: 'not2'
+                    // InternalOCLstdlib.g:4266:6: ( 'not2' )
+                    // InternalOCLstdlib.g:4267:1: 'not2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getNot2Keyword_10());
@@ -13919,10 +13919,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLstdlib.g:4272:6: ( 'or' )
+                    // InternalOCLstdlib.g:4274:6: ( 'or' )
                     {
-                    // InternalOCLstdlib.g:4272:6: ( 'or' )
-                    // InternalOCLstdlib.g:4273:1: 'or'
+                    // InternalOCLstdlib.g:4274:6: ( 'or' )
+                    // InternalOCLstdlib.g:4275:1: 'or'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getOrKeyword_11());
@@ -13938,10 +13938,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLstdlib.g:4280:6: ( 'or2' )
+                    // InternalOCLstdlib.g:4282:6: ( 'or2' )
                     {
-                    // InternalOCLstdlib.g:4280:6: ( 'or2' )
-                    // InternalOCLstdlib.g:4281:1: 'or2'
+                    // InternalOCLstdlib.g:4282:6: ( 'or2' )
+                    // InternalOCLstdlib.g:4283:1: 'or2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getOr2Keyword_12());
@@ -13957,10 +13957,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLstdlib.g:4288:6: ( 'then' )
+                    // InternalOCLstdlib.g:4290:6: ( 'then' )
                     {
-                    // InternalOCLstdlib.g:4288:6: ( 'then' )
-                    // InternalOCLstdlib.g:4289:1: 'then'
+                    // InternalOCLstdlib.g:4290:6: ( 'then' )
+                    // InternalOCLstdlib.g:4291:1: 'then'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getThenKeyword_13());
@@ -13976,10 +13976,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLstdlib.g:4296:6: ( 'xor' )
+                    // InternalOCLstdlib.g:4298:6: ( 'xor' )
                     {
-                    // InternalOCLstdlib.g:4296:6: ( 'xor' )
-                    // InternalOCLstdlib.g:4297:1: 'xor'
+                    // InternalOCLstdlib.g:4298:6: ( 'xor' )
+                    // InternalOCLstdlib.g:4299:1: 'xor'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getXorKeyword_14());
@@ -13995,10 +13995,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLstdlib.g:4304:6: ( 'xor2' )
+                    // InternalOCLstdlib.g:4306:6: ( 'xor2' )
                     {
-                    // InternalOCLstdlib.g:4304:6: ( 'xor2' )
-                    // InternalOCLstdlib.g:4305:1: 'xor2'
+                    // InternalOCLstdlib.g:4306:6: ( 'xor2' )
+                    // InternalOCLstdlib.g:4307:1: 'xor2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLReservedKeywordAccess().getXor2Keyword_15());
@@ -14031,13 +14031,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnaryOperatorName__Alternatives"
-    // InternalOCLstdlib.g:4317:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
+    // InternalOCLstdlib.g:4319:1: rule__EssentialOCLUnaryOperatorName__Alternatives : ( ( '-' ) | ( 'not' ) | ( 'not2' ) );
     public final void rule__EssentialOCLUnaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4321:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
+            // InternalOCLstdlib.g:4323:1: ( ( '-' ) | ( 'not' ) | ( 'not2' ) )
             int alt27=3;
             switch ( input.LA(1) ) {
             case 58:
@@ -14065,10 +14065,10 @@
 
             switch (alt27) {
                 case 1 :
-                    // InternalOCLstdlib.g:4322:1: ( '-' )
+                    // InternalOCLstdlib.g:4324:1: ( '-' )
                     {
-                    // InternalOCLstdlib.g:4322:1: ( '-' )
-                    // InternalOCLstdlib.g:4323:1: '-'
+                    // InternalOCLstdlib.g:4324:1: ( '-' )
+                    // InternalOCLstdlib.g:4325:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());
@@ -14084,10 +14084,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4330:6: ( 'not' )
+                    // InternalOCLstdlib.g:4332:6: ( 'not' )
                     {
-                    // InternalOCLstdlib.g:4330:6: ( 'not' )
-                    // InternalOCLstdlib.g:4331:1: 'not'
+                    // InternalOCLstdlib.g:4332:6: ( 'not' )
+                    // InternalOCLstdlib.g:4333:1: 'not'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());
@@ -14103,10 +14103,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4338:6: ( 'not2' )
+                    // InternalOCLstdlib.g:4340:6: ( 'not2' )
                     {
-                    // InternalOCLstdlib.g:4338:6: ( 'not2' )
-                    // InternalOCLstdlib.g:4339:1: 'not2'
+                    // InternalOCLstdlib.g:4340:6: ( 'not2' )
+                    // InternalOCLstdlib.g:4341:1: 'not2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());
@@ -14139,13 +14139,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLInfixOperatorName__Alternatives"
-    // InternalOCLstdlib.g:4351:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
+    // InternalOCLstdlib.g:4353:1: rule__EssentialOCLInfixOperatorName__Alternatives : ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) );
     public final void rule__EssentialOCLInfixOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4355:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
+            // InternalOCLstdlib.g:4357:1: ( ( '*' ) | ( '/' ) | ( '+' ) | ( '-' ) | ( '>' ) | ( '<' ) | ( '>=' ) | ( '<=' ) | ( '=' ) | ( '<>' ) | ( 'and' ) | ( 'and2' ) | ( 'implies' ) | ( 'implies2' ) | ( 'or' ) | ( 'or2' ) | ( 'xor' ) | ( 'xor2' ) )
             int alt28=18;
             switch ( input.LA(1) ) {
             case 59:
@@ -14248,10 +14248,10 @@
 
             switch (alt28) {
                 case 1 :
-                    // InternalOCLstdlib.g:4356:1: ( '*' )
+                    // InternalOCLstdlib.g:4358:1: ( '*' )
                     {
-                    // InternalOCLstdlib.g:4356:1: ( '*' )
-                    // InternalOCLstdlib.g:4357:1: '*'
+                    // InternalOCLstdlib.g:4358:1: ( '*' )
+                    // InternalOCLstdlib.g:4359:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());
@@ -14267,10 +14267,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4364:6: ( '/' )
+                    // InternalOCLstdlib.g:4366:6: ( '/' )
                     {
-                    // InternalOCLstdlib.g:4364:6: ( '/' )
-                    // InternalOCLstdlib.g:4365:1: '/'
+                    // InternalOCLstdlib.g:4366:6: ( '/' )
+                    // InternalOCLstdlib.g:4367:1: '/'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());
@@ -14286,10 +14286,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4372:6: ( '+' )
+                    // InternalOCLstdlib.g:4374:6: ( '+' )
                     {
-                    // InternalOCLstdlib.g:4372:6: ( '+' )
-                    // InternalOCLstdlib.g:4373:1: '+'
+                    // InternalOCLstdlib.g:4374:6: ( '+' )
+                    // InternalOCLstdlib.g:4375:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());
@@ -14305,10 +14305,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4380:6: ( '-' )
+                    // InternalOCLstdlib.g:4382:6: ( '-' )
                     {
-                    // InternalOCLstdlib.g:4380:6: ( '-' )
-                    // InternalOCLstdlib.g:4381:1: '-'
+                    // InternalOCLstdlib.g:4382:6: ( '-' )
+                    // InternalOCLstdlib.g:4383:1: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());
@@ -14324,10 +14324,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:4388:6: ( '>' )
+                    // InternalOCLstdlib.g:4390:6: ( '>' )
                     {
-                    // InternalOCLstdlib.g:4388:6: ( '>' )
-                    // InternalOCLstdlib.g:4389:1: '>'
+                    // InternalOCLstdlib.g:4390:6: ( '>' )
+                    // InternalOCLstdlib.g:4391:1: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());
@@ -14343,10 +14343,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLstdlib.g:4396:6: ( '<' )
+                    // InternalOCLstdlib.g:4398:6: ( '<' )
                     {
-                    // InternalOCLstdlib.g:4396:6: ( '<' )
-                    // InternalOCLstdlib.g:4397:1: '<'
+                    // InternalOCLstdlib.g:4398:6: ( '<' )
+                    // InternalOCLstdlib.g:4399:1: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());
@@ -14362,10 +14362,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLstdlib.g:4404:6: ( '>=' )
+                    // InternalOCLstdlib.g:4406:6: ( '>=' )
                     {
-                    // InternalOCLstdlib.g:4404:6: ( '>=' )
-                    // InternalOCLstdlib.g:4405:1: '>='
+                    // InternalOCLstdlib.g:4406:6: ( '>=' )
+                    // InternalOCLstdlib.g:4407:1: '>='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());
@@ -14381,10 +14381,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLstdlib.g:4412:6: ( '<=' )
+                    // InternalOCLstdlib.g:4414:6: ( '<=' )
                     {
-                    // InternalOCLstdlib.g:4412:6: ( '<=' )
-                    // InternalOCLstdlib.g:4413:1: '<='
+                    // InternalOCLstdlib.g:4414:6: ( '<=' )
+                    // InternalOCLstdlib.g:4415:1: '<='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());
@@ -14400,10 +14400,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLstdlib.g:4420:6: ( '=' )
+                    // InternalOCLstdlib.g:4422:6: ( '=' )
                     {
-                    // InternalOCLstdlib.g:4420:6: ( '=' )
-                    // InternalOCLstdlib.g:4421:1: '='
+                    // InternalOCLstdlib.g:4422:6: ( '=' )
+                    // InternalOCLstdlib.g:4423:1: '='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());
@@ -14419,10 +14419,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLstdlib.g:4428:6: ( '<>' )
+                    // InternalOCLstdlib.g:4430:6: ( '<>' )
                     {
-                    // InternalOCLstdlib.g:4428:6: ( '<>' )
-                    // InternalOCLstdlib.g:4429:1: '<>'
+                    // InternalOCLstdlib.g:4430:6: ( '<>' )
+                    // InternalOCLstdlib.g:4431:1: '<>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());
@@ -14438,10 +14438,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalOCLstdlib.g:4436:6: ( 'and' )
+                    // InternalOCLstdlib.g:4438:6: ( 'and' )
                     {
-                    // InternalOCLstdlib.g:4436:6: ( 'and' )
-                    // InternalOCLstdlib.g:4437:1: 'and'
+                    // InternalOCLstdlib.g:4438:6: ( 'and' )
+                    // InternalOCLstdlib.g:4439:1: 'and'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());
@@ -14457,10 +14457,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalOCLstdlib.g:4444:6: ( 'and2' )
+                    // InternalOCLstdlib.g:4446:6: ( 'and2' )
                     {
-                    // InternalOCLstdlib.g:4444:6: ( 'and2' )
-                    // InternalOCLstdlib.g:4445:1: 'and2'
+                    // InternalOCLstdlib.g:4446:6: ( 'and2' )
+                    // InternalOCLstdlib.g:4447:1: 'and2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());
@@ -14476,10 +14476,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalOCLstdlib.g:4452:6: ( 'implies' )
+                    // InternalOCLstdlib.g:4454:6: ( 'implies' )
                     {
-                    // InternalOCLstdlib.g:4452:6: ( 'implies' )
-                    // InternalOCLstdlib.g:4453:1: 'implies'
+                    // InternalOCLstdlib.g:4454:6: ( 'implies' )
+                    // InternalOCLstdlib.g:4455:1: 'implies'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());
@@ -14495,10 +14495,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalOCLstdlib.g:4460:6: ( 'implies2' )
+                    // InternalOCLstdlib.g:4462:6: ( 'implies2' )
                     {
-                    // InternalOCLstdlib.g:4460:6: ( 'implies2' )
-                    // InternalOCLstdlib.g:4461:1: 'implies2'
+                    // InternalOCLstdlib.g:4462:6: ( 'implies2' )
+                    // InternalOCLstdlib.g:4463:1: 'implies2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());
@@ -14514,10 +14514,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalOCLstdlib.g:4468:6: ( 'or' )
+                    // InternalOCLstdlib.g:4470:6: ( 'or' )
                     {
-                    // InternalOCLstdlib.g:4468:6: ( 'or' )
-                    // InternalOCLstdlib.g:4469:1: 'or'
+                    // InternalOCLstdlib.g:4470:6: ( 'or' )
+                    // InternalOCLstdlib.g:4471:1: 'or'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());
@@ -14533,10 +14533,10 @@
                     }
                     break;
                 case 16 :
-                    // InternalOCLstdlib.g:4476:6: ( 'or2' )
+                    // InternalOCLstdlib.g:4478:6: ( 'or2' )
                     {
-                    // InternalOCLstdlib.g:4476:6: ( 'or2' )
-                    // InternalOCLstdlib.g:4477:1: 'or2'
+                    // InternalOCLstdlib.g:4478:6: ( 'or2' )
+                    // InternalOCLstdlib.g:4479:1: 'or2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());
@@ -14552,10 +14552,10 @@
                     }
                     break;
                 case 17 :
-                    // InternalOCLstdlib.g:4484:6: ( 'xor' )
+                    // InternalOCLstdlib.g:4486:6: ( 'xor' )
                     {
-                    // InternalOCLstdlib.g:4484:6: ( 'xor' )
-                    // InternalOCLstdlib.g:4485:1: 'xor'
+                    // InternalOCLstdlib.g:4486:6: ( 'xor' )
+                    // InternalOCLstdlib.g:4487:1: 'xor'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());
@@ -14571,10 +14571,10 @@
                     }
                     break;
                 case 18 :
-                    // InternalOCLstdlib.g:4492:6: ( 'xor2' )
+                    // InternalOCLstdlib.g:4494:6: ( 'xor2' )
                     {
-                    // InternalOCLstdlib.g:4492:6: ( 'xor2' )
-                    // InternalOCLstdlib.g:4493:1: 'xor2'
+                    // InternalOCLstdlib.g:4494:6: ( 'xor2' )
+                    // InternalOCLstdlib.g:4495:1: 'xor2'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());
@@ -14607,13 +14607,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLNavigationOperatorName__Alternatives"
-    // InternalOCLstdlib.g:4505:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
+    // InternalOCLstdlib.g:4507:1: rule__EssentialOCLNavigationOperatorName__Alternatives : ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) );
     public final void rule__EssentialOCLNavigationOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4509:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
+            // InternalOCLstdlib.g:4511:1: ( ( '.' ) | ( '->' ) | ( '?.' ) | ( '?->' ) )
             int alt29=4;
             switch ( input.LA(1) ) {
             case 68:
@@ -14646,10 +14646,10 @@
 
             switch (alt29) {
                 case 1 :
-                    // InternalOCLstdlib.g:4510:1: ( '.' )
+                    // InternalOCLstdlib.g:4512:1: ( '.' )
                     {
-                    // InternalOCLstdlib.g:4510:1: ( '.' )
-                    // InternalOCLstdlib.g:4511:1: '.'
+                    // InternalOCLstdlib.g:4512:1: ( '.' )
+                    // InternalOCLstdlib.g:4513:1: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());
@@ -14665,10 +14665,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4518:6: ( '->' )
+                    // InternalOCLstdlib.g:4520:6: ( '->' )
                     {
-                    // InternalOCLstdlib.g:4518:6: ( '->' )
-                    // InternalOCLstdlib.g:4519:1: '->'
+                    // InternalOCLstdlib.g:4520:6: ( '->' )
+                    // InternalOCLstdlib.g:4521:1: '->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());
@@ -14684,10 +14684,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4526:6: ( '?.' )
+                    // InternalOCLstdlib.g:4528:6: ( '?.' )
                     {
-                    // InternalOCLstdlib.g:4526:6: ( '?.' )
-                    // InternalOCLstdlib.g:4527:1: '?.'
+                    // InternalOCLstdlib.g:4528:6: ( '?.' )
+                    // InternalOCLstdlib.g:4529:1: '?.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());
@@ -14703,10 +14703,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4534:6: ( '?->' )
+                    // InternalOCLstdlib.g:4536:6: ( '?->' )
                     {
-                    // InternalOCLstdlib.g:4534:6: ( '?->' )
-                    // InternalOCLstdlib.g:4535:1: '?->'
+                    // InternalOCLstdlib.g:4536:6: ( '?->' )
+                    // InternalOCLstdlib.g:4537:1: '?->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());
@@ -14739,13 +14739,13 @@
 
 
     // $ANTLR start "rule__BinaryOperatorName__Alternatives"
-    // InternalOCLstdlib.g:4547:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
+    // InternalOCLstdlib.g:4549:1: rule__BinaryOperatorName__Alternatives : ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) );
     public final void rule__BinaryOperatorName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4551:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
+            // InternalOCLstdlib.g:4553:1: ( ( ruleInfixOperatorName ) | ( ruleNavigationOperatorName ) )
             int alt30=2;
             int LA30_0 = input.LA(1);
 
@@ -14764,10 +14764,10 @@
             }
             switch (alt30) {
                 case 1 :
-                    // InternalOCLstdlib.g:4552:1: ( ruleInfixOperatorName )
+                    // InternalOCLstdlib.g:4554:1: ( ruleInfixOperatorName )
                     {
-                    // InternalOCLstdlib.g:4552:1: ( ruleInfixOperatorName )
-                    // InternalOCLstdlib.g:4553:1: ruleInfixOperatorName
+                    // InternalOCLstdlib.g:4554:1: ( ruleInfixOperatorName )
+                    // InternalOCLstdlib.g:4555:1: ruleInfixOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());
@@ -14787,10 +14787,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4558:6: ( ruleNavigationOperatorName )
+                    // InternalOCLstdlib.g:4560:6: ( ruleNavigationOperatorName )
                     {
-                    // InternalOCLstdlib.g:4558:6: ( ruleNavigationOperatorName )
-                    // InternalOCLstdlib.g:4559:1: ruleNavigationOperatorName
+                    // InternalOCLstdlib.g:4560:6: ( ruleNavigationOperatorName )
+                    // InternalOCLstdlib.g:4561:1: ruleNavigationOperatorName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());
@@ -14827,13 +14827,13 @@
 
 
     // $ANTLR start "rule__EssentialOCLUnreservedName__Alternatives"
-    // InternalOCLstdlib.g:4569:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
+    // InternalOCLstdlib.g:4571:1: rule__EssentialOCLUnreservedName__Alternatives : ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) );
     public final void rule__EssentialOCLUnreservedName__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4573:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
+            // InternalOCLstdlib.g:4575:1: ( ( ruleUnrestrictedName ) | ( ruleCollectionTypeIdentifier ) | ( rulePrimitiveTypeIdentifier ) | ( 'Map' ) | ( 'Tuple' ) )
             int alt31=5;
             switch ( input.LA(1) ) {
             case RULE_SIMPLE_ID:
@@ -14905,10 +14905,10 @@
 
             switch (alt31) {
                 case 1 :
-                    // InternalOCLstdlib.g:4574:1: ( ruleUnrestrictedName )
+                    // InternalOCLstdlib.g:4576:1: ( ruleUnrestrictedName )
                     {
-                    // InternalOCLstdlib.g:4574:1: ( ruleUnrestrictedName )
-                    // InternalOCLstdlib.g:4575:1: ruleUnrestrictedName
+                    // InternalOCLstdlib.g:4576:1: ( ruleUnrestrictedName )
+                    // InternalOCLstdlib.g:4577:1: ruleUnrestrictedName
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());
@@ -14928,10 +14928,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4580:6: ( ruleCollectionTypeIdentifier )
+                    // InternalOCLstdlib.g:4582:6: ( ruleCollectionTypeIdentifier )
                     {
-                    // InternalOCLstdlib.g:4580:6: ( ruleCollectionTypeIdentifier )
-                    // InternalOCLstdlib.g:4581:1: ruleCollectionTypeIdentifier
+                    // InternalOCLstdlib.g:4582:6: ( ruleCollectionTypeIdentifier )
+                    // InternalOCLstdlib.g:4583:1: ruleCollectionTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());
@@ -14951,10 +14951,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4586:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalOCLstdlib.g:4588:6: ( rulePrimitiveTypeIdentifier )
                     {
-                    // InternalOCLstdlib.g:4586:6: ( rulePrimitiveTypeIdentifier )
-                    // InternalOCLstdlib.g:4587:1: rulePrimitiveTypeIdentifier
+                    // InternalOCLstdlib.g:4588:6: ( rulePrimitiveTypeIdentifier )
+                    // InternalOCLstdlib.g:4589:1: rulePrimitiveTypeIdentifier
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());
@@ -14974,10 +14974,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4592:6: ( 'Map' )
+                    // InternalOCLstdlib.g:4594:6: ( 'Map' )
                     {
-                    // InternalOCLstdlib.g:4592:6: ( 'Map' )
-                    // InternalOCLstdlib.g:4593:1: 'Map'
+                    // InternalOCLstdlib.g:4594:6: ( 'Map' )
+                    // InternalOCLstdlib.g:4595:1: 'Map'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());
@@ -14993,10 +14993,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:4600:6: ( 'Tuple' )
+                    // InternalOCLstdlib.g:4602:6: ( 'Tuple' )
                     {
-                    // InternalOCLstdlib.g:4600:6: ( 'Tuple' )
-                    // InternalOCLstdlib.g:4601:1: 'Tuple'
+                    // InternalOCLstdlib.g:4602:6: ( 'Tuple' )
+                    // InternalOCLstdlib.g:4603:1: 'Tuple'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());
@@ -15029,13 +15029,13 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Alternatives"
-    // InternalOCLstdlib.g:4613:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
+    // InternalOCLstdlib.g:4615:1: rule__URIFirstPathElementCS__Alternatives : ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) );
     public final void rule__URIFirstPathElementCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4617:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
+            // InternalOCLstdlib.g:4619:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) ) | ( ( rule__URIFirstPathElementCS__Group_1__0 ) ) )
             int alt32=2;
             int LA32_0 = input.LA(1);
 
@@ -15054,16 +15054,16 @@
             }
             switch (alt32) {
                 case 1 :
-                    // InternalOCLstdlib.g:4618:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalOCLstdlib.g:4620:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
                     {
-                    // InternalOCLstdlib.g:4618:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
-                    // InternalOCLstdlib.g:4619:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalOCLstdlib.g:4620:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 ) )
+                    // InternalOCLstdlib.g:4621:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_0());
                     }
-                    // InternalOCLstdlib.g:4620:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
-                    // InternalOCLstdlib.g:4620:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
+                    // InternalOCLstdlib.g:4622:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_0 )
+                    // InternalOCLstdlib.g:4622:2: rule__URIFirstPathElementCS__ReferredElementAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__ReferredElementAssignment_0();
@@ -15083,16 +15083,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4624:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalOCLstdlib.g:4626:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:4624:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
-                    // InternalOCLstdlib.g:4625:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalOCLstdlib.g:4626:6: ( ( rule__URIFirstPathElementCS__Group_1__0 ) )
+                    // InternalOCLstdlib.g:4627:1: ( rule__URIFirstPathElementCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getURIFirstPathElementCSAccess().getGroup_1());
                     }
-                    // InternalOCLstdlib.g:4626:1: ( rule__URIFirstPathElementCS__Group_1__0 )
-                    // InternalOCLstdlib.g:4626:2: rule__URIFirstPathElementCS__Group_1__0
+                    // InternalOCLstdlib.g:4628:1: ( rule__URIFirstPathElementCS__Group_1__0 )
+                    // InternalOCLstdlib.g:4628:2: rule__URIFirstPathElementCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__URIFirstPathElementCS__Group_1__0();
@@ -15129,13 +15129,13 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeIdentifier__Alternatives"
-    // InternalOCLstdlib.g:4635:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
+    // InternalOCLstdlib.g:4637:1: rule__PrimitiveTypeIdentifier__Alternatives : ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) );
     public final void rule__PrimitiveTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4639:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
+            // InternalOCLstdlib.g:4641:1: ( ( 'Boolean' ) | ( 'Integer' ) | ( 'Real' ) | ( 'String' ) | ( 'UnlimitedNatural' ) | ( 'OclAny' ) | ( 'OclInvalid' ) | ( 'OclVoid' ) )
             int alt33=8;
             switch ( input.LA(1) ) {
             case 72:
@@ -15188,10 +15188,10 @@
 
             switch (alt33) {
                 case 1 :
-                    // InternalOCLstdlib.g:4640:1: ( 'Boolean' )
+                    // InternalOCLstdlib.g:4642:1: ( 'Boolean' )
                     {
-                    // InternalOCLstdlib.g:4640:1: ( 'Boolean' )
-                    // InternalOCLstdlib.g:4641:1: 'Boolean'
+                    // InternalOCLstdlib.g:4642:1: ( 'Boolean' )
+                    // InternalOCLstdlib.g:4643:1: 'Boolean'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());
@@ -15207,10 +15207,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4648:6: ( 'Integer' )
+                    // InternalOCLstdlib.g:4650:6: ( 'Integer' )
                     {
-                    // InternalOCLstdlib.g:4648:6: ( 'Integer' )
-                    // InternalOCLstdlib.g:4649:1: 'Integer'
+                    // InternalOCLstdlib.g:4650:6: ( 'Integer' )
+                    // InternalOCLstdlib.g:4651:1: 'Integer'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());
@@ -15226,10 +15226,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4656:6: ( 'Real' )
+                    // InternalOCLstdlib.g:4658:6: ( 'Real' )
                     {
-                    // InternalOCLstdlib.g:4656:6: ( 'Real' )
-                    // InternalOCLstdlib.g:4657:1: 'Real'
+                    // InternalOCLstdlib.g:4658:6: ( 'Real' )
+                    // InternalOCLstdlib.g:4659:1: 'Real'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());
@@ -15245,10 +15245,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4664:6: ( 'String' )
+                    // InternalOCLstdlib.g:4666:6: ( 'String' )
                     {
-                    // InternalOCLstdlib.g:4664:6: ( 'String' )
-                    // InternalOCLstdlib.g:4665:1: 'String'
+                    // InternalOCLstdlib.g:4666:6: ( 'String' )
+                    // InternalOCLstdlib.g:4667:1: 'String'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());
@@ -15264,10 +15264,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:4672:6: ( 'UnlimitedNatural' )
+                    // InternalOCLstdlib.g:4674:6: ( 'UnlimitedNatural' )
                     {
-                    // InternalOCLstdlib.g:4672:6: ( 'UnlimitedNatural' )
-                    // InternalOCLstdlib.g:4673:1: 'UnlimitedNatural'
+                    // InternalOCLstdlib.g:4674:6: ( 'UnlimitedNatural' )
+                    // InternalOCLstdlib.g:4675:1: 'UnlimitedNatural'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());
@@ -15283,10 +15283,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLstdlib.g:4680:6: ( 'OclAny' )
+                    // InternalOCLstdlib.g:4682:6: ( 'OclAny' )
                     {
-                    // InternalOCLstdlib.g:4680:6: ( 'OclAny' )
-                    // InternalOCLstdlib.g:4681:1: 'OclAny'
+                    // InternalOCLstdlib.g:4682:6: ( 'OclAny' )
+                    // InternalOCLstdlib.g:4683:1: 'OclAny'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());
@@ -15302,10 +15302,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLstdlib.g:4688:6: ( 'OclInvalid' )
+                    // InternalOCLstdlib.g:4690:6: ( 'OclInvalid' )
                     {
-                    // InternalOCLstdlib.g:4688:6: ( 'OclInvalid' )
-                    // InternalOCLstdlib.g:4689:1: 'OclInvalid'
+                    // InternalOCLstdlib.g:4690:6: ( 'OclInvalid' )
+                    // InternalOCLstdlib.g:4691:1: 'OclInvalid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());
@@ -15321,10 +15321,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLstdlib.g:4696:6: ( 'OclVoid' )
+                    // InternalOCLstdlib.g:4698:6: ( 'OclVoid' )
                     {
-                    // InternalOCLstdlib.g:4696:6: ( 'OclVoid' )
-                    // InternalOCLstdlib.g:4697:1: 'OclVoid'
+                    // InternalOCLstdlib.g:4698:6: ( 'OclVoid' )
+                    // InternalOCLstdlib.g:4699:1: 'OclVoid'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());
@@ -15357,13 +15357,13 @@
 
 
     // $ANTLR start "rule__CollectionTypeIdentifier__Alternatives"
-    // InternalOCLstdlib.g:4709:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
+    // InternalOCLstdlib.g:4711:1: rule__CollectionTypeIdentifier__Alternatives : ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) );
     public final void rule__CollectionTypeIdentifier__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4713:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
+            // InternalOCLstdlib.g:4715:1: ( ( 'Set' ) | ( 'Bag' ) | ( 'Sequence' ) | ( 'Collection' ) | ( 'OrderedSet' ) )
             int alt34=5;
             switch ( input.LA(1) ) {
             case 80:
@@ -15401,10 +15401,10 @@
 
             switch (alt34) {
                 case 1 :
-                    // InternalOCLstdlib.g:4714:1: ( 'Set' )
+                    // InternalOCLstdlib.g:4716:1: ( 'Set' )
                     {
-                    // InternalOCLstdlib.g:4714:1: ( 'Set' )
-                    // InternalOCLstdlib.g:4715:1: 'Set'
+                    // InternalOCLstdlib.g:4716:1: ( 'Set' )
+                    // InternalOCLstdlib.g:4717:1: 'Set'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());
@@ -15420,10 +15420,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4722:6: ( 'Bag' )
+                    // InternalOCLstdlib.g:4724:6: ( 'Bag' )
                     {
-                    // InternalOCLstdlib.g:4722:6: ( 'Bag' )
-                    // InternalOCLstdlib.g:4723:1: 'Bag'
+                    // InternalOCLstdlib.g:4724:6: ( 'Bag' )
+                    // InternalOCLstdlib.g:4725:1: 'Bag'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());
@@ -15439,10 +15439,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4730:6: ( 'Sequence' )
+                    // InternalOCLstdlib.g:4732:6: ( 'Sequence' )
                     {
-                    // InternalOCLstdlib.g:4730:6: ( 'Sequence' )
-                    // InternalOCLstdlib.g:4731:1: 'Sequence'
+                    // InternalOCLstdlib.g:4732:6: ( 'Sequence' )
+                    // InternalOCLstdlib.g:4733:1: 'Sequence'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());
@@ -15458,10 +15458,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4738:6: ( 'Collection' )
+                    // InternalOCLstdlib.g:4740:6: ( 'Collection' )
                     {
-                    // InternalOCLstdlib.g:4738:6: ( 'Collection' )
-                    // InternalOCLstdlib.g:4739:1: 'Collection'
+                    // InternalOCLstdlib.g:4740:6: ( 'Collection' )
+                    // InternalOCLstdlib.g:4741:1: 'Collection'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());
@@ -15477,10 +15477,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:4746:6: ( 'OrderedSet' )
+                    // InternalOCLstdlib.g:4748:6: ( 'OrderedSet' )
                     {
-                    // InternalOCLstdlib.g:4746:6: ( 'OrderedSet' )
-                    // InternalOCLstdlib.g:4747:1: 'OrderedSet'
+                    // InternalOCLstdlib.g:4748:6: ( 'OrderedSet' )
+                    // InternalOCLstdlib.g:4749:1: 'OrderedSet'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());
@@ -15513,27 +15513,27 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Alternatives"
-    // InternalOCLstdlib.g:4759:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
+    // InternalOCLstdlib.g:4761:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );
     public final void rule__CollectionLiteralPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4763:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:4765:1: ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) )
             int alt35=2;
             alt35 = dfa35.predict(input);
             switch (alt35) {
                 case 1 :
-                    // InternalOCLstdlib.g:4764:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4766:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:4764:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:4765:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4766:1: ( ( rule__CollectionLiteralPartCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4767:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:4766:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
-                    // InternalOCLstdlib.g:4766:2: rule__CollectionLiteralPartCS__Group_0__0
+                    // InternalOCLstdlib.g:4768:1: ( rule__CollectionLiteralPartCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4768:2: rule__CollectionLiteralPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0__0();
@@ -15553,16 +15553,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4770:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalOCLstdlib.g:4772:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
                     {
-                    // InternalOCLstdlib.g:4770:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
-                    // InternalOCLstdlib.g:4771:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalOCLstdlib.g:4772:6: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) )
+                    // InternalOCLstdlib.g:4773:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_1());
                     }
-                    // InternalOCLstdlib.g:4772:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
-                    // InternalOCLstdlib.g:4772:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
+                    // InternalOCLstdlib.g:4774:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 )
+                    // InternalOCLstdlib.g:4774:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1();
@@ -15599,13 +15599,13 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Alternatives"
-    // InternalOCLstdlib.g:4781:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
+    // InternalOCLstdlib.g:4783:1: rule__ShadowPartCS__Alternatives : ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) );
     public final void rule__ShadowPartCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4785:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:4787:1: ( ( ( rule__ShadowPartCS__Group_0__0 ) ) | ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) ) )
             int alt36=2;
             int LA36_0 = input.LA(1);
 
@@ -15624,16 +15624,16 @@
             }
             switch (alt36) {
                 case 1 :
-                    // InternalOCLstdlib.g:4786:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4788:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:4786:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:4787:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4788:1: ( ( rule__ShadowPartCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4789:1: ( rule__ShadowPartCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:4788:1: ( rule__ShadowPartCS__Group_0__0 )
-                    // InternalOCLstdlib.g:4788:2: rule__ShadowPartCS__Group_0__0
+                    // InternalOCLstdlib.g:4790:1: ( rule__ShadowPartCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4790:2: rule__ShadowPartCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__Group_0__0();
@@ -15653,16 +15653,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4792:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalOCLstdlib.g:4794:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
                     {
-                    // InternalOCLstdlib.g:4792:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
-                    // InternalOCLstdlib.g:4793:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalOCLstdlib.g:4794:6: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 ) )
+                    // InternalOCLstdlib.g:4795:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_1());
                     }
-                    // InternalOCLstdlib.g:4794:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
-                    // InternalOCLstdlib.g:4794:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
+                    // InternalOCLstdlib.g:4796:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_1 )
+                    // InternalOCLstdlib.g:4796:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ShadowPartCS__OwnedInitExpressionAssignment_1();
@@ -15699,21 +15699,21 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0"
-    // InternalOCLstdlib.g:4803:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalOCLstdlib.g:4805:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4807:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalOCLstdlib.g:4809:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt37=2;
             alt37 = dfa37.predict(input);
             switch (alt37) {
                 case 1 :
-                    // InternalOCLstdlib.g:4808:1: ( ruleExpCS )
+                    // InternalOCLstdlib.g:4810:1: ( ruleExpCS )
                     {
-                    // InternalOCLstdlib.g:4808:1: ( ruleExpCS )
-                    // InternalOCLstdlib.g:4809:1: ruleExpCS
+                    // InternalOCLstdlib.g:4810:1: ( ruleExpCS )
+                    // InternalOCLstdlib.g:4811:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());
@@ -15733,10 +15733,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4814:6: ( rulePatternExpCS )
+                    // InternalOCLstdlib.g:4816:6: ( rulePatternExpCS )
                     {
-                    // InternalOCLstdlib.g:4814:6: ( rulePatternExpCS )
-                    // InternalOCLstdlib.g:4815:1: rulePatternExpCS
+                    // InternalOCLstdlib.g:4816:6: ( rulePatternExpCS )
+                    // InternalOCLstdlib.g:4817:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());
@@ -15773,13 +15773,13 @@
 
 
     // $ANTLR start "rule__PrimitiveLiteralExpCS__Alternatives"
-    // InternalOCLstdlib.g:4825:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
+    // InternalOCLstdlib.g:4827:1: rule__PrimitiveLiteralExpCS__Alternatives : ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) );
     public final void rule__PrimitiveLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4829:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
+            // InternalOCLstdlib.g:4831:1: ( ( ruleNumberLiteralExpCS ) | ( ruleStringLiteralExpCS ) | ( ruleBooleanLiteralExpCS ) | ( ruleUnlimitedNaturalLiteralExpCS ) | ( ruleInvalidLiteralExpCS ) | ( ruleNullLiteralExpCS ) )
             int alt38=6;
             switch ( input.LA(1) ) {
             case RULE_INT:
@@ -15823,10 +15823,10 @@
 
             switch (alt38) {
                 case 1 :
-                    // InternalOCLstdlib.g:4830:1: ( ruleNumberLiteralExpCS )
+                    // InternalOCLstdlib.g:4832:1: ( ruleNumberLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:4830:1: ( ruleNumberLiteralExpCS )
-                    // InternalOCLstdlib.g:4831:1: ruleNumberLiteralExpCS
+                    // InternalOCLstdlib.g:4832:1: ( ruleNumberLiteralExpCS )
+                    // InternalOCLstdlib.g:4833:1: ruleNumberLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());
@@ -15846,10 +15846,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4836:6: ( ruleStringLiteralExpCS )
+                    // InternalOCLstdlib.g:4838:6: ( ruleStringLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:4836:6: ( ruleStringLiteralExpCS )
-                    // InternalOCLstdlib.g:4837:1: ruleStringLiteralExpCS
+                    // InternalOCLstdlib.g:4838:6: ( ruleStringLiteralExpCS )
+                    // InternalOCLstdlib.g:4839:1: ruleStringLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());
@@ -15869,10 +15869,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4842:6: ( ruleBooleanLiteralExpCS )
+                    // InternalOCLstdlib.g:4844:6: ( ruleBooleanLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:4842:6: ( ruleBooleanLiteralExpCS )
-                    // InternalOCLstdlib.g:4843:1: ruleBooleanLiteralExpCS
+                    // InternalOCLstdlib.g:4844:6: ( ruleBooleanLiteralExpCS )
+                    // InternalOCLstdlib.g:4845:1: ruleBooleanLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());
@@ -15892,10 +15892,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4848:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalOCLstdlib.g:4850:6: ( ruleUnlimitedNaturalLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:4848:6: ( ruleUnlimitedNaturalLiteralExpCS )
-                    // InternalOCLstdlib.g:4849:1: ruleUnlimitedNaturalLiteralExpCS
+                    // InternalOCLstdlib.g:4850:6: ( ruleUnlimitedNaturalLiteralExpCS )
+                    // InternalOCLstdlib.g:4851:1: ruleUnlimitedNaturalLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());
@@ -15915,10 +15915,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:4854:6: ( ruleInvalidLiteralExpCS )
+                    // InternalOCLstdlib.g:4856:6: ( ruleInvalidLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:4854:6: ( ruleInvalidLiteralExpCS )
-                    // InternalOCLstdlib.g:4855:1: ruleInvalidLiteralExpCS
+                    // InternalOCLstdlib.g:4856:6: ( ruleInvalidLiteralExpCS )
+                    // InternalOCLstdlib.g:4857:1: ruleInvalidLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());
@@ -15938,10 +15938,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLstdlib.g:4860:6: ( ruleNullLiteralExpCS )
+                    // InternalOCLstdlib.g:4862:6: ( ruleNullLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:4860:6: ( ruleNullLiteralExpCS )
-                    // InternalOCLstdlib.g:4861:1: ruleNullLiteralExpCS
+                    // InternalOCLstdlib.g:4862:6: ( ruleNullLiteralExpCS )
+                    // InternalOCLstdlib.g:4863:1: ruleNullLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());
@@ -15978,13 +15978,13 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__Alternatives"
-    // InternalOCLstdlib.g:4871:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
+    // InternalOCLstdlib.g:4873:1: rule__BooleanLiteralExpCS__Alternatives : ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) );
     public final void rule__BooleanLiteralExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4875:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
+            // InternalOCLstdlib.g:4877:1: ( ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) ) | ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) ) )
             int alt39=2;
             int LA39_0 = input.LA(1);
 
@@ -16003,16 +16003,16 @@
             }
             switch (alt39) {
                 case 1 :
-                    // InternalOCLstdlib.g:4876:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalOCLstdlib.g:4878:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
                     {
-                    // InternalOCLstdlib.g:4876:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
-                    // InternalOCLstdlib.g:4877:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalOCLstdlib.g:4878:1: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_0 ) )
+                    // InternalOCLstdlib.g:4879:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_0());
                     }
-                    // InternalOCLstdlib.g:4878:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
-                    // InternalOCLstdlib.g:4878:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
+                    // InternalOCLstdlib.g:4880:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_0 )
+                    // InternalOCLstdlib.g:4880:2: rule__BooleanLiteralExpCS__SymbolAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_0();
@@ -16032,16 +16032,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4882:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalOCLstdlib.g:4884:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
                     {
-                    // InternalOCLstdlib.g:4882:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
-                    // InternalOCLstdlib.g:4883:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalOCLstdlib.g:4884:6: ( ( rule__BooleanLiteralExpCS__SymbolAssignment_1 ) )
+                    // InternalOCLstdlib.g:4885:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolAssignment_1());
                     }
-                    // InternalOCLstdlib.g:4884:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
-                    // InternalOCLstdlib.g:4884:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
+                    // InternalOCLstdlib.g:4886:1: ( rule__BooleanLiteralExpCS__SymbolAssignment_1 )
+                    // InternalOCLstdlib.g:4886:2: rule__BooleanLiteralExpCS__SymbolAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__BooleanLiteralExpCS__SymbolAssignment_1();
@@ -16078,13 +16078,13 @@
 
 
     // $ANTLR start "rule__TypeLiteralCS__Alternatives"
-    // InternalOCLstdlib.g:4893:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
+    // InternalOCLstdlib.g:4895:1: rule__TypeLiteralCS__Alternatives : ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) );
     public final void rule__TypeLiteralCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4897:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
+            // InternalOCLstdlib.g:4899:1: ( ( rulePrimitiveTypeCS ) | ( ruleCollectionTypeCS ) | ( ruleMapTypeCS ) | ( ruleTupleTypeCS ) )
             int alt40=4;
             switch ( input.LA(1) ) {
             case 72:
@@ -16128,10 +16128,10 @@
 
             switch (alt40) {
                 case 1 :
-                    // InternalOCLstdlib.g:4898:1: ( rulePrimitiveTypeCS )
+                    // InternalOCLstdlib.g:4900:1: ( rulePrimitiveTypeCS )
                     {
-                    // InternalOCLstdlib.g:4898:1: ( rulePrimitiveTypeCS )
-                    // InternalOCLstdlib.g:4899:1: rulePrimitiveTypeCS
+                    // InternalOCLstdlib.g:4900:1: ( rulePrimitiveTypeCS )
+                    // InternalOCLstdlib.g:4901:1: rulePrimitiveTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());
@@ -16151,10 +16151,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4904:6: ( ruleCollectionTypeCS )
+                    // InternalOCLstdlib.g:4906:6: ( ruleCollectionTypeCS )
                     {
-                    // InternalOCLstdlib.g:4904:6: ( ruleCollectionTypeCS )
-                    // InternalOCLstdlib.g:4905:1: ruleCollectionTypeCS
+                    // InternalOCLstdlib.g:4906:6: ( ruleCollectionTypeCS )
+                    // InternalOCLstdlib.g:4907:1: ruleCollectionTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());
@@ -16174,10 +16174,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4910:6: ( ruleMapTypeCS )
+                    // InternalOCLstdlib.g:4912:6: ( ruleMapTypeCS )
                     {
-                    // InternalOCLstdlib.g:4910:6: ( ruleMapTypeCS )
-                    // InternalOCLstdlib.g:4911:1: ruleMapTypeCS
+                    // InternalOCLstdlib.g:4912:6: ( ruleMapTypeCS )
+                    // InternalOCLstdlib.g:4913:1: ruleMapTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());
@@ -16197,10 +16197,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:4916:6: ( ruleTupleTypeCS )
+                    // InternalOCLstdlib.g:4918:6: ( ruleTupleTypeCS )
                     {
-                    // InternalOCLstdlib.g:4916:6: ( ruleTupleTypeCS )
-                    // InternalOCLstdlib.g:4917:1: ruleTupleTypeCS
+                    // InternalOCLstdlib.g:4918:6: ( ruleTupleTypeCS )
+                    // InternalOCLstdlib.g:4919:1: ruleTupleTypeCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());
@@ -16237,21 +16237,21 @@
 
 
     // $ANTLR start "rule__TypeExpWithoutMultiplicityCS__Alternatives"
-    // InternalOCLstdlib.g:4927:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
+    // InternalOCLstdlib.g:4929:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );
     public final void rule__TypeExpWithoutMultiplicityCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4931:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
+            // InternalOCLstdlib.g:4933:1: ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) )
             int alt41=3;
             alt41 = dfa41.predict(input);
             switch (alt41) {
                 case 1 :
-                    // InternalOCLstdlib.g:4932:1: ( ruleTypeNameExpCS )
+                    // InternalOCLstdlib.g:4934:1: ( ruleTypeNameExpCS )
                     {
-                    // InternalOCLstdlib.g:4932:1: ( ruleTypeNameExpCS )
-                    // InternalOCLstdlib.g:4933:1: ruleTypeNameExpCS
+                    // InternalOCLstdlib.g:4934:1: ( ruleTypeNameExpCS )
+                    // InternalOCLstdlib.g:4935:1: ruleTypeNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());
@@ -16271,10 +16271,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4938:6: ( ruleTypeLiteralCS )
+                    // InternalOCLstdlib.g:4940:6: ( ruleTypeLiteralCS )
                     {
-                    // InternalOCLstdlib.g:4938:6: ( ruleTypeLiteralCS )
-                    // InternalOCLstdlib.g:4939:1: ruleTypeLiteralCS
+                    // InternalOCLstdlib.g:4940:6: ( ruleTypeLiteralCS )
+                    // InternalOCLstdlib.g:4941:1: ruleTypeLiteralCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -16294,10 +16294,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:4944:6: ( ruleCollectionPatternCS )
+                    // InternalOCLstdlib.g:4946:6: ( ruleCollectionPatternCS )
                     {
-                    // InternalOCLstdlib.g:4944:6: ( ruleCollectionPatternCS )
-                    // InternalOCLstdlib.g:4945:1: ruleCollectionPatternCS
+                    // InternalOCLstdlib.g:4946:6: ( ruleCollectionPatternCS )
+                    // InternalOCLstdlib.g:4947:1: ruleCollectionPatternCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());
@@ -16334,27 +16334,27 @@
 
 
     // $ANTLR start "rule__ExpCS__Alternatives"
-    // InternalOCLstdlib.g:4955:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
+    // InternalOCLstdlib.g:4957:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );
     public final void rule__ExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4959:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
+            // InternalOCLstdlib.g:4961:1: ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) )
             int alt42=2;
             alt42 = dfa42.predict(input);
             switch (alt42) {
                 case 1 :
-                    // InternalOCLstdlib.g:4960:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4962:1: ( ( rule__ExpCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:4960:1: ( ( rule__ExpCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:4961:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4962:1: ( ( rule__ExpCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4963:1: ( rule__ExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:4962:1: ( rule__ExpCS__Group_0__0 )
-                    // InternalOCLstdlib.g:4962:2: rule__ExpCS__Group_0__0
+                    // InternalOCLstdlib.g:4964:1: ( rule__ExpCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4964:2: rule__ExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0__0();
@@ -16374,10 +16374,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4966:6: ( rulePrefixedLetExpCS )
+                    // InternalOCLstdlib.g:4968:6: ( rulePrefixedLetExpCS )
                     {
-                    // InternalOCLstdlib.g:4966:6: ( rulePrefixedLetExpCS )
-                    // InternalOCLstdlib.g:4967:1: rulePrefixedLetExpCS
+                    // InternalOCLstdlib.g:4968:6: ( rulePrefixedLetExpCS )
+                    // InternalOCLstdlib.g:4969:1: rulePrefixedLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());
@@ -16414,13 +16414,13 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Alternatives"
-    // InternalOCLstdlib.g:4977:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
+    // InternalOCLstdlib.g:4979:1: rule__PrefixedLetExpCS__Alternatives : ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) );
     public final void rule__PrefixedLetExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:4981:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
+            // InternalOCLstdlib.g:4983:1: ( ( ( rule__PrefixedLetExpCS__Group_0__0 ) ) | ( ruleLetExpCS ) )
             int alt43=2;
             int LA43_0 = input.LA(1);
 
@@ -16439,16 +16439,16 @@
             }
             switch (alt43) {
                 case 1 :
-                    // InternalOCLstdlib.g:4982:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4984:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:4982:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:4983:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4984:1: ( ( rule__PrefixedLetExpCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:4985:1: ( rule__PrefixedLetExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:4984:1: ( rule__PrefixedLetExpCS__Group_0__0 )
-                    // InternalOCLstdlib.g:4984:2: rule__PrefixedLetExpCS__Group_0__0
+                    // InternalOCLstdlib.g:4986:1: ( rule__PrefixedLetExpCS__Group_0__0 )
+                    // InternalOCLstdlib.g:4986:2: rule__PrefixedLetExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedLetExpCS__Group_0__0();
@@ -16468,10 +16468,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:4988:6: ( ruleLetExpCS )
+                    // InternalOCLstdlib.g:4990:6: ( ruleLetExpCS )
                     {
-                    // InternalOCLstdlib.g:4988:6: ( ruleLetExpCS )
-                    // InternalOCLstdlib.g:4989:1: ruleLetExpCS
+                    // InternalOCLstdlib.g:4990:6: ( ruleLetExpCS )
+                    // InternalOCLstdlib.g:4991:1: ruleLetExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());
@@ -16508,13 +16508,13 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Alternatives"
-    // InternalOCLstdlib.g:4999:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
+    // InternalOCLstdlib.g:5001:1: rule__PrefixedPrimaryExpCS__Alternatives : ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) );
     public final void rule__PrefixedPrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5003:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
+            // InternalOCLstdlib.g:5005:1: ( ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) ) | ( rulePrimaryExpCS ) )
             int alt44=2;
             int LA44_0 = input.LA(1);
 
@@ -16533,16 +16533,16 @@
             }
             switch (alt44) {
                 case 1 :
-                    // InternalOCLstdlib.g:5004:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:5006:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:5004:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:5005:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalOCLstdlib.g:5006:1: ( ( rule__PrefixedPrimaryExpCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:5007:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:5006:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
-                    // InternalOCLstdlib.g:5006:2: rule__PrefixedPrimaryExpCS__Group_0__0
+                    // InternalOCLstdlib.g:5008:1: ( rule__PrefixedPrimaryExpCS__Group_0__0 )
+                    // InternalOCLstdlib.g:5008:2: rule__PrefixedPrimaryExpCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PrefixedPrimaryExpCS__Group_0__0();
@@ -16562,10 +16562,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5010:6: ( rulePrimaryExpCS )
+                    // InternalOCLstdlib.g:5012:6: ( rulePrimaryExpCS )
                     {
-                    // InternalOCLstdlib.g:5010:6: ( rulePrimaryExpCS )
-                    // InternalOCLstdlib.g:5011:1: rulePrimaryExpCS
+                    // InternalOCLstdlib.g:5012:6: ( rulePrimaryExpCS )
+                    // InternalOCLstdlib.g:5013:1: rulePrimaryExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());
@@ -16602,21 +16602,21 @@
 
 
     // $ANTLR start "rule__PrimaryExpCS__Alternatives"
-    // InternalOCLstdlib.g:5021:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
+    // InternalOCLstdlib.g:5023:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );
     public final void rule__PrimaryExpCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5025:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
+            // InternalOCLstdlib.g:5027:1: ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) )
             int alt45=10;
             alt45 = dfa45.predict(input);
             switch (alt45) {
                 case 1 :
-                    // InternalOCLstdlib.g:5026:1: ( ruleNestedExpCS )
+                    // InternalOCLstdlib.g:5028:1: ( ruleNestedExpCS )
                     {
-                    // InternalOCLstdlib.g:5026:1: ( ruleNestedExpCS )
-                    // InternalOCLstdlib.g:5027:1: ruleNestedExpCS
+                    // InternalOCLstdlib.g:5028:1: ( ruleNestedExpCS )
+                    // InternalOCLstdlib.g:5029:1: ruleNestedExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());
@@ -16636,10 +16636,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5032:6: ( ruleIfExpCS )
+                    // InternalOCLstdlib.g:5034:6: ( ruleIfExpCS )
                     {
-                    // InternalOCLstdlib.g:5032:6: ( ruleIfExpCS )
-                    // InternalOCLstdlib.g:5033:1: ruleIfExpCS
+                    // InternalOCLstdlib.g:5034:6: ( ruleIfExpCS )
+                    // InternalOCLstdlib.g:5035:1: ruleIfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());
@@ -16659,10 +16659,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:5038:6: ( ruleSelfExpCS )
+                    // InternalOCLstdlib.g:5040:6: ( ruleSelfExpCS )
                     {
-                    // InternalOCLstdlib.g:5038:6: ( ruleSelfExpCS )
-                    // InternalOCLstdlib.g:5039:1: ruleSelfExpCS
+                    // InternalOCLstdlib.g:5040:6: ( ruleSelfExpCS )
+                    // InternalOCLstdlib.g:5041:1: ruleSelfExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());
@@ -16682,10 +16682,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalOCLstdlib.g:5044:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalOCLstdlib.g:5046:6: ( rulePrimitiveLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:5044:6: ( rulePrimitiveLiteralExpCS )
-                    // InternalOCLstdlib.g:5045:1: rulePrimitiveLiteralExpCS
+                    // InternalOCLstdlib.g:5046:6: ( rulePrimitiveLiteralExpCS )
+                    // InternalOCLstdlib.g:5047:1: rulePrimitiveLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());
@@ -16705,10 +16705,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalOCLstdlib.g:5050:6: ( ruleTupleLiteralExpCS )
+                    // InternalOCLstdlib.g:5052:6: ( ruleTupleLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:5050:6: ( ruleTupleLiteralExpCS )
-                    // InternalOCLstdlib.g:5051:1: ruleTupleLiteralExpCS
+                    // InternalOCLstdlib.g:5052:6: ( ruleTupleLiteralExpCS )
+                    // InternalOCLstdlib.g:5053:1: ruleTupleLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -16728,10 +16728,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalOCLstdlib.g:5056:6: ( ruleMapLiteralExpCS )
+                    // InternalOCLstdlib.g:5058:6: ( ruleMapLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:5056:6: ( ruleMapLiteralExpCS )
-                    // InternalOCLstdlib.g:5057:1: ruleMapLiteralExpCS
+                    // InternalOCLstdlib.g:5058:6: ( ruleMapLiteralExpCS )
+                    // InternalOCLstdlib.g:5059:1: ruleMapLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -16751,10 +16751,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalOCLstdlib.g:5062:6: ( ruleCollectionLiteralExpCS )
+                    // InternalOCLstdlib.g:5064:6: ( ruleCollectionLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:5062:6: ( ruleCollectionLiteralExpCS )
-                    // InternalOCLstdlib.g:5063:1: ruleCollectionLiteralExpCS
+                    // InternalOCLstdlib.g:5064:6: ( ruleCollectionLiteralExpCS )
+                    // InternalOCLstdlib.g:5065:1: ruleCollectionLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -16774,10 +16774,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalOCLstdlib.g:5068:6: ( ruleLambdaLiteralExpCS )
+                    // InternalOCLstdlib.g:5070:6: ( ruleLambdaLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:5068:6: ( ruleLambdaLiteralExpCS )
-                    // InternalOCLstdlib.g:5069:1: ruleLambdaLiteralExpCS
+                    // InternalOCLstdlib.g:5070:6: ( ruleLambdaLiteralExpCS )
+                    // InternalOCLstdlib.g:5071:1: ruleLambdaLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());
@@ -16797,10 +16797,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalOCLstdlib.g:5074:6: ( ruleTypeLiteralExpCS )
+                    // InternalOCLstdlib.g:5076:6: ( ruleTypeLiteralExpCS )
                     {
-                    // InternalOCLstdlib.g:5074:6: ( ruleTypeLiteralExpCS )
-                    // InternalOCLstdlib.g:5075:1: ruleTypeLiteralExpCS
+                    // InternalOCLstdlib.g:5076:6: ( ruleTypeLiteralExpCS )
+                    // InternalOCLstdlib.g:5077:1: ruleTypeLiteralExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -16820,10 +16820,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalOCLstdlib.g:5080:6: ( ruleNameExpCS )
+                    // InternalOCLstdlib.g:5082:6: ( ruleNameExpCS )
                     {
-                    // InternalOCLstdlib.g:5080:6: ( ruleNameExpCS )
-                    // InternalOCLstdlib.g:5081:1: ruleNameExpCS
+                    // InternalOCLstdlib.g:5082:6: ( ruleNameExpCS )
+                    // InternalOCLstdlib.g:5083:1: ruleNameExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());
@@ -16860,13 +16860,13 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0"
-    // InternalOCLstdlib.g:5091:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
+    // InternalOCLstdlib.g:5093:1: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 : ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) );
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5095:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
+            // InternalOCLstdlib.g:5097:1: ( ( ruleNavigatingCommaArgCS ) | ( ruleNavigatingSemiArgCS ) | ( ruleNavigatingBarArgCS ) )
             int alt46=3;
             switch ( input.LA(1) ) {
             case 91:
@@ -16894,10 +16894,10 @@
 
             switch (alt46) {
                 case 1 :
-                    // InternalOCLstdlib.g:5096:1: ( ruleNavigatingCommaArgCS )
+                    // InternalOCLstdlib.g:5098:1: ( ruleNavigatingCommaArgCS )
                     {
-                    // InternalOCLstdlib.g:5096:1: ( ruleNavigatingCommaArgCS )
-                    // InternalOCLstdlib.g:5097:1: ruleNavigatingCommaArgCS
+                    // InternalOCLstdlib.g:5098:1: ( ruleNavigatingCommaArgCS )
+                    // InternalOCLstdlib.g:5099:1: ruleNavigatingCommaArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());
@@ -16917,10 +16917,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5102:6: ( ruleNavigatingSemiArgCS )
+                    // InternalOCLstdlib.g:5104:6: ( ruleNavigatingSemiArgCS )
                     {
-                    // InternalOCLstdlib.g:5102:6: ( ruleNavigatingSemiArgCS )
-                    // InternalOCLstdlib.g:5103:1: ruleNavigatingSemiArgCS
+                    // InternalOCLstdlib.g:5104:6: ( ruleNavigatingSemiArgCS )
+                    // InternalOCLstdlib.g:5105:1: ruleNavigatingSemiArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());
@@ -16940,10 +16940,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:5108:6: ( ruleNavigatingBarArgCS )
+                    // InternalOCLstdlib.g:5110:6: ( ruleNavigatingBarArgCS )
                     {
-                    // InternalOCLstdlib.g:5108:6: ( ruleNavigatingBarArgCS )
-                    // InternalOCLstdlib.g:5109:1: ruleNavigatingBarArgCS
+                    // InternalOCLstdlib.g:5110:6: ( ruleNavigatingBarArgCS )
+                    // InternalOCLstdlib.g:5111:1: ruleNavigatingBarArgCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());
@@ -16980,13 +16980,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives"
-    // InternalOCLstdlib.g:5119:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
+    // InternalOCLstdlib.g:5121:1: rule__NavigatingArgCS__Alternatives : ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5123:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
+            // InternalOCLstdlib.g:5125:1: ( ( ( rule__NavigatingArgCS__Group_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_1__0 ) ) )
             int alt47=2;
             int LA47_0 = input.LA(1);
 
@@ -17005,16 +17005,16 @@
             }
             switch (alt47) {
                 case 1 :
-                    // InternalOCLstdlib.g:5124:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:5126:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:5124:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
-                    // InternalOCLstdlib.g:5125:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalOCLstdlib.g:5126:1: ( ( rule__NavigatingArgCS__Group_0__0 ) )
+                    // InternalOCLstdlib.g:5127:1: ( rule__NavigatingArgCS__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0());
                     }
-                    // InternalOCLstdlib.g:5126:1: ( rule__NavigatingArgCS__Group_0__0 )
-                    // InternalOCLstdlib.g:5126:2: rule__NavigatingArgCS__Group_0__0
+                    // InternalOCLstdlib.g:5128:1: ( rule__NavigatingArgCS__Group_0__0 )
+                    // InternalOCLstdlib.g:5128:2: rule__NavigatingArgCS__Group_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0__0();
@@ -17034,16 +17034,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5130:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalOCLstdlib.g:5132:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:5130:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
-                    // InternalOCLstdlib.g:5131:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalOCLstdlib.g:5132:6: ( ( rule__NavigatingArgCS__Group_1__0 ) )
+                    // InternalOCLstdlib.g:5133:1: ( rule__NavigatingArgCS__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_1());
                     }
-                    // InternalOCLstdlib.g:5132:1: ( rule__NavigatingArgCS__Group_1__0 )
-                    // InternalOCLstdlib.g:5132:2: rule__NavigatingArgCS__Group_1__0
+                    // InternalOCLstdlib.g:5134:1: ( rule__NavigatingArgCS__Group_1__0 )
+                    // InternalOCLstdlib.g:5134:2: rule__NavigatingArgCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_1__0();
@@ -17080,13 +17080,13 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Alternatives_0_1"
-    // InternalOCLstdlib.g:5141:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
+    // InternalOCLstdlib.g:5143:1: rule__NavigatingArgCS__Alternatives_0_1 : ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) );
     public final void rule__NavigatingArgCS__Alternatives_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5145:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
+            // InternalOCLstdlib.g:5147:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) | ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) ) )
             int alt48=3;
             switch ( input.LA(1) ) {
             case 100:
@@ -17142,16 +17142,16 @@
 
             switch (alt48) {
                 case 1 :
-                    // InternalOCLstdlib.g:5146:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalOCLstdlib.g:5148:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:5146:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-                    // InternalOCLstdlib.g:5147:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalOCLstdlib.g:5148:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+                    // InternalOCLstdlib.g:5149:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
                     }
-                    // InternalOCLstdlib.g:5148:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-                    // InternalOCLstdlib.g:5148:2: rule__NavigatingArgCS__Group_0_1_0__0
+                    // InternalOCLstdlib.g:5150:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+                    // InternalOCLstdlib.g:5150:2: rule__NavigatingArgCS__Group_0_1_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0__0();
@@ -17171,16 +17171,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5152:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalOCLstdlib.g:5154:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:5152:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-                    // InternalOCLstdlib.g:5153:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalOCLstdlib.g:5154:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+                    // InternalOCLstdlib.g:5155:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
                     }
-                    // InternalOCLstdlib.g:5154:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-                    // InternalOCLstdlib.g:5154:2: rule__NavigatingArgCS__Group_0_1_1__0
+                    // InternalOCLstdlib.g:5156:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+                    // InternalOCLstdlib.g:5156:2: rule__NavigatingArgCS__Group_0_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1__0();
@@ -17200,16 +17200,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:5158:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalOCLstdlib.g:5160:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
                     {
-                    // InternalOCLstdlib.g:5158:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
-                    // InternalOCLstdlib.g:5159:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalOCLstdlib.g:5160:6: ( ( rule__NavigatingArgCS__Group_0_1_2__0 ) )
+                    // InternalOCLstdlib.g:5161:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2());
                     }
-                    // InternalOCLstdlib.g:5160:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
-                    // InternalOCLstdlib.g:5160:2: rule__NavigatingArgCS__Group_0_1_2__0
+                    // InternalOCLstdlib.g:5162:1: ( rule__NavigatingArgCS__Group_0_1_2__0 )
+                    // InternalOCLstdlib.g:5162:2: rule__NavigatingArgCS__Group_0_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2__0();
@@ -17246,13 +17246,13 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Alternatives_2"
-    // InternalOCLstdlib.g:5169:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
+    // InternalOCLstdlib.g:5171:1: rule__NavigatingCommaArgCS__Alternatives_2 : ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) );
     public final void rule__NavigatingCommaArgCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5173:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
+            // InternalOCLstdlib.g:5175:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) | ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) ) )
             int alt49=3;
             switch ( input.LA(1) ) {
             case 100:
@@ -17308,16 +17308,16 @@
 
             switch (alt49) {
                 case 1 :
-                    // InternalOCLstdlib.g:5174:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalOCLstdlib.g:5176:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
                     {
-                    // InternalOCLstdlib.g:5174:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-                    // InternalOCLstdlib.g:5175:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalOCLstdlib.g:5176:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+                    // InternalOCLstdlib.g:5177:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
                     }
-                    // InternalOCLstdlib.g:5176:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-                    // InternalOCLstdlib.g:5176:2: rule__NavigatingCommaArgCS__Group_2_0__0
+                    // InternalOCLstdlib.g:5178:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+                    // InternalOCLstdlib.g:5178:2: rule__NavigatingCommaArgCS__Group_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -17337,16 +17337,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5180:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalOCLstdlib.g:5182:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
                     {
-                    // InternalOCLstdlib.g:5180:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-                    // InternalOCLstdlib.g:5181:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalOCLstdlib.g:5182:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+                    // InternalOCLstdlib.g:5183:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
                     }
-                    // InternalOCLstdlib.g:5182:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-                    // InternalOCLstdlib.g:5182:2: rule__NavigatingCommaArgCS__Group_2_1__0
+                    // InternalOCLstdlib.g:5184:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+                    // InternalOCLstdlib.g:5184:2: rule__NavigatingCommaArgCS__Group_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -17366,16 +17366,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:5186:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalOCLstdlib.g:5188:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
                     {
-                    // InternalOCLstdlib.g:5186:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
-                    // InternalOCLstdlib.g:5187:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalOCLstdlib.g:5188:6: ( ( rule__NavigatingCommaArgCS__Group_2_2__0 ) )
+                    // InternalOCLstdlib.g:5189:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2());
                     }
-                    // InternalOCLstdlib.g:5188:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
-                    // InternalOCLstdlib.g:5188:2: rule__NavigatingCommaArgCS__Group_2_2__0
+                    // InternalOCLstdlib.g:5190:1: ( rule__NavigatingCommaArgCS__Group_2_2__0 )
+                    // InternalOCLstdlib.g:5190:2: rule__NavigatingCommaArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2__0();
@@ -17412,21 +17412,21 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAlternatives_1_0"
-    // InternalOCLstdlib.g:5197:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
+    // InternalOCLstdlib.g:5199:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );
     public final void rule__IfExpCS__OwnedConditionAlternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5201:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
+            // InternalOCLstdlib.g:5203:1: ( ( ruleExpCS ) | ( rulePatternExpCS ) )
             int alt50=2;
             alt50 = dfa50.predict(input);
             switch (alt50) {
                 case 1 :
-                    // InternalOCLstdlib.g:5202:1: ( ruleExpCS )
+                    // InternalOCLstdlib.g:5204:1: ( ruleExpCS )
                     {
-                    // InternalOCLstdlib.g:5202:1: ( ruleExpCS )
-                    // InternalOCLstdlib.g:5203:1: ruleExpCS
+                    // InternalOCLstdlib.g:5204:1: ( ruleExpCS )
+                    // InternalOCLstdlib.g:5205:1: ruleExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());
@@ -17446,10 +17446,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5208:6: ( rulePatternExpCS )
+                    // InternalOCLstdlib.g:5210:6: ( rulePatternExpCS )
                     {
-                    // InternalOCLstdlib.g:5208:6: ( rulePatternExpCS )
-                    // InternalOCLstdlib.g:5209:1: rulePatternExpCS
+                    // InternalOCLstdlib.g:5210:6: ( rulePatternExpCS )
+                    // InternalOCLstdlib.g:5211:1: rulePatternExpCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());
@@ -17486,13 +17486,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_1"
-    // InternalOCLstdlib.g:5219:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
+    // InternalOCLstdlib.g:5221:1: rule__MultiplicityCS__Alternatives_1 : ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) );
     public final void rule__MultiplicityCS__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5223:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
+            // InternalOCLstdlib.g:5225:1: ( ( ruleMultiplicityBoundsCS ) | ( ruleMultiplicityStringCS ) )
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -17511,10 +17511,10 @@
             }
             switch (alt51) {
                 case 1 :
-                    // InternalOCLstdlib.g:5224:1: ( ruleMultiplicityBoundsCS )
+                    // InternalOCLstdlib.g:5226:1: ( ruleMultiplicityBoundsCS )
                     {
-                    // InternalOCLstdlib.g:5224:1: ( ruleMultiplicityBoundsCS )
-                    // InternalOCLstdlib.g:5225:1: ruleMultiplicityBoundsCS
+                    // InternalOCLstdlib.g:5226:1: ( ruleMultiplicityBoundsCS )
+                    // InternalOCLstdlib.g:5227:1: ruleMultiplicityBoundsCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());
@@ -17534,10 +17534,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5230:6: ( ruleMultiplicityStringCS )
+                    // InternalOCLstdlib.g:5232:6: ( ruleMultiplicityStringCS )
                     {
-                    // InternalOCLstdlib.g:5230:6: ( ruleMultiplicityStringCS )
-                    // InternalOCLstdlib.g:5231:1: ruleMultiplicityStringCS
+                    // InternalOCLstdlib.g:5232:6: ( ruleMultiplicityStringCS )
+                    // InternalOCLstdlib.g:5233:1: ruleMultiplicityStringCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());
@@ -17574,13 +17574,13 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Alternatives_2"
-    // InternalOCLstdlib.g:5241:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
+    // InternalOCLstdlib.g:5243:1: rule__MultiplicityCS__Alternatives_2 : ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) );
     public final void rule__MultiplicityCS__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5245:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:5247:1: ( ( '|?' ) | ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) ) )
             int alt52=2;
             int LA52_0 = input.LA(1);
 
@@ -17599,10 +17599,10 @@
             }
             switch (alt52) {
                 case 1 :
-                    // InternalOCLstdlib.g:5246:1: ( '|?' )
+                    // InternalOCLstdlib.g:5248:1: ( '|?' )
                     {
-                    // InternalOCLstdlib.g:5246:1: ( '|?' )
-                    // InternalOCLstdlib.g:5247:1: '|?'
+                    // InternalOCLstdlib.g:5248:1: ( '|?' )
+                    // InternalOCLstdlib.g:5249:1: '|?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());
@@ -17618,16 +17618,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5254:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalOCLstdlib.g:5256:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
                     {
-                    // InternalOCLstdlib.g:5254:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
-                    // InternalOCLstdlib.g:5255:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalOCLstdlib.g:5256:6: ( ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 ) )
+                    // InternalOCLstdlib.g:5257:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityCSAccess().getIsNullFreeAssignment_2_1());
                     }
-                    // InternalOCLstdlib.g:5256:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
-                    // InternalOCLstdlib.g:5256:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
+                    // InternalOCLstdlib.g:5258:1: ( rule__MultiplicityCS__IsNullFreeAssignment_2_1 )
+                    // InternalOCLstdlib.g:5258:2: rule__MultiplicityCS__IsNullFreeAssignment_2_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__IsNullFreeAssignment_2_1();
@@ -17664,13 +17664,13 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAlternatives_0"
-    // InternalOCLstdlib.g:5265:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
+    // InternalOCLstdlib.g:5267:1: rule__MultiplicityStringCS__StringBoundsAlternatives_0 : ( ( '*' ) | ( '+' ) | ( '?' ) );
     public final void rule__MultiplicityStringCS__StringBoundsAlternatives_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5269:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
+            // InternalOCLstdlib.g:5271:1: ( ( '*' ) | ( '+' ) | ( '?' ) )
             int alt53=3;
             switch ( input.LA(1) ) {
             case 59:
@@ -17698,10 +17698,10 @@
 
             switch (alt53) {
                 case 1 :
-                    // InternalOCLstdlib.g:5270:1: ( '*' )
+                    // InternalOCLstdlib.g:5272:1: ( '*' )
                     {
-                    // InternalOCLstdlib.g:5270:1: ( '*' )
-                    // InternalOCLstdlib.g:5271:1: '*'
+                    // InternalOCLstdlib.g:5272:1: ( '*' )
+                    // InternalOCLstdlib.g:5273:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());
@@ -17717,10 +17717,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5278:6: ( '+' )
+                    // InternalOCLstdlib.g:5280:6: ( '+' )
                     {
-                    // InternalOCLstdlib.g:5278:6: ( '+' )
-                    // InternalOCLstdlib.g:5279:1: '+'
+                    // InternalOCLstdlib.g:5280:6: ( '+' )
+                    // InternalOCLstdlib.g:5281:1: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());
@@ -17736,10 +17736,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalOCLstdlib.g:5286:6: ( '?' )
+                    // InternalOCLstdlib.g:5288:6: ( '?' )
                     {
-                    // InternalOCLstdlib.g:5286:6: ( '?' )
-                    // InternalOCLstdlib.g:5287:1: '?'
+                    // InternalOCLstdlib.g:5288:6: ( '?' )
+                    // InternalOCLstdlib.g:5289:1: '?'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());
@@ -17772,13 +17772,13 @@
 
 
     // $ANTLR start "rule__TypeRefCS__Alternatives"
-    // InternalOCLstdlib.g:5299:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
+    // InternalOCLstdlib.g:5301:1: rule__TypeRefCS__Alternatives : ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) );
     public final void rule__TypeRefCS__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5303:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
+            // InternalOCLstdlib.g:5305:1: ( ( ruleTypedRefCS ) | ( ruleWildcardTypeRefCS ) )
             int alt54=2;
             int LA54_0 = input.LA(1);
 
@@ -17797,10 +17797,10 @@
             }
             switch (alt54) {
                 case 1 :
-                    // InternalOCLstdlib.g:5304:1: ( ruleTypedRefCS )
+                    // InternalOCLstdlib.g:5306:1: ( ruleTypedRefCS )
                     {
-                    // InternalOCLstdlib.g:5304:1: ( ruleTypedRefCS )
-                    // InternalOCLstdlib.g:5305:1: ruleTypedRefCS
+                    // InternalOCLstdlib.g:5306:1: ( ruleTypedRefCS )
+                    // InternalOCLstdlib.g:5307:1: ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());
@@ -17820,10 +17820,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5310:6: ( ruleWildcardTypeRefCS )
+                    // InternalOCLstdlib.g:5312:6: ( ruleWildcardTypeRefCS )
                     {
-                    // InternalOCLstdlib.g:5310:6: ( ruleWildcardTypeRefCS )
-                    // InternalOCLstdlib.g:5311:1: ruleWildcardTypeRefCS
+                    // InternalOCLstdlib.g:5312:6: ( ruleWildcardTypeRefCS )
+                    // InternalOCLstdlib.g:5313:1: ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());
@@ -17860,13 +17860,13 @@
 
 
     // $ANTLR start "rule__ID__Alternatives"
-    // InternalOCLstdlib.g:5321:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
+    // InternalOCLstdlib.g:5323:1: rule__ID__Alternatives : ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) );
     public final void rule__ID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5325:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
+            // InternalOCLstdlib.g:5327:1: ( ( RULE_SIMPLE_ID ) | ( RULE_ESCAPED_ID ) )
             int alt55=2;
             int LA55_0 = input.LA(1);
 
@@ -17885,10 +17885,10 @@
             }
             switch (alt55) {
                 case 1 :
-                    // InternalOCLstdlib.g:5326:1: ( RULE_SIMPLE_ID )
+                    // InternalOCLstdlib.g:5328:1: ( RULE_SIMPLE_ID )
                     {
-                    // InternalOCLstdlib.g:5326:1: ( RULE_SIMPLE_ID )
-                    // InternalOCLstdlib.g:5327:1: RULE_SIMPLE_ID
+                    // InternalOCLstdlib.g:5328:1: ( RULE_SIMPLE_ID )
+                    // InternalOCLstdlib.g:5329:1: RULE_SIMPLE_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());
@@ -17904,10 +17904,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5332:6: ( RULE_ESCAPED_ID )
+                    // InternalOCLstdlib.g:5334:6: ( RULE_ESCAPED_ID )
                     {
-                    // InternalOCLstdlib.g:5332:6: ( RULE_ESCAPED_ID )
-                    // InternalOCLstdlib.g:5333:1: RULE_ESCAPED_ID
+                    // InternalOCLstdlib.g:5334:6: ( RULE_ESCAPED_ID )
+                    // InternalOCLstdlib.g:5335:1: RULE_ESCAPED_ID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());
@@ -17940,13 +17940,13 @@
 
 
     // $ANTLR start "rule__UPPER__Alternatives"
-    // InternalOCLstdlib.g:5343:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
+    // InternalOCLstdlib.g:5345:1: rule__UPPER__Alternatives : ( ( RULE_INT ) | ( '*' ) );
     public final void rule__UPPER__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5347:1: ( ( RULE_INT ) | ( '*' ) )
+            // InternalOCLstdlib.g:5349:1: ( ( RULE_INT ) | ( '*' ) )
             int alt56=2;
             int LA56_0 = input.LA(1);
 
@@ -17965,10 +17965,10 @@
             }
             switch (alt56) {
                 case 1 :
-                    // InternalOCLstdlib.g:5348:1: ( RULE_INT )
+                    // InternalOCLstdlib.g:5350:1: ( RULE_INT )
                     {
-                    // InternalOCLstdlib.g:5348:1: ( RULE_INT )
-                    // InternalOCLstdlib.g:5349:1: RULE_INT
+                    // InternalOCLstdlib.g:5350:1: ( RULE_INT )
+                    // InternalOCLstdlib.g:5351:1: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());
@@ -17984,10 +17984,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:5354:6: ( '*' )
+                    // InternalOCLstdlib.g:5356:6: ( '*' )
                     {
-                    // InternalOCLstdlib.g:5354:6: ( '*' )
-                    // InternalOCLstdlib.g:5355:1: '*'
+                    // InternalOCLstdlib.g:5356:6: ( '*' )
+                    // InternalOCLstdlib.g:5357:1: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getUPPERAccess().getAsteriskKeyword_1());
@@ -18020,14 +18020,14 @@
 
 
     // $ANTLR start "rule__Library__Group__0"
-    // InternalOCLstdlib.g:5369:1: rule__Library__Group__0 : rule__Library__Group__0__Impl rule__Library__Group__1 ;
+    // InternalOCLstdlib.g:5371:1: rule__Library__Group__0 : rule__Library__Group__0__Impl rule__Library__Group__1 ;
     public final void rule__Library__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5373:1: ( rule__Library__Group__0__Impl rule__Library__Group__1 )
-            // InternalOCLstdlib.g:5374:2: rule__Library__Group__0__Impl rule__Library__Group__1
+            // InternalOCLstdlib.g:5375:1: ( rule__Library__Group__0__Impl rule__Library__Group__1 )
+            // InternalOCLstdlib.g:5376:2: rule__Library__Group__0__Impl rule__Library__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_4);
             rule__Library__Group__0__Impl();
@@ -18058,22 +18058,22 @@
 
 
     // $ANTLR start "rule__Library__Group__0__Impl"
-    // InternalOCLstdlib.g:5381:1: rule__Library__Group__0__Impl : ( ( rule__Library__Group_0__0 )* ) ;
+    // InternalOCLstdlib.g:5383:1: rule__Library__Group__0__Impl : ( ( rule__Library__Group_0__0 )* ) ;
     public final void rule__Library__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5385:1: ( ( ( rule__Library__Group_0__0 )* ) )
-            // InternalOCLstdlib.g:5386:1: ( ( rule__Library__Group_0__0 )* )
+            // InternalOCLstdlib.g:5387:1: ( ( ( rule__Library__Group_0__0 )* ) )
+            // InternalOCLstdlib.g:5388:1: ( ( rule__Library__Group_0__0 )* )
             {
-            // InternalOCLstdlib.g:5386:1: ( ( rule__Library__Group_0__0 )* )
-            // InternalOCLstdlib.g:5387:1: ( rule__Library__Group_0__0 )*
+            // InternalOCLstdlib.g:5388:1: ( ( rule__Library__Group_0__0 )* )
+            // InternalOCLstdlib.g:5389:1: ( rule__Library__Group_0__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibraryAccess().getGroup_0());
             }
-            // InternalOCLstdlib.g:5388:1: ( rule__Library__Group_0__0 )*
+            // InternalOCLstdlib.g:5390:1: ( rule__Library__Group_0__0 )*
             loop57:
             do {
                 int alt57=2;
@@ -18086,7 +18086,7 @@
 
                 switch (alt57) {
             	case 1 :
-            	    // InternalOCLstdlib.g:5388:2: rule__Library__Group_0__0
+            	    // InternalOCLstdlib.g:5390:2: rule__Library__Group_0__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_5);
             	    rule__Library__Group_0__0();
@@ -18127,14 +18127,14 @@
 
 
     // $ANTLR start "rule__Library__Group__1"
-    // InternalOCLstdlib.g:5398:1: rule__Library__Group__1 : rule__Library__Group__1__Impl ;
+    // InternalOCLstdlib.g:5400:1: rule__Library__Group__1 : rule__Library__Group__1__Impl ;
     public final void rule__Library__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5402:1: ( rule__Library__Group__1__Impl )
-            // InternalOCLstdlib.g:5403:2: rule__Library__Group__1__Impl
+            // InternalOCLstdlib.g:5404:1: ( rule__Library__Group__1__Impl )
+            // InternalOCLstdlib.g:5405:2: rule__Library__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__Library__Group__1__Impl();
@@ -18160,22 +18160,22 @@
 
 
     // $ANTLR start "rule__Library__Group__1__Impl"
-    // InternalOCLstdlib.g:5409:1: rule__Library__Group__1__Impl : ( ( rule__Library__OwnedPackagesAssignment_1 )* ) ;
+    // InternalOCLstdlib.g:5411:1: rule__Library__Group__1__Impl : ( ( rule__Library__OwnedPackagesAssignment_1 )* ) ;
     public final void rule__Library__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5413:1: ( ( ( rule__Library__OwnedPackagesAssignment_1 )* ) )
-            // InternalOCLstdlib.g:5414:1: ( ( rule__Library__OwnedPackagesAssignment_1 )* )
+            // InternalOCLstdlib.g:5415:1: ( ( ( rule__Library__OwnedPackagesAssignment_1 )* ) )
+            // InternalOCLstdlib.g:5416:1: ( ( rule__Library__OwnedPackagesAssignment_1 )* )
             {
-            // InternalOCLstdlib.g:5414:1: ( ( rule__Library__OwnedPackagesAssignment_1 )* )
-            // InternalOCLstdlib.g:5415:1: ( rule__Library__OwnedPackagesAssignment_1 )*
+            // InternalOCLstdlib.g:5416:1: ( ( rule__Library__OwnedPackagesAssignment_1 )* )
+            // InternalOCLstdlib.g:5417:1: ( rule__Library__OwnedPackagesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibraryAccess().getOwnedPackagesAssignment_1());
             }
-            // InternalOCLstdlib.g:5416:1: ( rule__Library__OwnedPackagesAssignment_1 )*
+            // InternalOCLstdlib.g:5418:1: ( rule__Library__OwnedPackagesAssignment_1 )*
             loop58:
             do {
                 int alt58=2;
@@ -18188,7 +18188,7 @@
 
                 switch (alt58) {
             	case 1 :
-            	    // InternalOCLstdlib.g:5416:2: rule__Library__OwnedPackagesAssignment_1
+            	    // InternalOCLstdlib.g:5418:2: rule__Library__OwnedPackagesAssignment_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_6);
             	    rule__Library__OwnedPackagesAssignment_1();
@@ -18229,14 +18229,14 @@
 
 
     // $ANTLR start "rule__Library__Group_0__0"
-    // InternalOCLstdlib.g:5430:1: rule__Library__Group_0__0 : rule__Library__Group_0__0__Impl rule__Library__Group_0__1 ;
+    // InternalOCLstdlib.g:5432:1: rule__Library__Group_0__0 : rule__Library__Group_0__0__Impl rule__Library__Group_0__1 ;
     public final void rule__Library__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5434:1: ( rule__Library__Group_0__0__Impl rule__Library__Group_0__1 )
-            // InternalOCLstdlib.g:5435:2: rule__Library__Group_0__0__Impl rule__Library__Group_0__1
+            // InternalOCLstdlib.g:5436:1: ( rule__Library__Group_0__0__Impl rule__Library__Group_0__1 )
+            // InternalOCLstdlib.g:5437:2: rule__Library__Group_0__0__Impl rule__Library__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__Library__Group_0__0__Impl();
@@ -18267,23 +18267,23 @@
 
 
     // $ANTLR start "rule__Library__Group_0__0__Impl"
-    // InternalOCLstdlib.g:5442:1: rule__Library__Group_0__0__Impl : ( ( rule__Library__OwnedImportsAssignment_0_0 ) ) ;
+    // InternalOCLstdlib.g:5444:1: rule__Library__Group_0__0__Impl : ( ( rule__Library__OwnedImportsAssignment_0_0 ) ) ;
     public final void rule__Library__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5446:1: ( ( ( rule__Library__OwnedImportsAssignment_0_0 ) ) )
-            // InternalOCLstdlib.g:5447:1: ( ( rule__Library__OwnedImportsAssignment_0_0 ) )
+            // InternalOCLstdlib.g:5448:1: ( ( ( rule__Library__OwnedImportsAssignment_0_0 ) ) )
+            // InternalOCLstdlib.g:5449:1: ( ( rule__Library__OwnedImportsAssignment_0_0 ) )
             {
-            // InternalOCLstdlib.g:5447:1: ( ( rule__Library__OwnedImportsAssignment_0_0 ) )
-            // InternalOCLstdlib.g:5448:1: ( rule__Library__OwnedImportsAssignment_0_0 )
+            // InternalOCLstdlib.g:5449:1: ( ( rule__Library__OwnedImportsAssignment_0_0 ) )
+            // InternalOCLstdlib.g:5450:1: ( rule__Library__OwnedImportsAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibraryAccess().getOwnedImportsAssignment_0_0());
             }
-            // InternalOCLstdlib.g:5449:1: ( rule__Library__OwnedImportsAssignment_0_0 )
-            // InternalOCLstdlib.g:5449:2: rule__Library__OwnedImportsAssignment_0_0
+            // InternalOCLstdlib.g:5451:1: ( rule__Library__OwnedImportsAssignment_0_0 )
+            // InternalOCLstdlib.g:5451:2: rule__Library__OwnedImportsAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__Library__OwnedImportsAssignment_0_0();
@@ -18318,14 +18318,14 @@
 
 
     // $ANTLR start "rule__Library__Group_0__1"
-    // InternalOCLstdlib.g:5459:1: rule__Library__Group_0__1 : rule__Library__Group_0__1__Impl ;
+    // InternalOCLstdlib.g:5461:1: rule__Library__Group_0__1 : rule__Library__Group_0__1__Impl ;
     public final void rule__Library__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5463:1: ( rule__Library__Group_0__1__Impl )
-            // InternalOCLstdlib.g:5464:2: rule__Library__Group_0__1__Impl
+            // InternalOCLstdlib.g:5465:1: ( rule__Library__Group_0__1__Impl )
+            // InternalOCLstdlib.g:5466:2: rule__Library__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__Library__Group_0__1__Impl();
@@ -18351,17 +18351,17 @@
 
 
     // $ANTLR start "rule__Library__Group_0__1__Impl"
-    // InternalOCLstdlib.g:5470:1: rule__Library__Group_0__1__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:5472:1: rule__Library__Group_0__1__Impl : ( ';' ) ;
     public final void rule__Library__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5474:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:5475:1: ( ';' )
+            // InternalOCLstdlib.g:5476:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:5477:1: ( ';' )
             {
-            // InternalOCLstdlib.g:5475:1: ( ';' )
-            // InternalOCLstdlib.g:5476:1: ';'
+            // InternalOCLstdlib.g:5477:1: ( ';' )
+            // InternalOCLstdlib.g:5478:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibraryAccess().getSemicolonKeyword_0_1());
@@ -18392,14 +18392,14 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group__0"
-    // InternalOCLstdlib.g:5493:1: rule__LibPathNameCS__Group__0 : rule__LibPathNameCS__Group__0__Impl rule__LibPathNameCS__Group__1 ;
+    // InternalOCLstdlib.g:5495:1: rule__LibPathNameCS__Group__0 : rule__LibPathNameCS__Group__0__Impl rule__LibPathNameCS__Group__1 ;
     public final void rule__LibPathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5497:1: ( rule__LibPathNameCS__Group__0__Impl rule__LibPathNameCS__Group__1 )
-            // InternalOCLstdlib.g:5498:2: rule__LibPathNameCS__Group__0__Impl rule__LibPathNameCS__Group__1
+            // InternalOCLstdlib.g:5499:1: ( rule__LibPathNameCS__Group__0__Impl rule__LibPathNameCS__Group__1 )
+            // InternalOCLstdlib.g:5500:2: rule__LibPathNameCS__Group__0__Impl rule__LibPathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__LibPathNameCS__Group__0__Impl();
@@ -18430,23 +18430,23 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group__0__Impl"
-    // InternalOCLstdlib.g:5505:1: rule__LibPathNameCS__Group__0__Impl : ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:5507:1: rule__LibPathNameCS__Group__0__Impl : ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__LibPathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5509:1: ( ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalOCLstdlib.g:5510:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLstdlib.g:5511:1: ( ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalOCLstdlib.g:5512:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:5510:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalOCLstdlib.g:5511:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLstdlib.g:5512:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLstdlib.g:5513:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalOCLstdlib.g:5512:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalOCLstdlib.g:5512:2: rule__LibPathNameCS__OwnedPathElementsAssignment_0
+            // InternalOCLstdlib.g:5514:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLstdlib.g:5514:2: rule__LibPathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPathNameCS__OwnedPathElementsAssignment_0();
@@ -18481,14 +18481,14 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group__1"
-    // InternalOCLstdlib.g:5522:1: rule__LibPathNameCS__Group__1 : rule__LibPathNameCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:5524:1: rule__LibPathNameCS__Group__1 : rule__LibPathNameCS__Group__1__Impl ;
     public final void rule__LibPathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5526:1: ( rule__LibPathNameCS__Group__1__Impl )
-            // InternalOCLstdlib.g:5527:2: rule__LibPathNameCS__Group__1__Impl
+            // InternalOCLstdlib.g:5528:1: ( rule__LibPathNameCS__Group__1__Impl )
+            // InternalOCLstdlib.g:5529:2: rule__LibPathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPathNameCS__Group__1__Impl();
@@ -18514,22 +18514,22 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group__1__Impl"
-    // InternalOCLstdlib.g:5533:1: rule__LibPathNameCS__Group__1__Impl : ( ( rule__LibPathNameCS__Group_1__0 )* ) ;
+    // InternalOCLstdlib.g:5535:1: rule__LibPathNameCS__Group__1__Impl : ( ( rule__LibPathNameCS__Group_1__0 )* ) ;
     public final void rule__LibPathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5537:1: ( ( ( rule__LibPathNameCS__Group_1__0 )* ) )
-            // InternalOCLstdlib.g:5538:1: ( ( rule__LibPathNameCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:5539:1: ( ( ( rule__LibPathNameCS__Group_1__0 )* ) )
+            // InternalOCLstdlib.g:5540:1: ( ( rule__LibPathNameCS__Group_1__0 )* )
             {
-            // InternalOCLstdlib.g:5538:1: ( ( rule__LibPathNameCS__Group_1__0 )* )
-            // InternalOCLstdlib.g:5539:1: ( rule__LibPathNameCS__Group_1__0 )*
+            // InternalOCLstdlib.g:5540:1: ( ( rule__LibPathNameCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:5541:1: ( rule__LibPathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathNameCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:5540:1: ( rule__LibPathNameCS__Group_1__0 )*
+            // InternalOCLstdlib.g:5542:1: ( rule__LibPathNameCS__Group_1__0 )*
             loop59:
             do {
                 int alt59=2;
@@ -18542,7 +18542,7 @@
 
                 switch (alt59) {
             	case 1 :
-            	    // InternalOCLstdlib.g:5540:2: rule__LibPathNameCS__Group_1__0
+            	    // InternalOCLstdlib.g:5542:2: rule__LibPathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_9);
             	    rule__LibPathNameCS__Group_1__0();
@@ -18583,14 +18583,14 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group_1__0"
-    // InternalOCLstdlib.g:5554:1: rule__LibPathNameCS__Group_1__0 : rule__LibPathNameCS__Group_1__0__Impl rule__LibPathNameCS__Group_1__1 ;
+    // InternalOCLstdlib.g:5556:1: rule__LibPathNameCS__Group_1__0 : rule__LibPathNameCS__Group_1__0__Impl rule__LibPathNameCS__Group_1__1 ;
     public final void rule__LibPathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5558:1: ( rule__LibPathNameCS__Group_1__0__Impl rule__LibPathNameCS__Group_1__1 )
-            // InternalOCLstdlib.g:5559:2: rule__LibPathNameCS__Group_1__0__Impl rule__LibPathNameCS__Group_1__1
+            // InternalOCLstdlib.g:5560:1: ( rule__LibPathNameCS__Group_1__0__Impl rule__LibPathNameCS__Group_1__1 )
+            // InternalOCLstdlib.g:5561:2: rule__LibPathNameCS__Group_1__0__Impl rule__LibPathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibPathNameCS__Group_1__0__Impl();
@@ -18621,17 +18621,17 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:5566:1: rule__LibPathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalOCLstdlib.g:5568:1: rule__LibPathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__LibPathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5570:1: ( ( '::' ) )
-            // InternalOCLstdlib.g:5571:1: ( '::' )
+            // InternalOCLstdlib.g:5572:1: ( ( '::' ) )
+            // InternalOCLstdlib.g:5573:1: ( '::' )
             {
-            // InternalOCLstdlib.g:5571:1: ( '::' )
-            // InternalOCLstdlib.g:5572:1: '::'
+            // InternalOCLstdlib.g:5573:1: ( '::' )
+            // InternalOCLstdlib.g:5574:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathNameCSAccess().getColonColonKeyword_1_0());
@@ -18662,14 +18662,14 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group_1__1"
-    // InternalOCLstdlib.g:5585:1: rule__LibPathNameCS__Group_1__1 : rule__LibPathNameCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:5587:1: rule__LibPathNameCS__Group_1__1 : rule__LibPathNameCS__Group_1__1__Impl ;
     public final void rule__LibPathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5589:1: ( rule__LibPathNameCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:5590:2: rule__LibPathNameCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:5591:1: ( rule__LibPathNameCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:5592:2: rule__LibPathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPathNameCS__Group_1__1__Impl();
@@ -18695,23 +18695,23 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:5596:1: rule__LibPathNameCS__Group_1__1__Impl : ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:5598:1: rule__LibPathNameCS__Group_1__1__Impl : ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__LibPathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5600:1: ( ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:5601:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:5602:1: ( ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:5603:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:5601:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalOCLstdlib.g:5602:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLstdlib.g:5603:1: ( ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:5604:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalOCLstdlib.g:5603:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalOCLstdlib.g:5603:2: rule__LibPathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalOCLstdlib.g:5605:1: ( rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLstdlib.g:5605:2: rule__LibPathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPathNameCS__OwnedPathElementsAssignment_1_1();
@@ -18746,14 +18746,14 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__Group__0"
-    // InternalOCLstdlib.g:5617:1: rule__AccumulatorCS__Group__0 : rule__AccumulatorCS__Group__0__Impl rule__AccumulatorCS__Group__1 ;
+    // InternalOCLstdlib.g:5619:1: rule__AccumulatorCS__Group__0 : rule__AccumulatorCS__Group__0__Impl rule__AccumulatorCS__Group__1 ;
     public final void rule__AccumulatorCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5621:1: ( rule__AccumulatorCS__Group__0__Impl rule__AccumulatorCS__Group__1 )
-            // InternalOCLstdlib.g:5622:2: rule__AccumulatorCS__Group__0__Impl rule__AccumulatorCS__Group__1
+            // InternalOCLstdlib.g:5623:1: ( rule__AccumulatorCS__Group__0__Impl rule__AccumulatorCS__Group__1 )
+            // InternalOCLstdlib.g:5624:2: rule__AccumulatorCS__Group__0__Impl rule__AccumulatorCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__AccumulatorCS__Group__0__Impl();
@@ -18784,23 +18784,23 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__Group__0__Impl"
-    // InternalOCLstdlib.g:5629:1: rule__AccumulatorCS__Group__0__Impl : ( ( rule__AccumulatorCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:5631:1: rule__AccumulatorCS__Group__0__Impl : ( ( rule__AccumulatorCS__NameAssignment_0 ) ) ;
     public final void rule__AccumulatorCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5633:1: ( ( ( rule__AccumulatorCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:5634:1: ( ( rule__AccumulatorCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:5635:1: ( ( ( rule__AccumulatorCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:5636:1: ( ( rule__AccumulatorCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:5634:1: ( ( rule__AccumulatorCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:5635:1: ( rule__AccumulatorCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:5636:1: ( ( rule__AccumulatorCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:5637:1: ( rule__AccumulatorCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAccumulatorCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:5636:1: ( rule__AccumulatorCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:5636:2: rule__AccumulatorCS__NameAssignment_0
+            // InternalOCLstdlib.g:5638:1: ( rule__AccumulatorCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:5638:2: rule__AccumulatorCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AccumulatorCS__NameAssignment_0();
@@ -18835,14 +18835,14 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__Group__1"
-    // InternalOCLstdlib.g:5646:1: rule__AccumulatorCS__Group__1 : rule__AccumulatorCS__Group__1__Impl rule__AccumulatorCS__Group__2 ;
+    // InternalOCLstdlib.g:5648:1: rule__AccumulatorCS__Group__1 : rule__AccumulatorCS__Group__1__Impl rule__AccumulatorCS__Group__2 ;
     public final void rule__AccumulatorCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5650:1: ( rule__AccumulatorCS__Group__1__Impl rule__AccumulatorCS__Group__2 )
-            // InternalOCLstdlib.g:5651:2: rule__AccumulatorCS__Group__1__Impl rule__AccumulatorCS__Group__2
+            // InternalOCLstdlib.g:5652:1: ( rule__AccumulatorCS__Group__1__Impl rule__AccumulatorCS__Group__2 )
+            // InternalOCLstdlib.g:5653:2: rule__AccumulatorCS__Group__1__Impl rule__AccumulatorCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__AccumulatorCS__Group__1__Impl();
@@ -18873,17 +18873,17 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__Group__1__Impl"
-    // InternalOCLstdlib.g:5658:1: rule__AccumulatorCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:5660:1: rule__AccumulatorCS__Group__1__Impl : ( ':' ) ;
     public final void rule__AccumulatorCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5662:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:5663:1: ( ':' )
+            // InternalOCLstdlib.g:5664:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:5665:1: ( ':' )
             {
-            // InternalOCLstdlib.g:5663:1: ( ':' )
-            // InternalOCLstdlib.g:5664:1: ':'
+            // InternalOCLstdlib.g:5665:1: ( ':' )
+            // InternalOCLstdlib.g:5666:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAccumulatorCSAccess().getColonKeyword_1());
@@ -18914,14 +18914,14 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__Group__2"
-    // InternalOCLstdlib.g:5677:1: rule__AccumulatorCS__Group__2 : rule__AccumulatorCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:5679:1: rule__AccumulatorCS__Group__2 : rule__AccumulatorCS__Group__2__Impl ;
     public final void rule__AccumulatorCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5681:1: ( rule__AccumulatorCS__Group__2__Impl )
-            // InternalOCLstdlib.g:5682:2: rule__AccumulatorCS__Group__2__Impl
+            // InternalOCLstdlib.g:5683:1: ( rule__AccumulatorCS__Group__2__Impl )
+            // InternalOCLstdlib.g:5684:2: rule__AccumulatorCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AccumulatorCS__Group__2__Impl();
@@ -18947,23 +18947,23 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__Group__2__Impl"
-    // InternalOCLstdlib.g:5688:1: rule__AccumulatorCS__Group__2__Impl : ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:5690:1: rule__AccumulatorCS__Group__2__Impl : ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__AccumulatorCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5692:1: ( ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) ) )
-            // InternalOCLstdlib.g:5693:1: ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:5694:1: ( ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) ) )
+            // InternalOCLstdlib.g:5695:1: ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:5693:1: ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) )
-            // InternalOCLstdlib.g:5694:1: ( rule__AccumulatorCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:5695:1: ( ( rule__AccumulatorCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:5696:1: ( rule__AccumulatorCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAccumulatorCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalOCLstdlib.g:5695:1: ( rule__AccumulatorCS__OwnedTypeAssignment_2 )
-            // InternalOCLstdlib.g:5695:2: rule__AccumulatorCS__OwnedTypeAssignment_2
+            // InternalOCLstdlib.g:5697:1: ( rule__AccumulatorCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:5697:2: rule__AccumulatorCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AccumulatorCS__OwnedTypeAssignment_2();
@@ -18998,14 +18998,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__0"
-    // InternalOCLstdlib.g:5711:1: rule__AnnotationCS__Group__0 : rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 ;
+    // InternalOCLstdlib.g:5713:1: rule__AnnotationCS__Group__0 : rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 ;
     public final void rule__AnnotationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5715:1: ( rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 )
-            // InternalOCLstdlib.g:5716:2: rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1
+            // InternalOCLstdlib.g:5717:1: ( rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1 )
+            // InternalOCLstdlib.g:5718:2: rule__AnnotationCS__Group__0__Impl rule__AnnotationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__AnnotationCS__Group__0__Impl();
@@ -19036,17 +19036,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__0__Impl"
-    // InternalOCLstdlib.g:5723:1: rule__AnnotationCS__Group__0__Impl : ( 'annotation' ) ;
+    // InternalOCLstdlib.g:5725:1: rule__AnnotationCS__Group__0__Impl : ( 'annotation' ) ;
     public final void rule__AnnotationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5727:1: ( ( 'annotation' ) )
-            // InternalOCLstdlib.g:5728:1: ( 'annotation' )
+            // InternalOCLstdlib.g:5729:1: ( ( 'annotation' ) )
+            // InternalOCLstdlib.g:5730:1: ( 'annotation' )
             {
-            // InternalOCLstdlib.g:5728:1: ( 'annotation' )
-            // InternalOCLstdlib.g:5729:1: 'annotation'
+            // InternalOCLstdlib.g:5730:1: ( 'annotation' )
+            // InternalOCLstdlib.g:5731:1: 'annotation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAnnotationKeyword_0());
@@ -19077,14 +19077,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__1"
-    // InternalOCLstdlib.g:5742:1: rule__AnnotationCS__Group__1 : rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 ;
+    // InternalOCLstdlib.g:5744:1: rule__AnnotationCS__Group__1 : rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 ;
     public final void rule__AnnotationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5746:1: ( rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 )
-            // InternalOCLstdlib.g:5747:2: rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2
+            // InternalOCLstdlib.g:5748:1: ( rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2 )
+            // InternalOCLstdlib.g:5749:2: rule__AnnotationCS__Group__1__Impl rule__AnnotationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__AnnotationCS__Group__1__Impl();
@@ -19115,23 +19115,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__1__Impl"
-    // InternalOCLstdlib.g:5754:1: rule__AnnotationCS__Group__1__Impl : ( ( rule__AnnotationCS__NameAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:5756:1: rule__AnnotationCS__Group__1__Impl : ( ( rule__AnnotationCS__NameAssignment_1 ) ) ;
     public final void rule__AnnotationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5758:1: ( ( ( rule__AnnotationCS__NameAssignment_1 ) ) )
-            // InternalOCLstdlib.g:5759:1: ( ( rule__AnnotationCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:5760:1: ( ( ( rule__AnnotationCS__NameAssignment_1 ) ) )
+            // InternalOCLstdlib.g:5761:1: ( ( rule__AnnotationCS__NameAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:5759:1: ( ( rule__AnnotationCS__NameAssignment_1 ) )
-            // InternalOCLstdlib.g:5760:1: ( rule__AnnotationCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:5761:1: ( ( rule__AnnotationCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:5762:1: ( rule__AnnotationCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getNameAssignment_1());
             }
-            // InternalOCLstdlib.g:5761:1: ( rule__AnnotationCS__NameAssignment_1 )
-            // InternalOCLstdlib.g:5761:2: rule__AnnotationCS__NameAssignment_1
+            // InternalOCLstdlib.g:5763:1: ( rule__AnnotationCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:5763:2: rule__AnnotationCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__NameAssignment_1();
@@ -19166,14 +19166,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__2"
-    // InternalOCLstdlib.g:5771:1: rule__AnnotationCS__Group__2 : rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 ;
+    // InternalOCLstdlib.g:5773:1: rule__AnnotationCS__Group__2 : rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 ;
     public final void rule__AnnotationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5775:1: ( rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 )
-            // InternalOCLstdlib.g:5776:2: rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3
+            // InternalOCLstdlib.g:5777:1: ( rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3 )
+            // InternalOCLstdlib.g:5778:2: rule__AnnotationCS__Group__2__Impl rule__AnnotationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_14);
             rule__AnnotationCS__Group__2__Impl();
@@ -19204,22 +19204,22 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__2__Impl"
-    // InternalOCLstdlib.g:5783:1: rule__AnnotationCS__Group__2__Impl : ( ( rule__AnnotationCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:5785:1: rule__AnnotationCS__Group__2__Impl : ( ( rule__AnnotationCS__Group_2__0 )? ) ;
     public final void rule__AnnotationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5787:1: ( ( ( rule__AnnotationCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:5788:1: ( ( rule__AnnotationCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:5789:1: ( ( ( rule__AnnotationCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:5790:1: ( ( rule__AnnotationCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:5788:1: ( ( rule__AnnotationCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:5789:1: ( rule__AnnotationCS__Group_2__0 )?
+            // InternalOCLstdlib.g:5790:1: ( ( rule__AnnotationCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:5791:1: ( rule__AnnotationCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:5790:1: ( rule__AnnotationCS__Group_2__0 )?
+            // InternalOCLstdlib.g:5792:1: ( rule__AnnotationCS__Group_2__0 )?
             int alt60=2;
             int LA60_0 = input.LA(1);
 
@@ -19228,7 +19228,7 @@
             }
             switch (alt60) {
                 case 1 :
-                    // InternalOCLstdlib.g:5790:2: rule__AnnotationCS__Group_2__0
+                    // InternalOCLstdlib.g:5792:2: rule__AnnotationCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__AnnotationCS__Group_2__0();
@@ -19266,14 +19266,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__3"
-    // InternalOCLstdlib.g:5800:1: rule__AnnotationCS__Group__3 : rule__AnnotationCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:5802:1: rule__AnnotationCS__Group__3 : rule__AnnotationCS__Group__3__Impl ;
     public final void rule__AnnotationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5804:1: ( rule__AnnotationCS__Group__3__Impl )
-            // InternalOCLstdlib.g:5805:2: rule__AnnotationCS__Group__3__Impl
+            // InternalOCLstdlib.g:5806:1: ( rule__AnnotationCS__Group__3__Impl )
+            // InternalOCLstdlib.g:5807:2: rule__AnnotationCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group__3__Impl();
@@ -19299,23 +19299,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group__3__Impl"
-    // InternalOCLstdlib.g:5811:1: rule__AnnotationCS__Group__3__Impl : ( ( rule__AnnotationCS__Alternatives_3 ) ) ;
+    // InternalOCLstdlib.g:5813:1: rule__AnnotationCS__Group__3__Impl : ( ( rule__AnnotationCS__Alternatives_3 ) ) ;
     public final void rule__AnnotationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5815:1: ( ( ( rule__AnnotationCS__Alternatives_3 ) ) )
-            // InternalOCLstdlib.g:5816:1: ( ( rule__AnnotationCS__Alternatives_3 ) )
+            // InternalOCLstdlib.g:5817:1: ( ( ( rule__AnnotationCS__Alternatives_3 ) ) )
+            // InternalOCLstdlib.g:5818:1: ( ( rule__AnnotationCS__Alternatives_3 ) )
             {
-            // InternalOCLstdlib.g:5816:1: ( ( rule__AnnotationCS__Alternatives_3 ) )
-            // InternalOCLstdlib.g:5817:1: ( rule__AnnotationCS__Alternatives_3 )
+            // InternalOCLstdlib.g:5818:1: ( ( rule__AnnotationCS__Alternatives_3 ) )
+            // InternalOCLstdlib.g:5819:1: ( rule__AnnotationCS__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getAlternatives_3());
             }
-            // InternalOCLstdlib.g:5818:1: ( rule__AnnotationCS__Alternatives_3 )
-            // InternalOCLstdlib.g:5818:2: rule__AnnotationCS__Alternatives_3
+            // InternalOCLstdlib.g:5820:1: ( rule__AnnotationCS__Alternatives_3 )
+            // InternalOCLstdlib.g:5820:2: rule__AnnotationCS__Alternatives_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Alternatives_3();
@@ -19350,14 +19350,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__0"
-    // InternalOCLstdlib.g:5836:1: rule__AnnotationCS__Group_2__0 : rule__AnnotationCS__Group_2__0__Impl rule__AnnotationCS__Group_2__1 ;
+    // InternalOCLstdlib.g:5838:1: rule__AnnotationCS__Group_2__0 : rule__AnnotationCS__Group_2__0__Impl rule__AnnotationCS__Group_2__1 ;
     public final void rule__AnnotationCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5840:1: ( rule__AnnotationCS__Group_2__0__Impl rule__AnnotationCS__Group_2__1 )
-            // InternalOCLstdlib.g:5841:2: rule__AnnotationCS__Group_2__0__Impl rule__AnnotationCS__Group_2__1
+            // InternalOCLstdlib.g:5842:1: ( rule__AnnotationCS__Group_2__0__Impl rule__AnnotationCS__Group_2__1 )
+            // InternalOCLstdlib.g:5843:2: rule__AnnotationCS__Group_2__0__Impl rule__AnnotationCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__AnnotationCS__Group_2__0__Impl();
@@ -19388,17 +19388,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:5848:1: rule__AnnotationCS__Group_2__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:5850:1: rule__AnnotationCS__Group_2__0__Impl : ( '(' ) ;
     public final void rule__AnnotationCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5852:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:5853:1: ( '(' )
+            // InternalOCLstdlib.g:5854:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:5855:1: ( '(' )
             {
-            // InternalOCLstdlib.g:5853:1: ( '(' )
-            // InternalOCLstdlib.g:5854:1: '('
+            // InternalOCLstdlib.g:5855:1: ( '(' )
+            // InternalOCLstdlib.g:5856:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getLeftParenthesisKeyword_2_0());
@@ -19429,14 +19429,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__1"
-    // InternalOCLstdlib.g:5867:1: rule__AnnotationCS__Group_2__1 : rule__AnnotationCS__Group_2__1__Impl rule__AnnotationCS__Group_2__2 ;
+    // InternalOCLstdlib.g:5869:1: rule__AnnotationCS__Group_2__1 : rule__AnnotationCS__Group_2__1__Impl rule__AnnotationCS__Group_2__2 ;
     public final void rule__AnnotationCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5871:1: ( rule__AnnotationCS__Group_2__1__Impl rule__AnnotationCS__Group_2__2 )
-            // InternalOCLstdlib.g:5872:2: rule__AnnotationCS__Group_2__1__Impl rule__AnnotationCS__Group_2__2
+            // InternalOCLstdlib.g:5873:1: ( rule__AnnotationCS__Group_2__1__Impl rule__AnnotationCS__Group_2__2 )
+            // InternalOCLstdlib.g:5874:2: rule__AnnotationCS__Group_2__1__Impl rule__AnnotationCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__AnnotationCS__Group_2__1__Impl();
@@ -19467,23 +19467,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:5879:1: rule__AnnotationCS__Group_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:5881:1: rule__AnnotationCS__Group_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) ) ;
     public final void rule__AnnotationCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5883:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:5884:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) )
+            // InternalOCLstdlib.g:5885:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:5886:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:5884:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) )
-            // InternalOCLstdlib.g:5885:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 )
+            // InternalOCLstdlib.g:5886:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 ) )
+            // InternalOCLstdlib.g:5887:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_2_1());
             }
-            // InternalOCLstdlib.g:5886:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 )
-            // InternalOCLstdlib.g:5886:2: rule__AnnotationCS__OwnedDetailsAssignment_2_1
+            // InternalOCLstdlib.g:5888:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_1 )
+            // InternalOCLstdlib.g:5888:2: rule__AnnotationCS__OwnedDetailsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__OwnedDetailsAssignment_2_1();
@@ -19518,14 +19518,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__2"
-    // InternalOCLstdlib.g:5896:1: rule__AnnotationCS__Group_2__2 : rule__AnnotationCS__Group_2__2__Impl rule__AnnotationCS__Group_2__3 ;
+    // InternalOCLstdlib.g:5898:1: rule__AnnotationCS__Group_2__2 : rule__AnnotationCS__Group_2__2__Impl rule__AnnotationCS__Group_2__3 ;
     public final void rule__AnnotationCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5900:1: ( rule__AnnotationCS__Group_2__2__Impl rule__AnnotationCS__Group_2__3 )
-            // InternalOCLstdlib.g:5901:2: rule__AnnotationCS__Group_2__2__Impl rule__AnnotationCS__Group_2__3
+            // InternalOCLstdlib.g:5902:1: ( rule__AnnotationCS__Group_2__2__Impl rule__AnnotationCS__Group_2__3 )
+            // InternalOCLstdlib.g:5903:2: rule__AnnotationCS__Group_2__2__Impl rule__AnnotationCS__Group_2__3
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__AnnotationCS__Group_2__2__Impl();
@@ -19556,22 +19556,22 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__2__Impl"
-    // InternalOCLstdlib.g:5908:1: rule__AnnotationCS__Group_2__2__Impl : ( ( rule__AnnotationCS__Group_2_2__0 )* ) ;
+    // InternalOCLstdlib.g:5910:1: rule__AnnotationCS__Group_2__2__Impl : ( ( rule__AnnotationCS__Group_2_2__0 )* ) ;
     public final void rule__AnnotationCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5912:1: ( ( ( rule__AnnotationCS__Group_2_2__0 )* ) )
-            // InternalOCLstdlib.g:5913:1: ( ( rule__AnnotationCS__Group_2_2__0 )* )
+            // InternalOCLstdlib.g:5914:1: ( ( ( rule__AnnotationCS__Group_2_2__0 )* ) )
+            // InternalOCLstdlib.g:5915:1: ( ( rule__AnnotationCS__Group_2_2__0 )* )
             {
-            // InternalOCLstdlib.g:5913:1: ( ( rule__AnnotationCS__Group_2_2__0 )* )
-            // InternalOCLstdlib.g:5914:1: ( rule__AnnotationCS__Group_2_2__0 )*
+            // InternalOCLstdlib.g:5915:1: ( ( rule__AnnotationCS__Group_2_2__0 )* )
+            // InternalOCLstdlib.g:5916:1: ( rule__AnnotationCS__Group_2_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getGroup_2_2());
             }
-            // InternalOCLstdlib.g:5915:1: ( rule__AnnotationCS__Group_2_2__0 )*
+            // InternalOCLstdlib.g:5917:1: ( rule__AnnotationCS__Group_2_2__0 )*
             loop61:
             do {
                 int alt61=2;
@@ -19584,7 +19584,7 @@
 
                 switch (alt61) {
             	case 1 :
-            	    // InternalOCLstdlib.g:5915:2: rule__AnnotationCS__Group_2_2__0
+            	    // InternalOCLstdlib.g:5917:2: rule__AnnotationCS__Group_2_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__AnnotationCS__Group_2_2__0();
@@ -19625,14 +19625,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__3"
-    // InternalOCLstdlib.g:5925:1: rule__AnnotationCS__Group_2__3 : rule__AnnotationCS__Group_2__3__Impl ;
+    // InternalOCLstdlib.g:5927:1: rule__AnnotationCS__Group_2__3 : rule__AnnotationCS__Group_2__3__Impl ;
     public final void rule__AnnotationCS__Group_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5929:1: ( rule__AnnotationCS__Group_2__3__Impl )
-            // InternalOCLstdlib.g:5930:2: rule__AnnotationCS__Group_2__3__Impl
+            // InternalOCLstdlib.g:5931:1: ( rule__AnnotationCS__Group_2__3__Impl )
+            // InternalOCLstdlib.g:5932:2: rule__AnnotationCS__Group_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group_2__3__Impl();
@@ -19658,17 +19658,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2__3__Impl"
-    // InternalOCLstdlib.g:5936:1: rule__AnnotationCS__Group_2__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:5938:1: rule__AnnotationCS__Group_2__3__Impl : ( ')' ) ;
     public final void rule__AnnotationCS__Group_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5940:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:5941:1: ( ')' )
+            // InternalOCLstdlib.g:5942:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:5943:1: ( ')' )
             {
-            // InternalOCLstdlib.g:5941:1: ( ')' )
-            // InternalOCLstdlib.g:5942:1: ')'
+            // InternalOCLstdlib.g:5943:1: ( ')' )
+            // InternalOCLstdlib.g:5944:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getRightParenthesisKeyword_2_3());
@@ -19699,14 +19699,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2_2__0"
-    // InternalOCLstdlib.g:5963:1: rule__AnnotationCS__Group_2_2__0 : rule__AnnotationCS__Group_2_2__0__Impl rule__AnnotationCS__Group_2_2__1 ;
+    // InternalOCLstdlib.g:5965:1: rule__AnnotationCS__Group_2_2__0 : rule__AnnotationCS__Group_2_2__0__Impl rule__AnnotationCS__Group_2_2__1 ;
     public final void rule__AnnotationCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5967:1: ( rule__AnnotationCS__Group_2_2__0__Impl rule__AnnotationCS__Group_2_2__1 )
-            // InternalOCLstdlib.g:5968:2: rule__AnnotationCS__Group_2_2__0__Impl rule__AnnotationCS__Group_2_2__1
+            // InternalOCLstdlib.g:5969:1: ( rule__AnnotationCS__Group_2_2__0__Impl rule__AnnotationCS__Group_2_2__1 )
+            // InternalOCLstdlib.g:5970:2: rule__AnnotationCS__Group_2_2__0__Impl rule__AnnotationCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__AnnotationCS__Group_2_2__0__Impl();
@@ -19737,17 +19737,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2_2__0__Impl"
-    // InternalOCLstdlib.g:5975:1: rule__AnnotationCS__Group_2_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:5977:1: rule__AnnotationCS__Group_2_2__0__Impl : ( ',' ) ;
     public final void rule__AnnotationCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5979:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:5980:1: ( ',' )
+            // InternalOCLstdlib.g:5981:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:5982:1: ( ',' )
             {
-            // InternalOCLstdlib.g:5980:1: ( ',' )
-            // InternalOCLstdlib.g:5981:1: ','
+            // InternalOCLstdlib.g:5982:1: ( ',' )
+            // InternalOCLstdlib.g:5983:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getCommaKeyword_2_2_0());
@@ -19778,14 +19778,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2_2__1"
-    // InternalOCLstdlib.g:5994:1: rule__AnnotationCS__Group_2_2__1 : rule__AnnotationCS__Group_2_2__1__Impl ;
+    // InternalOCLstdlib.g:5996:1: rule__AnnotationCS__Group_2_2__1 : rule__AnnotationCS__Group_2_2__1__Impl ;
     public final void rule__AnnotationCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:5998:1: ( rule__AnnotationCS__Group_2_2__1__Impl )
-            // InternalOCLstdlib.g:5999:2: rule__AnnotationCS__Group_2_2__1__Impl
+            // InternalOCLstdlib.g:6000:1: ( rule__AnnotationCS__Group_2_2__1__Impl )
+            // InternalOCLstdlib.g:6001:2: rule__AnnotationCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group_2_2__1__Impl();
@@ -19811,23 +19811,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_2_2__1__Impl"
-    // InternalOCLstdlib.g:6005:1: rule__AnnotationCS__Group_2_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) ) ;
+    // InternalOCLstdlib.g:6007:1: rule__AnnotationCS__Group_2_2__1__Impl : ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) ) ;
     public final void rule__AnnotationCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6009:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) ) )
-            // InternalOCLstdlib.g:6010:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:6011:1: ( ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) ) )
+            // InternalOCLstdlib.g:6012:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) )
             {
-            // InternalOCLstdlib.g:6010:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) )
-            // InternalOCLstdlib.g:6011:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 )
+            // InternalOCLstdlib.g:6012:1: ( ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:6013:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsAssignment_2_2_1());
             }
-            // InternalOCLstdlib.g:6012:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 )
-            // InternalOCLstdlib.g:6012:2: rule__AnnotationCS__OwnedDetailsAssignment_2_2_1
+            // InternalOCLstdlib.g:6014:1: ( rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 )
+            // InternalOCLstdlib.g:6014:2: rule__AnnotationCS__OwnedDetailsAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__OwnedDetailsAssignment_2_2_1();
@@ -19862,14 +19862,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_0__0"
-    // InternalOCLstdlib.g:6026:1: rule__AnnotationCS__Group_3_0__0 : rule__AnnotationCS__Group_3_0__0__Impl rule__AnnotationCS__Group_3_0__1 ;
+    // InternalOCLstdlib.g:6028:1: rule__AnnotationCS__Group_3_0__0 : rule__AnnotationCS__Group_3_0__0__Impl rule__AnnotationCS__Group_3_0__1 ;
     public final void rule__AnnotationCS__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6030:1: ( rule__AnnotationCS__Group_3_0__0__Impl rule__AnnotationCS__Group_3_0__1 )
-            // InternalOCLstdlib.g:6031:2: rule__AnnotationCS__Group_3_0__0__Impl rule__AnnotationCS__Group_3_0__1
+            // InternalOCLstdlib.g:6032:1: ( rule__AnnotationCS__Group_3_0__0__Impl rule__AnnotationCS__Group_3_0__1 )
+            // InternalOCLstdlib.g:6033:2: rule__AnnotationCS__Group_3_0__0__Impl rule__AnnotationCS__Group_3_0__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__AnnotationCS__Group_3_0__0__Impl();
@@ -19900,17 +19900,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_0__0__Impl"
-    // InternalOCLstdlib.g:6038:1: rule__AnnotationCS__Group_3_0__0__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:6040:1: rule__AnnotationCS__Group_3_0__0__Impl : ( '{' ) ;
     public final void rule__AnnotationCS__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6042:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:6043:1: ( '{' )
+            // InternalOCLstdlib.g:6044:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:6045:1: ( '{' )
             {
-            // InternalOCLstdlib.g:6043:1: ( '{' )
-            // InternalOCLstdlib.g:6044:1: '{'
+            // InternalOCLstdlib.g:6045:1: ( '{' )
+            // InternalOCLstdlib.g:6046:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getLeftCurlyBracketKeyword_3_0_0());
@@ -19941,14 +19941,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_0__1"
-    // InternalOCLstdlib.g:6057:1: rule__AnnotationCS__Group_3_0__1 : rule__AnnotationCS__Group_3_0__1__Impl rule__AnnotationCS__Group_3_0__2 ;
+    // InternalOCLstdlib.g:6059:1: rule__AnnotationCS__Group_3_0__1 : rule__AnnotationCS__Group_3_0__1__Impl rule__AnnotationCS__Group_3_0__2 ;
     public final void rule__AnnotationCS__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6061:1: ( rule__AnnotationCS__Group_3_0__1__Impl rule__AnnotationCS__Group_3_0__2 )
-            // InternalOCLstdlib.g:6062:2: rule__AnnotationCS__Group_3_0__1__Impl rule__AnnotationCS__Group_3_0__2
+            // InternalOCLstdlib.g:6063:1: ( rule__AnnotationCS__Group_3_0__1__Impl rule__AnnotationCS__Group_3_0__2 )
+            // InternalOCLstdlib.g:6064:2: rule__AnnotationCS__Group_3_0__1__Impl rule__AnnotationCS__Group_3_0__2
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__AnnotationCS__Group_3_0__1__Impl();
@@ -19979,23 +19979,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_0__1__Impl"
-    // InternalOCLstdlib.g:6069:1: rule__AnnotationCS__Group_3_0__1__Impl : ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) ) ;
+    // InternalOCLstdlib.g:6071:1: rule__AnnotationCS__Group_3_0__1__Impl : ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) ) ;
     public final void rule__AnnotationCS__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6073:1: ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) ) )
-            // InternalOCLstdlib.g:6074:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) )
+            // InternalOCLstdlib.g:6075:1: ( ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) ) )
+            // InternalOCLstdlib.g:6076:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) )
             {
-            // InternalOCLstdlib.g:6074:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) )
-            // InternalOCLstdlib.g:6075:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 )
+            // InternalOCLstdlib.g:6076:1: ( ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 ) )
+            // InternalOCLstdlib.g:6077:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAssignment_3_0_1());
             }
-            // InternalOCLstdlib.g:6076:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 )
-            // InternalOCLstdlib.g:6076:2: rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1
+            // InternalOCLstdlib.g:6078:1: ( rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 )
+            // InternalOCLstdlib.g:6078:2: rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1();
@@ -20030,14 +20030,14 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_0__2"
-    // InternalOCLstdlib.g:6086:1: rule__AnnotationCS__Group_3_0__2 : rule__AnnotationCS__Group_3_0__2__Impl ;
+    // InternalOCLstdlib.g:6088:1: rule__AnnotationCS__Group_3_0__2 : rule__AnnotationCS__Group_3_0__2__Impl ;
     public final void rule__AnnotationCS__Group_3_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6090:1: ( rule__AnnotationCS__Group_3_0__2__Impl )
-            // InternalOCLstdlib.g:6091:2: rule__AnnotationCS__Group_3_0__2__Impl
+            // InternalOCLstdlib.g:6092:1: ( rule__AnnotationCS__Group_3_0__2__Impl )
+            // InternalOCLstdlib.g:6093:2: rule__AnnotationCS__Group_3_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__Group_3_0__2__Impl();
@@ -20063,17 +20063,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__Group_3_0__2__Impl"
-    // InternalOCLstdlib.g:6097:1: rule__AnnotationCS__Group_3_0__2__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:6099:1: rule__AnnotationCS__Group_3_0__2__Impl : ( '}' ) ;
     public final void rule__AnnotationCS__Group_3_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6101:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:6102:1: ( '}' )
+            // InternalOCLstdlib.g:6103:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:6104:1: ( '}' )
             {
-            // InternalOCLstdlib.g:6102:1: ( '}' )
-            // InternalOCLstdlib.g:6103:1: '}'
+            // InternalOCLstdlib.g:6104:1: ( '}' )
+            // InternalOCLstdlib.g:6105:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getRightCurlyBracketKeyword_3_0_2());
@@ -20104,14 +20104,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__0"
-    // InternalOCLstdlib.g:6122:1: rule__LibClassCS__Group__0 : rule__LibClassCS__Group__0__Impl rule__LibClassCS__Group__1 ;
+    // InternalOCLstdlib.g:6124:1: rule__LibClassCS__Group__0 : rule__LibClassCS__Group__0__Impl rule__LibClassCS__Group__1 ;
     public final void rule__LibClassCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6126:1: ( rule__LibClassCS__Group__0__Impl rule__LibClassCS__Group__1 )
-            // InternalOCLstdlib.g:6127:2: rule__LibClassCS__Group__0__Impl rule__LibClassCS__Group__1
+            // InternalOCLstdlib.g:6128:1: ( rule__LibClassCS__Group__0__Impl rule__LibClassCS__Group__1 )
+            // InternalOCLstdlib.g:6129:2: rule__LibClassCS__Group__0__Impl rule__LibClassCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_20);
             rule__LibClassCS__Group__0__Impl();
@@ -20142,22 +20142,22 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__0__Impl"
-    // InternalOCLstdlib.g:6134:1: rule__LibClassCS__Group__0__Impl : ( ( rule__LibClassCS__IsAbstractAssignment_0 )? ) ;
+    // InternalOCLstdlib.g:6136:1: rule__LibClassCS__Group__0__Impl : ( ( rule__LibClassCS__IsAbstractAssignment_0 )? ) ;
     public final void rule__LibClassCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6138:1: ( ( ( rule__LibClassCS__IsAbstractAssignment_0 )? ) )
-            // InternalOCLstdlib.g:6139:1: ( ( rule__LibClassCS__IsAbstractAssignment_0 )? )
+            // InternalOCLstdlib.g:6140:1: ( ( ( rule__LibClassCS__IsAbstractAssignment_0 )? ) )
+            // InternalOCLstdlib.g:6141:1: ( ( rule__LibClassCS__IsAbstractAssignment_0 )? )
             {
-            // InternalOCLstdlib.g:6139:1: ( ( rule__LibClassCS__IsAbstractAssignment_0 )? )
-            // InternalOCLstdlib.g:6140:1: ( rule__LibClassCS__IsAbstractAssignment_0 )?
+            // InternalOCLstdlib.g:6141:1: ( ( rule__LibClassCS__IsAbstractAssignment_0 )? )
+            // InternalOCLstdlib.g:6142:1: ( rule__LibClassCS__IsAbstractAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getIsAbstractAssignment_0());
             }
-            // InternalOCLstdlib.g:6141:1: ( rule__LibClassCS__IsAbstractAssignment_0 )?
+            // InternalOCLstdlib.g:6143:1: ( rule__LibClassCS__IsAbstractAssignment_0 )?
             int alt62=2;
             int LA62_0 = input.LA(1);
 
@@ -20166,7 +20166,7 @@
             }
             switch (alt62) {
                 case 1 :
-                    // InternalOCLstdlib.g:6141:2: rule__LibClassCS__IsAbstractAssignment_0
+                    // InternalOCLstdlib.g:6143:2: rule__LibClassCS__IsAbstractAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__IsAbstractAssignment_0();
@@ -20204,14 +20204,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__1"
-    // InternalOCLstdlib.g:6151:1: rule__LibClassCS__Group__1 : rule__LibClassCS__Group__1__Impl rule__LibClassCS__Group__2 ;
+    // InternalOCLstdlib.g:6153:1: rule__LibClassCS__Group__1 : rule__LibClassCS__Group__1__Impl rule__LibClassCS__Group__2 ;
     public final void rule__LibClassCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6155:1: ( rule__LibClassCS__Group__1__Impl rule__LibClassCS__Group__2 )
-            // InternalOCLstdlib.g:6156:2: rule__LibClassCS__Group__1__Impl rule__LibClassCS__Group__2
+            // InternalOCLstdlib.g:6157:1: ( rule__LibClassCS__Group__1__Impl rule__LibClassCS__Group__2 )
+            // InternalOCLstdlib.g:6158:2: rule__LibClassCS__Group__1__Impl rule__LibClassCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_21);
             rule__LibClassCS__Group__1__Impl();
@@ -20242,17 +20242,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__1__Impl"
-    // InternalOCLstdlib.g:6163:1: rule__LibClassCS__Group__1__Impl : ( 'type' ) ;
+    // InternalOCLstdlib.g:6165:1: rule__LibClassCS__Group__1__Impl : ( 'type' ) ;
     public final void rule__LibClassCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6167:1: ( ( 'type' ) )
-            // InternalOCLstdlib.g:6168:1: ( 'type' )
+            // InternalOCLstdlib.g:6169:1: ( ( 'type' ) )
+            // InternalOCLstdlib.g:6170:1: ( 'type' )
             {
-            // InternalOCLstdlib.g:6168:1: ( 'type' )
-            // InternalOCLstdlib.g:6169:1: 'type'
+            // InternalOCLstdlib.g:6170:1: ( 'type' )
+            // InternalOCLstdlib.g:6171:1: 'type'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getTypeKeyword_1());
@@ -20283,14 +20283,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__2"
-    // InternalOCLstdlib.g:6182:1: rule__LibClassCS__Group__2 : rule__LibClassCS__Group__2__Impl rule__LibClassCS__Group__3 ;
+    // InternalOCLstdlib.g:6184:1: rule__LibClassCS__Group__2 : rule__LibClassCS__Group__2__Impl rule__LibClassCS__Group__3 ;
     public final void rule__LibClassCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6186:1: ( rule__LibClassCS__Group__2__Impl rule__LibClassCS__Group__3 )
-            // InternalOCLstdlib.g:6187:2: rule__LibClassCS__Group__2__Impl rule__LibClassCS__Group__3
+            // InternalOCLstdlib.g:6188:1: ( rule__LibClassCS__Group__2__Impl rule__LibClassCS__Group__3 )
+            // InternalOCLstdlib.g:6189:2: rule__LibClassCS__Group__2__Impl rule__LibClassCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__LibClassCS__Group__2__Impl();
@@ -20321,23 +20321,23 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__2__Impl"
-    // InternalOCLstdlib.g:6194:1: rule__LibClassCS__Group__2__Impl : ( ( rule__LibClassCS__NameAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:6196:1: rule__LibClassCS__Group__2__Impl : ( ( rule__LibClassCS__NameAssignment_2 ) ) ;
     public final void rule__LibClassCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6198:1: ( ( ( rule__LibClassCS__NameAssignment_2 ) ) )
-            // InternalOCLstdlib.g:6199:1: ( ( rule__LibClassCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:6200:1: ( ( ( rule__LibClassCS__NameAssignment_2 ) ) )
+            // InternalOCLstdlib.g:6201:1: ( ( rule__LibClassCS__NameAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:6199:1: ( ( rule__LibClassCS__NameAssignment_2 ) )
-            // InternalOCLstdlib.g:6200:1: ( rule__LibClassCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:6201:1: ( ( rule__LibClassCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:6202:1: ( rule__LibClassCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getNameAssignment_2());
             }
-            // InternalOCLstdlib.g:6201:1: ( rule__LibClassCS__NameAssignment_2 )
-            // InternalOCLstdlib.g:6201:2: rule__LibClassCS__NameAssignment_2
+            // InternalOCLstdlib.g:6203:1: ( rule__LibClassCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:6203:2: rule__LibClassCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__NameAssignment_2();
@@ -20372,14 +20372,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__3"
-    // InternalOCLstdlib.g:6211:1: rule__LibClassCS__Group__3 : rule__LibClassCS__Group__3__Impl rule__LibClassCS__Group__4 ;
+    // InternalOCLstdlib.g:6213:1: rule__LibClassCS__Group__3 : rule__LibClassCS__Group__3__Impl rule__LibClassCS__Group__4 ;
     public final void rule__LibClassCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6215:1: ( rule__LibClassCS__Group__3__Impl rule__LibClassCS__Group__4 )
-            // InternalOCLstdlib.g:6216:2: rule__LibClassCS__Group__3__Impl rule__LibClassCS__Group__4
+            // InternalOCLstdlib.g:6217:1: ( rule__LibClassCS__Group__3__Impl rule__LibClassCS__Group__4 )
+            // InternalOCLstdlib.g:6218:2: rule__LibClassCS__Group__3__Impl rule__LibClassCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__LibClassCS__Group__3__Impl();
@@ -20410,22 +20410,22 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__3__Impl"
-    // InternalOCLstdlib.g:6223:1: rule__LibClassCS__Group__3__Impl : ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? ) ;
+    // InternalOCLstdlib.g:6225:1: rule__LibClassCS__Group__3__Impl : ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? ) ;
     public final void rule__LibClassCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6227:1: ( ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? ) )
-            // InternalOCLstdlib.g:6228:1: ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLstdlib.g:6229:1: ( ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? ) )
+            // InternalOCLstdlib.g:6230:1: ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? )
             {
-            // InternalOCLstdlib.g:6228:1: ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? )
-            // InternalOCLstdlib.g:6229:1: ( rule__LibClassCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLstdlib.g:6230:1: ( ( rule__LibClassCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLstdlib.g:6231:1: ( rule__LibClassCS__OwnedSignatureAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedSignatureAssignment_3());
             }
-            // InternalOCLstdlib.g:6230:1: ( rule__LibClassCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLstdlib.g:6232:1: ( rule__LibClassCS__OwnedSignatureAssignment_3 )?
             int alt63=2;
             int LA63_0 = input.LA(1);
 
@@ -20434,7 +20434,7 @@
             }
             switch (alt63) {
                 case 1 :
-                    // InternalOCLstdlib.g:6230:2: rule__LibClassCS__OwnedSignatureAssignment_3
+                    // InternalOCLstdlib.g:6232:2: rule__LibClassCS__OwnedSignatureAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__OwnedSignatureAssignment_3();
@@ -20472,14 +20472,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__4"
-    // InternalOCLstdlib.g:6240:1: rule__LibClassCS__Group__4 : rule__LibClassCS__Group__4__Impl rule__LibClassCS__Group__5 ;
+    // InternalOCLstdlib.g:6242:1: rule__LibClassCS__Group__4 : rule__LibClassCS__Group__4__Impl rule__LibClassCS__Group__5 ;
     public final void rule__LibClassCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6244:1: ( rule__LibClassCS__Group__4__Impl rule__LibClassCS__Group__5 )
-            // InternalOCLstdlib.g:6245:2: rule__LibClassCS__Group__4__Impl rule__LibClassCS__Group__5
+            // InternalOCLstdlib.g:6246:1: ( rule__LibClassCS__Group__4__Impl rule__LibClassCS__Group__5 )
+            // InternalOCLstdlib.g:6247:2: rule__LibClassCS__Group__4__Impl rule__LibClassCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__LibClassCS__Group__4__Impl();
@@ -20510,22 +20510,22 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__4__Impl"
-    // InternalOCLstdlib.g:6252:1: rule__LibClassCS__Group__4__Impl : ( ( rule__LibClassCS__Group_4__0 )? ) ;
+    // InternalOCLstdlib.g:6254:1: rule__LibClassCS__Group__4__Impl : ( ( rule__LibClassCS__Group_4__0 )? ) ;
     public final void rule__LibClassCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6256:1: ( ( ( rule__LibClassCS__Group_4__0 )? ) )
-            // InternalOCLstdlib.g:6257:1: ( ( rule__LibClassCS__Group_4__0 )? )
+            // InternalOCLstdlib.g:6258:1: ( ( ( rule__LibClassCS__Group_4__0 )? ) )
+            // InternalOCLstdlib.g:6259:1: ( ( rule__LibClassCS__Group_4__0 )? )
             {
-            // InternalOCLstdlib.g:6257:1: ( ( rule__LibClassCS__Group_4__0 )? )
-            // InternalOCLstdlib.g:6258:1: ( rule__LibClassCS__Group_4__0 )?
+            // InternalOCLstdlib.g:6259:1: ( ( rule__LibClassCS__Group_4__0 )? )
+            // InternalOCLstdlib.g:6260:1: ( rule__LibClassCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getGroup_4());
             }
-            // InternalOCLstdlib.g:6259:1: ( rule__LibClassCS__Group_4__0 )?
+            // InternalOCLstdlib.g:6261:1: ( rule__LibClassCS__Group_4__0 )?
             int alt64=2;
             int LA64_0 = input.LA(1);
 
@@ -20534,7 +20534,7 @@
             }
             switch (alt64) {
                 case 1 :
-                    // InternalOCLstdlib.g:6259:2: rule__LibClassCS__Group_4__0
+                    // InternalOCLstdlib.g:6261:2: rule__LibClassCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__Group_4__0();
@@ -20572,14 +20572,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__5"
-    // InternalOCLstdlib.g:6269:1: rule__LibClassCS__Group__5 : rule__LibClassCS__Group__5__Impl rule__LibClassCS__Group__6 ;
+    // InternalOCLstdlib.g:6271:1: rule__LibClassCS__Group__5 : rule__LibClassCS__Group__5__Impl rule__LibClassCS__Group__6 ;
     public final void rule__LibClassCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6273:1: ( rule__LibClassCS__Group__5__Impl rule__LibClassCS__Group__6 )
-            // InternalOCLstdlib.g:6274:2: rule__LibClassCS__Group__5__Impl rule__LibClassCS__Group__6
+            // InternalOCLstdlib.g:6275:1: ( rule__LibClassCS__Group__5__Impl rule__LibClassCS__Group__6 )
+            // InternalOCLstdlib.g:6276:2: rule__LibClassCS__Group__5__Impl rule__LibClassCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_22);
             rule__LibClassCS__Group__5__Impl();
@@ -20610,22 +20610,22 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__5__Impl"
-    // InternalOCLstdlib.g:6281:1: rule__LibClassCS__Group__5__Impl : ( ( rule__LibClassCS__Group_5__0 )? ) ;
+    // InternalOCLstdlib.g:6283:1: rule__LibClassCS__Group__5__Impl : ( ( rule__LibClassCS__Group_5__0 )? ) ;
     public final void rule__LibClassCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6285:1: ( ( ( rule__LibClassCS__Group_5__0 )? ) )
-            // InternalOCLstdlib.g:6286:1: ( ( rule__LibClassCS__Group_5__0 )? )
+            // InternalOCLstdlib.g:6287:1: ( ( ( rule__LibClassCS__Group_5__0 )? ) )
+            // InternalOCLstdlib.g:6288:1: ( ( rule__LibClassCS__Group_5__0 )? )
             {
-            // InternalOCLstdlib.g:6286:1: ( ( rule__LibClassCS__Group_5__0 )? )
-            // InternalOCLstdlib.g:6287:1: ( rule__LibClassCS__Group_5__0 )?
+            // InternalOCLstdlib.g:6288:1: ( ( rule__LibClassCS__Group_5__0 )? )
+            // InternalOCLstdlib.g:6289:1: ( rule__LibClassCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getGroup_5());
             }
-            // InternalOCLstdlib.g:6288:1: ( rule__LibClassCS__Group_5__0 )?
+            // InternalOCLstdlib.g:6290:1: ( rule__LibClassCS__Group_5__0 )?
             int alt65=2;
             int LA65_0 = input.LA(1);
 
@@ -20634,7 +20634,7 @@
             }
             switch (alt65) {
                 case 1 :
-                    // InternalOCLstdlib.g:6288:2: rule__LibClassCS__Group_5__0
+                    // InternalOCLstdlib.g:6290:2: rule__LibClassCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibClassCS__Group_5__0();
@@ -20672,14 +20672,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__6"
-    // InternalOCLstdlib.g:6298:1: rule__LibClassCS__Group__6 : rule__LibClassCS__Group__6__Impl rule__LibClassCS__Group__7 ;
+    // InternalOCLstdlib.g:6300:1: rule__LibClassCS__Group__6 : rule__LibClassCS__Group__6__Impl rule__LibClassCS__Group__7 ;
     public final void rule__LibClassCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6302:1: ( rule__LibClassCS__Group__6__Impl rule__LibClassCS__Group__7 )
-            // InternalOCLstdlib.g:6303:2: rule__LibClassCS__Group__6__Impl rule__LibClassCS__Group__7
+            // InternalOCLstdlib.g:6304:1: ( rule__LibClassCS__Group__6__Impl rule__LibClassCS__Group__7 )
+            // InternalOCLstdlib.g:6305:2: rule__LibClassCS__Group__6__Impl rule__LibClassCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_23);
             rule__LibClassCS__Group__6__Impl();
@@ -20710,17 +20710,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__6__Impl"
-    // InternalOCLstdlib.g:6310:1: rule__LibClassCS__Group__6__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:6312:1: rule__LibClassCS__Group__6__Impl : ( '{' ) ;
     public final void rule__LibClassCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6314:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:6315:1: ( '{' )
+            // InternalOCLstdlib.g:6316:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:6317:1: ( '{' )
             {
-            // InternalOCLstdlib.g:6315:1: ( '{' )
-            // InternalOCLstdlib.g:6316:1: '{'
+            // InternalOCLstdlib.g:6317:1: ( '{' )
+            // InternalOCLstdlib.g:6318:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getLeftCurlyBracketKeyword_6());
@@ -20751,14 +20751,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__7"
-    // InternalOCLstdlib.g:6329:1: rule__LibClassCS__Group__7 : rule__LibClassCS__Group__7__Impl rule__LibClassCS__Group__8 ;
+    // InternalOCLstdlib.g:6331:1: rule__LibClassCS__Group__7 : rule__LibClassCS__Group__7__Impl rule__LibClassCS__Group__8 ;
     public final void rule__LibClassCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6333:1: ( rule__LibClassCS__Group__7__Impl rule__LibClassCS__Group__8 )
-            // InternalOCLstdlib.g:6334:2: rule__LibClassCS__Group__7__Impl rule__LibClassCS__Group__8
+            // InternalOCLstdlib.g:6335:1: ( rule__LibClassCS__Group__7__Impl rule__LibClassCS__Group__8 )
+            // InternalOCLstdlib.g:6336:2: rule__LibClassCS__Group__7__Impl rule__LibClassCS__Group__8
             {
             pushFollow(FollowSets000.FOLLOW_23);
             rule__LibClassCS__Group__7__Impl();
@@ -20789,22 +20789,22 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__7__Impl"
-    // InternalOCLstdlib.g:6341:1: rule__LibClassCS__Group__7__Impl : ( ( rule__LibClassCS__Alternatives_7 )* ) ;
+    // InternalOCLstdlib.g:6343:1: rule__LibClassCS__Group__7__Impl : ( ( rule__LibClassCS__Alternatives_7 )* ) ;
     public final void rule__LibClassCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6345:1: ( ( ( rule__LibClassCS__Alternatives_7 )* ) )
-            // InternalOCLstdlib.g:6346:1: ( ( rule__LibClassCS__Alternatives_7 )* )
+            // InternalOCLstdlib.g:6347:1: ( ( ( rule__LibClassCS__Alternatives_7 )* ) )
+            // InternalOCLstdlib.g:6348:1: ( ( rule__LibClassCS__Alternatives_7 )* )
             {
-            // InternalOCLstdlib.g:6346:1: ( ( rule__LibClassCS__Alternatives_7 )* )
-            // InternalOCLstdlib.g:6347:1: ( rule__LibClassCS__Alternatives_7 )*
+            // InternalOCLstdlib.g:6348:1: ( ( rule__LibClassCS__Alternatives_7 )* )
+            // InternalOCLstdlib.g:6349:1: ( rule__LibClassCS__Alternatives_7 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getAlternatives_7());
             }
-            // InternalOCLstdlib.g:6348:1: ( rule__LibClassCS__Alternatives_7 )*
+            // InternalOCLstdlib.g:6350:1: ( rule__LibClassCS__Alternatives_7 )*
             loop66:
             do {
                 int alt66=2;
@@ -20817,7 +20817,7 @@
 
                 switch (alt66) {
             	case 1 :
-            	    // InternalOCLstdlib.g:6348:2: rule__LibClassCS__Alternatives_7
+            	    // InternalOCLstdlib.g:6350:2: rule__LibClassCS__Alternatives_7
             	    {
             	    pushFollow(FollowSets000.FOLLOW_24);
             	    rule__LibClassCS__Alternatives_7();
@@ -20858,14 +20858,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__8"
-    // InternalOCLstdlib.g:6358:1: rule__LibClassCS__Group__8 : rule__LibClassCS__Group__8__Impl ;
+    // InternalOCLstdlib.g:6360:1: rule__LibClassCS__Group__8 : rule__LibClassCS__Group__8__Impl ;
     public final void rule__LibClassCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6362:1: ( rule__LibClassCS__Group__8__Impl )
-            // InternalOCLstdlib.g:6363:2: rule__LibClassCS__Group__8__Impl
+            // InternalOCLstdlib.g:6364:1: ( rule__LibClassCS__Group__8__Impl )
+            // InternalOCLstdlib.g:6365:2: rule__LibClassCS__Group__8__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__Group__8__Impl();
@@ -20891,17 +20891,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group__8__Impl"
-    // InternalOCLstdlib.g:6369:1: rule__LibClassCS__Group__8__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:6371:1: rule__LibClassCS__Group__8__Impl : ( '}' ) ;
     public final void rule__LibClassCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6373:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:6374:1: ( '}' )
+            // InternalOCLstdlib.g:6375:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:6376:1: ( '}' )
             {
-            // InternalOCLstdlib.g:6374:1: ( '}' )
-            // InternalOCLstdlib.g:6375:1: '}'
+            // InternalOCLstdlib.g:6376:1: ( '}' )
+            // InternalOCLstdlib.g:6377:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getRightCurlyBracketKeyword_8());
@@ -20932,14 +20932,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_4__0"
-    // InternalOCLstdlib.g:6406:1: rule__LibClassCS__Group_4__0 : rule__LibClassCS__Group_4__0__Impl rule__LibClassCS__Group_4__1 ;
+    // InternalOCLstdlib.g:6408:1: rule__LibClassCS__Group_4__0 : rule__LibClassCS__Group_4__0__Impl rule__LibClassCS__Group_4__1 ;
     public final void rule__LibClassCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6410:1: ( rule__LibClassCS__Group_4__0__Impl rule__LibClassCS__Group_4__1 )
-            // InternalOCLstdlib.g:6411:2: rule__LibClassCS__Group_4__0__Impl rule__LibClassCS__Group_4__1
+            // InternalOCLstdlib.g:6412:1: ( rule__LibClassCS__Group_4__0__Impl rule__LibClassCS__Group_4__1 )
+            // InternalOCLstdlib.g:6413:2: rule__LibClassCS__Group_4__0__Impl rule__LibClassCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_21);
             rule__LibClassCS__Group_4__0__Impl();
@@ -20970,17 +20970,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_4__0__Impl"
-    // InternalOCLstdlib.g:6418:1: rule__LibClassCS__Group_4__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:6420:1: rule__LibClassCS__Group_4__0__Impl : ( ':' ) ;
     public final void rule__LibClassCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6422:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:6423:1: ( ':' )
+            // InternalOCLstdlib.g:6424:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:6425:1: ( ':' )
             {
-            // InternalOCLstdlib.g:6423:1: ( ':' )
-            // InternalOCLstdlib.g:6424:1: ':'
+            // InternalOCLstdlib.g:6425:1: ( ':' )
+            // InternalOCLstdlib.g:6426:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getColonKeyword_4_0());
@@ -21011,14 +21011,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_4__1"
-    // InternalOCLstdlib.g:6437:1: rule__LibClassCS__Group_4__1 : rule__LibClassCS__Group_4__1__Impl ;
+    // InternalOCLstdlib.g:6439:1: rule__LibClassCS__Group_4__1 : rule__LibClassCS__Group_4__1__Impl ;
     public final void rule__LibClassCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6441:1: ( rule__LibClassCS__Group_4__1__Impl )
-            // InternalOCLstdlib.g:6442:2: rule__LibClassCS__Group_4__1__Impl
+            // InternalOCLstdlib.g:6443:1: ( rule__LibClassCS__Group_4__1__Impl )
+            // InternalOCLstdlib.g:6444:2: rule__LibClassCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__Group_4__1__Impl();
@@ -21044,23 +21044,23 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_4__1__Impl"
-    // InternalOCLstdlib.g:6448:1: rule__LibClassCS__Group_4__1__Impl : ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) ) ;
+    // InternalOCLstdlib.g:6450:1: rule__LibClassCS__Group_4__1__Impl : ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) ) ;
     public final void rule__LibClassCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6452:1: ( ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) ) )
-            // InternalOCLstdlib.g:6453:1: ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) )
+            // InternalOCLstdlib.g:6454:1: ( ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) ) )
+            // InternalOCLstdlib.g:6455:1: ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) )
             {
-            // InternalOCLstdlib.g:6453:1: ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) )
-            // InternalOCLstdlib.g:6454:1: ( rule__LibClassCS__MetaclassNameAssignment_4_1 )
+            // InternalOCLstdlib.g:6455:1: ( ( rule__LibClassCS__MetaclassNameAssignment_4_1 ) )
+            // InternalOCLstdlib.g:6456:1: ( rule__LibClassCS__MetaclassNameAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getMetaclassNameAssignment_4_1());
             }
-            // InternalOCLstdlib.g:6455:1: ( rule__LibClassCS__MetaclassNameAssignment_4_1 )
-            // InternalOCLstdlib.g:6455:2: rule__LibClassCS__MetaclassNameAssignment_4_1
+            // InternalOCLstdlib.g:6457:1: ( rule__LibClassCS__MetaclassNameAssignment_4_1 )
+            // InternalOCLstdlib.g:6457:2: rule__LibClassCS__MetaclassNameAssignment_4_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__MetaclassNameAssignment_4_1();
@@ -21095,14 +21095,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5__0"
-    // InternalOCLstdlib.g:6469:1: rule__LibClassCS__Group_5__0 : rule__LibClassCS__Group_5__0__Impl rule__LibClassCS__Group_5__1 ;
+    // InternalOCLstdlib.g:6471:1: rule__LibClassCS__Group_5__0 : rule__LibClassCS__Group_5__0__Impl rule__LibClassCS__Group_5__1 ;
     public final void rule__LibClassCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6473:1: ( rule__LibClassCS__Group_5__0__Impl rule__LibClassCS__Group_5__1 )
-            // InternalOCLstdlib.g:6474:2: rule__LibClassCS__Group_5__0__Impl rule__LibClassCS__Group_5__1
+            // InternalOCLstdlib.g:6475:1: ( rule__LibClassCS__Group_5__0__Impl rule__LibClassCS__Group_5__1 )
+            // InternalOCLstdlib.g:6476:2: rule__LibClassCS__Group_5__0__Impl rule__LibClassCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibClassCS__Group_5__0__Impl();
@@ -21133,17 +21133,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5__0__Impl"
-    // InternalOCLstdlib.g:6481:1: rule__LibClassCS__Group_5__0__Impl : ( 'conformsTo' ) ;
+    // InternalOCLstdlib.g:6483:1: rule__LibClassCS__Group_5__0__Impl : ( 'conformsTo' ) ;
     public final void rule__LibClassCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6485:1: ( ( 'conformsTo' ) )
-            // InternalOCLstdlib.g:6486:1: ( 'conformsTo' )
+            // InternalOCLstdlib.g:6487:1: ( ( 'conformsTo' ) )
+            // InternalOCLstdlib.g:6488:1: ( 'conformsTo' )
             {
-            // InternalOCLstdlib.g:6486:1: ( 'conformsTo' )
-            // InternalOCLstdlib.g:6487:1: 'conformsTo'
+            // InternalOCLstdlib.g:6488:1: ( 'conformsTo' )
+            // InternalOCLstdlib.g:6489:1: 'conformsTo'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getConformsToKeyword_5_0());
@@ -21174,14 +21174,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5__1"
-    // InternalOCLstdlib.g:6500:1: rule__LibClassCS__Group_5__1 : rule__LibClassCS__Group_5__1__Impl rule__LibClassCS__Group_5__2 ;
+    // InternalOCLstdlib.g:6502:1: rule__LibClassCS__Group_5__1 : rule__LibClassCS__Group_5__1__Impl rule__LibClassCS__Group_5__2 ;
     public final void rule__LibClassCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6504:1: ( rule__LibClassCS__Group_5__1__Impl rule__LibClassCS__Group_5__2 )
-            // InternalOCLstdlib.g:6505:2: rule__LibClassCS__Group_5__1__Impl rule__LibClassCS__Group_5__2
+            // InternalOCLstdlib.g:6506:1: ( rule__LibClassCS__Group_5__1__Impl rule__LibClassCS__Group_5__2 )
+            // InternalOCLstdlib.g:6507:2: rule__LibClassCS__Group_5__1__Impl rule__LibClassCS__Group_5__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__LibClassCS__Group_5__1__Impl();
@@ -21212,23 +21212,23 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5__1__Impl"
-    // InternalOCLstdlib.g:6512:1: rule__LibClassCS__Group_5__1__Impl : ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) ) ;
+    // InternalOCLstdlib.g:6514:1: rule__LibClassCS__Group_5__1__Impl : ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) ) ;
     public final void rule__LibClassCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6516:1: ( ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) ) )
-            // InternalOCLstdlib.g:6517:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) )
+            // InternalOCLstdlib.g:6518:1: ( ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) ) )
+            // InternalOCLstdlib.g:6519:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) )
             {
-            // InternalOCLstdlib.g:6517:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) )
-            // InternalOCLstdlib.g:6518:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 )
+            // InternalOCLstdlib.g:6519:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 ) )
+            // InternalOCLstdlib.g:6520:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedSuperTypesAssignment_5_1());
             }
-            // InternalOCLstdlib.g:6519:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 )
-            // InternalOCLstdlib.g:6519:2: rule__LibClassCS__OwnedSuperTypesAssignment_5_1
+            // InternalOCLstdlib.g:6521:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_1 )
+            // InternalOCLstdlib.g:6521:2: rule__LibClassCS__OwnedSuperTypesAssignment_5_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__OwnedSuperTypesAssignment_5_1();
@@ -21263,14 +21263,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5__2"
-    // InternalOCLstdlib.g:6529:1: rule__LibClassCS__Group_5__2 : rule__LibClassCS__Group_5__2__Impl ;
+    // InternalOCLstdlib.g:6531:1: rule__LibClassCS__Group_5__2 : rule__LibClassCS__Group_5__2__Impl ;
     public final void rule__LibClassCS__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6533:1: ( rule__LibClassCS__Group_5__2__Impl )
-            // InternalOCLstdlib.g:6534:2: rule__LibClassCS__Group_5__2__Impl
+            // InternalOCLstdlib.g:6535:1: ( rule__LibClassCS__Group_5__2__Impl )
+            // InternalOCLstdlib.g:6536:2: rule__LibClassCS__Group_5__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__Group_5__2__Impl();
@@ -21296,22 +21296,22 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5__2__Impl"
-    // InternalOCLstdlib.g:6540:1: rule__LibClassCS__Group_5__2__Impl : ( ( rule__LibClassCS__Group_5_2__0 )* ) ;
+    // InternalOCLstdlib.g:6542:1: rule__LibClassCS__Group_5__2__Impl : ( ( rule__LibClassCS__Group_5_2__0 )* ) ;
     public final void rule__LibClassCS__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6544:1: ( ( ( rule__LibClassCS__Group_5_2__0 )* ) )
-            // InternalOCLstdlib.g:6545:1: ( ( rule__LibClassCS__Group_5_2__0 )* )
+            // InternalOCLstdlib.g:6546:1: ( ( ( rule__LibClassCS__Group_5_2__0 )* ) )
+            // InternalOCLstdlib.g:6547:1: ( ( rule__LibClassCS__Group_5_2__0 )* )
             {
-            // InternalOCLstdlib.g:6545:1: ( ( rule__LibClassCS__Group_5_2__0 )* )
-            // InternalOCLstdlib.g:6546:1: ( rule__LibClassCS__Group_5_2__0 )*
+            // InternalOCLstdlib.g:6547:1: ( ( rule__LibClassCS__Group_5_2__0 )* )
+            // InternalOCLstdlib.g:6548:1: ( rule__LibClassCS__Group_5_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getGroup_5_2());
             }
-            // InternalOCLstdlib.g:6547:1: ( rule__LibClassCS__Group_5_2__0 )*
+            // InternalOCLstdlib.g:6549:1: ( rule__LibClassCS__Group_5_2__0 )*
             loop67:
             do {
                 int alt67=2;
@@ -21324,7 +21324,7 @@
 
                 switch (alt67) {
             	case 1 :
-            	    // InternalOCLstdlib.g:6547:2: rule__LibClassCS__Group_5_2__0
+            	    // InternalOCLstdlib.g:6549:2: rule__LibClassCS__Group_5_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LibClassCS__Group_5_2__0();
@@ -21365,14 +21365,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5_2__0"
-    // InternalOCLstdlib.g:6563:1: rule__LibClassCS__Group_5_2__0 : rule__LibClassCS__Group_5_2__0__Impl rule__LibClassCS__Group_5_2__1 ;
+    // InternalOCLstdlib.g:6565:1: rule__LibClassCS__Group_5_2__0 : rule__LibClassCS__Group_5_2__0__Impl rule__LibClassCS__Group_5_2__1 ;
     public final void rule__LibClassCS__Group_5_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6567:1: ( rule__LibClassCS__Group_5_2__0__Impl rule__LibClassCS__Group_5_2__1 )
-            // InternalOCLstdlib.g:6568:2: rule__LibClassCS__Group_5_2__0__Impl rule__LibClassCS__Group_5_2__1
+            // InternalOCLstdlib.g:6569:1: ( rule__LibClassCS__Group_5_2__0__Impl rule__LibClassCS__Group_5_2__1 )
+            // InternalOCLstdlib.g:6570:2: rule__LibClassCS__Group_5_2__0__Impl rule__LibClassCS__Group_5_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibClassCS__Group_5_2__0__Impl();
@@ -21403,17 +21403,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5_2__0__Impl"
-    // InternalOCLstdlib.g:6575:1: rule__LibClassCS__Group_5_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:6577:1: rule__LibClassCS__Group_5_2__0__Impl : ( ',' ) ;
     public final void rule__LibClassCS__Group_5_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6579:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:6580:1: ( ',' )
+            // InternalOCLstdlib.g:6581:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:6582:1: ( ',' )
             {
-            // InternalOCLstdlib.g:6580:1: ( ',' )
-            // InternalOCLstdlib.g:6581:1: ','
+            // InternalOCLstdlib.g:6582:1: ( ',' )
+            // InternalOCLstdlib.g:6583:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getCommaKeyword_5_2_0());
@@ -21444,14 +21444,14 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5_2__1"
-    // InternalOCLstdlib.g:6594:1: rule__LibClassCS__Group_5_2__1 : rule__LibClassCS__Group_5_2__1__Impl ;
+    // InternalOCLstdlib.g:6596:1: rule__LibClassCS__Group_5_2__1 : rule__LibClassCS__Group_5_2__1__Impl ;
     public final void rule__LibClassCS__Group_5_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6598:1: ( rule__LibClassCS__Group_5_2__1__Impl )
-            // InternalOCLstdlib.g:6599:2: rule__LibClassCS__Group_5_2__1__Impl
+            // InternalOCLstdlib.g:6600:1: ( rule__LibClassCS__Group_5_2__1__Impl )
+            // InternalOCLstdlib.g:6601:2: rule__LibClassCS__Group_5_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__Group_5_2__1__Impl();
@@ -21477,23 +21477,23 @@
 
 
     // $ANTLR start "rule__LibClassCS__Group_5_2__1__Impl"
-    // InternalOCLstdlib.g:6605:1: rule__LibClassCS__Group_5_2__1__Impl : ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) ) ;
+    // InternalOCLstdlib.g:6607:1: rule__LibClassCS__Group_5_2__1__Impl : ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) ) ;
     public final void rule__LibClassCS__Group_5_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6609:1: ( ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) ) )
-            // InternalOCLstdlib.g:6610:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) )
+            // InternalOCLstdlib.g:6611:1: ( ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) ) )
+            // InternalOCLstdlib.g:6612:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) )
             {
-            // InternalOCLstdlib.g:6610:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) )
-            // InternalOCLstdlib.g:6611:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 )
+            // InternalOCLstdlib.g:6612:1: ( ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 ) )
+            // InternalOCLstdlib.g:6613:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedSuperTypesAssignment_5_2_1());
             }
-            // InternalOCLstdlib.g:6612:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 )
-            // InternalOCLstdlib.g:6612:2: rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1
+            // InternalOCLstdlib.g:6614:1: ( rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 )
+            // InternalOCLstdlib.g:6614:2: rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1();
@@ -21528,14 +21528,14 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__0"
-    // InternalOCLstdlib.g:6626:1: rule__DetailCS__Group__0 : rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 ;
+    // InternalOCLstdlib.g:6628:1: rule__DetailCS__Group__0 : rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 ;
     public final void rule__DetailCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6630:1: ( rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 )
-            // InternalOCLstdlib.g:6631:2: rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1
+            // InternalOCLstdlib.g:6632:1: ( rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1 )
+            // InternalOCLstdlib.g:6633:2: rule__DetailCS__Group__0__Impl rule__DetailCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__DetailCS__Group__0__Impl();
@@ -21566,23 +21566,23 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__0__Impl"
-    // InternalOCLstdlib.g:6638:1: rule__DetailCS__Group__0__Impl : ( ( rule__DetailCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:6640:1: rule__DetailCS__Group__0__Impl : ( ( rule__DetailCS__NameAssignment_0 ) ) ;
     public final void rule__DetailCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6642:1: ( ( ( rule__DetailCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:6643:1: ( ( rule__DetailCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:6644:1: ( ( ( rule__DetailCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:6645:1: ( ( rule__DetailCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:6643:1: ( ( rule__DetailCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:6644:1: ( rule__DetailCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:6645:1: ( ( rule__DetailCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:6646:1: ( rule__DetailCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:6645:1: ( rule__DetailCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:6645:2: rule__DetailCS__NameAssignment_0
+            // InternalOCLstdlib.g:6647:1: ( rule__DetailCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:6647:2: rule__DetailCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__NameAssignment_0();
@@ -21617,14 +21617,14 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__1"
-    // InternalOCLstdlib.g:6655:1: rule__DetailCS__Group__1 : rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 ;
+    // InternalOCLstdlib.g:6657:1: rule__DetailCS__Group__1 : rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 ;
     public final void rule__DetailCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6659:1: ( rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 )
-            // InternalOCLstdlib.g:6660:2: rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2
+            // InternalOCLstdlib.g:6661:1: ( rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2 )
+            // InternalOCLstdlib.g:6662:2: rule__DetailCS__Group__1__Impl rule__DetailCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_27);
             rule__DetailCS__Group__1__Impl();
@@ -21655,17 +21655,17 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__1__Impl"
-    // InternalOCLstdlib.g:6667:1: rule__DetailCS__Group__1__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:6669:1: rule__DetailCS__Group__1__Impl : ( '=' ) ;
     public final void rule__DetailCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6671:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:6672:1: ( '=' )
+            // InternalOCLstdlib.g:6673:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:6674:1: ( '=' )
             {
-            // InternalOCLstdlib.g:6672:1: ( '=' )
-            // InternalOCLstdlib.g:6673:1: '='
+            // InternalOCLstdlib.g:6674:1: ( '=' )
+            // InternalOCLstdlib.g:6675:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getEqualsSignKeyword_1());
@@ -21696,14 +21696,14 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__2"
-    // InternalOCLstdlib.g:6686:1: rule__DetailCS__Group__2 : rule__DetailCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:6688:1: rule__DetailCS__Group__2 : rule__DetailCS__Group__2__Impl ;
     public final void rule__DetailCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6690:1: ( rule__DetailCS__Group__2__Impl )
-            // InternalOCLstdlib.g:6691:2: rule__DetailCS__Group__2__Impl
+            // InternalOCLstdlib.g:6692:1: ( rule__DetailCS__Group__2__Impl )
+            // InternalOCLstdlib.g:6693:2: rule__DetailCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__Group__2__Impl();
@@ -21729,22 +21729,22 @@
 
 
     // $ANTLR start "rule__DetailCS__Group__2__Impl"
-    // InternalOCLstdlib.g:6697:1: rule__DetailCS__Group__2__Impl : ( ( rule__DetailCS__ValuesAssignment_2 )* ) ;
+    // InternalOCLstdlib.g:6699:1: rule__DetailCS__Group__2__Impl : ( ( rule__DetailCS__ValuesAssignment_2 )* ) ;
     public final void rule__DetailCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6701:1: ( ( ( rule__DetailCS__ValuesAssignment_2 )* ) )
-            // InternalOCLstdlib.g:6702:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
+            // InternalOCLstdlib.g:6703:1: ( ( ( rule__DetailCS__ValuesAssignment_2 )* ) )
+            // InternalOCLstdlib.g:6704:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
             {
-            // InternalOCLstdlib.g:6702:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
-            // InternalOCLstdlib.g:6703:1: ( rule__DetailCS__ValuesAssignment_2 )*
+            // InternalOCLstdlib.g:6704:1: ( ( rule__DetailCS__ValuesAssignment_2 )* )
+            // InternalOCLstdlib.g:6705:1: ( rule__DetailCS__ValuesAssignment_2 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getValuesAssignment_2());
             }
-            // InternalOCLstdlib.g:6704:1: ( rule__DetailCS__ValuesAssignment_2 )*
+            // InternalOCLstdlib.g:6706:1: ( rule__DetailCS__ValuesAssignment_2 )*
             loop68:
             do {
                 int alt68=2;
@@ -21757,7 +21757,7 @@
 
                 switch (alt68) {
             	case 1 :
-            	    // InternalOCLstdlib.g:6704:2: rule__DetailCS__ValuesAssignment_2
+            	    // InternalOCLstdlib.g:6706:2: rule__DetailCS__ValuesAssignment_2
             	    {
             	    pushFollow(FollowSets000.FOLLOW_28);
             	    rule__DetailCS__ValuesAssignment_2();
@@ -21798,14 +21798,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__0"
-    // InternalOCLstdlib.g:6720:1: rule__DocumentationCS__Group__0 : rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 ;
+    // InternalOCLstdlib.g:6722:1: rule__DocumentationCS__Group__0 : rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 ;
     public final void rule__DocumentationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6724:1: ( rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 )
-            // InternalOCLstdlib.g:6725:2: rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1
+            // InternalOCLstdlib.g:6726:1: ( rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1 )
+            // InternalOCLstdlib.g:6727:2: rule__DocumentationCS__Group__0__Impl rule__DocumentationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_18);
             rule__DocumentationCS__Group__0__Impl();
@@ -21836,23 +21836,23 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__0__Impl"
-    // InternalOCLstdlib.g:6732:1: rule__DocumentationCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:6734:1: rule__DocumentationCS__Group__0__Impl : ( () ) ;
     public final void rule__DocumentationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6736:1: ( ( () ) )
-            // InternalOCLstdlib.g:6737:1: ( () )
+            // InternalOCLstdlib.g:6738:1: ( ( () ) )
+            // InternalOCLstdlib.g:6739:1: ( () )
             {
-            // InternalOCLstdlib.g:6737:1: ( () )
-            // InternalOCLstdlib.g:6738:1: ()
+            // InternalOCLstdlib.g:6739:1: ( () )
+            // InternalOCLstdlib.g:6740:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getDocumentationCSAction_0());
             }
-            // InternalOCLstdlib.g:6739:1: ()
-            // InternalOCLstdlib.g:6741:1:
+            // InternalOCLstdlib.g:6741:1: ()
+            // InternalOCLstdlib.g:6743:1:
             {
             }
 
@@ -21877,14 +21877,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__1"
-    // InternalOCLstdlib.g:6751:1: rule__DocumentationCS__Group__1 : rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 ;
+    // InternalOCLstdlib.g:6753:1: rule__DocumentationCS__Group__1 : rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 ;
     public final void rule__DocumentationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6755:1: ( rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 )
-            // InternalOCLstdlib.g:6756:2: rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2
+            // InternalOCLstdlib.g:6757:1: ( rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2 )
+            // InternalOCLstdlib.g:6758:2: rule__DocumentationCS__Group__1__Impl rule__DocumentationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__DocumentationCS__Group__1__Impl();
@@ -21915,17 +21915,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__1__Impl"
-    // InternalOCLstdlib.g:6763:1: rule__DocumentationCS__Group__1__Impl : ( 'documentation' ) ;
+    // InternalOCLstdlib.g:6765:1: rule__DocumentationCS__Group__1__Impl : ( 'documentation' ) ;
     public final void rule__DocumentationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6767:1: ( ( 'documentation' ) )
-            // InternalOCLstdlib.g:6768:1: ( 'documentation' )
+            // InternalOCLstdlib.g:6769:1: ( ( 'documentation' ) )
+            // InternalOCLstdlib.g:6770:1: ( 'documentation' )
             {
-            // InternalOCLstdlib.g:6768:1: ( 'documentation' )
-            // InternalOCLstdlib.g:6769:1: 'documentation'
+            // InternalOCLstdlib.g:6770:1: ( 'documentation' )
+            // InternalOCLstdlib.g:6771:1: 'documentation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getDocumentationKeyword_1());
@@ -21956,14 +21956,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__2"
-    // InternalOCLstdlib.g:6782:1: rule__DocumentationCS__Group__2 : rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 ;
+    // InternalOCLstdlib.g:6784:1: rule__DocumentationCS__Group__2 : rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 ;
     public final void rule__DocumentationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6786:1: ( rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 )
-            // InternalOCLstdlib.g:6787:2: rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3
+            // InternalOCLstdlib.g:6788:1: ( rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3 )
+            // InternalOCLstdlib.g:6789:2: rule__DocumentationCS__Group__2__Impl rule__DocumentationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__DocumentationCS__Group__2__Impl();
@@ -21994,22 +21994,22 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__2__Impl"
-    // InternalOCLstdlib.g:6794:1: rule__DocumentationCS__Group__2__Impl : ( ( rule__DocumentationCS__ValueAssignment_2 )? ) ;
+    // InternalOCLstdlib.g:6796:1: rule__DocumentationCS__Group__2__Impl : ( ( rule__DocumentationCS__ValueAssignment_2 )? ) ;
     public final void rule__DocumentationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6798:1: ( ( ( rule__DocumentationCS__ValueAssignment_2 )? ) )
-            // InternalOCLstdlib.g:6799:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
+            // InternalOCLstdlib.g:6800:1: ( ( ( rule__DocumentationCS__ValueAssignment_2 )? ) )
+            // InternalOCLstdlib.g:6801:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
             {
-            // InternalOCLstdlib.g:6799:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
-            // InternalOCLstdlib.g:6800:1: ( rule__DocumentationCS__ValueAssignment_2 )?
+            // InternalOCLstdlib.g:6801:1: ( ( rule__DocumentationCS__ValueAssignment_2 )? )
+            // InternalOCLstdlib.g:6802:1: ( rule__DocumentationCS__ValueAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getValueAssignment_2());
             }
-            // InternalOCLstdlib.g:6801:1: ( rule__DocumentationCS__ValueAssignment_2 )?
+            // InternalOCLstdlib.g:6803:1: ( rule__DocumentationCS__ValueAssignment_2 )?
             int alt69=2;
             int LA69_0 = input.LA(1);
 
@@ -22018,7 +22018,7 @@
             }
             switch (alt69) {
                 case 1 :
-                    // InternalOCLstdlib.g:6801:2: rule__DocumentationCS__ValueAssignment_2
+                    // InternalOCLstdlib.g:6803:2: rule__DocumentationCS__ValueAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DocumentationCS__ValueAssignment_2();
@@ -22056,14 +22056,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__3"
-    // InternalOCLstdlib.g:6811:1: rule__DocumentationCS__Group__3 : rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 ;
+    // InternalOCLstdlib.g:6813:1: rule__DocumentationCS__Group__3 : rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 ;
     public final void rule__DocumentationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6815:1: ( rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 )
-            // InternalOCLstdlib.g:6816:2: rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4
+            // InternalOCLstdlib.g:6817:1: ( rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4 )
+            // InternalOCLstdlib.g:6818:2: rule__DocumentationCS__Group__3__Impl rule__DocumentationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_29);
             rule__DocumentationCS__Group__3__Impl();
@@ -22094,22 +22094,22 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__3__Impl"
-    // InternalOCLstdlib.g:6823:1: rule__DocumentationCS__Group__3__Impl : ( ( rule__DocumentationCS__Group_3__0 )? ) ;
+    // InternalOCLstdlib.g:6825:1: rule__DocumentationCS__Group__3__Impl : ( ( rule__DocumentationCS__Group_3__0 )? ) ;
     public final void rule__DocumentationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6827:1: ( ( ( rule__DocumentationCS__Group_3__0 )? ) )
-            // InternalOCLstdlib.g:6828:1: ( ( rule__DocumentationCS__Group_3__0 )? )
+            // InternalOCLstdlib.g:6829:1: ( ( ( rule__DocumentationCS__Group_3__0 )? ) )
+            // InternalOCLstdlib.g:6830:1: ( ( rule__DocumentationCS__Group_3__0 )? )
             {
-            // InternalOCLstdlib.g:6828:1: ( ( rule__DocumentationCS__Group_3__0 )? )
-            // InternalOCLstdlib.g:6829:1: ( rule__DocumentationCS__Group_3__0 )?
+            // InternalOCLstdlib.g:6830:1: ( ( rule__DocumentationCS__Group_3__0 )? )
+            // InternalOCLstdlib.g:6831:1: ( rule__DocumentationCS__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getGroup_3());
             }
-            // InternalOCLstdlib.g:6830:1: ( rule__DocumentationCS__Group_3__0 )?
+            // InternalOCLstdlib.g:6832:1: ( rule__DocumentationCS__Group_3__0 )?
             int alt70=2;
             int LA70_0 = input.LA(1);
 
@@ -22118,7 +22118,7 @@
             }
             switch (alt70) {
                 case 1 :
-                    // InternalOCLstdlib.g:6830:2: rule__DocumentationCS__Group_3__0
+                    // InternalOCLstdlib.g:6832:2: rule__DocumentationCS__Group_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__DocumentationCS__Group_3__0();
@@ -22156,14 +22156,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__4"
-    // InternalOCLstdlib.g:6840:1: rule__DocumentationCS__Group__4 : rule__DocumentationCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:6842:1: rule__DocumentationCS__Group__4 : rule__DocumentationCS__Group__4__Impl ;
     public final void rule__DocumentationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6844:1: ( rule__DocumentationCS__Group__4__Impl )
-            // InternalOCLstdlib.g:6845:2: rule__DocumentationCS__Group__4__Impl
+            // InternalOCLstdlib.g:6846:1: ( rule__DocumentationCS__Group__4__Impl )
+            // InternalOCLstdlib.g:6847:2: rule__DocumentationCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__Group__4__Impl();
@@ -22189,17 +22189,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group__4__Impl"
-    // InternalOCLstdlib.g:6851:1: rule__DocumentationCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:6853:1: rule__DocumentationCS__Group__4__Impl : ( ';' ) ;
     public final void rule__DocumentationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6855:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:6856:1: ( ';' )
+            // InternalOCLstdlib.g:6857:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:6858:1: ( ';' )
             {
-            // InternalOCLstdlib.g:6856:1: ( ';' )
-            // InternalOCLstdlib.g:6857:1: ';'
+            // InternalOCLstdlib.g:6858:1: ( ';' )
+            // InternalOCLstdlib.g:6859:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getSemicolonKeyword_4());
@@ -22230,14 +22230,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__0"
-    // InternalOCLstdlib.g:6880:1: rule__DocumentationCS__Group_3__0 : rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 ;
+    // InternalOCLstdlib.g:6882:1: rule__DocumentationCS__Group_3__0 : rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 ;
     public final void rule__DocumentationCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6884:1: ( rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 )
-            // InternalOCLstdlib.g:6885:2: rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1
+            // InternalOCLstdlib.g:6886:1: ( rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1 )
+            // InternalOCLstdlib.g:6887:2: rule__DocumentationCS__Group_3__0__Impl rule__DocumentationCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__DocumentationCS__Group_3__0__Impl();
@@ -22268,17 +22268,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__0__Impl"
-    // InternalOCLstdlib.g:6892:1: rule__DocumentationCS__Group_3__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:6894:1: rule__DocumentationCS__Group_3__0__Impl : ( '(' ) ;
     public final void rule__DocumentationCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6896:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:6897:1: ( '(' )
+            // InternalOCLstdlib.g:6898:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:6899:1: ( '(' )
             {
-            // InternalOCLstdlib.g:6897:1: ( '(' )
-            // InternalOCLstdlib.g:6898:1: '('
+            // InternalOCLstdlib.g:6899:1: ( '(' )
+            // InternalOCLstdlib.g:6900:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getLeftParenthesisKeyword_3_0());
@@ -22309,14 +22309,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__1"
-    // InternalOCLstdlib.g:6911:1: rule__DocumentationCS__Group_3__1 : rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 ;
+    // InternalOCLstdlib.g:6913:1: rule__DocumentationCS__Group_3__1 : rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 ;
     public final void rule__DocumentationCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6915:1: ( rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 )
-            // InternalOCLstdlib.g:6916:2: rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2
+            // InternalOCLstdlib.g:6917:1: ( rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2 )
+            // InternalOCLstdlib.g:6918:2: rule__DocumentationCS__Group_3__1__Impl rule__DocumentationCS__Group_3__2
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__DocumentationCS__Group_3__1__Impl();
@@ -22347,23 +22347,23 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__1__Impl"
-    // InternalOCLstdlib.g:6923:1: rule__DocumentationCS__Group_3__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) ;
+    // InternalOCLstdlib.g:6925:1: rule__DocumentationCS__Group_3__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) ;
     public final void rule__DocumentationCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6927:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) )
-            // InternalOCLstdlib.g:6928:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
+            // InternalOCLstdlib.g:6929:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) ) )
+            // InternalOCLstdlib.g:6930:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
             {
-            // InternalOCLstdlib.g:6928:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
-            // InternalOCLstdlib.g:6929:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
+            // InternalOCLstdlib.g:6930:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 ) )
+            // InternalOCLstdlib.g:6931:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_1());
             }
-            // InternalOCLstdlib.g:6930:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
-            // InternalOCLstdlib.g:6930:2: rule__DocumentationCS__OwnedDetailsAssignment_3_1
+            // InternalOCLstdlib.g:6932:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_1 )
+            // InternalOCLstdlib.g:6932:2: rule__DocumentationCS__OwnedDetailsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__OwnedDetailsAssignment_3_1();
@@ -22398,14 +22398,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__2"
-    // InternalOCLstdlib.g:6940:1: rule__DocumentationCS__Group_3__2 : rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 ;
+    // InternalOCLstdlib.g:6942:1: rule__DocumentationCS__Group_3__2 : rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 ;
     public final void rule__DocumentationCS__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6944:1: ( rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 )
-            // InternalOCLstdlib.g:6945:2: rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3
+            // InternalOCLstdlib.g:6946:1: ( rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3 )
+            // InternalOCLstdlib.g:6947:2: rule__DocumentationCS__Group_3__2__Impl rule__DocumentationCS__Group_3__3
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__DocumentationCS__Group_3__2__Impl();
@@ -22436,22 +22436,22 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__2__Impl"
-    // InternalOCLstdlib.g:6952:1: rule__DocumentationCS__Group_3__2__Impl : ( ( rule__DocumentationCS__Group_3_2__0 )* ) ;
+    // InternalOCLstdlib.g:6954:1: rule__DocumentationCS__Group_3__2__Impl : ( ( rule__DocumentationCS__Group_3_2__0 )* ) ;
     public final void rule__DocumentationCS__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6956:1: ( ( ( rule__DocumentationCS__Group_3_2__0 )* ) )
-            // InternalOCLstdlib.g:6957:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
+            // InternalOCLstdlib.g:6958:1: ( ( ( rule__DocumentationCS__Group_3_2__0 )* ) )
+            // InternalOCLstdlib.g:6959:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
             {
-            // InternalOCLstdlib.g:6957:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
-            // InternalOCLstdlib.g:6958:1: ( rule__DocumentationCS__Group_3_2__0 )*
+            // InternalOCLstdlib.g:6959:1: ( ( rule__DocumentationCS__Group_3_2__0 )* )
+            // InternalOCLstdlib.g:6960:1: ( rule__DocumentationCS__Group_3_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getGroup_3_2());
             }
-            // InternalOCLstdlib.g:6959:1: ( rule__DocumentationCS__Group_3_2__0 )*
+            // InternalOCLstdlib.g:6961:1: ( rule__DocumentationCS__Group_3_2__0 )*
             loop71:
             do {
                 int alt71=2;
@@ -22464,7 +22464,7 @@
 
                 switch (alt71) {
             	case 1 :
-            	    // InternalOCLstdlib.g:6959:2: rule__DocumentationCS__Group_3_2__0
+            	    // InternalOCLstdlib.g:6961:2: rule__DocumentationCS__Group_3_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__DocumentationCS__Group_3_2__0();
@@ -22505,14 +22505,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__3"
-    // InternalOCLstdlib.g:6969:1: rule__DocumentationCS__Group_3__3 : rule__DocumentationCS__Group_3__3__Impl ;
+    // InternalOCLstdlib.g:6971:1: rule__DocumentationCS__Group_3__3 : rule__DocumentationCS__Group_3__3__Impl ;
     public final void rule__DocumentationCS__Group_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6973:1: ( rule__DocumentationCS__Group_3__3__Impl )
-            // InternalOCLstdlib.g:6974:2: rule__DocumentationCS__Group_3__3__Impl
+            // InternalOCLstdlib.g:6975:1: ( rule__DocumentationCS__Group_3__3__Impl )
+            // InternalOCLstdlib.g:6976:2: rule__DocumentationCS__Group_3__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__Group_3__3__Impl();
@@ -22538,17 +22538,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3__3__Impl"
-    // InternalOCLstdlib.g:6980:1: rule__DocumentationCS__Group_3__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:6982:1: rule__DocumentationCS__Group_3__3__Impl : ( ')' ) ;
     public final void rule__DocumentationCS__Group_3__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:6984:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:6985:1: ( ')' )
+            // InternalOCLstdlib.g:6986:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:6987:1: ( ')' )
             {
-            // InternalOCLstdlib.g:6985:1: ( ')' )
-            // InternalOCLstdlib.g:6986:1: ')'
+            // InternalOCLstdlib.g:6987:1: ( ')' )
+            // InternalOCLstdlib.g:6988:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getRightParenthesisKeyword_3_3());
@@ -22579,14 +22579,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__0"
-    // InternalOCLstdlib.g:7007:1: rule__DocumentationCS__Group_3_2__0 : rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 ;
+    // InternalOCLstdlib.g:7009:1: rule__DocumentationCS__Group_3_2__0 : rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 ;
     public final void rule__DocumentationCS__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7011:1: ( rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 )
-            // InternalOCLstdlib.g:7012:2: rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1
+            // InternalOCLstdlib.g:7013:1: ( rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1 )
+            // InternalOCLstdlib.g:7014:2: rule__DocumentationCS__Group_3_2__0__Impl rule__DocumentationCS__Group_3_2__1
             {
             pushFollow(FollowSets000.FOLLOW_15);
             rule__DocumentationCS__Group_3_2__0__Impl();
@@ -22617,17 +22617,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__0__Impl"
-    // InternalOCLstdlib.g:7019:1: rule__DocumentationCS__Group_3_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:7021:1: rule__DocumentationCS__Group_3_2__0__Impl : ( ',' ) ;
     public final void rule__DocumentationCS__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7023:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:7024:1: ( ',' )
+            // InternalOCLstdlib.g:7025:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:7026:1: ( ',' )
             {
-            // InternalOCLstdlib.g:7024:1: ( ',' )
-            // InternalOCLstdlib.g:7025:1: ','
+            // InternalOCLstdlib.g:7026:1: ( ',' )
+            // InternalOCLstdlib.g:7027:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getCommaKeyword_3_2_0());
@@ -22658,14 +22658,14 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__1"
-    // InternalOCLstdlib.g:7038:1: rule__DocumentationCS__Group_3_2__1 : rule__DocumentationCS__Group_3_2__1__Impl ;
+    // InternalOCLstdlib.g:7040:1: rule__DocumentationCS__Group_3_2__1 : rule__DocumentationCS__Group_3_2__1__Impl ;
     public final void rule__DocumentationCS__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7042:1: ( rule__DocumentationCS__Group_3_2__1__Impl )
-            // InternalOCLstdlib.g:7043:2: rule__DocumentationCS__Group_3_2__1__Impl
+            // InternalOCLstdlib.g:7044:1: ( rule__DocumentationCS__Group_3_2__1__Impl )
+            // InternalOCLstdlib.g:7045:2: rule__DocumentationCS__Group_3_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__Group_3_2__1__Impl();
@@ -22691,23 +22691,23 @@
 
 
     // $ANTLR start "rule__DocumentationCS__Group_3_2__1__Impl"
-    // InternalOCLstdlib.g:7049:1: rule__DocumentationCS__Group_3_2__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
+    // InternalOCLstdlib.g:7051:1: rule__DocumentationCS__Group_3_2__1__Impl : ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) ;
     public final void rule__DocumentationCS__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7053:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) )
-            // InternalOCLstdlib.g:7054:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
+            // InternalOCLstdlib.g:7055:1: ( ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) ) )
+            // InternalOCLstdlib.g:7056:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
             {
-            // InternalOCLstdlib.g:7054:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
-            // InternalOCLstdlib.g:7055:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
+            // InternalOCLstdlib.g:7056:1: ( ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 ) )
+            // InternalOCLstdlib.g:7057:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsAssignment_3_2_1());
             }
-            // InternalOCLstdlib.g:7056:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
-            // InternalOCLstdlib.g:7056:2: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1
+            // InternalOCLstdlib.g:7058:1: ( rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 )
+            // InternalOCLstdlib.g:7058:2: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DocumentationCS__OwnedDetailsAssignment_3_2_1();
@@ -22742,14 +22742,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__0"
-    // InternalOCLstdlib.g:7070:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
+    // InternalOCLstdlib.g:7072:1: rule__ImportCS__Group__0 : rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 ;
     public final void rule__ImportCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7074:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
-            // InternalOCLstdlib.g:7075:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
+            // InternalOCLstdlib.g:7076:1: ( rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1 )
+            // InternalOCLstdlib.g:7077:2: rule__ImportCS__Group__0__Impl rule__ImportCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__ImportCS__Group__0__Impl();
@@ -22780,17 +22780,17 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__0__Impl"
-    // InternalOCLstdlib.g:7082:1: rule__ImportCS__Group__0__Impl : ( 'import' ) ;
+    // InternalOCLstdlib.g:7084:1: rule__ImportCS__Group__0__Impl : ( 'import' ) ;
     public final void rule__ImportCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7086:1: ( ( 'import' ) )
-            // InternalOCLstdlib.g:7087:1: ( 'import' )
+            // InternalOCLstdlib.g:7088:1: ( ( 'import' ) )
+            // InternalOCLstdlib.g:7089:1: ( 'import' )
             {
-            // InternalOCLstdlib.g:7087:1: ( 'import' )
-            // InternalOCLstdlib.g:7088:1: 'import'
+            // InternalOCLstdlib.g:7089:1: ( 'import' )
+            // InternalOCLstdlib.g:7090:1: 'import'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getImportKeyword_0());
@@ -22821,14 +22821,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__1"
-    // InternalOCLstdlib.g:7101:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
+    // InternalOCLstdlib.g:7103:1: rule__ImportCS__Group__1 : rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 ;
     public final void rule__ImportCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7105:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
-            // InternalOCLstdlib.g:7106:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
+            // InternalOCLstdlib.g:7107:1: ( rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2 )
+            // InternalOCLstdlib.g:7108:2: rule__ImportCS__Group__1__Impl rule__ImportCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__ImportCS__Group__1__Impl();
@@ -22859,27 +22859,27 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__1__Impl"
-    // InternalOCLstdlib.g:7113:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:7115:1: rule__ImportCS__Group__1__Impl : ( ( rule__ImportCS__Group_1__0 )? ) ;
     public final void rule__ImportCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7117:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:7118:1: ( ( rule__ImportCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:7119:1: ( ( ( rule__ImportCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:7120:1: ( ( rule__ImportCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:7118:1: ( ( rule__ImportCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:7119:1: ( rule__ImportCS__Group_1__0 )?
+            // InternalOCLstdlib.g:7120:1: ( ( rule__ImportCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:7121:1: ( rule__ImportCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:7120:1: ( rule__ImportCS__Group_1__0 )?
+            // InternalOCLstdlib.g:7122:1: ( rule__ImportCS__Group_1__0 )?
             int alt72=2;
             alt72 = dfa72.predict(input);
             switch (alt72) {
                 case 1 :
-                    // InternalOCLstdlib.g:7120:2: rule__ImportCS__Group_1__0
+                    // InternalOCLstdlib.g:7122:2: rule__ImportCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImportCS__Group_1__0();
@@ -22917,14 +22917,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__2"
-    // InternalOCLstdlib.g:7130:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
+    // InternalOCLstdlib.g:7132:1: rule__ImportCS__Group__2 : rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 ;
     public final void rule__ImportCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7134:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
-            // InternalOCLstdlib.g:7135:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
+            // InternalOCLstdlib.g:7136:1: ( rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3 )
+            // InternalOCLstdlib.g:7137:2: rule__ImportCS__Group__2__Impl rule__ImportCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_30);
             rule__ImportCS__Group__2__Impl();
@@ -22955,23 +22955,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__2__Impl"
-    // InternalOCLstdlib.g:7142:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:7144:1: rule__ImportCS__Group__2__Impl : ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) ;
     public final void rule__ImportCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7146:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
-            // InternalOCLstdlib.g:7147:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
+            // InternalOCLstdlib.g:7148:1: ( ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) ) )
+            // InternalOCLstdlib.g:7149:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:7147:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
-            // InternalOCLstdlib.g:7148:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
+            // InternalOCLstdlib.g:7149:1: ( ( rule__ImportCS__OwnedPathNameAssignment_2 ) )
+            // InternalOCLstdlib.g:7150:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getOwnedPathNameAssignment_2());
             }
-            // InternalOCLstdlib.g:7149:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
-            // InternalOCLstdlib.g:7149:2: rule__ImportCS__OwnedPathNameAssignment_2
+            // InternalOCLstdlib.g:7151:1: ( rule__ImportCS__OwnedPathNameAssignment_2 )
+            // InternalOCLstdlib.g:7151:2: rule__ImportCS__OwnedPathNameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__OwnedPathNameAssignment_2();
@@ -23006,14 +23006,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__3"
-    // InternalOCLstdlib.g:7159:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:7161:1: rule__ImportCS__Group__3 : rule__ImportCS__Group__3__Impl ;
     public final void rule__ImportCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7163:1: ( rule__ImportCS__Group__3__Impl )
-            // InternalOCLstdlib.g:7164:2: rule__ImportCS__Group__3__Impl
+            // InternalOCLstdlib.g:7165:1: ( rule__ImportCS__Group__3__Impl )
+            // InternalOCLstdlib.g:7166:2: rule__ImportCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Group__3__Impl();
@@ -23039,22 +23039,22 @@
 
 
     // $ANTLR start "rule__ImportCS__Group__3__Impl"
-    // InternalOCLstdlib.g:7170:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
+    // InternalOCLstdlib.g:7172:1: rule__ImportCS__Group__3__Impl : ( ( rule__ImportCS__IsAllAssignment_3 )? ) ;
     public final void rule__ImportCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7174:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
-            // InternalOCLstdlib.g:7175:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
+            // InternalOCLstdlib.g:7176:1: ( ( ( rule__ImportCS__IsAllAssignment_3 )? ) )
+            // InternalOCLstdlib.g:7177:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
             {
-            // InternalOCLstdlib.g:7175:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
-            // InternalOCLstdlib.g:7176:1: ( rule__ImportCS__IsAllAssignment_3 )?
+            // InternalOCLstdlib.g:7177:1: ( ( rule__ImportCS__IsAllAssignment_3 )? )
+            // InternalOCLstdlib.g:7178:1: ( rule__ImportCS__IsAllAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllAssignment_3());
             }
-            // InternalOCLstdlib.g:7177:1: ( rule__ImportCS__IsAllAssignment_3 )?
+            // InternalOCLstdlib.g:7179:1: ( rule__ImportCS__IsAllAssignment_3 )?
             int alt73=2;
             int LA73_0 = input.LA(1);
 
@@ -23063,7 +23063,7 @@
             }
             switch (alt73) {
                 case 1 :
-                    // InternalOCLstdlib.g:7177:2: rule__ImportCS__IsAllAssignment_3
+                    // InternalOCLstdlib.g:7179:2: rule__ImportCS__IsAllAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ImportCS__IsAllAssignment_3();
@@ -23101,14 +23101,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__0"
-    // InternalOCLstdlib.g:7195:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
+    // InternalOCLstdlib.g:7197:1: rule__ImportCS__Group_1__0 : rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 ;
     public final void rule__ImportCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7199:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
-            // InternalOCLstdlib.g:7200:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
+            // InternalOCLstdlib.g:7201:1: ( rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1 )
+            // InternalOCLstdlib.g:7202:2: rule__ImportCS__Group_1__0__Impl rule__ImportCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__ImportCS__Group_1__0__Impl();
@@ -23139,23 +23139,23 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:7207:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLstdlib.g:7209:1: rule__ImportCS__Group_1__0__Impl : ( ( rule__ImportCS__NameAssignment_1_0 ) ) ;
     public final void rule__ImportCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7211:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
-            // InternalOCLstdlib.g:7212:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:7213:1: ( ( ( rule__ImportCS__NameAssignment_1_0 ) ) )
+            // InternalOCLstdlib.g:7214:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLstdlib.g:7212:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
-            // InternalOCLstdlib.g:7213:1: ( rule__ImportCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:7214:1: ( ( rule__ImportCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:7215:1: ( rule__ImportCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLstdlib.g:7214:1: ( rule__ImportCS__NameAssignment_1_0 )
-            // InternalOCLstdlib.g:7214:2: rule__ImportCS__NameAssignment_1_0
+            // InternalOCLstdlib.g:7216:1: ( rule__ImportCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:7216:2: rule__ImportCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__NameAssignment_1_0();
@@ -23190,14 +23190,14 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__1"
-    // InternalOCLstdlib.g:7224:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:7226:1: rule__ImportCS__Group_1__1 : rule__ImportCS__Group_1__1__Impl ;
     public final void rule__ImportCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7228:1: ( rule__ImportCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:7229:2: rule__ImportCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:7230:1: ( rule__ImportCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:7231:2: rule__ImportCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ImportCS__Group_1__1__Impl();
@@ -23223,17 +23223,17 @@
 
 
     // $ANTLR start "rule__ImportCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:7235:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:7237:1: rule__ImportCS__Group_1__1__Impl : ( ':' ) ;
     public final void rule__ImportCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7239:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:7240:1: ( ':' )
+            // InternalOCLstdlib.g:7241:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:7242:1: ( ':' )
             {
-            // InternalOCLstdlib.g:7240:1: ( ':' )
-            // InternalOCLstdlib.g:7241:1: ':'
+            // InternalOCLstdlib.g:7242:1: ( ':' )
+            // InternalOCLstdlib.g:7243:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getColonKeyword_1_1());
@@ -23264,14 +23264,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group__0"
-    // InternalOCLstdlib.g:7258:1: rule__InvCS__Group__0 : rule__InvCS__Group__0__Impl rule__InvCS__Group__1 ;
+    // InternalOCLstdlib.g:7260:1: rule__InvCS__Group__0 : rule__InvCS__Group__0__Impl rule__InvCS__Group__1 ;
     public final void rule__InvCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7262:1: ( rule__InvCS__Group__0__Impl rule__InvCS__Group__1 )
-            // InternalOCLstdlib.g:7263:2: rule__InvCS__Group__0__Impl rule__InvCS__Group__1
+            // InternalOCLstdlib.g:7264:1: ( rule__InvCS__Group__0__Impl rule__InvCS__Group__1 )
+            // InternalOCLstdlib.g:7265:2: rule__InvCS__Group__0__Impl rule__InvCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__InvCS__Group__0__Impl();
@@ -23302,23 +23302,23 @@
 
 
     // $ANTLR start "rule__InvCS__Group__0__Impl"
-    // InternalOCLstdlib.g:7270:1: rule__InvCS__Group__0__Impl : ( ( rule__InvCS__StereotypeAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:7272:1: rule__InvCS__Group__0__Impl : ( ( rule__InvCS__StereotypeAssignment_0 ) ) ;
     public final void rule__InvCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7274:1: ( ( ( rule__InvCS__StereotypeAssignment_0 ) ) )
-            // InternalOCLstdlib.g:7275:1: ( ( rule__InvCS__StereotypeAssignment_0 ) )
+            // InternalOCLstdlib.g:7276:1: ( ( ( rule__InvCS__StereotypeAssignment_0 ) ) )
+            // InternalOCLstdlib.g:7277:1: ( ( rule__InvCS__StereotypeAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:7275:1: ( ( rule__InvCS__StereotypeAssignment_0 ) )
-            // InternalOCLstdlib.g:7276:1: ( rule__InvCS__StereotypeAssignment_0 )
+            // InternalOCLstdlib.g:7277:1: ( ( rule__InvCS__StereotypeAssignment_0 ) )
+            // InternalOCLstdlib.g:7278:1: ( rule__InvCS__StereotypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getStereotypeAssignment_0());
             }
-            // InternalOCLstdlib.g:7277:1: ( rule__InvCS__StereotypeAssignment_0 )
-            // InternalOCLstdlib.g:7277:2: rule__InvCS__StereotypeAssignment_0
+            // InternalOCLstdlib.g:7279:1: ( rule__InvCS__StereotypeAssignment_0 )
+            // InternalOCLstdlib.g:7279:2: rule__InvCS__StereotypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__StereotypeAssignment_0();
@@ -23353,14 +23353,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group__1"
-    // InternalOCLstdlib.g:7287:1: rule__InvCS__Group__1 : rule__InvCS__Group__1__Impl rule__InvCS__Group__2 ;
+    // InternalOCLstdlib.g:7289:1: rule__InvCS__Group__1 : rule__InvCS__Group__1__Impl rule__InvCS__Group__2 ;
     public final void rule__InvCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7291:1: ( rule__InvCS__Group__1__Impl rule__InvCS__Group__2 )
-            // InternalOCLstdlib.g:7292:2: rule__InvCS__Group__1__Impl rule__InvCS__Group__2
+            // InternalOCLstdlib.g:7293:1: ( rule__InvCS__Group__1__Impl rule__InvCS__Group__2 )
+            // InternalOCLstdlib.g:7294:2: rule__InvCS__Group__1__Impl rule__InvCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__InvCS__Group__1__Impl();
@@ -23391,22 +23391,22 @@
 
 
     // $ANTLR start "rule__InvCS__Group__1__Impl"
-    // InternalOCLstdlib.g:7299:1: rule__InvCS__Group__1__Impl : ( ( rule__InvCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:7301:1: rule__InvCS__Group__1__Impl : ( ( rule__InvCS__Group_1__0 )? ) ;
     public final void rule__InvCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7303:1: ( ( ( rule__InvCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:7304:1: ( ( rule__InvCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:7305:1: ( ( ( rule__InvCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:7306:1: ( ( rule__InvCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:7304:1: ( ( rule__InvCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:7305:1: ( rule__InvCS__Group_1__0 )?
+            // InternalOCLstdlib.g:7306:1: ( ( rule__InvCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:7307:1: ( rule__InvCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:7306:1: ( rule__InvCS__Group_1__0 )?
+            // InternalOCLstdlib.g:7308:1: ( rule__InvCS__Group_1__0 )?
             int alt74=2;
             int LA74_0 = input.LA(1);
 
@@ -23415,7 +23415,7 @@
             }
             switch (alt74) {
                 case 1 :
-                    // InternalOCLstdlib.g:7306:2: rule__InvCS__Group_1__0
+                    // InternalOCLstdlib.g:7308:2: rule__InvCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvCS__Group_1__0();
@@ -23453,14 +23453,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group__2"
-    // InternalOCLstdlib.g:7316:1: rule__InvCS__Group__2 : rule__InvCS__Group__2__Impl rule__InvCS__Group__3 ;
+    // InternalOCLstdlib.g:7318:1: rule__InvCS__Group__2 : rule__InvCS__Group__2__Impl rule__InvCS__Group__3 ;
     public final void rule__InvCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7320:1: ( rule__InvCS__Group__2__Impl rule__InvCS__Group__3 )
-            // InternalOCLstdlib.g:7321:2: rule__InvCS__Group__2__Impl rule__InvCS__Group__3
+            // InternalOCLstdlib.g:7322:1: ( rule__InvCS__Group__2__Impl rule__InvCS__Group__3 )
+            // InternalOCLstdlib.g:7323:2: rule__InvCS__Group__2__Impl rule__InvCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__InvCS__Group__2__Impl();
@@ -23491,17 +23491,17 @@
 
 
     // $ANTLR start "rule__InvCS__Group__2__Impl"
-    // InternalOCLstdlib.g:7328:1: rule__InvCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:7330:1: rule__InvCS__Group__2__Impl : ( ':' ) ;
     public final void rule__InvCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7332:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:7333:1: ( ':' )
+            // InternalOCLstdlib.g:7334:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:7335:1: ( ':' )
             {
-            // InternalOCLstdlib.g:7333:1: ( ':' )
-            // InternalOCLstdlib.g:7334:1: ':'
+            // InternalOCLstdlib.g:7335:1: ( ':' )
+            // InternalOCLstdlib.g:7336:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getColonKeyword_2());
@@ -23532,14 +23532,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group__3"
-    // InternalOCLstdlib.g:7347:1: rule__InvCS__Group__3 : rule__InvCS__Group__3__Impl rule__InvCS__Group__4 ;
+    // InternalOCLstdlib.g:7349:1: rule__InvCS__Group__3 : rule__InvCS__Group__3__Impl rule__InvCS__Group__4 ;
     public final void rule__InvCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7351:1: ( rule__InvCS__Group__3__Impl rule__InvCS__Group__4 )
-            // InternalOCLstdlib.g:7352:2: rule__InvCS__Group__3__Impl rule__InvCS__Group__4
+            // InternalOCLstdlib.g:7353:1: ( rule__InvCS__Group__3__Impl rule__InvCS__Group__4 )
+            // InternalOCLstdlib.g:7354:2: rule__InvCS__Group__3__Impl rule__InvCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__InvCS__Group__3__Impl();
@@ -23570,23 +23570,23 @@
 
 
     // $ANTLR start "rule__InvCS__Group__3__Impl"
-    // InternalOCLstdlib.g:7359:1: rule__InvCS__Group__3__Impl : ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:7361:1: rule__InvCS__Group__3__Impl : ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) ) ;
     public final void rule__InvCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7363:1: ( ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) ) )
-            // InternalOCLstdlib.g:7364:1: ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) )
+            // InternalOCLstdlib.g:7365:1: ( ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) ) )
+            // InternalOCLstdlib.g:7366:1: ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:7364:1: ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) )
-            // InternalOCLstdlib.g:7365:1: ( rule__InvCS__OwnedSpecificationAssignment_3 )
+            // InternalOCLstdlib.g:7366:1: ( ( rule__InvCS__OwnedSpecificationAssignment_3 ) )
+            // InternalOCLstdlib.g:7367:1: ( rule__InvCS__OwnedSpecificationAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getOwnedSpecificationAssignment_3());
             }
-            // InternalOCLstdlib.g:7366:1: ( rule__InvCS__OwnedSpecificationAssignment_3 )
-            // InternalOCLstdlib.g:7366:2: rule__InvCS__OwnedSpecificationAssignment_3
+            // InternalOCLstdlib.g:7368:1: ( rule__InvCS__OwnedSpecificationAssignment_3 )
+            // InternalOCLstdlib.g:7368:2: rule__InvCS__OwnedSpecificationAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__OwnedSpecificationAssignment_3();
@@ -23621,14 +23621,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group__4"
-    // InternalOCLstdlib.g:7376:1: rule__InvCS__Group__4 : rule__InvCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:7378:1: rule__InvCS__Group__4 : rule__InvCS__Group__4__Impl ;
     public final void rule__InvCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7380:1: ( rule__InvCS__Group__4__Impl )
-            // InternalOCLstdlib.g:7381:2: rule__InvCS__Group__4__Impl
+            // InternalOCLstdlib.g:7382:1: ( rule__InvCS__Group__4__Impl )
+            // InternalOCLstdlib.g:7383:2: rule__InvCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__Group__4__Impl();
@@ -23654,17 +23654,17 @@
 
 
     // $ANTLR start "rule__InvCS__Group__4__Impl"
-    // InternalOCLstdlib.g:7387:1: rule__InvCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:7389:1: rule__InvCS__Group__4__Impl : ( ';' ) ;
     public final void rule__InvCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7391:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:7392:1: ( ';' )
+            // InternalOCLstdlib.g:7393:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:7394:1: ( ';' )
             {
-            // InternalOCLstdlib.g:7392:1: ( ';' )
-            // InternalOCLstdlib.g:7393:1: ';'
+            // InternalOCLstdlib.g:7394:1: ( ';' )
+            // InternalOCLstdlib.g:7395:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getSemicolonKeyword_4());
@@ -23695,14 +23695,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1__0"
-    // InternalOCLstdlib.g:7416:1: rule__InvCS__Group_1__0 : rule__InvCS__Group_1__0__Impl rule__InvCS__Group_1__1 ;
+    // InternalOCLstdlib.g:7418:1: rule__InvCS__Group_1__0 : rule__InvCS__Group_1__0__Impl rule__InvCS__Group_1__1 ;
     public final void rule__InvCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7420:1: ( rule__InvCS__Group_1__0__Impl rule__InvCS__Group_1__1 )
-            // InternalOCLstdlib.g:7421:2: rule__InvCS__Group_1__0__Impl rule__InvCS__Group_1__1
+            // InternalOCLstdlib.g:7422:1: ( rule__InvCS__Group_1__0__Impl rule__InvCS__Group_1__1 )
+            // InternalOCLstdlib.g:7423:2: rule__InvCS__Group_1__0__Impl rule__InvCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__InvCS__Group_1__0__Impl();
@@ -23733,23 +23733,23 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:7428:1: rule__InvCS__Group_1__0__Impl : ( ( rule__InvCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLstdlib.g:7430:1: rule__InvCS__Group_1__0__Impl : ( ( rule__InvCS__NameAssignment_1_0 ) ) ;
     public final void rule__InvCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7432:1: ( ( ( rule__InvCS__NameAssignment_1_0 ) ) )
-            // InternalOCLstdlib.g:7433:1: ( ( rule__InvCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:7434:1: ( ( ( rule__InvCS__NameAssignment_1_0 ) ) )
+            // InternalOCLstdlib.g:7435:1: ( ( rule__InvCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLstdlib.g:7433:1: ( ( rule__InvCS__NameAssignment_1_0 ) )
-            // InternalOCLstdlib.g:7434:1: ( rule__InvCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:7435:1: ( ( rule__InvCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:7436:1: ( rule__InvCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLstdlib.g:7435:1: ( rule__InvCS__NameAssignment_1_0 )
-            // InternalOCLstdlib.g:7435:2: rule__InvCS__NameAssignment_1_0
+            // InternalOCLstdlib.g:7437:1: ( rule__InvCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:7437:2: rule__InvCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__NameAssignment_1_0();
@@ -23784,14 +23784,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1__1"
-    // InternalOCLstdlib.g:7445:1: rule__InvCS__Group_1__1 : rule__InvCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:7447:1: rule__InvCS__Group_1__1 : rule__InvCS__Group_1__1__Impl ;
     public final void rule__InvCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7449:1: ( rule__InvCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:7450:2: rule__InvCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:7451:1: ( rule__InvCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:7452:2: rule__InvCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__Group_1__1__Impl();
@@ -23817,22 +23817,22 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:7456:1: rule__InvCS__Group_1__1__Impl : ( ( rule__InvCS__Group_1_1__0 )? ) ;
+    // InternalOCLstdlib.g:7458:1: rule__InvCS__Group_1__1__Impl : ( ( rule__InvCS__Group_1_1__0 )? ) ;
     public final void rule__InvCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7460:1: ( ( ( rule__InvCS__Group_1_1__0 )? ) )
-            // InternalOCLstdlib.g:7461:1: ( ( rule__InvCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:7462:1: ( ( ( rule__InvCS__Group_1_1__0 )? ) )
+            // InternalOCLstdlib.g:7463:1: ( ( rule__InvCS__Group_1_1__0 )? )
             {
-            // InternalOCLstdlib.g:7461:1: ( ( rule__InvCS__Group_1_1__0 )? )
-            // InternalOCLstdlib.g:7462:1: ( rule__InvCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:7463:1: ( ( rule__InvCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:7464:1: ( rule__InvCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getGroup_1_1());
             }
-            // InternalOCLstdlib.g:7463:1: ( rule__InvCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:7465:1: ( rule__InvCS__Group_1_1__0 )?
             int alt75=2;
             int LA75_0 = input.LA(1);
 
@@ -23841,7 +23841,7 @@
             }
             switch (alt75) {
                 case 1 :
-                    // InternalOCLstdlib.g:7463:2: rule__InvCS__Group_1_1__0
+                    // InternalOCLstdlib.g:7465:2: rule__InvCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__InvCS__Group_1_1__0();
@@ -23879,14 +23879,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1_1__0"
-    // InternalOCLstdlib.g:7477:1: rule__InvCS__Group_1_1__0 : rule__InvCS__Group_1_1__0__Impl rule__InvCS__Group_1_1__1 ;
+    // InternalOCLstdlib.g:7479:1: rule__InvCS__Group_1_1__0 : rule__InvCS__Group_1_1__0__Impl rule__InvCS__Group_1_1__1 ;
     public final void rule__InvCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7481:1: ( rule__InvCS__Group_1_1__0__Impl rule__InvCS__Group_1_1__1 )
-            // InternalOCLstdlib.g:7482:2: rule__InvCS__Group_1_1__0__Impl rule__InvCS__Group_1_1__1
+            // InternalOCLstdlib.g:7483:1: ( rule__InvCS__Group_1_1__0__Impl rule__InvCS__Group_1_1__1 )
+            // InternalOCLstdlib.g:7484:2: rule__InvCS__Group_1_1__0__Impl rule__InvCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__InvCS__Group_1_1__0__Impl();
@@ -23917,17 +23917,17 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1_1__0__Impl"
-    // InternalOCLstdlib.g:7489:1: rule__InvCS__Group_1_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:7491:1: rule__InvCS__Group_1_1__0__Impl : ( '(' ) ;
     public final void rule__InvCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7493:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:7494:1: ( '(' )
+            // InternalOCLstdlib.g:7495:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:7496:1: ( '(' )
             {
-            // InternalOCLstdlib.g:7494:1: ( '(' )
-            // InternalOCLstdlib.g:7495:1: '('
+            // InternalOCLstdlib.g:7496:1: ( '(' )
+            // InternalOCLstdlib.g:7497:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getLeftParenthesisKeyword_1_1_0());
@@ -23958,14 +23958,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1_1__1"
-    // InternalOCLstdlib.g:7508:1: rule__InvCS__Group_1_1__1 : rule__InvCS__Group_1_1__1__Impl rule__InvCS__Group_1_1__2 ;
+    // InternalOCLstdlib.g:7510:1: rule__InvCS__Group_1_1__1 : rule__InvCS__Group_1_1__1__Impl rule__InvCS__Group_1_1__2 ;
     public final void rule__InvCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7512:1: ( rule__InvCS__Group_1_1__1__Impl rule__InvCS__Group_1_1__2 )
-            // InternalOCLstdlib.g:7513:2: rule__InvCS__Group_1_1__1__Impl rule__InvCS__Group_1_1__2
+            // InternalOCLstdlib.g:7514:1: ( rule__InvCS__Group_1_1__1__Impl rule__InvCS__Group_1_1__2 )
+            // InternalOCLstdlib.g:7515:2: rule__InvCS__Group_1_1__1__Impl rule__InvCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__InvCS__Group_1_1__1__Impl();
@@ -23996,23 +23996,23 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1_1__1__Impl"
-    // InternalOCLstdlib.g:7520:1: rule__InvCS__Group_1_1__1__Impl : ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:7522:1: rule__InvCS__Group_1_1__1__Impl : ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
     public final void rule__InvCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7524:1: ( ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
-            // InternalOCLstdlib.g:7525:1: ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:7526:1: ( ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
+            // InternalOCLstdlib.g:7527:1: ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:7525:1: ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
-            // InternalOCLstdlib.g:7526:1: ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLstdlib.g:7527:1: ( ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:7528:1: ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
             }
-            // InternalOCLstdlib.g:7527:1: ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 )
-            // InternalOCLstdlib.g:7527:2: rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1
+            // InternalOCLstdlib.g:7529:1: ( rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLstdlib.g:7529:2: rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1();
@@ -24047,14 +24047,14 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1_1__2"
-    // InternalOCLstdlib.g:7537:1: rule__InvCS__Group_1_1__2 : rule__InvCS__Group_1_1__2__Impl ;
+    // InternalOCLstdlib.g:7539:1: rule__InvCS__Group_1_1__2 : rule__InvCS__Group_1_1__2__Impl ;
     public final void rule__InvCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7541:1: ( rule__InvCS__Group_1_1__2__Impl )
-            // InternalOCLstdlib.g:7542:2: rule__InvCS__Group_1_1__2__Impl
+            // InternalOCLstdlib.g:7543:1: ( rule__InvCS__Group_1_1__2__Impl )
+            // InternalOCLstdlib.g:7544:2: rule__InvCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvCS__Group_1_1__2__Impl();
@@ -24080,17 +24080,17 @@
 
 
     // $ANTLR start "rule__InvCS__Group_1_1__2__Impl"
-    // InternalOCLstdlib.g:7548:1: rule__InvCS__Group_1_1__2__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:7550:1: rule__InvCS__Group_1_1__2__Impl : ( ')' ) ;
     public final void rule__InvCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7552:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:7553:1: ( ')' )
+            // InternalOCLstdlib.g:7554:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:7555:1: ( ')' )
             {
-            // InternalOCLstdlib.g:7553:1: ( ')' )
-            // InternalOCLstdlib.g:7554:1: ')'
+            // InternalOCLstdlib.g:7555:1: ( ')' )
+            // InternalOCLstdlib.g:7556:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getRightParenthesisKeyword_1_1_2());
@@ -24121,14 +24121,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__0"
-    // InternalOCLstdlib.g:7573:1: rule__LibCoercionCS__Group__0 : rule__LibCoercionCS__Group__0__Impl rule__LibCoercionCS__Group__1 ;
+    // InternalOCLstdlib.g:7575:1: rule__LibCoercionCS__Group__0 : rule__LibCoercionCS__Group__0__Impl rule__LibCoercionCS__Group__1 ;
     public final void rule__LibCoercionCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7577:1: ( rule__LibCoercionCS__Group__0__Impl rule__LibCoercionCS__Group__1 )
-            // InternalOCLstdlib.g:7578:2: rule__LibCoercionCS__Group__0__Impl rule__LibCoercionCS__Group__1
+            // InternalOCLstdlib.g:7579:1: ( rule__LibCoercionCS__Group__0__Impl rule__LibCoercionCS__Group__1 )
+            // InternalOCLstdlib.g:7580:2: rule__LibCoercionCS__Group__0__Impl rule__LibCoercionCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibCoercionCS__Group__0__Impl();
@@ -24159,17 +24159,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__0__Impl"
-    // InternalOCLstdlib.g:7585:1: rule__LibCoercionCS__Group__0__Impl : ( 'coercion' ) ;
+    // InternalOCLstdlib.g:7587:1: rule__LibCoercionCS__Group__0__Impl : ( 'coercion' ) ;
     public final void rule__LibCoercionCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7589:1: ( ( 'coercion' ) )
-            // InternalOCLstdlib.g:7590:1: ( 'coercion' )
+            // InternalOCLstdlib.g:7591:1: ( ( 'coercion' ) )
+            // InternalOCLstdlib.g:7592:1: ( 'coercion' )
             {
-            // InternalOCLstdlib.g:7590:1: ( 'coercion' )
-            // InternalOCLstdlib.g:7591:1: 'coercion'
+            // InternalOCLstdlib.g:7592:1: ( 'coercion' )
+            // InternalOCLstdlib.g:7593:1: 'coercion'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getCoercionKeyword_0());
@@ -24200,14 +24200,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__1"
-    // InternalOCLstdlib.g:7604:1: rule__LibCoercionCS__Group__1 : rule__LibCoercionCS__Group__1__Impl rule__LibCoercionCS__Group__2 ;
+    // InternalOCLstdlib.g:7606:1: rule__LibCoercionCS__Group__1 : rule__LibCoercionCS__Group__1__Impl rule__LibCoercionCS__Group__2 ;
     public final void rule__LibCoercionCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7608:1: ( rule__LibCoercionCS__Group__1__Impl rule__LibCoercionCS__Group__2 )
-            // InternalOCLstdlib.g:7609:2: rule__LibCoercionCS__Group__1__Impl rule__LibCoercionCS__Group__2
+            // InternalOCLstdlib.g:7610:1: ( rule__LibCoercionCS__Group__1__Impl rule__LibCoercionCS__Group__2 )
+            // InternalOCLstdlib.g:7611:2: rule__LibCoercionCS__Group__1__Impl rule__LibCoercionCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__LibCoercionCS__Group__1__Impl();
@@ -24238,23 +24238,23 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__1__Impl"
-    // InternalOCLstdlib.g:7616:1: rule__LibCoercionCS__Group__1__Impl : ( ( rule__LibCoercionCS__NameAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:7618:1: rule__LibCoercionCS__Group__1__Impl : ( ( rule__LibCoercionCS__NameAssignment_1 ) ) ;
     public final void rule__LibCoercionCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7620:1: ( ( ( rule__LibCoercionCS__NameAssignment_1 ) ) )
-            // InternalOCLstdlib.g:7621:1: ( ( rule__LibCoercionCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:7622:1: ( ( ( rule__LibCoercionCS__NameAssignment_1 ) ) )
+            // InternalOCLstdlib.g:7623:1: ( ( rule__LibCoercionCS__NameAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:7621:1: ( ( rule__LibCoercionCS__NameAssignment_1 ) )
-            // InternalOCLstdlib.g:7622:1: ( rule__LibCoercionCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:7623:1: ( ( rule__LibCoercionCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:7624:1: ( rule__LibCoercionCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getNameAssignment_1());
             }
-            // InternalOCLstdlib.g:7623:1: ( rule__LibCoercionCS__NameAssignment_1 )
-            // InternalOCLstdlib.g:7623:2: rule__LibCoercionCS__NameAssignment_1
+            // InternalOCLstdlib.g:7625:1: ( rule__LibCoercionCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:7625:2: rule__LibCoercionCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__NameAssignment_1();
@@ -24289,14 +24289,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__2"
-    // InternalOCLstdlib.g:7633:1: rule__LibCoercionCS__Group__2 : rule__LibCoercionCS__Group__2__Impl rule__LibCoercionCS__Group__3 ;
+    // InternalOCLstdlib.g:7635:1: rule__LibCoercionCS__Group__2 : rule__LibCoercionCS__Group__2__Impl rule__LibCoercionCS__Group__3 ;
     public final void rule__LibCoercionCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7637:1: ( rule__LibCoercionCS__Group__2__Impl rule__LibCoercionCS__Group__3 )
-            // InternalOCLstdlib.g:7638:2: rule__LibCoercionCS__Group__2__Impl rule__LibCoercionCS__Group__3
+            // InternalOCLstdlib.g:7639:1: ( rule__LibCoercionCS__Group__2__Impl rule__LibCoercionCS__Group__3 )
+            // InternalOCLstdlib.g:7640:2: rule__LibCoercionCS__Group__2__Impl rule__LibCoercionCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__LibCoercionCS__Group__2__Impl();
@@ -24327,17 +24327,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__2__Impl"
-    // InternalOCLstdlib.g:7645:1: rule__LibCoercionCS__Group__2__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:7647:1: rule__LibCoercionCS__Group__2__Impl : ( '(' ) ;
     public final void rule__LibCoercionCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7649:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:7650:1: ( '(' )
+            // InternalOCLstdlib.g:7651:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:7652:1: ( '(' )
             {
-            // InternalOCLstdlib.g:7650:1: ( '(' )
-            // InternalOCLstdlib.g:7651:1: '('
+            // InternalOCLstdlib.g:7652:1: ( '(' )
+            // InternalOCLstdlib.g:7653:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getLeftParenthesisKeyword_2());
@@ -24368,14 +24368,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__3"
-    // InternalOCLstdlib.g:7664:1: rule__LibCoercionCS__Group__3 : rule__LibCoercionCS__Group__3__Impl rule__LibCoercionCS__Group__4 ;
+    // InternalOCLstdlib.g:7666:1: rule__LibCoercionCS__Group__3 : rule__LibCoercionCS__Group__3__Impl rule__LibCoercionCS__Group__4 ;
     public final void rule__LibCoercionCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7668:1: ( rule__LibCoercionCS__Group__3__Impl rule__LibCoercionCS__Group__4 )
-            // InternalOCLstdlib.g:7669:2: rule__LibCoercionCS__Group__3__Impl rule__LibCoercionCS__Group__4
+            // InternalOCLstdlib.g:7670:1: ( rule__LibCoercionCS__Group__3__Impl rule__LibCoercionCS__Group__4 )
+            // InternalOCLstdlib.g:7671:2: rule__LibCoercionCS__Group__3__Impl rule__LibCoercionCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__LibCoercionCS__Group__3__Impl();
@@ -24406,17 +24406,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__3__Impl"
-    // InternalOCLstdlib.g:7676:1: rule__LibCoercionCS__Group__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:7678:1: rule__LibCoercionCS__Group__3__Impl : ( ')' ) ;
     public final void rule__LibCoercionCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7680:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:7681:1: ( ')' )
+            // InternalOCLstdlib.g:7682:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:7683:1: ( ')' )
             {
-            // InternalOCLstdlib.g:7681:1: ( ')' )
-            // InternalOCLstdlib.g:7682:1: ')'
+            // InternalOCLstdlib.g:7683:1: ( ')' )
+            // InternalOCLstdlib.g:7684:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getRightParenthesisKeyword_3());
@@ -24447,14 +24447,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__4"
-    // InternalOCLstdlib.g:7695:1: rule__LibCoercionCS__Group__4 : rule__LibCoercionCS__Group__4__Impl rule__LibCoercionCS__Group__5 ;
+    // InternalOCLstdlib.g:7697:1: rule__LibCoercionCS__Group__4 : rule__LibCoercionCS__Group__4__Impl rule__LibCoercionCS__Group__5 ;
     public final void rule__LibCoercionCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7699:1: ( rule__LibCoercionCS__Group__4__Impl rule__LibCoercionCS__Group__5 )
-            // InternalOCLstdlib.g:7700:2: rule__LibCoercionCS__Group__4__Impl rule__LibCoercionCS__Group__5
+            // InternalOCLstdlib.g:7701:1: ( rule__LibCoercionCS__Group__4__Impl rule__LibCoercionCS__Group__5 )
+            // InternalOCLstdlib.g:7702:2: rule__LibCoercionCS__Group__4__Impl rule__LibCoercionCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibCoercionCS__Group__4__Impl();
@@ -24485,17 +24485,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__4__Impl"
-    // InternalOCLstdlib.g:7707:1: rule__LibCoercionCS__Group__4__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:7709:1: rule__LibCoercionCS__Group__4__Impl : ( ':' ) ;
     public final void rule__LibCoercionCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7711:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:7712:1: ( ':' )
+            // InternalOCLstdlib.g:7713:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:7714:1: ( ':' )
             {
-            // InternalOCLstdlib.g:7712:1: ( ':' )
-            // InternalOCLstdlib.g:7713:1: ':'
+            // InternalOCLstdlib.g:7714:1: ( ':' )
+            // InternalOCLstdlib.g:7715:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getColonKeyword_4());
@@ -24526,14 +24526,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__5"
-    // InternalOCLstdlib.g:7726:1: rule__LibCoercionCS__Group__5 : rule__LibCoercionCS__Group__5__Impl rule__LibCoercionCS__Group__6 ;
+    // InternalOCLstdlib.g:7728:1: rule__LibCoercionCS__Group__5 : rule__LibCoercionCS__Group__5__Impl rule__LibCoercionCS__Group__6 ;
     public final void rule__LibCoercionCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7730:1: ( rule__LibCoercionCS__Group__5__Impl rule__LibCoercionCS__Group__6 )
-            // InternalOCLstdlib.g:7731:2: rule__LibCoercionCS__Group__5__Impl rule__LibCoercionCS__Group__6
+            // InternalOCLstdlib.g:7732:1: ( rule__LibCoercionCS__Group__5__Impl rule__LibCoercionCS__Group__6 )
+            // InternalOCLstdlib.g:7733:2: rule__LibCoercionCS__Group__5__Impl rule__LibCoercionCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_35);
             rule__LibCoercionCS__Group__5__Impl();
@@ -24564,23 +24564,23 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__5__Impl"
-    // InternalOCLstdlib.g:7738:1: rule__LibCoercionCS__Group__5__Impl : ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) ) ;
+    // InternalOCLstdlib.g:7740:1: rule__LibCoercionCS__Group__5__Impl : ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) ) ;
     public final void rule__LibCoercionCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7742:1: ( ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) ) )
-            // InternalOCLstdlib.g:7743:1: ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) )
+            // InternalOCLstdlib.g:7744:1: ( ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) ) )
+            // InternalOCLstdlib.g:7745:1: ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) )
             {
-            // InternalOCLstdlib.g:7743:1: ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) )
-            // InternalOCLstdlib.g:7744:1: ( rule__LibCoercionCS__OwnedTypeAssignment_5 )
+            // InternalOCLstdlib.g:7745:1: ( ( rule__LibCoercionCS__OwnedTypeAssignment_5 ) )
+            // InternalOCLstdlib.g:7746:1: ( rule__LibCoercionCS__OwnedTypeAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getOwnedTypeAssignment_5());
             }
-            // InternalOCLstdlib.g:7745:1: ( rule__LibCoercionCS__OwnedTypeAssignment_5 )
-            // InternalOCLstdlib.g:7745:2: rule__LibCoercionCS__OwnedTypeAssignment_5
+            // InternalOCLstdlib.g:7747:1: ( rule__LibCoercionCS__OwnedTypeAssignment_5 )
+            // InternalOCLstdlib.g:7747:2: rule__LibCoercionCS__OwnedTypeAssignment_5
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__OwnedTypeAssignment_5();
@@ -24615,14 +24615,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__6"
-    // InternalOCLstdlib.g:7755:1: rule__LibCoercionCS__Group__6 : rule__LibCoercionCS__Group__6__Impl rule__LibCoercionCS__Group__7 ;
+    // InternalOCLstdlib.g:7757:1: rule__LibCoercionCS__Group__6 : rule__LibCoercionCS__Group__6__Impl rule__LibCoercionCS__Group__7 ;
     public final void rule__LibCoercionCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7759:1: ( rule__LibCoercionCS__Group__6__Impl rule__LibCoercionCS__Group__7 )
-            // InternalOCLstdlib.g:7760:2: rule__LibCoercionCS__Group__6__Impl rule__LibCoercionCS__Group__7
+            // InternalOCLstdlib.g:7761:1: ( rule__LibCoercionCS__Group__6__Impl rule__LibCoercionCS__Group__7 )
+            // InternalOCLstdlib.g:7762:2: rule__LibCoercionCS__Group__6__Impl rule__LibCoercionCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_35);
             rule__LibCoercionCS__Group__6__Impl();
@@ -24653,22 +24653,22 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__6__Impl"
-    // InternalOCLstdlib.g:7767:1: rule__LibCoercionCS__Group__6__Impl : ( ( rule__LibCoercionCS__Group_6__0 )? ) ;
+    // InternalOCLstdlib.g:7769:1: rule__LibCoercionCS__Group__6__Impl : ( ( rule__LibCoercionCS__Group_6__0 )? ) ;
     public final void rule__LibCoercionCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7771:1: ( ( ( rule__LibCoercionCS__Group_6__0 )? ) )
-            // InternalOCLstdlib.g:7772:1: ( ( rule__LibCoercionCS__Group_6__0 )? )
+            // InternalOCLstdlib.g:7773:1: ( ( ( rule__LibCoercionCS__Group_6__0 )? ) )
+            // InternalOCLstdlib.g:7774:1: ( ( rule__LibCoercionCS__Group_6__0 )? )
             {
-            // InternalOCLstdlib.g:7772:1: ( ( rule__LibCoercionCS__Group_6__0 )? )
-            // InternalOCLstdlib.g:7773:1: ( rule__LibCoercionCS__Group_6__0 )?
+            // InternalOCLstdlib.g:7774:1: ( ( rule__LibCoercionCS__Group_6__0 )? )
+            // InternalOCLstdlib.g:7775:1: ( rule__LibCoercionCS__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getGroup_6());
             }
-            // InternalOCLstdlib.g:7774:1: ( rule__LibCoercionCS__Group_6__0 )?
+            // InternalOCLstdlib.g:7776:1: ( rule__LibCoercionCS__Group_6__0 )?
             int alt76=2;
             int LA76_0 = input.LA(1);
 
@@ -24677,7 +24677,7 @@
             }
             switch (alt76) {
                 case 1 :
-                    // InternalOCLstdlib.g:7774:2: rule__LibCoercionCS__Group_6__0
+                    // InternalOCLstdlib.g:7776:2: rule__LibCoercionCS__Group_6__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibCoercionCS__Group_6__0();
@@ -24715,14 +24715,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__7"
-    // InternalOCLstdlib.g:7784:1: rule__LibCoercionCS__Group__7 : rule__LibCoercionCS__Group__7__Impl ;
+    // InternalOCLstdlib.g:7786:1: rule__LibCoercionCS__Group__7 : rule__LibCoercionCS__Group__7__Impl ;
     public final void rule__LibCoercionCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7788:1: ( rule__LibCoercionCS__Group__7__Impl )
-            // InternalOCLstdlib.g:7789:2: rule__LibCoercionCS__Group__7__Impl
+            // InternalOCLstdlib.g:7790:1: ( rule__LibCoercionCS__Group__7__Impl )
+            // InternalOCLstdlib.g:7791:2: rule__LibCoercionCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__Group__7__Impl();
@@ -24748,23 +24748,23 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group__7__Impl"
-    // InternalOCLstdlib.g:7795:1: rule__LibCoercionCS__Group__7__Impl : ( ( rule__LibCoercionCS__Alternatives_7 ) ) ;
+    // InternalOCLstdlib.g:7797:1: rule__LibCoercionCS__Group__7__Impl : ( ( rule__LibCoercionCS__Alternatives_7 ) ) ;
     public final void rule__LibCoercionCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7799:1: ( ( ( rule__LibCoercionCS__Alternatives_7 ) ) )
-            // InternalOCLstdlib.g:7800:1: ( ( rule__LibCoercionCS__Alternatives_7 ) )
+            // InternalOCLstdlib.g:7801:1: ( ( ( rule__LibCoercionCS__Alternatives_7 ) ) )
+            // InternalOCLstdlib.g:7802:1: ( ( rule__LibCoercionCS__Alternatives_7 ) )
             {
-            // InternalOCLstdlib.g:7800:1: ( ( rule__LibCoercionCS__Alternatives_7 ) )
-            // InternalOCLstdlib.g:7801:1: ( rule__LibCoercionCS__Alternatives_7 )
+            // InternalOCLstdlib.g:7802:1: ( ( rule__LibCoercionCS__Alternatives_7 ) )
+            // InternalOCLstdlib.g:7803:1: ( rule__LibCoercionCS__Alternatives_7 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getAlternatives_7());
             }
-            // InternalOCLstdlib.g:7802:1: ( rule__LibCoercionCS__Alternatives_7 )
-            // InternalOCLstdlib.g:7802:2: rule__LibCoercionCS__Alternatives_7
+            // InternalOCLstdlib.g:7804:1: ( rule__LibCoercionCS__Alternatives_7 )
+            // InternalOCLstdlib.g:7804:2: rule__LibCoercionCS__Alternatives_7
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__Alternatives_7();
@@ -24799,14 +24799,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_6__0"
-    // InternalOCLstdlib.g:7828:1: rule__LibCoercionCS__Group_6__0 : rule__LibCoercionCS__Group_6__0__Impl rule__LibCoercionCS__Group_6__1 ;
+    // InternalOCLstdlib.g:7830:1: rule__LibCoercionCS__Group_6__0 : rule__LibCoercionCS__Group_6__0__Impl rule__LibCoercionCS__Group_6__1 ;
     public final void rule__LibCoercionCS__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7832:1: ( rule__LibCoercionCS__Group_6__0__Impl rule__LibCoercionCS__Group_6__1 )
-            // InternalOCLstdlib.g:7833:2: rule__LibCoercionCS__Group_6__0__Impl rule__LibCoercionCS__Group_6__1
+            // InternalOCLstdlib.g:7834:1: ( rule__LibCoercionCS__Group_6__0__Impl rule__LibCoercionCS__Group_6__1 )
+            // InternalOCLstdlib.g:7835:2: rule__LibCoercionCS__Group_6__0__Impl rule__LibCoercionCS__Group_6__1
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__LibCoercionCS__Group_6__0__Impl();
@@ -24837,17 +24837,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_6__0__Impl"
-    // InternalOCLstdlib.g:7840:1: rule__LibCoercionCS__Group_6__0__Impl : ( '=>' ) ;
+    // InternalOCLstdlib.g:7842:1: rule__LibCoercionCS__Group_6__0__Impl : ( '=>' ) ;
     public final void rule__LibCoercionCS__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7844:1: ( ( '=>' ) )
-            // InternalOCLstdlib.g:7845:1: ( '=>' )
+            // InternalOCLstdlib.g:7846:1: ( ( '=>' ) )
+            // InternalOCLstdlib.g:7847:1: ( '=>' )
             {
-            // InternalOCLstdlib.g:7845:1: ( '=>' )
-            // InternalOCLstdlib.g:7846:1: '=>'
+            // InternalOCLstdlib.g:7847:1: ( '=>' )
+            // InternalOCLstdlib.g:7848:1: '=>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getEqualsSignGreaterThanSignKeyword_6_0());
@@ -24878,14 +24878,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_6__1"
-    // InternalOCLstdlib.g:7859:1: rule__LibCoercionCS__Group_6__1 : rule__LibCoercionCS__Group_6__1__Impl ;
+    // InternalOCLstdlib.g:7861:1: rule__LibCoercionCS__Group_6__1 : rule__LibCoercionCS__Group_6__1__Impl ;
     public final void rule__LibCoercionCS__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7863:1: ( rule__LibCoercionCS__Group_6__1__Impl )
-            // InternalOCLstdlib.g:7864:2: rule__LibCoercionCS__Group_6__1__Impl
+            // InternalOCLstdlib.g:7865:1: ( rule__LibCoercionCS__Group_6__1__Impl )
+            // InternalOCLstdlib.g:7866:2: rule__LibCoercionCS__Group_6__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__Group_6__1__Impl();
@@ -24911,23 +24911,23 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_6__1__Impl"
-    // InternalOCLstdlib.g:7870:1: rule__LibCoercionCS__Group_6__1__Impl : ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) ) ;
+    // InternalOCLstdlib.g:7872:1: rule__LibCoercionCS__Group_6__1__Impl : ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) ) ;
     public final void rule__LibCoercionCS__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7874:1: ( ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) ) )
-            // InternalOCLstdlib.g:7875:1: ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) )
+            // InternalOCLstdlib.g:7876:1: ( ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) ) )
+            // InternalOCLstdlib.g:7877:1: ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) )
             {
-            // InternalOCLstdlib.g:7875:1: ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) )
-            // InternalOCLstdlib.g:7876:1: ( rule__LibCoercionCS__ImplementationAssignment_6_1 )
+            // InternalOCLstdlib.g:7877:1: ( ( rule__LibCoercionCS__ImplementationAssignment_6_1 ) )
+            // InternalOCLstdlib.g:7878:1: ( rule__LibCoercionCS__ImplementationAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getImplementationAssignment_6_1());
             }
-            // InternalOCLstdlib.g:7877:1: ( rule__LibCoercionCS__ImplementationAssignment_6_1 )
-            // InternalOCLstdlib.g:7877:2: rule__LibCoercionCS__ImplementationAssignment_6_1
+            // InternalOCLstdlib.g:7879:1: ( rule__LibCoercionCS__ImplementationAssignment_6_1 )
+            // InternalOCLstdlib.g:7879:2: rule__LibCoercionCS__ImplementationAssignment_6_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__ImplementationAssignment_6_1();
@@ -24962,14 +24962,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_7_0__0"
-    // InternalOCLstdlib.g:7891:1: rule__LibCoercionCS__Group_7_0__0 : rule__LibCoercionCS__Group_7_0__0__Impl rule__LibCoercionCS__Group_7_0__1 ;
+    // InternalOCLstdlib.g:7893:1: rule__LibCoercionCS__Group_7_0__0 : rule__LibCoercionCS__Group_7_0__0__Impl rule__LibCoercionCS__Group_7_0__1 ;
     public final void rule__LibCoercionCS__Group_7_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7895:1: ( rule__LibCoercionCS__Group_7_0__0__Impl rule__LibCoercionCS__Group_7_0__1 )
-            // InternalOCLstdlib.g:7896:2: rule__LibCoercionCS__Group_7_0__0__Impl rule__LibCoercionCS__Group_7_0__1
+            // InternalOCLstdlib.g:7897:1: ( rule__LibCoercionCS__Group_7_0__0__Impl rule__LibCoercionCS__Group_7_0__1 )
+            // InternalOCLstdlib.g:7898:2: rule__LibCoercionCS__Group_7_0__0__Impl rule__LibCoercionCS__Group_7_0__1
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__LibCoercionCS__Group_7_0__0__Impl();
@@ -25000,17 +25000,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_7_0__0__Impl"
-    // InternalOCLstdlib.g:7903:1: rule__LibCoercionCS__Group_7_0__0__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:7905:1: rule__LibCoercionCS__Group_7_0__0__Impl : ( '{' ) ;
     public final void rule__LibCoercionCS__Group_7_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7907:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:7908:1: ( '{' )
+            // InternalOCLstdlib.g:7909:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:7910:1: ( '{' )
             {
-            // InternalOCLstdlib.g:7908:1: ( '{' )
-            // InternalOCLstdlib.g:7909:1: '{'
+            // InternalOCLstdlib.g:7910:1: ( '{' )
+            // InternalOCLstdlib.g:7911:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getLeftCurlyBracketKeyword_7_0_0());
@@ -25041,14 +25041,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_7_0__1"
-    // InternalOCLstdlib.g:7922:1: rule__LibCoercionCS__Group_7_0__1 : rule__LibCoercionCS__Group_7_0__1__Impl rule__LibCoercionCS__Group_7_0__2 ;
+    // InternalOCLstdlib.g:7924:1: rule__LibCoercionCS__Group_7_0__1 : rule__LibCoercionCS__Group_7_0__1__Impl rule__LibCoercionCS__Group_7_0__2 ;
     public final void rule__LibCoercionCS__Group_7_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7926:1: ( rule__LibCoercionCS__Group_7_0__1__Impl rule__LibCoercionCS__Group_7_0__2 )
-            // InternalOCLstdlib.g:7927:2: rule__LibCoercionCS__Group_7_0__1__Impl rule__LibCoercionCS__Group_7_0__2
+            // InternalOCLstdlib.g:7928:1: ( rule__LibCoercionCS__Group_7_0__1__Impl rule__LibCoercionCS__Group_7_0__2 )
+            // InternalOCLstdlib.g:7929:2: rule__LibCoercionCS__Group_7_0__1__Impl rule__LibCoercionCS__Group_7_0__2
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__LibCoercionCS__Group_7_0__1__Impl();
@@ -25079,22 +25079,22 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_7_0__1__Impl"
-    // InternalOCLstdlib.g:7934:1: rule__LibCoercionCS__Group_7_0__1__Impl : ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* ) ;
+    // InternalOCLstdlib.g:7936:1: rule__LibCoercionCS__Group_7_0__1__Impl : ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* ) ;
     public final void rule__LibCoercionCS__Group_7_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7938:1: ( ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* ) )
-            // InternalOCLstdlib.g:7939:1: ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* )
+            // InternalOCLstdlib.g:7940:1: ( ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* ) )
+            // InternalOCLstdlib.g:7941:1: ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* )
             {
-            // InternalOCLstdlib.g:7939:1: ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* )
-            // InternalOCLstdlib.g:7940:1: ( rule__LibCoercionCS__Alternatives_7_0_1 )*
+            // InternalOCLstdlib.g:7941:1: ( ( rule__LibCoercionCS__Alternatives_7_0_1 )* )
+            // InternalOCLstdlib.g:7942:1: ( rule__LibCoercionCS__Alternatives_7_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getAlternatives_7_0_1());
             }
-            // InternalOCLstdlib.g:7941:1: ( rule__LibCoercionCS__Alternatives_7_0_1 )*
+            // InternalOCLstdlib.g:7943:1: ( rule__LibCoercionCS__Alternatives_7_0_1 )*
             loop77:
             do {
                 int alt77=2;
@@ -25107,7 +25107,7 @@
 
                 switch (alt77) {
             	case 1 :
-            	    // InternalOCLstdlib.g:7941:2: rule__LibCoercionCS__Alternatives_7_0_1
+            	    // InternalOCLstdlib.g:7943:2: rule__LibCoercionCS__Alternatives_7_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_38);
             	    rule__LibCoercionCS__Alternatives_7_0_1();
@@ -25148,14 +25148,14 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_7_0__2"
-    // InternalOCLstdlib.g:7951:1: rule__LibCoercionCS__Group_7_0__2 : rule__LibCoercionCS__Group_7_0__2__Impl ;
+    // InternalOCLstdlib.g:7953:1: rule__LibCoercionCS__Group_7_0__2 : rule__LibCoercionCS__Group_7_0__2__Impl ;
     public final void rule__LibCoercionCS__Group_7_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7955:1: ( rule__LibCoercionCS__Group_7_0__2__Impl )
-            // InternalOCLstdlib.g:7956:2: rule__LibCoercionCS__Group_7_0__2__Impl
+            // InternalOCLstdlib.g:7957:1: ( rule__LibCoercionCS__Group_7_0__2__Impl )
+            // InternalOCLstdlib.g:7958:2: rule__LibCoercionCS__Group_7_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibCoercionCS__Group_7_0__2__Impl();
@@ -25181,17 +25181,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__Group_7_0__2__Impl"
-    // InternalOCLstdlib.g:7962:1: rule__LibCoercionCS__Group_7_0__2__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:7964:1: rule__LibCoercionCS__Group_7_0__2__Impl : ( '}' ) ;
     public final void rule__LibCoercionCS__Group_7_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7966:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:7967:1: ( '}' )
+            // InternalOCLstdlib.g:7968:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:7969:1: ( '}' )
             {
-            // InternalOCLstdlib.g:7967:1: ( '}' )
-            // InternalOCLstdlib.g:7968:1: '}'
+            // InternalOCLstdlib.g:7969:1: ( '}' )
+            // InternalOCLstdlib.g:7970:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getRightCurlyBracketKeyword_7_0_2());
@@ -25222,14 +25222,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__0"
-    // InternalOCLstdlib.g:7987:1: rule__LibIterationCS__Group__0 : rule__LibIterationCS__Group__0__Impl rule__LibIterationCS__Group__1 ;
+    // InternalOCLstdlib.g:7989:1: rule__LibIterationCS__Group__0 : rule__LibIterationCS__Group__0__Impl rule__LibIterationCS__Group__1 ;
     public final void rule__LibIterationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:7991:1: ( rule__LibIterationCS__Group__0__Impl rule__LibIterationCS__Group__1 )
-            // InternalOCLstdlib.g:7992:2: rule__LibIterationCS__Group__0__Impl rule__LibIterationCS__Group__1
+            // InternalOCLstdlib.g:7993:1: ( rule__LibIterationCS__Group__0__Impl rule__LibIterationCS__Group__1 )
+            // InternalOCLstdlib.g:7994:2: rule__LibIterationCS__Group__0__Impl rule__LibIterationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibIterationCS__Group__0__Impl();
@@ -25260,17 +25260,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__0__Impl"
-    // InternalOCLstdlib.g:7999:1: rule__LibIterationCS__Group__0__Impl : ( 'iteration' ) ;
+    // InternalOCLstdlib.g:8001:1: rule__LibIterationCS__Group__0__Impl : ( 'iteration' ) ;
     public final void rule__LibIterationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8003:1: ( ( 'iteration' ) )
-            // InternalOCLstdlib.g:8004:1: ( 'iteration' )
+            // InternalOCLstdlib.g:8005:1: ( ( 'iteration' ) )
+            // InternalOCLstdlib.g:8006:1: ( 'iteration' )
             {
-            // InternalOCLstdlib.g:8004:1: ( 'iteration' )
-            // InternalOCLstdlib.g:8005:1: 'iteration'
+            // InternalOCLstdlib.g:8006:1: ( 'iteration' )
+            // InternalOCLstdlib.g:8007:1: 'iteration'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIterationKeyword_0());
@@ -25301,14 +25301,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__1"
-    // InternalOCLstdlib.g:8018:1: rule__LibIterationCS__Group__1 : rule__LibIterationCS__Group__1__Impl rule__LibIterationCS__Group__2 ;
+    // InternalOCLstdlib.g:8020:1: rule__LibIterationCS__Group__1 : rule__LibIterationCS__Group__1__Impl rule__LibIterationCS__Group__2 ;
     public final void rule__LibIterationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8022:1: ( rule__LibIterationCS__Group__1__Impl rule__LibIterationCS__Group__2 )
-            // InternalOCLstdlib.g:8023:2: rule__LibIterationCS__Group__1__Impl rule__LibIterationCS__Group__2
+            // InternalOCLstdlib.g:8024:1: ( rule__LibIterationCS__Group__1__Impl rule__LibIterationCS__Group__2 )
+            // InternalOCLstdlib.g:8025:2: rule__LibIterationCS__Group__1__Impl rule__LibIterationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__LibIterationCS__Group__1__Impl();
@@ -25339,23 +25339,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__1__Impl"
-    // InternalOCLstdlib.g:8030:1: rule__LibIterationCS__Group__1__Impl : ( ( rule__LibIterationCS__NameAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:8032:1: rule__LibIterationCS__Group__1__Impl : ( ( rule__LibIterationCS__NameAssignment_1 ) ) ;
     public final void rule__LibIterationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8034:1: ( ( ( rule__LibIterationCS__NameAssignment_1 ) ) )
-            // InternalOCLstdlib.g:8035:1: ( ( rule__LibIterationCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:8036:1: ( ( ( rule__LibIterationCS__NameAssignment_1 ) ) )
+            // InternalOCLstdlib.g:8037:1: ( ( rule__LibIterationCS__NameAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:8035:1: ( ( rule__LibIterationCS__NameAssignment_1 ) )
-            // InternalOCLstdlib.g:8036:1: ( rule__LibIterationCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:8037:1: ( ( rule__LibIterationCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:8038:1: ( rule__LibIterationCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getNameAssignment_1());
             }
-            // InternalOCLstdlib.g:8037:1: ( rule__LibIterationCS__NameAssignment_1 )
-            // InternalOCLstdlib.g:8037:2: rule__LibIterationCS__NameAssignment_1
+            // InternalOCLstdlib.g:8039:1: ( rule__LibIterationCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:8039:2: rule__LibIterationCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__NameAssignment_1();
@@ -25390,14 +25390,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__2"
-    // InternalOCLstdlib.g:8047:1: rule__LibIterationCS__Group__2 : rule__LibIterationCS__Group__2__Impl rule__LibIterationCS__Group__3 ;
+    // InternalOCLstdlib.g:8049:1: rule__LibIterationCS__Group__2 : rule__LibIterationCS__Group__2__Impl rule__LibIterationCS__Group__3 ;
     public final void rule__LibIterationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8051:1: ( rule__LibIterationCS__Group__2__Impl rule__LibIterationCS__Group__3 )
-            // InternalOCLstdlib.g:8052:2: rule__LibIterationCS__Group__2__Impl rule__LibIterationCS__Group__3
+            // InternalOCLstdlib.g:8053:1: ( rule__LibIterationCS__Group__2__Impl rule__LibIterationCS__Group__3 )
+            // InternalOCLstdlib.g:8054:2: rule__LibIterationCS__Group__2__Impl rule__LibIterationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__LibIterationCS__Group__2__Impl();
@@ -25428,27 +25428,27 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__2__Impl"
-    // InternalOCLstdlib.g:8059:1: rule__LibIterationCS__Group__2__Impl : ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? ) ;
+    // InternalOCLstdlib.g:8061:1: rule__LibIterationCS__Group__2__Impl : ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? ) ;
     public final void rule__LibIterationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8063:1: ( ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? ) )
-            // InternalOCLstdlib.g:8064:1: ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? )
+            // InternalOCLstdlib.g:8065:1: ( ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? ) )
+            // InternalOCLstdlib.g:8066:1: ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? )
             {
-            // InternalOCLstdlib.g:8064:1: ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? )
-            // InternalOCLstdlib.g:8065:1: ( rule__LibIterationCS__OwnedSignatureAssignment_2 )?
+            // InternalOCLstdlib.g:8066:1: ( ( rule__LibIterationCS__OwnedSignatureAssignment_2 )? )
+            // InternalOCLstdlib.g:8067:1: ( rule__LibIterationCS__OwnedSignatureAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedSignatureAssignment_2());
             }
-            // InternalOCLstdlib.g:8066:1: ( rule__LibIterationCS__OwnedSignatureAssignment_2 )?
+            // InternalOCLstdlib.g:8068:1: ( rule__LibIterationCS__OwnedSignatureAssignment_2 )?
             int alt78=2;
             alt78 = dfa78.predict(input);
             switch (alt78) {
                 case 1 :
-                    // InternalOCLstdlib.g:8066:2: rule__LibIterationCS__OwnedSignatureAssignment_2
+                    // InternalOCLstdlib.g:8068:2: rule__LibIterationCS__OwnedSignatureAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__OwnedSignatureAssignment_2();
@@ -25486,14 +25486,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__3"
-    // InternalOCLstdlib.g:8076:1: rule__LibIterationCS__Group__3 : rule__LibIterationCS__Group__3__Impl rule__LibIterationCS__Group__4 ;
+    // InternalOCLstdlib.g:8078:1: rule__LibIterationCS__Group__3 : rule__LibIterationCS__Group__3__Impl rule__LibIterationCS__Group__4 ;
     public final void rule__LibIterationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8080:1: ( rule__LibIterationCS__Group__3__Impl rule__LibIterationCS__Group__4 )
-            // InternalOCLstdlib.g:8081:2: rule__LibIterationCS__Group__3__Impl rule__LibIterationCS__Group__4
+            // InternalOCLstdlib.g:8082:1: ( rule__LibIterationCS__Group__3__Impl rule__LibIterationCS__Group__4 )
+            // InternalOCLstdlib.g:8083:2: rule__LibIterationCS__Group__3__Impl rule__LibIterationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibIterationCS__Group__3__Impl();
@@ -25524,17 +25524,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__3__Impl"
-    // InternalOCLstdlib.g:8088:1: rule__LibIterationCS__Group__3__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:8090:1: rule__LibIterationCS__Group__3__Impl : ( '(' ) ;
     public final void rule__LibIterationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8092:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:8093:1: ( '(' )
+            // InternalOCLstdlib.g:8094:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:8095:1: ( '(' )
             {
-            // InternalOCLstdlib.g:8093:1: ( '(' )
-            // InternalOCLstdlib.g:8094:1: '('
+            // InternalOCLstdlib.g:8095:1: ( '(' )
+            // InternalOCLstdlib.g:8096:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getLeftParenthesisKeyword_3());
@@ -25565,14 +25565,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__4"
-    // InternalOCLstdlib.g:8107:1: rule__LibIterationCS__Group__4 : rule__LibIterationCS__Group__4__Impl rule__LibIterationCS__Group__5 ;
+    // InternalOCLstdlib.g:8109:1: rule__LibIterationCS__Group__4 : rule__LibIterationCS__Group__4__Impl rule__LibIterationCS__Group__5 ;
     public final void rule__LibIterationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8111:1: ( rule__LibIterationCS__Group__4__Impl rule__LibIterationCS__Group__5 )
-            // InternalOCLstdlib.g:8112:2: rule__LibIterationCS__Group__4__Impl rule__LibIterationCS__Group__5
+            // InternalOCLstdlib.g:8113:1: ( rule__LibIterationCS__Group__4__Impl rule__LibIterationCS__Group__5 )
+            // InternalOCLstdlib.g:8114:2: rule__LibIterationCS__Group__4__Impl rule__LibIterationCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__LibIterationCS__Group__4__Impl();
@@ -25603,23 +25603,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__4__Impl"
-    // InternalOCLstdlib.g:8119:1: rule__LibIterationCS__Group__4__Impl : ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) ) ;
+    // InternalOCLstdlib.g:8121:1: rule__LibIterationCS__Group__4__Impl : ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) ) ;
     public final void rule__LibIterationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8123:1: ( ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) ) )
-            // InternalOCLstdlib.g:8124:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) )
+            // InternalOCLstdlib.g:8125:1: ( ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) ) )
+            // InternalOCLstdlib.g:8126:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) )
             {
-            // InternalOCLstdlib.g:8124:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) )
-            // InternalOCLstdlib.g:8125:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_4 )
+            // InternalOCLstdlib.g:8126:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_4 ) )
+            // InternalOCLstdlib.g:8127:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedIteratorsAssignment_4());
             }
-            // InternalOCLstdlib.g:8126:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_4 )
-            // InternalOCLstdlib.g:8126:2: rule__LibIterationCS__OwnedIteratorsAssignment_4
+            // InternalOCLstdlib.g:8128:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_4 )
+            // InternalOCLstdlib.g:8128:2: rule__LibIterationCS__OwnedIteratorsAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedIteratorsAssignment_4();
@@ -25654,14 +25654,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__5"
-    // InternalOCLstdlib.g:8136:1: rule__LibIterationCS__Group__5 : rule__LibIterationCS__Group__5__Impl rule__LibIterationCS__Group__6 ;
+    // InternalOCLstdlib.g:8138:1: rule__LibIterationCS__Group__5 : rule__LibIterationCS__Group__5__Impl rule__LibIterationCS__Group__6 ;
     public final void rule__LibIterationCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8140:1: ( rule__LibIterationCS__Group__5__Impl rule__LibIterationCS__Group__6 )
-            // InternalOCLstdlib.g:8141:2: rule__LibIterationCS__Group__5__Impl rule__LibIterationCS__Group__6
+            // InternalOCLstdlib.g:8142:1: ( rule__LibIterationCS__Group__5__Impl rule__LibIterationCS__Group__6 )
+            // InternalOCLstdlib.g:8143:2: rule__LibIterationCS__Group__5__Impl rule__LibIterationCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__LibIterationCS__Group__5__Impl();
@@ -25692,22 +25692,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__5__Impl"
-    // InternalOCLstdlib.g:8148:1: rule__LibIterationCS__Group__5__Impl : ( ( rule__LibIterationCS__Group_5__0 )* ) ;
+    // InternalOCLstdlib.g:8150:1: rule__LibIterationCS__Group__5__Impl : ( ( rule__LibIterationCS__Group_5__0 )* ) ;
     public final void rule__LibIterationCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8152:1: ( ( ( rule__LibIterationCS__Group_5__0 )* ) )
-            // InternalOCLstdlib.g:8153:1: ( ( rule__LibIterationCS__Group_5__0 )* )
+            // InternalOCLstdlib.g:8154:1: ( ( ( rule__LibIterationCS__Group_5__0 )* ) )
+            // InternalOCLstdlib.g:8155:1: ( ( rule__LibIterationCS__Group_5__0 )* )
             {
-            // InternalOCLstdlib.g:8153:1: ( ( rule__LibIterationCS__Group_5__0 )* )
-            // InternalOCLstdlib.g:8154:1: ( rule__LibIterationCS__Group_5__0 )*
+            // InternalOCLstdlib.g:8155:1: ( ( rule__LibIterationCS__Group_5__0 )* )
+            // InternalOCLstdlib.g:8156:1: ( rule__LibIterationCS__Group_5__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getGroup_5());
             }
-            // InternalOCLstdlib.g:8155:1: ( rule__LibIterationCS__Group_5__0 )*
+            // InternalOCLstdlib.g:8157:1: ( rule__LibIterationCS__Group_5__0 )*
             loop79:
             do {
                 int alt79=2;
@@ -25720,7 +25720,7 @@
 
                 switch (alt79) {
             	case 1 :
-            	    // InternalOCLstdlib.g:8155:2: rule__LibIterationCS__Group_5__0
+            	    // InternalOCLstdlib.g:8157:2: rule__LibIterationCS__Group_5__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LibIterationCS__Group_5__0();
@@ -25761,14 +25761,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__6"
-    // InternalOCLstdlib.g:8165:1: rule__LibIterationCS__Group__6 : rule__LibIterationCS__Group__6__Impl rule__LibIterationCS__Group__7 ;
+    // InternalOCLstdlib.g:8167:1: rule__LibIterationCS__Group__6 : rule__LibIterationCS__Group__6__Impl rule__LibIterationCS__Group__7 ;
     public final void rule__LibIterationCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8169:1: ( rule__LibIterationCS__Group__6__Impl rule__LibIterationCS__Group__7 )
-            // InternalOCLstdlib.g:8170:2: rule__LibIterationCS__Group__6__Impl rule__LibIterationCS__Group__7
+            // InternalOCLstdlib.g:8171:1: ( rule__LibIterationCS__Group__6__Impl rule__LibIterationCS__Group__7 )
+            // InternalOCLstdlib.g:8172:2: rule__LibIterationCS__Group__6__Impl rule__LibIterationCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__LibIterationCS__Group__6__Impl();
@@ -25799,22 +25799,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__6__Impl"
-    // InternalOCLstdlib.g:8177:1: rule__LibIterationCS__Group__6__Impl : ( ( rule__LibIterationCS__Group_6__0 )? ) ;
+    // InternalOCLstdlib.g:8179:1: rule__LibIterationCS__Group__6__Impl : ( ( rule__LibIterationCS__Group_6__0 )? ) ;
     public final void rule__LibIterationCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8181:1: ( ( ( rule__LibIterationCS__Group_6__0 )? ) )
-            // InternalOCLstdlib.g:8182:1: ( ( rule__LibIterationCS__Group_6__0 )? )
+            // InternalOCLstdlib.g:8183:1: ( ( ( rule__LibIterationCS__Group_6__0 )? ) )
+            // InternalOCLstdlib.g:8184:1: ( ( rule__LibIterationCS__Group_6__0 )? )
             {
-            // InternalOCLstdlib.g:8182:1: ( ( rule__LibIterationCS__Group_6__0 )? )
-            // InternalOCLstdlib.g:8183:1: ( rule__LibIterationCS__Group_6__0 )?
+            // InternalOCLstdlib.g:8184:1: ( ( rule__LibIterationCS__Group_6__0 )? )
+            // InternalOCLstdlib.g:8185:1: ( rule__LibIterationCS__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getGroup_6());
             }
-            // InternalOCLstdlib.g:8184:1: ( rule__LibIterationCS__Group_6__0 )?
+            // InternalOCLstdlib.g:8186:1: ( rule__LibIterationCS__Group_6__0 )?
             int alt80=2;
             int LA80_0 = input.LA(1);
 
@@ -25823,7 +25823,7 @@
             }
             switch (alt80) {
                 case 1 :
-                    // InternalOCLstdlib.g:8184:2: rule__LibIterationCS__Group_6__0
+                    // InternalOCLstdlib.g:8186:2: rule__LibIterationCS__Group_6__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__Group_6__0();
@@ -25861,14 +25861,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__7"
-    // InternalOCLstdlib.g:8194:1: rule__LibIterationCS__Group__7 : rule__LibIterationCS__Group__7__Impl rule__LibIterationCS__Group__8 ;
+    // InternalOCLstdlib.g:8196:1: rule__LibIterationCS__Group__7 : rule__LibIterationCS__Group__7__Impl rule__LibIterationCS__Group__8 ;
     public final void rule__LibIterationCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8198:1: ( rule__LibIterationCS__Group__7__Impl rule__LibIterationCS__Group__8 )
-            // InternalOCLstdlib.g:8199:2: rule__LibIterationCS__Group__7__Impl rule__LibIterationCS__Group__8
+            // InternalOCLstdlib.g:8200:1: ( rule__LibIterationCS__Group__7__Impl rule__LibIterationCS__Group__8 )
+            // InternalOCLstdlib.g:8201:2: rule__LibIterationCS__Group__7__Impl rule__LibIterationCS__Group__8
             {
             pushFollow(FollowSets000.FOLLOW_40);
             rule__LibIterationCS__Group__7__Impl();
@@ -25899,22 +25899,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__7__Impl"
-    // InternalOCLstdlib.g:8206:1: rule__LibIterationCS__Group__7__Impl : ( ( rule__LibIterationCS__Group_7__0 )? ) ;
+    // InternalOCLstdlib.g:8208:1: rule__LibIterationCS__Group__7__Impl : ( ( rule__LibIterationCS__Group_7__0 )? ) ;
     public final void rule__LibIterationCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8210:1: ( ( ( rule__LibIterationCS__Group_7__0 )? ) )
-            // InternalOCLstdlib.g:8211:1: ( ( rule__LibIterationCS__Group_7__0 )? )
+            // InternalOCLstdlib.g:8212:1: ( ( ( rule__LibIterationCS__Group_7__0 )? ) )
+            // InternalOCLstdlib.g:8213:1: ( ( rule__LibIterationCS__Group_7__0 )? )
             {
-            // InternalOCLstdlib.g:8211:1: ( ( rule__LibIterationCS__Group_7__0 )? )
-            // InternalOCLstdlib.g:8212:1: ( rule__LibIterationCS__Group_7__0 )?
+            // InternalOCLstdlib.g:8213:1: ( ( rule__LibIterationCS__Group_7__0 )? )
+            // InternalOCLstdlib.g:8214:1: ( rule__LibIterationCS__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getGroup_7());
             }
-            // InternalOCLstdlib.g:8213:1: ( rule__LibIterationCS__Group_7__0 )?
+            // InternalOCLstdlib.g:8215:1: ( rule__LibIterationCS__Group_7__0 )?
             int alt81=2;
             int LA81_0 = input.LA(1);
 
@@ -25923,7 +25923,7 @@
             }
             switch (alt81) {
                 case 1 :
-                    // InternalOCLstdlib.g:8213:2: rule__LibIterationCS__Group_7__0
+                    // InternalOCLstdlib.g:8215:2: rule__LibIterationCS__Group_7__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__Group_7__0();
@@ -25961,14 +25961,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__8"
-    // InternalOCLstdlib.g:8223:1: rule__LibIterationCS__Group__8 : rule__LibIterationCS__Group__8__Impl rule__LibIterationCS__Group__9 ;
+    // InternalOCLstdlib.g:8225:1: rule__LibIterationCS__Group__8 : rule__LibIterationCS__Group__8__Impl rule__LibIterationCS__Group__9 ;
     public final void rule__LibIterationCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8227:1: ( rule__LibIterationCS__Group__8__Impl rule__LibIterationCS__Group__9 )
-            // InternalOCLstdlib.g:8228:2: rule__LibIterationCS__Group__8__Impl rule__LibIterationCS__Group__9
+            // InternalOCLstdlib.g:8229:1: ( rule__LibIterationCS__Group__8__Impl rule__LibIterationCS__Group__9 )
+            // InternalOCLstdlib.g:8230:2: rule__LibIterationCS__Group__8__Impl rule__LibIterationCS__Group__9
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__LibIterationCS__Group__8__Impl();
@@ -25999,17 +25999,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__8__Impl"
-    // InternalOCLstdlib.g:8235:1: rule__LibIterationCS__Group__8__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:8237:1: rule__LibIterationCS__Group__8__Impl : ( ')' ) ;
     public final void rule__LibIterationCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8239:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:8240:1: ( ')' )
+            // InternalOCLstdlib.g:8241:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:8242:1: ( ')' )
             {
-            // InternalOCLstdlib.g:8240:1: ( ')' )
-            // InternalOCLstdlib.g:8241:1: ')'
+            // InternalOCLstdlib.g:8242:1: ( ')' )
+            // InternalOCLstdlib.g:8243:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getRightParenthesisKeyword_8());
@@ -26040,14 +26040,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__9"
-    // InternalOCLstdlib.g:8254:1: rule__LibIterationCS__Group__9 : rule__LibIterationCS__Group__9__Impl rule__LibIterationCS__Group__10 ;
+    // InternalOCLstdlib.g:8256:1: rule__LibIterationCS__Group__9 : rule__LibIterationCS__Group__9__Impl rule__LibIterationCS__Group__10 ;
     public final void rule__LibIterationCS__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8258:1: ( rule__LibIterationCS__Group__9__Impl rule__LibIterationCS__Group__10 )
-            // InternalOCLstdlib.g:8259:2: rule__LibIterationCS__Group__9__Impl rule__LibIterationCS__Group__10
+            // InternalOCLstdlib.g:8260:1: ( rule__LibIterationCS__Group__9__Impl rule__LibIterationCS__Group__10 )
+            // InternalOCLstdlib.g:8261:2: rule__LibIterationCS__Group__9__Impl rule__LibIterationCS__Group__10
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibIterationCS__Group__9__Impl();
@@ -26078,17 +26078,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__9__Impl"
-    // InternalOCLstdlib.g:8266:1: rule__LibIterationCS__Group__9__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:8268:1: rule__LibIterationCS__Group__9__Impl : ( ':' ) ;
     public final void rule__LibIterationCS__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8270:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:8271:1: ( ':' )
+            // InternalOCLstdlib.g:8272:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:8273:1: ( ':' )
             {
-            // InternalOCLstdlib.g:8271:1: ( ':' )
-            // InternalOCLstdlib.g:8272:1: ':'
+            // InternalOCLstdlib.g:8273:1: ( ':' )
+            // InternalOCLstdlib.g:8274:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getColonKeyword_9());
@@ -26119,14 +26119,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__10"
-    // InternalOCLstdlib.g:8285:1: rule__LibIterationCS__Group__10 : rule__LibIterationCS__Group__10__Impl rule__LibIterationCS__Group__11 ;
+    // InternalOCLstdlib.g:8287:1: rule__LibIterationCS__Group__10 : rule__LibIterationCS__Group__10__Impl rule__LibIterationCS__Group__11 ;
     public final void rule__LibIterationCS__Group__10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8289:1: ( rule__LibIterationCS__Group__10__Impl rule__LibIterationCS__Group__11 )
-            // InternalOCLstdlib.g:8290:2: rule__LibIterationCS__Group__10__Impl rule__LibIterationCS__Group__11
+            // InternalOCLstdlib.g:8291:1: ( rule__LibIterationCS__Group__10__Impl rule__LibIterationCS__Group__11 )
+            // InternalOCLstdlib.g:8292:2: rule__LibIterationCS__Group__10__Impl rule__LibIterationCS__Group__11
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__LibIterationCS__Group__10__Impl();
@@ -26157,23 +26157,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__10__Impl"
-    // InternalOCLstdlib.g:8297:1: rule__LibIterationCS__Group__10__Impl : ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) ) ;
+    // InternalOCLstdlib.g:8299:1: rule__LibIterationCS__Group__10__Impl : ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) ) ;
     public final void rule__LibIterationCS__Group__10__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8301:1: ( ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) ) )
-            // InternalOCLstdlib.g:8302:1: ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) )
+            // InternalOCLstdlib.g:8303:1: ( ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) ) )
+            // InternalOCLstdlib.g:8304:1: ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) )
             {
-            // InternalOCLstdlib.g:8302:1: ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) )
-            // InternalOCLstdlib.g:8303:1: ( rule__LibIterationCS__OwnedTypeAssignment_10 )
+            // InternalOCLstdlib.g:8304:1: ( ( rule__LibIterationCS__OwnedTypeAssignment_10 ) )
+            // InternalOCLstdlib.g:8305:1: ( rule__LibIterationCS__OwnedTypeAssignment_10 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedTypeAssignment_10());
             }
-            // InternalOCLstdlib.g:8304:1: ( rule__LibIterationCS__OwnedTypeAssignment_10 )
-            // InternalOCLstdlib.g:8304:2: rule__LibIterationCS__OwnedTypeAssignment_10
+            // InternalOCLstdlib.g:8306:1: ( rule__LibIterationCS__OwnedTypeAssignment_10 )
+            // InternalOCLstdlib.g:8306:2: rule__LibIterationCS__OwnedTypeAssignment_10
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedTypeAssignment_10();
@@ -26208,14 +26208,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__11"
-    // InternalOCLstdlib.g:8314:1: rule__LibIterationCS__Group__11 : rule__LibIterationCS__Group__11__Impl rule__LibIterationCS__Group__12 ;
+    // InternalOCLstdlib.g:8316:1: rule__LibIterationCS__Group__11 : rule__LibIterationCS__Group__11__Impl rule__LibIterationCS__Group__12 ;
     public final void rule__LibIterationCS__Group__11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8318:1: ( rule__LibIterationCS__Group__11__Impl rule__LibIterationCS__Group__12 )
-            // InternalOCLstdlib.g:8319:2: rule__LibIterationCS__Group__11__Impl rule__LibIterationCS__Group__12
+            // InternalOCLstdlib.g:8320:1: ( rule__LibIterationCS__Group__11__Impl rule__LibIterationCS__Group__12 )
+            // InternalOCLstdlib.g:8321:2: rule__LibIterationCS__Group__11__Impl rule__LibIterationCS__Group__12
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__LibIterationCS__Group__11__Impl();
@@ -26246,22 +26246,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__11__Impl"
-    // InternalOCLstdlib.g:8326:1: rule__LibIterationCS__Group__11__Impl : ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? ) ;
+    // InternalOCLstdlib.g:8328:1: rule__LibIterationCS__Group__11__Impl : ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? ) ;
     public final void rule__LibIterationCS__Group__11__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8330:1: ( ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? ) )
-            // InternalOCLstdlib.g:8331:1: ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? )
+            // InternalOCLstdlib.g:8332:1: ( ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? ) )
+            // InternalOCLstdlib.g:8333:1: ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? )
             {
-            // InternalOCLstdlib.g:8331:1: ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? )
-            // InternalOCLstdlib.g:8332:1: ( rule__LibIterationCS__IsInvalidatingAssignment_11 )?
+            // InternalOCLstdlib.g:8333:1: ( ( rule__LibIterationCS__IsInvalidatingAssignment_11 )? )
+            // InternalOCLstdlib.g:8334:1: ( rule__LibIterationCS__IsInvalidatingAssignment_11 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIsInvalidatingAssignment_11());
             }
-            // InternalOCLstdlib.g:8333:1: ( rule__LibIterationCS__IsInvalidatingAssignment_11 )?
+            // InternalOCLstdlib.g:8335:1: ( rule__LibIterationCS__IsInvalidatingAssignment_11 )?
             int alt82=2;
             int LA82_0 = input.LA(1);
 
@@ -26270,7 +26270,7 @@
             }
             switch (alt82) {
                 case 1 :
-                    // InternalOCLstdlib.g:8333:2: rule__LibIterationCS__IsInvalidatingAssignment_11
+                    // InternalOCLstdlib.g:8335:2: rule__LibIterationCS__IsInvalidatingAssignment_11
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__IsInvalidatingAssignment_11();
@@ -26308,14 +26308,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__12"
-    // InternalOCLstdlib.g:8343:1: rule__LibIterationCS__Group__12 : rule__LibIterationCS__Group__12__Impl rule__LibIterationCS__Group__13 ;
+    // InternalOCLstdlib.g:8345:1: rule__LibIterationCS__Group__12 : rule__LibIterationCS__Group__12__Impl rule__LibIterationCS__Group__13 ;
     public final void rule__LibIterationCS__Group__12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8347:1: ( rule__LibIterationCS__Group__12__Impl rule__LibIterationCS__Group__13 )
-            // InternalOCLstdlib.g:8348:2: rule__LibIterationCS__Group__12__Impl rule__LibIterationCS__Group__13
+            // InternalOCLstdlib.g:8349:1: ( rule__LibIterationCS__Group__12__Impl rule__LibIterationCS__Group__13 )
+            // InternalOCLstdlib.g:8350:2: rule__LibIterationCS__Group__12__Impl rule__LibIterationCS__Group__13
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__LibIterationCS__Group__12__Impl();
@@ -26346,22 +26346,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__12__Impl"
-    // InternalOCLstdlib.g:8355:1: rule__LibIterationCS__Group__12__Impl : ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? ) ;
+    // InternalOCLstdlib.g:8357:1: rule__LibIterationCS__Group__12__Impl : ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? ) ;
     public final void rule__LibIterationCS__Group__12__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8359:1: ( ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? ) )
-            // InternalOCLstdlib.g:8360:1: ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? )
+            // InternalOCLstdlib.g:8361:1: ( ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? ) )
+            // InternalOCLstdlib.g:8362:1: ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? )
             {
-            // InternalOCLstdlib.g:8360:1: ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? )
-            // InternalOCLstdlib.g:8361:1: ( rule__LibIterationCS__IsValidatingAssignment_12 )?
+            // InternalOCLstdlib.g:8362:1: ( ( rule__LibIterationCS__IsValidatingAssignment_12 )? )
+            // InternalOCLstdlib.g:8363:1: ( rule__LibIterationCS__IsValidatingAssignment_12 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIsValidatingAssignment_12());
             }
-            // InternalOCLstdlib.g:8362:1: ( rule__LibIterationCS__IsValidatingAssignment_12 )?
+            // InternalOCLstdlib.g:8364:1: ( rule__LibIterationCS__IsValidatingAssignment_12 )?
             int alt83=2;
             int LA83_0 = input.LA(1);
 
@@ -26370,7 +26370,7 @@
             }
             switch (alt83) {
                 case 1 :
-                    // InternalOCLstdlib.g:8362:2: rule__LibIterationCS__IsValidatingAssignment_12
+                    // InternalOCLstdlib.g:8364:2: rule__LibIterationCS__IsValidatingAssignment_12
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__IsValidatingAssignment_12();
@@ -26408,14 +26408,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__13"
-    // InternalOCLstdlib.g:8372:1: rule__LibIterationCS__Group__13 : rule__LibIterationCS__Group__13__Impl rule__LibIterationCS__Group__14 ;
+    // InternalOCLstdlib.g:8374:1: rule__LibIterationCS__Group__13 : rule__LibIterationCS__Group__13__Impl rule__LibIterationCS__Group__14 ;
     public final void rule__LibIterationCS__Group__13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8376:1: ( rule__LibIterationCS__Group__13__Impl rule__LibIterationCS__Group__14 )
-            // InternalOCLstdlib.g:8377:2: rule__LibIterationCS__Group__13__Impl rule__LibIterationCS__Group__14
+            // InternalOCLstdlib.g:8378:1: ( rule__LibIterationCS__Group__13__Impl rule__LibIterationCS__Group__14 )
+            // InternalOCLstdlib.g:8379:2: rule__LibIterationCS__Group__13__Impl rule__LibIterationCS__Group__14
             {
             pushFollow(FollowSets000.FOLLOW_41);
             rule__LibIterationCS__Group__13__Impl();
@@ -26446,22 +26446,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__13__Impl"
-    // InternalOCLstdlib.g:8384:1: rule__LibIterationCS__Group__13__Impl : ( ( rule__LibIterationCS__Group_13__0 )? ) ;
+    // InternalOCLstdlib.g:8386:1: rule__LibIterationCS__Group__13__Impl : ( ( rule__LibIterationCS__Group_13__0 )? ) ;
     public final void rule__LibIterationCS__Group__13__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8388:1: ( ( ( rule__LibIterationCS__Group_13__0 )? ) )
-            // InternalOCLstdlib.g:8389:1: ( ( rule__LibIterationCS__Group_13__0 )? )
+            // InternalOCLstdlib.g:8390:1: ( ( ( rule__LibIterationCS__Group_13__0 )? ) )
+            // InternalOCLstdlib.g:8391:1: ( ( rule__LibIterationCS__Group_13__0 )? )
             {
-            // InternalOCLstdlib.g:8389:1: ( ( rule__LibIterationCS__Group_13__0 )? )
-            // InternalOCLstdlib.g:8390:1: ( rule__LibIterationCS__Group_13__0 )?
+            // InternalOCLstdlib.g:8391:1: ( ( rule__LibIterationCS__Group_13__0 )? )
+            // InternalOCLstdlib.g:8392:1: ( rule__LibIterationCS__Group_13__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getGroup_13());
             }
-            // InternalOCLstdlib.g:8391:1: ( rule__LibIterationCS__Group_13__0 )?
+            // InternalOCLstdlib.g:8393:1: ( rule__LibIterationCS__Group_13__0 )?
             int alt84=2;
             int LA84_0 = input.LA(1);
 
@@ -26470,7 +26470,7 @@
             }
             switch (alt84) {
                 case 1 :
-                    // InternalOCLstdlib.g:8391:2: rule__LibIterationCS__Group_13__0
+                    // InternalOCLstdlib.g:8393:2: rule__LibIterationCS__Group_13__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibIterationCS__Group_13__0();
@@ -26508,14 +26508,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__14"
-    // InternalOCLstdlib.g:8401:1: rule__LibIterationCS__Group__14 : rule__LibIterationCS__Group__14__Impl ;
+    // InternalOCLstdlib.g:8403:1: rule__LibIterationCS__Group__14 : rule__LibIterationCS__Group__14__Impl ;
     public final void rule__LibIterationCS__Group__14() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8405:1: ( rule__LibIterationCS__Group__14__Impl )
-            // InternalOCLstdlib.g:8406:2: rule__LibIterationCS__Group__14__Impl
+            // InternalOCLstdlib.g:8407:1: ( rule__LibIterationCS__Group__14__Impl )
+            // InternalOCLstdlib.g:8408:2: rule__LibIterationCS__Group__14__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group__14__Impl();
@@ -26541,23 +26541,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group__14__Impl"
-    // InternalOCLstdlib.g:8412:1: rule__LibIterationCS__Group__14__Impl : ( ( rule__LibIterationCS__Alternatives_14 ) ) ;
+    // InternalOCLstdlib.g:8414:1: rule__LibIterationCS__Group__14__Impl : ( ( rule__LibIterationCS__Alternatives_14 ) ) ;
     public final void rule__LibIterationCS__Group__14__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8416:1: ( ( ( rule__LibIterationCS__Alternatives_14 ) ) )
-            // InternalOCLstdlib.g:8417:1: ( ( rule__LibIterationCS__Alternatives_14 ) )
+            // InternalOCLstdlib.g:8418:1: ( ( ( rule__LibIterationCS__Alternatives_14 ) ) )
+            // InternalOCLstdlib.g:8419:1: ( ( rule__LibIterationCS__Alternatives_14 ) )
             {
-            // InternalOCLstdlib.g:8417:1: ( ( rule__LibIterationCS__Alternatives_14 ) )
-            // InternalOCLstdlib.g:8418:1: ( rule__LibIterationCS__Alternatives_14 )
+            // InternalOCLstdlib.g:8419:1: ( ( rule__LibIterationCS__Alternatives_14 ) )
+            // InternalOCLstdlib.g:8420:1: ( rule__LibIterationCS__Alternatives_14 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getAlternatives_14());
             }
-            // InternalOCLstdlib.g:8419:1: ( rule__LibIterationCS__Alternatives_14 )
-            // InternalOCLstdlib.g:8419:2: rule__LibIterationCS__Alternatives_14
+            // InternalOCLstdlib.g:8421:1: ( rule__LibIterationCS__Alternatives_14 )
+            // InternalOCLstdlib.g:8421:2: rule__LibIterationCS__Alternatives_14
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Alternatives_14();
@@ -26592,14 +26592,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_5__0"
-    // InternalOCLstdlib.g:8459:1: rule__LibIterationCS__Group_5__0 : rule__LibIterationCS__Group_5__0__Impl rule__LibIterationCS__Group_5__1 ;
+    // InternalOCLstdlib.g:8461:1: rule__LibIterationCS__Group_5__0 : rule__LibIterationCS__Group_5__0__Impl rule__LibIterationCS__Group_5__1 ;
     public final void rule__LibIterationCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8463:1: ( rule__LibIterationCS__Group_5__0__Impl rule__LibIterationCS__Group_5__1 )
-            // InternalOCLstdlib.g:8464:2: rule__LibIterationCS__Group_5__0__Impl rule__LibIterationCS__Group_5__1
+            // InternalOCLstdlib.g:8465:1: ( rule__LibIterationCS__Group_5__0__Impl rule__LibIterationCS__Group_5__1 )
+            // InternalOCLstdlib.g:8466:2: rule__LibIterationCS__Group_5__0__Impl rule__LibIterationCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibIterationCS__Group_5__0__Impl();
@@ -26630,17 +26630,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_5__0__Impl"
-    // InternalOCLstdlib.g:8471:1: rule__LibIterationCS__Group_5__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:8473:1: rule__LibIterationCS__Group_5__0__Impl : ( ',' ) ;
     public final void rule__LibIterationCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8475:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:8476:1: ( ',' )
+            // InternalOCLstdlib.g:8477:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:8478:1: ( ',' )
             {
-            // InternalOCLstdlib.g:8476:1: ( ',' )
-            // InternalOCLstdlib.g:8477:1: ','
+            // InternalOCLstdlib.g:8478:1: ( ',' )
+            // InternalOCLstdlib.g:8479:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getCommaKeyword_5_0());
@@ -26671,14 +26671,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_5__1"
-    // InternalOCLstdlib.g:8490:1: rule__LibIterationCS__Group_5__1 : rule__LibIterationCS__Group_5__1__Impl ;
+    // InternalOCLstdlib.g:8492:1: rule__LibIterationCS__Group_5__1 : rule__LibIterationCS__Group_5__1__Impl ;
     public final void rule__LibIterationCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8494:1: ( rule__LibIterationCS__Group_5__1__Impl )
-            // InternalOCLstdlib.g:8495:2: rule__LibIterationCS__Group_5__1__Impl
+            // InternalOCLstdlib.g:8496:1: ( rule__LibIterationCS__Group_5__1__Impl )
+            // InternalOCLstdlib.g:8497:2: rule__LibIterationCS__Group_5__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_5__1__Impl();
@@ -26704,23 +26704,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_5__1__Impl"
-    // InternalOCLstdlib.g:8501:1: rule__LibIterationCS__Group_5__1__Impl : ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) ) ;
+    // InternalOCLstdlib.g:8503:1: rule__LibIterationCS__Group_5__1__Impl : ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) ) ;
     public final void rule__LibIterationCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8505:1: ( ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) ) )
-            // InternalOCLstdlib.g:8506:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) )
+            // InternalOCLstdlib.g:8507:1: ( ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) ) )
+            // InternalOCLstdlib.g:8508:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) )
             {
-            // InternalOCLstdlib.g:8506:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) )
-            // InternalOCLstdlib.g:8507:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 )
+            // InternalOCLstdlib.g:8508:1: ( ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 ) )
+            // InternalOCLstdlib.g:8509:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedIteratorsAssignment_5_1());
             }
-            // InternalOCLstdlib.g:8508:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 )
-            // InternalOCLstdlib.g:8508:2: rule__LibIterationCS__OwnedIteratorsAssignment_5_1
+            // InternalOCLstdlib.g:8510:1: ( rule__LibIterationCS__OwnedIteratorsAssignment_5_1 )
+            // InternalOCLstdlib.g:8510:2: rule__LibIterationCS__OwnedIteratorsAssignment_5_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedIteratorsAssignment_5_1();
@@ -26755,14 +26755,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6__0"
-    // InternalOCLstdlib.g:8522:1: rule__LibIterationCS__Group_6__0 : rule__LibIterationCS__Group_6__0__Impl rule__LibIterationCS__Group_6__1 ;
+    // InternalOCLstdlib.g:8524:1: rule__LibIterationCS__Group_6__0 : rule__LibIterationCS__Group_6__0__Impl rule__LibIterationCS__Group_6__1 ;
     public final void rule__LibIterationCS__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8526:1: ( rule__LibIterationCS__Group_6__0__Impl rule__LibIterationCS__Group_6__1 )
-            // InternalOCLstdlib.g:8527:2: rule__LibIterationCS__Group_6__0__Impl rule__LibIterationCS__Group_6__1
+            // InternalOCLstdlib.g:8528:1: ( rule__LibIterationCS__Group_6__0__Impl rule__LibIterationCS__Group_6__1 )
+            // InternalOCLstdlib.g:8529:2: rule__LibIterationCS__Group_6__0__Impl rule__LibIterationCS__Group_6__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibIterationCS__Group_6__0__Impl();
@@ -26793,17 +26793,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6__0__Impl"
-    // InternalOCLstdlib.g:8534:1: rule__LibIterationCS__Group_6__0__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:8536:1: rule__LibIterationCS__Group_6__0__Impl : ( ';' ) ;
     public final void rule__LibIterationCS__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8538:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:8539:1: ( ';' )
+            // InternalOCLstdlib.g:8540:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:8541:1: ( ';' )
             {
-            // InternalOCLstdlib.g:8539:1: ( ';' )
-            // InternalOCLstdlib.g:8540:1: ';'
+            // InternalOCLstdlib.g:8541:1: ( ';' )
+            // InternalOCLstdlib.g:8542:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getSemicolonKeyword_6_0());
@@ -26834,14 +26834,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6__1"
-    // InternalOCLstdlib.g:8553:1: rule__LibIterationCS__Group_6__1 : rule__LibIterationCS__Group_6__1__Impl rule__LibIterationCS__Group_6__2 ;
+    // InternalOCLstdlib.g:8555:1: rule__LibIterationCS__Group_6__1 : rule__LibIterationCS__Group_6__1__Impl rule__LibIterationCS__Group_6__2 ;
     public final void rule__LibIterationCS__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8557:1: ( rule__LibIterationCS__Group_6__1__Impl rule__LibIterationCS__Group_6__2 )
-            // InternalOCLstdlib.g:8558:2: rule__LibIterationCS__Group_6__1__Impl rule__LibIterationCS__Group_6__2
+            // InternalOCLstdlib.g:8559:1: ( rule__LibIterationCS__Group_6__1__Impl rule__LibIterationCS__Group_6__2 )
+            // InternalOCLstdlib.g:8560:2: rule__LibIterationCS__Group_6__1__Impl rule__LibIterationCS__Group_6__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__LibIterationCS__Group_6__1__Impl();
@@ -26872,23 +26872,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6__1__Impl"
-    // InternalOCLstdlib.g:8565:1: rule__LibIterationCS__Group_6__1__Impl : ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) ) ;
+    // InternalOCLstdlib.g:8567:1: rule__LibIterationCS__Group_6__1__Impl : ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) ) ;
     public final void rule__LibIterationCS__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8569:1: ( ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) ) )
-            // InternalOCLstdlib.g:8570:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) )
+            // InternalOCLstdlib.g:8571:1: ( ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) ) )
+            // InternalOCLstdlib.g:8572:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) )
             {
-            // InternalOCLstdlib.g:8570:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) )
-            // InternalOCLstdlib.g:8571:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 )
+            // InternalOCLstdlib.g:8572:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 ) )
+            // InternalOCLstdlib.g:8573:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedAccumulatorsAssignment_6_1());
             }
-            // InternalOCLstdlib.g:8572:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 )
-            // InternalOCLstdlib.g:8572:2: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1
+            // InternalOCLstdlib.g:8574:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 )
+            // InternalOCLstdlib.g:8574:2: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1();
@@ -26923,14 +26923,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6__2"
-    // InternalOCLstdlib.g:8582:1: rule__LibIterationCS__Group_6__2 : rule__LibIterationCS__Group_6__2__Impl ;
+    // InternalOCLstdlib.g:8584:1: rule__LibIterationCS__Group_6__2 : rule__LibIterationCS__Group_6__2__Impl ;
     public final void rule__LibIterationCS__Group_6__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8586:1: ( rule__LibIterationCS__Group_6__2__Impl )
-            // InternalOCLstdlib.g:8587:2: rule__LibIterationCS__Group_6__2__Impl
+            // InternalOCLstdlib.g:8588:1: ( rule__LibIterationCS__Group_6__2__Impl )
+            // InternalOCLstdlib.g:8589:2: rule__LibIterationCS__Group_6__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_6__2__Impl();
@@ -26956,22 +26956,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6__2__Impl"
-    // InternalOCLstdlib.g:8593:1: rule__LibIterationCS__Group_6__2__Impl : ( ( rule__LibIterationCS__Group_6_2__0 )* ) ;
+    // InternalOCLstdlib.g:8595:1: rule__LibIterationCS__Group_6__2__Impl : ( ( rule__LibIterationCS__Group_6_2__0 )* ) ;
     public final void rule__LibIterationCS__Group_6__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8597:1: ( ( ( rule__LibIterationCS__Group_6_2__0 )* ) )
-            // InternalOCLstdlib.g:8598:1: ( ( rule__LibIterationCS__Group_6_2__0 )* )
+            // InternalOCLstdlib.g:8599:1: ( ( ( rule__LibIterationCS__Group_6_2__0 )* ) )
+            // InternalOCLstdlib.g:8600:1: ( ( rule__LibIterationCS__Group_6_2__0 )* )
             {
-            // InternalOCLstdlib.g:8598:1: ( ( rule__LibIterationCS__Group_6_2__0 )* )
-            // InternalOCLstdlib.g:8599:1: ( rule__LibIterationCS__Group_6_2__0 )*
+            // InternalOCLstdlib.g:8600:1: ( ( rule__LibIterationCS__Group_6_2__0 )* )
+            // InternalOCLstdlib.g:8601:1: ( rule__LibIterationCS__Group_6_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getGroup_6_2());
             }
-            // InternalOCLstdlib.g:8600:1: ( rule__LibIterationCS__Group_6_2__0 )*
+            // InternalOCLstdlib.g:8602:1: ( rule__LibIterationCS__Group_6_2__0 )*
             loop85:
             do {
                 int alt85=2;
@@ -26984,7 +26984,7 @@
 
                 switch (alt85) {
             	case 1 :
-            	    // InternalOCLstdlib.g:8600:2: rule__LibIterationCS__Group_6_2__0
+            	    // InternalOCLstdlib.g:8602:2: rule__LibIterationCS__Group_6_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LibIterationCS__Group_6_2__0();
@@ -27025,14 +27025,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6_2__0"
-    // InternalOCLstdlib.g:8616:1: rule__LibIterationCS__Group_6_2__0 : rule__LibIterationCS__Group_6_2__0__Impl rule__LibIterationCS__Group_6_2__1 ;
+    // InternalOCLstdlib.g:8618:1: rule__LibIterationCS__Group_6_2__0 : rule__LibIterationCS__Group_6_2__0__Impl rule__LibIterationCS__Group_6_2__1 ;
     public final void rule__LibIterationCS__Group_6_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8620:1: ( rule__LibIterationCS__Group_6_2__0__Impl rule__LibIterationCS__Group_6_2__1 )
-            // InternalOCLstdlib.g:8621:2: rule__LibIterationCS__Group_6_2__0__Impl rule__LibIterationCS__Group_6_2__1
+            // InternalOCLstdlib.g:8622:1: ( rule__LibIterationCS__Group_6_2__0__Impl rule__LibIterationCS__Group_6_2__1 )
+            // InternalOCLstdlib.g:8623:2: rule__LibIterationCS__Group_6_2__0__Impl rule__LibIterationCS__Group_6_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibIterationCS__Group_6_2__0__Impl();
@@ -27063,17 +27063,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6_2__0__Impl"
-    // InternalOCLstdlib.g:8628:1: rule__LibIterationCS__Group_6_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:8630:1: rule__LibIterationCS__Group_6_2__0__Impl : ( ',' ) ;
     public final void rule__LibIterationCS__Group_6_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8632:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:8633:1: ( ',' )
+            // InternalOCLstdlib.g:8634:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:8635:1: ( ',' )
             {
-            // InternalOCLstdlib.g:8633:1: ( ',' )
-            // InternalOCLstdlib.g:8634:1: ','
+            // InternalOCLstdlib.g:8635:1: ( ',' )
+            // InternalOCLstdlib.g:8636:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getCommaKeyword_6_2_0());
@@ -27104,14 +27104,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6_2__1"
-    // InternalOCLstdlib.g:8647:1: rule__LibIterationCS__Group_6_2__1 : rule__LibIterationCS__Group_6_2__1__Impl ;
+    // InternalOCLstdlib.g:8649:1: rule__LibIterationCS__Group_6_2__1 : rule__LibIterationCS__Group_6_2__1__Impl ;
     public final void rule__LibIterationCS__Group_6_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8651:1: ( rule__LibIterationCS__Group_6_2__1__Impl )
-            // InternalOCLstdlib.g:8652:2: rule__LibIterationCS__Group_6_2__1__Impl
+            // InternalOCLstdlib.g:8653:1: ( rule__LibIterationCS__Group_6_2__1__Impl )
+            // InternalOCLstdlib.g:8654:2: rule__LibIterationCS__Group_6_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_6_2__1__Impl();
@@ -27137,23 +27137,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_6_2__1__Impl"
-    // InternalOCLstdlib.g:8658:1: rule__LibIterationCS__Group_6_2__1__Impl : ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) ) ;
+    // InternalOCLstdlib.g:8660:1: rule__LibIterationCS__Group_6_2__1__Impl : ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) ) ;
     public final void rule__LibIterationCS__Group_6_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8662:1: ( ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) ) )
-            // InternalOCLstdlib.g:8663:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) )
+            // InternalOCLstdlib.g:8664:1: ( ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) ) )
+            // InternalOCLstdlib.g:8665:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) )
             {
-            // InternalOCLstdlib.g:8663:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) )
-            // InternalOCLstdlib.g:8664:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 )
+            // InternalOCLstdlib.g:8665:1: ( ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 ) )
+            // InternalOCLstdlib.g:8666:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedAccumulatorsAssignment_6_2_1());
             }
-            // InternalOCLstdlib.g:8665:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 )
-            // InternalOCLstdlib.g:8665:2: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1
+            // InternalOCLstdlib.g:8667:1: ( rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 )
+            // InternalOCLstdlib.g:8667:2: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1();
@@ -27188,14 +27188,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7__0"
-    // InternalOCLstdlib.g:8679:1: rule__LibIterationCS__Group_7__0 : rule__LibIterationCS__Group_7__0__Impl rule__LibIterationCS__Group_7__1 ;
+    // InternalOCLstdlib.g:8681:1: rule__LibIterationCS__Group_7__0 : rule__LibIterationCS__Group_7__0__Impl rule__LibIterationCS__Group_7__1 ;
     public final void rule__LibIterationCS__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8683:1: ( rule__LibIterationCS__Group_7__0__Impl rule__LibIterationCS__Group_7__1 )
-            // InternalOCLstdlib.g:8684:2: rule__LibIterationCS__Group_7__0__Impl rule__LibIterationCS__Group_7__1
+            // InternalOCLstdlib.g:8685:1: ( rule__LibIterationCS__Group_7__0__Impl rule__LibIterationCS__Group_7__1 )
+            // InternalOCLstdlib.g:8686:2: rule__LibIterationCS__Group_7__0__Impl rule__LibIterationCS__Group_7__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibIterationCS__Group_7__0__Impl();
@@ -27226,17 +27226,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7__0__Impl"
-    // InternalOCLstdlib.g:8691:1: rule__LibIterationCS__Group_7__0__Impl : ( '|' ) ;
+    // InternalOCLstdlib.g:8693:1: rule__LibIterationCS__Group_7__0__Impl : ( '|' ) ;
     public final void rule__LibIterationCS__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8695:1: ( ( '|' ) )
-            // InternalOCLstdlib.g:8696:1: ( '|' )
+            // InternalOCLstdlib.g:8697:1: ( ( '|' ) )
+            // InternalOCLstdlib.g:8698:1: ( '|' )
             {
-            // InternalOCLstdlib.g:8696:1: ( '|' )
-            // InternalOCLstdlib.g:8697:1: '|'
+            // InternalOCLstdlib.g:8698:1: ( '|' )
+            // InternalOCLstdlib.g:8699:1: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getVerticalLineKeyword_7_0());
@@ -27267,14 +27267,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7__1"
-    // InternalOCLstdlib.g:8710:1: rule__LibIterationCS__Group_7__1 : rule__LibIterationCS__Group_7__1__Impl rule__LibIterationCS__Group_7__2 ;
+    // InternalOCLstdlib.g:8712:1: rule__LibIterationCS__Group_7__1 : rule__LibIterationCS__Group_7__1__Impl rule__LibIterationCS__Group_7__2 ;
     public final void rule__LibIterationCS__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8714:1: ( rule__LibIterationCS__Group_7__1__Impl rule__LibIterationCS__Group_7__2 )
-            // InternalOCLstdlib.g:8715:2: rule__LibIterationCS__Group_7__1__Impl rule__LibIterationCS__Group_7__2
+            // InternalOCLstdlib.g:8716:1: ( rule__LibIterationCS__Group_7__1__Impl rule__LibIterationCS__Group_7__2 )
+            // InternalOCLstdlib.g:8717:2: rule__LibIterationCS__Group_7__1__Impl rule__LibIterationCS__Group_7__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__LibIterationCS__Group_7__1__Impl();
@@ -27305,23 +27305,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7__1__Impl"
-    // InternalOCLstdlib.g:8722:1: rule__LibIterationCS__Group_7__1__Impl : ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) ) ;
+    // InternalOCLstdlib.g:8724:1: rule__LibIterationCS__Group_7__1__Impl : ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) ) ;
     public final void rule__LibIterationCS__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8726:1: ( ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) ) )
-            // InternalOCLstdlib.g:8727:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) )
+            // InternalOCLstdlib.g:8728:1: ( ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) ) )
+            // InternalOCLstdlib.g:8729:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) )
             {
-            // InternalOCLstdlib.g:8727:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) )
-            // InternalOCLstdlib.g:8728:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_1 )
+            // InternalOCLstdlib.g:8729:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_1 ) )
+            // InternalOCLstdlib.g:8730:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedParametersAssignment_7_1());
             }
-            // InternalOCLstdlib.g:8729:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_1 )
-            // InternalOCLstdlib.g:8729:2: rule__LibIterationCS__OwnedParametersAssignment_7_1
+            // InternalOCLstdlib.g:8731:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_1 )
+            // InternalOCLstdlib.g:8731:2: rule__LibIterationCS__OwnedParametersAssignment_7_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedParametersAssignment_7_1();
@@ -27356,14 +27356,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7__2"
-    // InternalOCLstdlib.g:8739:1: rule__LibIterationCS__Group_7__2 : rule__LibIterationCS__Group_7__2__Impl ;
+    // InternalOCLstdlib.g:8741:1: rule__LibIterationCS__Group_7__2 : rule__LibIterationCS__Group_7__2__Impl ;
     public final void rule__LibIterationCS__Group_7__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8743:1: ( rule__LibIterationCS__Group_7__2__Impl )
-            // InternalOCLstdlib.g:8744:2: rule__LibIterationCS__Group_7__2__Impl
+            // InternalOCLstdlib.g:8745:1: ( rule__LibIterationCS__Group_7__2__Impl )
+            // InternalOCLstdlib.g:8746:2: rule__LibIterationCS__Group_7__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_7__2__Impl();
@@ -27389,22 +27389,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7__2__Impl"
-    // InternalOCLstdlib.g:8750:1: rule__LibIterationCS__Group_7__2__Impl : ( ( rule__LibIterationCS__Group_7_2__0 )* ) ;
+    // InternalOCLstdlib.g:8752:1: rule__LibIterationCS__Group_7__2__Impl : ( ( rule__LibIterationCS__Group_7_2__0 )* ) ;
     public final void rule__LibIterationCS__Group_7__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8754:1: ( ( ( rule__LibIterationCS__Group_7_2__0 )* ) )
-            // InternalOCLstdlib.g:8755:1: ( ( rule__LibIterationCS__Group_7_2__0 )* )
+            // InternalOCLstdlib.g:8756:1: ( ( ( rule__LibIterationCS__Group_7_2__0 )* ) )
+            // InternalOCLstdlib.g:8757:1: ( ( rule__LibIterationCS__Group_7_2__0 )* )
             {
-            // InternalOCLstdlib.g:8755:1: ( ( rule__LibIterationCS__Group_7_2__0 )* )
-            // InternalOCLstdlib.g:8756:1: ( rule__LibIterationCS__Group_7_2__0 )*
+            // InternalOCLstdlib.g:8757:1: ( ( rule__LibIterationCS__Group_7_2__0 )* )
+            // InternalOCLstdlib.g:8758:1: ( rule__LibIterationCS__Group_7_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getGroup_7_2());
             }
-            // InternalOCLstdlib.g:8757:1: ( rule__LibIterationCS__Group_7_2__0 )*
+            // InternalOCLstdlib.g:8759:1: ( rule__LibIterationCS__Group_7_2__0 )*
             loop86:
             do {
                 int alt86=2;
@@ -27417,7 +27417,7 @@
 
                 switch (alt86) {
             	case 1 :
-            	    // InternalOCLstdlib.g:8757:2: rule__LibIterationCS__Group_7_2__0
+            	    // InternalOCLstdlib.g:8759:2: rule__LibIterationCS__Group_7_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LibIterationCS__Group_7_2__0();
@@ -27458,14 +27458,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7_2__0"
-    // InternalOCLstdlib.g:8773:1: rule__LibIterationCS__Group_7_2__0 : rule__LibIterationCS__Group_7_2__0__Impl rule__LibIterationCS__Group_7_2__1 ;
+    // InternalOCLstdlib.g:8775:1: rule__LibIterationCS__Group_7_2__0 : rule__LibIterationCS__Group_7_2__0__Impl rule__LibIterationCS__Group_7_2__1 ;
     public final void rule__LibIterationCS__Group_7_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8777:1: ( rule__LibIterationCS__Group_7_2__0__Impl rule__LibIterationCS__Group_7_2__1 )
-            // InternalOCLstdlib.g:8778:2: rule__LibIterationCS__Group_7_2__0__Impl rule__LibIterationCS__Group_7_2__1
+            // InternalOCLstdlib.g:8779:1: ( rule__LibIterationCS__Group_7_2__0__Impl rule__LibIterationCS__Group_7_2__1 )
+            // InternalOCLstdlib.g:8780:2: rule__LibIterationCS__Group_7_2__0__Impl rule__LibIterationCS__Group_7_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibIterationCS__Group_7_2__0__Impl();
@@ -27496,17 +27496,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7_2__0__Impl"
-    // InternalOCLstdlib.g:8785:1: rule__LibIterationCS__Group_7_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:8787:1: rule__LibIterationCS__Group_7_2__0__Impl : ( ',' ) ;
     public final void rule__LibIterationCS__Group_7_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8789:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:8790:1: ( ',' )
+            // InternalOCLstdlib.g:8791:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:8792:1: ( ',' )
             {
-            // InternalOCLstdlib.g:8790:1: ( ',' )
-            // InternalOCLstdlib.g:8791:1: ','
+            // InternalOCLstdlib.g:8792:1: ( ',' )
+            // InternalOCLstdlib.g:8793:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getCommaKeyword_7_2_0());
@@ -27537,14 +27537,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7_2__1"
-    // InternalOCLstdlib.g:8804:1: rule__LibIterationCS__Group_7_2__1 : rule__LibIterationCS__Group_7_2__1__Impl ;
+    // InternalOCLstdlib.g:8806:1: rule__LibIterationCS__Group_7_2__1 : rule__LibIterationCS__Group_7_2__1__Impl ;
     public final void rule__LibIterationCS__Group_7_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8808:1: ( rule__LibIterationCS__Group_7_2__1__Impl )
-            // InternalOCLstdlib.g:8809:2: rule__LibIterationCS__Group_7_2__1__Impl
+            // InternalOCLstdlib.g:8810:1: ( rule__LibIterationCS__Group_7_2__1__Impl )
+            // InternalOCLstdlib.g:8811:2: rule__LibIterationCS__Group_7_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_7_2__1__Impl();
@@ -27570,23 +27570,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_7_2__1__Impl"
-    // InternalOCLstdlib.g:8815:1: rule__LibIterationCS__Group_7_2__1__Impl : ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) ) ;
+    // InternalOCLstdlib.g:8817:1: rule__LibIterationCS__Group_7_2__1__Impl : ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) ) ;
     public final void rule__LibIterationCS__Group_7_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8819:1: ( ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) ) )
-            // InternalOCLstdlib.g:8820:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) )
+            // InternalOCLstdlib.g:8821:1: ( ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) ) )
+            // InternalOCLstdlib.g:8822:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) )
             {
-            // InternalOCLstdlib.g:8820:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) )
-            // InternalOCLstdlib.g:8821:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 )
+            // InternalOCLstdlib.g:8822:1: ( ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 ) )
+            // InternalOCLstdlib.g:8823:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedParametersAssignment_7_2_1());
             }
-            // InternalOCLstdlib.g:8822:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 )
-            // InternalOCLstdlib.g:8822:2: rule__LibIterationCS__OwnedParametersAssignment_7_2_1
+            // InternalOCLstdlib.g:8824:1: ( rule__LibIterationCS__OwnedParametersAssignment_7_2_1 )
+            // InternalOCLstdlib.g:8824:2: rule__LibIterationCS__OwnedParametersAssignment_7_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__OwnedParametersAssignment_7_2_1();
@@ -27621,14 +27621,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_13__0"
-    // InternalOCLstdlib.g:8836:1: rule__LibIterationCS__Group_13__0 : rule__LibIterationCS__Group_13__0__Impl rule__LibIterationCS__Group_13__1 ;
+    // InternalOCLstdlib.g:8838:1: rule__LibIterationCS__Group_13__0 : rule__LibIterationCS__Group_13__0__Impl rule__LibIterationCS__Group_13__1 ;
     public final void rule__LibIterationCS__Group_13__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8840:1: ( rule__LibIterationCS__Group_13__0__Impl rule__LibIterationCS__Group_13__1 )
-            // InternalOCLstdlib.g:8841:2: rule__LibIterationCS__Group_13__0__Impl rule__LibIterationCS__Group_13__1
+            // InternalOCLstdlib.g:8842:1: ( rule__LibIterationCS__Group_13__0__Impl rule__LibIterationCS__Group_13__1 )
+            // InternalOCLstdlib.g:8843:2: rule__LibIterationCS__Group_13__0__Impl rule__LibIterationCS__Group_13__1
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__LibIterationCS__Group_13__0__Impl();
@@ -27659,17 +27659,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_13__0__Impl"
-    // InternalOCLstdlib.g:8848:1: rule__LibIterationCS__Group_13__0__Impl : ( '=>' ) ;
+    // InternalOCLstdlib.g:8850:1: rule__LibIterationCS__Group_13__0__Impl : ( '=>' ) ;
     public final void rule__LibIterationCS__Group_13__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8852:1: ( ( '=>' ) )
-            // InternalOCLstdlib.g:8853:1: ( '=>' )
+            // InternalOCLstdlib.g:8854:1: ( ( '=>' ) )
+            // InternalOCLstdlib.g:8855:1: ( '=>' )
             {
-            // InternalOCLstdlib.g:8853:1: ( '=>' )
-            // InternalOCLstdlib.g:8854:1: '=>'
+            // InternalOCLstdlib.g:8855:1: ( '=>' )
+            // InternalOCLstdlib.g:8856:1: '=>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getEqualsSignGreaterThanSignKeyword_13_0());
@@ -27700,14 +27700,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_13__1"
-    // InternalOCLstdlib.g:8867:1: rule__LibIterationCS__Group_13__1 : rule__LibIterationCS__Group_13__1__Impl ;
+    // InternalOCLstdlib.g:8869:1: rule__LibIterationCS__Group_13__1 : rule__LibIterationCS__Group_13__1__Impl ;
     public final void rule__LibIterationCS__Group_13__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8871:1: ( rule__LibIterationCS__Group_13__1__Impl )
-            // InternalOCLstdlib.g:8872:2: rule__LibIterationCS__Group_13__1__Impl
+            // InternalOCLstdlib.g:8873:1: ( rule__LibIterationCS__Group_13__1__Impl )
+            // InternalOCLstdlib.g:8874:2: rule__LibIterationCS__Group_13__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_13__1__Impl();
@@ -27733,23 +27733,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_13__1__Impl"
-    // InternalOCLstdlib.g:8878:1: rule__LibIterationCS__Group_13__1__Impl : ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) ) ;
+    // InternalOCLstdlib.g:8880:1: rule__LibIterationCS__Group_13__1__Impl : ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) ) ;
     public final void rule__LibIterationCS__Group_13__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8882:1: ( ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) ) )
-            // InternalOCLstdlib.g:8883:1: ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) )
+            // InternalOCLstdlib.g:8884:1: ( ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) ) )
+            // InternalOCLstdlib.g:8885:1: ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) )
             {
-            // InternalOCLstdlib.g:8883:1: ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) )
-            // InternalOCLstdlib.g:8884:1: ( rule__LibIterationCS__ImplementationAssignment_13_1 )
+            // InternalOCLstdlib.g:8885:1: ( ( rule__LibIterationCS__ImplementationAssignment_13_1 ) )
+            // InternalOCLstdlib.g:8886:1: ( rule__LibIterationCS__ImplementationAssignment_13_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getImplementationAssignment_13_1());
             }
-            // InternalOCLstdlib.g:8885:1: ( rule__LibIterationCS__ImplementationAssignment_13_1 )
-            // InternalOCLstdlib.g:8885:2: rule__LibIterationCS__ImplementationAssignment_13_1
+            // InternalOCLstdlib.g:8887:1: ( rule__LibIterationCS__ImplementationAssignment_13_1 )
+            // InternalOCLstdlib.g:8887:2: rule__LibIterationCS__ImplementationAssignment_13_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__ImplementationAssignment_13_1();
@@ -27784,14 +27784,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_14_0__0"
-    // InternalOCLstdlib.g:8899:1: rule__LibIterationCS__Group_14_0__0 : rule__LibIterationCS__Group_14_0__0__Impl rule__LibIterationCS__Group_14_0__1 ;
+    // InternalOCLstdlib.g:8901:1: rule__LibIterationCS__Group_14_0__0 : rule__LibIterationCS__Group_14_0__0__Impl rule__LibIterationCS__Group_14_0__1 ;
     public final void rule__LibIterationCS__Group_14_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8903:1: ( rule__LibIterationCS__Group_14_0__0__Impl rule__LibIterationCS__Group_14_0__1 )
-            // InternalOCLstdlib.g:8904:2: rule__LibIterationCS__Group_14_0__0__Impl rule__LibIterationCS__Group_14_0__1
+            // InternalOCLstdlib.g:8905:1: ( rule__LibIterationCS__Group_14_0__0__Impl rule__LibIterationCS__Group_14_0__1 )
+            // InternalOCLstdlib.g:8906:2: rule__LibIterationCS__Group_14_0__0__Impl rule__LibIterationCS__Group_14_0__1
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__LibIterationCS__Group_14_0__0__Impl();
@@ -27822,17 +27822,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_14_0__0__Impl"
-    // InternalOCLstdlib.g:8911:1: rule__LibIterationCS__Group_14_0__0__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:8913:1: rule__LibIterationCS__Group_14_0__0__Impl : ( '{' ) ;
     public final void rule__LibIterationCS__Group_14_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8915:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:8916:1: ( '{' )
+            // InternalOCLstdlib.g:8917:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:8918:1: ( '{' )
             {
-            // InternalOCLstdlib.g:8916:1: ( '{' )
-            // InternalOCLstdlib.g:8917:1: '{'
+            // InternalOCLstdlib.g:8918:1: ( '{' )
+            // InternalOCLstdlib.g:8919:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getLeftCurlyBracketKeyword_14_0_0());
@@ -27863,14 +27863,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_14_0__1"
-    // InternalOCLstdlib.g:8930:1: rule__LibIterationCS__Group_14_0__1 : rule__LibIterationCS__Group_14_0__1__Impl rule__LibIterationCS__Group_14_0__2 ;
+    // InternalOCLstdlib.g:8932:1: rule__LibIterationCS__Group_14_0__1 : rule__LibIterationCS__Group_14_0__1__Impl rule__LibIterationCS__Group_14_0__2 ;
     public final void rule__LibIterationCS__Group_14_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8934:1: ( rule__LibIterationCS__Group_14_0__1__Impl rule__LibIterationCS__Group_14_0__2 )
-            // InternalOCLstdlib.g:8935:2: rule__LibIterationCS__Group_14_0__1__Impl rule__LibIterationCS__Group_14_0__2
+            // InternalOCLstdlib.g:8936:1: ( rule__LibIterationCS__Group_14_0__1__Impl rule__LibIterationCS__Group_14_0__2 )
+            // InternalOCLstdlib.g:8937:2: rule__LibIterationCS__Group_14_0__1__Impl rule__LibIterationCS__Group_14_0__2
             {
             pushFollow(FollowSets000.FOLLOW_37);
             rule__LibIterationCS__Group_14_0__1__Impl();
@@ -27901,22 +27901,22 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_14_0__1__Impl"
-    // InternalOCLstdlib.g:8942:1: rule__LibIterationCS__Group_14_0__1__Impl : ( ( rule__LibIterationCS__Alternatives_14_0_1 )* ) ;
+    // InternalOCLstdlib.g:8944:1: rule__LibIterationCS__Group_14_0__1__Impl : ( ( rule__LibIterationCS__Alternatives_14_0_1 )* ) ;
     public final void rule__LibIterationCS__Group_14_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8946:1: ( ( ( rule__LibIterationCS__Alternatives_14_0_1 )* ) )
-            // InternalOCLstdlib.g:8947:1: ( ( rule__LibIterationCS__Alternatives_14_0_1 )* )
+            // InternalOCLstdlib.g:8948:1: ( ( ( rule__LibIterationCS__Alternatives_14_0_1 )* ) )
+            // InternalOCLstdlib.g:8949:1: ( ( rule__LibIterationCS__Alternatives_14_0_1 )* )
             {
-            // InternalOCLstdlib.g:8947:1: ( ( rule__LibIterationCS__Alternatives_14_0_1 )* )
-            // InternalOCLstdlib.g:8948:1: ( rule__LibIterationCS__Alternatives_14_0_1 )*
+            // InternalOCLstdlib.g:8949:1: ( ( rule__LibIterationCS__Alternatives_14_0_1 )* )
+            // InternalOCLstdlib.g:8950:1: ( rule__LibIterationCS__Alternatives_14_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getAlternatives_14_0_1());
             }
-            // InternalOCLstdlib.g:8949:1: ( rule__LibIterationCS__Alternatives_14_0_1 )*
+            // InternalOCLstdlib.g:8951:1: ( rule__LibIterationCS__Alternatives_14_0_1 )*
             loop87:
             do {
                 int alt87=2;
@@ -27929,7 +27929,7 @@
 
                 switch (alt87) {
             	case 1 :
-            	    // InternalOCLstdlib.g:8949:2: rule__LibIterationCS__Alternatives_14_0_1
+            	    // InternalOCLstdlib.g:8951:2: rule__LibIterationCS__Alternatives_14_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_38);
             	    rule__LibIterationCS__Alternatives_14_0_1();
@@ -27970,14 +27970,14 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_14_0__2"
-    // InternalOCLstdlib.g:8959:1: rule__LibIterationCS__Group_14_0__2 : rule__LibIterationCS__Group_14_0__2__Impl ;
+    // InternalOCLstdlib.g:8961:1: rule__LibIterationCS__Group_14_0__2 : rule__LibIterationCS__Group_14_0__2__Impl ;
     public final void rule__LibIterationCS__Group_14_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8963:1: ( rule__LibIterationCS__Group_14_0__2__Impl )
-            // InternalOCLstdlib.g:8964:2: rule__LibIterationCS__Group_14_0__2__Impl
+            // InternalOCLstdlib.g:8965:1: ( rule__LibIterationCS__Group_14_0__2__Impl )
+            // InternalOCLstdlib.g:8966:2: rule__LibIterationCS__Group_14_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibIterationCS__Group_14_0__2__Impl();
@@ -28003,17 +28003,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__Group_14_0__2__Impl"
-    // InternalOCLstdlib.g:8970:1: rule__LibIterationCS__Group_14_0__2__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:8972:1: rule__LibIterationCS__Group_14_0__2__Impl : ( '}' ) ;
     public final void rule__LibIterationCS__Group_14_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8974:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:8975:1: ( '}' )
+            // InternalOCLstdlib.g:8976:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:8977:1: ( '}' )
             {
-            // InternalOCLstdlib.g:8975:1: ( '}' )
-            // InternalOCLstdlib.g:8976:1: '}'
+            // InternalOCLstdlib.g:8977:1: ( '}' )
+            // InternalOCLstdlib.g:8978:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getRightCurlyBracketKeyword_14_0_2());
@@ -28044,14 +28044,14 @@
 
 
     // $ANTLR start "rule__IteratorCS__Group__0"
-    // InternalOCLstdlib.g:8995:1: rule__IteratorCS__Group__0 : rule__IteratorCS__Group__0__Impl rule__IteratorCS__Group__1 ;
+    // InternalOCLstdlib.g:8997:1: rule__IteratorCS__Group__0 : rule__IteratorCS__Group__0__Impl rule__IteratorCS__Group__1 ;
     public final void rule__IteratorCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:8999:1: ( rule__IteratorCS__Group__0__Impl rule__IteratorCS__Group__1 )
-            // InternalOCLstdlib.g:9000:2: rule__IteratorCS__Group__0__Impl rule__IteratorCS__Group__1
+            // InternalOCLstdlib.g:9001:1: ( rule__IteratorCS__Group__0__Impl rule__IteratorCS__Group__1 )
+            // InternalOCLstdlib.g:9002:2: rule__IteratorCS__Group__0__Impl rule__IteratorCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__IteratorCS__Group__0__Impl();
@@ -28082,23 +28082,23 @@
 
 
     // $ANTLR start "rule__IteratorCS__Group__0__Impl"
-    // InternalOCLstdlib.g:9007:1: rule__IteratorCS__Group__0__Impl : ( ( rule__IteratorCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:9009:1: rule__IteratorCS__Group__0__Impl : ( ( rule__IteratorCS__NameAssignment_0 ) ) ;
     public final void rule__IteratorCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9011:1: ( ( ( rule__IteratorCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:9012:1: ( ( rule__IteratorCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:9013:1: ( ( ( rule__IteratorCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:9014:1: ( ( rule__IteratorCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:9012:1: ( ( rule__IteratorCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:9013:1: ( rule__IteratorCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:9014:1: ( ( rule__IteratorCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:9015:1: ( rule__IteratorCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIteratorCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:9014:1: ( rule__IteratorCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:9014:2: rule__IteratorCS__NameAssignment_0
+            // InternalOCLstdlib.g:9016:1: ( rule__IteratorCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:9016:2: rule__IteratorCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IteratorCS__NameAssignment_0();
@@ -28133,14 +28133,14 @@
 
 
     // $ANTLR start "rule__IteratorCS__Group__1"
-    // InternalOCLstdlib.g:9024:1: rule__IteratorCS__Group__1 : rule__IteratorCS__Group__1__Impl rule__IteratorCS__Group__2 ;
+    // InternalOCLstdlib.g:9026:1: rule__IteratorCS__Group__1 : rule__IteratorCS__Group__1__Impl rule__IteratorCS__Group__2 ;
     public final void rule__IteratorCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9028:1: ( rule__IteratorCS__Group__1__Impl rule__IteratorCS__Group__2 )
-            // InternalOCLstdlib.g:9029:2: rule__IteratorCS__Group__1__Impl rule__IteratorCS__Group__2
+            // InternalOCLstdlib.g:9030:1: ( rule__IteratorCS__Group__1__Impl rule__IteratorCS__Group__2 )
+            // InternalOCLstdlib.g:9031:2: rule__IteratorCS__Group__1__Impl rule__IteratorCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__IteratorCS__Group__1__Impl();
@@ -28171,17 +28171,17 @@
 
 
     // $ANTLR start "rule__IteratorCS__Group__1__Impl"
-    // InternalOCLstdlib.g:9036:1: rule__IteratorCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:9038:1: rule__IteratorCS__Group__1__Impl : ( ':' ) ;
     public final void rule__IteratorCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9040:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:9041:1: ( ':' )
+            // InternalOCLstdlib.g:9042:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:9043:1: ( ':' )
             {
-            // InternalOCLstdlib.g:9041:1: ( ':' )
-            // InternalOCLstdlib.g:9042:1: ':'
+            // InternalOCLstdlib.g:9043:1: ( ':' )
+            // InternalOCLstdlib.g:9044:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIteratorCSAccess().getColonKeyword_1());
@@ -28212,14 +28212,14 @@
 
 
     // $ANTLR start "rule__IteratorCS__Group__2"
-    // InternalOCLstdlib.g:9055:1: rule__IteratorCS__Group__2 : rule__IteratorCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:9057:1: rule__IteratorCS__Group__2 : rule__IteratorCS__Group__2__Impl ;
     public final void rule__IteratorCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9059:1: ( rule__IteratorCS__Group__2__Impl )
-            // InternalOCLstdlib.g:9060:2: rule__IteratorCS__Group__2__Impl
+            // InternalOCLstdlib.g:9061:1: ( rule__IteratorCS__Group__2__Impl )
+            // InternalOCLstdlib.g:9062:2: rule__IteratorCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IteratorCS__Group__2__Impl();
@@ -28245,23 +28245,23 @@
 
 
     // $ANTLR start "rule__IteratorCS__Group__2__Impl"
-    // InternalOCLstdlib.g:9066:1: rule__IteratorCS__Group__2__Impl : ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:9068:1: rule__IteratorCS__Group__2__Impl : ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__IteratorCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9070:1: ( ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) ) )
-            // InternalOCLstdlib.g:9071:1: ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:9072:1: ( ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) ) )
+            // InternalOCLstdlib.g:9073:1: ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:9071:1: ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) )
-            // InternalOCLstdlib.g:9072:1: ( rule__IteratorCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:9073:1: ( ( rule__IteratorCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:9074:1: ( rule__IteratorCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIteratorCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalOCLstdlib.g:9073:1: ( rule__IteratorCS__OwnedTypeAssignment_2 )
-            // InternalOCLstdlib.g:9073:2: rule__IteratorCS__OwnedTypeAssignment_2
+            // InternalOCLstdlib.g:9075:1: ( rule__IteratorCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:9075:2: rule__IteratorCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IteratorCS__OwnedTypeAssignment_2();
@@ -28296,14 +28296,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__0"
-    // InternalOCLstdlib.g:9089:1: rule__LambdaTypeCS__Group__0 : rule__LambdaTypeCS__Group__0__Impl rule__LambdaTypeCS__Group__1 ;
+    // InternalOCLstdlib.g:9091:1: rule__LambdaTypeCS__Group__0 : rule__LambdaTypeCS__Group__0__Impl rule__LambdaTypeCS__Group__1 ;
     public final void rule__LambdaTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9093:1: ( rule__LambdaTypeCS__Group__0__Impl rule__LambdaTypeCS__Group__1 )
-            // InternalOCLstdlib.g:9094:2: rule__LambdaTypeCS__Group__0__Impl rule__LambdaTypeCS__Group__1
+            // InternalOCLstdlib.g:9095:1: ( rule__LambdaTypeCS__Group__0__Impl rule__LambdaTypeCS__Group__1 )
+            // InternalOCLstdlib.g:9096:2: rule__LambdaTypeCS__Group__0__Impl rule__LambdaTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__LambdaTypeCS__Group__0__Impl();
@@ -28334,23 +28334,23 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__0__Impl"
-    // InternalOCLstdlib.g:9101:1: rule__LambdaTypeCS__Group__0__Impl : ( ( rule__LambdaTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:9103:1: rule__LambdaTypeCS__Group__0__Impl : ( ( rule__LambdaTypeCS__NameAssignment_0 ) ) ;
     public final void rule__LambdaTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9105:1: ( ( ( rule__LambdaTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:9106:1: ( ( rule__LambdaTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:9107:1: ( ( ( rule__LambdaTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:9108:1: ( ( rule__LambdaTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:9106:1: ( ( rule__LambdaTypeCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:9107:1: ( rule__LambdaTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:9108:1: ( ( rule__LambdaTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:9109:1: ( rule__LambdaTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:9108:1: ( rule__LambdaTypeCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:9108:2: rule__LambdaTypeCS__NameAssignment_0
+            // InternalOCLstdlib.g:9110:1: ( rule__LambdaTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:9110:2: rule__LambdaTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__NameAssignment_0();
@@ -28385,14 +28385,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__1"
-    // InternalOCLstdlib.g:9118:1: rule__LambdaTypeCS__Group__1 : rule__LambdaTypeCS__Group__1__Impl rule__LambdaTypeCS__Group__2 ;
+    // InternalOCLstdlib.g:9120:1: rule__LambdaTypeCS__Group__1 : rule__LambdaTypeCS__Group__1__Impl rule__LambdaTypeCS__Group__2 ;
     public final void rule__LambdaTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9122:1: ( rule__LambdaTypeCS__Group__1__Impl rule__LambdaTypeCS__Group__2 )
-            // InternalOCLstdlib.g:9123:2: rule__LambdaTypeCS__Group__1__Impl rule__LambdaTypeCS__Group__2
+            // InternalOCLstdlib.g:9124:1: ( rule__LambdaTypeCS__Group__1__Impl rule__LambdaTypeCS__Group__2 )
+            // InternalOCLstdlib.g:9125:2: rule__LambdaTypeCS__Group__1__Impl rule__LambdaTypeCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_42);
             rule__LambdaTypeCS__Group__1__Impl();
@@ -28423,22 +28423,22 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__1__Impl"
-    // InternalOCLstdlib.g:9130:1: rule__LambdaTypeCS__Group__1__Impl : ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? ) ;
+    // InternalOCLstdlib.g:9132:1: rule__LambdaTypeCS__Group__1__Impl : ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? ) ;
     public final void rule__LambdaTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9134:1: ( ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? ) )
-            // InternalOCLstdlib.g:9135:1: ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? )
+            // InternalOCLstdlib.g:9136:1: ( ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? ) )
+            // InternalOCLstdlib.g:9137:1: ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? )
             {
-            // InternalOCLstdlib.g:9135:1: ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? )
-            // InternalOCLstdlib.g:9136:1: ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )?
+            // InternalOCLstdlib.g:9137:1: ( ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )? )
+            // InternalOCLstdlib.g:9138:1: ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedSignatureAssignment_1());
             }
-            // InternalOCLstdlib.g:9137:1: ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )?
+            // InternalOCLstdlib.g:9139:1: ( rule__LambdaTypeCS__OwnedSignatureAssignment_1 )?
             int alt88=2;
             int LA88_0 = input.LA(1);
 
@@ -28447,7 +28447,7 @@
             }
             switch (alt88) {
                 case 1 :
-                    // InternalOCLstdlib.g:9137:2: rule__LambdaTypeCS__OwnedSignatureAssignment_1
+                    // InternalOCLstdlib.g:9139:2: rule__LambdaTypeCS__OwnedSignatureAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LambdaTypeCS__OwnedSignatureAssignment_1();
@@ -28485,14 +28485,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__2"
-    // InternalOCLstdlib.g:9147:1: rule__LambdaTypeCS__Group__2 : rule__LambdaTypeCS__Group__2__Impl rule__LambdaTypeCS__Group__3 ;
+    // InternalOCLstdlib.g:9149:1: rule__LambdaTypeCS__Group__2 : rule__LambdaTypeCS__Group__2__Impl rule__LambdaTypeCS__Group__3 ;
     public final void rule__LambdaTypeCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9151:1: ( rule__LambdaTypeCS__Group__2__Impl rule__LambdaTypeCS__Group__3 )
-            // InternalOCLstdlib.g:9152:2: rule__LambdaTypeCS__Group__2__Impl rule__LambdaTypeCS__Group__3
+            // InternalOCLstdlib.g:9153:1: ( rule__LambdaTypeCS__Group__2__Impl rule__LambdaTypeCS__Group__3 )
+            // InternalOCLstdlib.g:9154:2: rule__LambdaTypeCS__Group__2__Impl rule__LambdaTypeCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__LambdaTypeCS__Group__2__Impl();
@@ -28523,23 +28523,23 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__2__Impl"
-    // InternalOCLstdlib.g:9159:1: rule__LambdaTypeCS__Group__2__Impl : ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:9161:1: rule__LambdaTypeCS__Group__2__Impl : ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) ) ;
     public final void rule__LambdaTypeCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9163:1: ( ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) ) )
-            // InternalOCLstdlib.g:9164:1: ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:9165:1: ( ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) ) )
+            // InternalOCLstdlib.g:9166:1: ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:9164:1: ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) )
-            // InternalOCLstdlib.g:9165:1: ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 )
+            // InternalOCLstdlib.g:9166:1: ( ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:9167:1: ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedContextTypeAssignment_2());
             }
-            // InternalOCLstdlib.g:9166:1: ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 )
-            // InternalOCLstdlib.g:9166:2: rule__LambdaTypeCS__OwnedContextTypeAssignment_2
+            // InternalOCLstdlib.g:9168:1: ( rule__LambdaTypeCS__OwnedContextTypeAssignment_2 )
+            // InternalOCLstdlib.g:9168:2: rule__LambdaTypeCS__OwnedContextTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__OwnedContextTypeAssignment_2();
@@ -28574,14 +28574,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__3"
-    // InternalOCLstdlib.g:9176:1: rule__LambdaTypeCS__Group__3 : rule__LambdaTypeCS__Group__3__Impl rule__LambdaTypeCS__Group__4 ;
+    // InternalOCLstdlib.g:9178:1: rule__LambdaTypeCS__Group__3 : rule__LambdaTypeCS__Group__3__Impl rule__LambdaTypeCS__Group__4 ;
     public final void rule__LambdaTypeCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9180:1: ( rule__LambdaTypeCS__Group__3__Impl rule__LambdaTypeCS__Group__4 )
-            // InternalOCLstdlib.g:9181:2: rule__LambdaTypeCS__Group__3__Impl rule__LambdaTypeCS__Group__4
+            // InternalOCLstdlib.g:9182:1: ( rule__LambdaTypeCS__Group__3__Impl rule__LambdaTypeCS__Group__4 )
+            // InternalOCLstdlib.g:9183:2: rule__LambdaTypeCS__Group__3__Impl rule__LambdaTypeCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__LambdaTypeCS__Group__3__Impl();
@@ -28612,17 +28612,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__3__Impl"
-    // InternalOCLstdlib.g:9188:1: rule__LambdaTypeCS__Group__3__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:9190:1: rule__LambdaTypeCS__Group__3__Impl : ( '(' ) ;
     public final void rule__LambdaTypeCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9192:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:9193:1: ( '(' )
+            // InternalOCLstdlib.g:9194:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:9195:1: ( '(' )
             {
-            // InternalOCLstdlib.g:9193:1: ( '(' )
-            // InternalOCLstdlib.g:9194:1: '('
+            // InternalOCLstdlib.g:9195:1: ( '(' )
+            // InternalOCLstdlib.g:9196:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getLeftParenthesisKeyword_3());
@@ -28653,14 +28653,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__4"
-    // InternalOCLstdlib.g:9207:1: rule__LambdaTypeCS__Group__4 : rule__LambdaTypeCS__Group__4__Impl rule__LambdaTypeCS__Group__5 ;
+    // InternalOCLstdlib.g:9209:1: rule__LambdaTypeCS__Group__4 : rule__LambdaTypeCS__Group__4__Impl rule__LambdaTypeCS__Group__5 ;
     public final void rule__LambdaTypeCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9211:1: ( rule__LambdaTypeCS__Group__4__Impl rule__LambdaTypeCS__Group__5 )
-            // InternalOCLstdlib.g:9212:2: rule__LambdaTypeCS__Group__4__Impl rule__LambdaTypeCS__Group__5
+            // InternalOCLstdlib.g:9213:1: ( rule__LambdaTypeCS__Group__4__Impl rule__LambdaTypeCS__Group__5 )
+            // InternalOCLstdlib.g:9214:2: rule__LambdaTypeCS__Group__4__Impl rule__LambdaTypeCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_43);
             rule__LambdaTypeCS__Group__4__Impl();
@@ -28691,22 +28691,22 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__4__Impl"
-    // InternalOCLstdlib.g:9219:1: rule__LambdaTypeCS__Group__4__Impl : ( ( rule__LambdaTypeCS__Group_4__0 )? ) ;
+    // InternalOCLstdlib.g:9221:1: rule__LambdaTypeCS__Group__4__Impl : ( ( rule__LambdaTypeCS__Group_4__0 )? ) ;
     public final void rule__LambdaTypeCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9223:1: ( ( ( rule__LambdaTypeCS__Group_4__0 )? ) )
-            // InternalOCLstdlib.g:9224:1: ( ( rule__LambdaTypeCS__Group_4__0 )? )
+            // InternalOCLstdlib.g:9225:1: ( ( ( rule__LambdaTypeCS__Group_4__0 )? ) )
+            // InternalOCLstdlib.g:9226:1: ( ( rule__LambdaTypeCS__Group_4__0 )? )
             {
-            // InternalOCLstdlib.g:9224:1: ( ( rule__LambdaTypeCS__Group_4__0 )? )
-            // InternalOCLstdlib.g:9225:1: ( rule__LambdaTypeCS__Group_4__0 )?
+            // InternalOCLstdlib.g:9226:1: ( ( rule__LambdaTypeCS__Group_4__0 )? )
+            // InternalOCLstdlib.g:9227:1: ( rule__LambdaTypeCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getGroup_4());
             }
-            // InternalOCLstdlib.g:9226:1: ( rule__LambdaTypeCS__Group_4__0 )?
+            // InternalOCLstdlib.g:9228:1: ( rule__LambdaTypeCS__Group_4__0 )?
             int alt89=2;
             int LA89_0 = input.LA(1);
 
@@ -28715,7 +28715,7 @@
             }
             switch (alt89) {
                 case 1 :
-                    // InternalOCLstdlib.g:9226:2: rule__LambdaTypeCS__Group_4__0
+                    // InternalOCLstdlib.g:9228:2: rule__LambdaTypeCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LambdaTypeCS__Group_4__0();
@@ -28753,14 +28753,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__5"
-    // InternalOCLstdlib.g:9236:1: rule__LambdaTypeCS__Group__5 : rule__LambdaTypeCS__Group__5__Impl rule__LambdaTypeCS__Group__6 ;
+    // InternalOCLstdlib.g:9238:1: rule__LambdaTypeCS__Group__5 : rule__LambdaTypeCS__Group__5__Impl rule__LambdaTypeCS__Group__6 ;
     public final void rule__LambdaTypeCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9240:1: ( rule__LambdaTypeCS__Group__5__Impl rule__LambdaTypeCS__Group__6 )
-            // InternalOCLstdlib.g:9241:2: rule__LambdaTypeCS__Group__5__Impl rule__LambdaTypeCS__Group__6
+            // InternalOCLstdlib.g:9242:1: ( rule__LambdaTypeCS__Group__5__Impl rule__LambdaTypeCS__Group__6 )
+            // InternalOCLstdlib.g:9243:2: rule__LambdaTypeCS__Group__5__Impl rule__LambdaTypeCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__LambdaTypeCS__Group__5__Impl();
@@ -28791,17 +28791,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__5__Impl"
-    // InternalOCLstdlib.g:9248:1: rule__LambdaTypeCS__Group__5__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:9250:1: rule__LambdaTypeCS__Group__5__Impl : ( ')' ) ;
     public final void rule__LambdaTypeCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9252:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:9253:1: ( ')' )
+            // InternalOCLstdlib.g:9254:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:9255:1: ( ')' )
             {
-            // InternalOCLstdlib.g:9253:1: ( ')' )
-            // InternalOCLstdlib.g:9254:1: ')'
+            // InternalOCLstdlib.g:9255:1: ( ')' )
+            // InternalOCLstdlib.g:9256:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getRightParenthesisKeyword_5());
@@ -28832,14 +28832,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__6"
-    // InternalOCLstdlib.g:9267:1: rule__LambdaTypeCS__Group__6 : rule__LambdaTypeCS__Group__6__Impl rule__LambdaTypeCS__Group__7 ;
+    // InternalOCLstdlib.g:9269:1: rule__LambdaTypeCS__Group__6 : rule__LambdaTypeCS__Group__6__Impl rule__LambdaTypeCS__Group__7 ;
     public final void rule__LambdaTypeCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9271:1: ( rule__LambdaTypeCS__Group__6__Impl rule__LambdaTypeCS__Group__7 )
-            // InternalOCLstdlib.g:9272:2: rule__LambdaTypeCS__Group__6__Impl rule__LambdaTypeCS__Group__7
+            // InternalOCLstdlib.g:9273:1: ( rule__LambdaTypeCS__Group__6__Impl rule__LambdaTypeCS__Group__7 )
+            // InternalOCLstdlib.g:9274:2: rule__LambdaTypeCS__Group__6__Impl rule__LambdaTypeCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LambdaTypeCS__Group__6__Impl();
@@ -28870,17 +28870,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__6__Impl"
-    // InternalOCLstdlib.g:9279:1: rule__LambdaTypeCS__Group__6__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:9281:1: rule__LambdaTypeCS__Group__6__Impl : ( ':' ) ;
     public final void rule__LambdaTypeCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9283:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:9284:1: ( ':' )
+            // InternalOCLstdlib.g:9285:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:9286:1: ( ':' )
             {
-            // InternalOCLstdlib.g:9284:1: ( ':' )
-            // InternalOCLstdlib.g:9285:1: ':'
+            // InternalOCLstdlib.g:9286:1: ( ':' )
+            // InternalOCLstdlib.g:9287:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getColonKeyword_6());
@@ -28911,14 +28911,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__7"
-    // InternalOCLstdlib.g:9298:1: rule__LambdaTypeCS__Group__7 : rule__LambdaTypeCS__Group__7__Impl ;
+    // InternalOCLstdlib.g:9300:1: rule__LambdaTypeCS__Group__7 : rule__LambdaTypeCS__Group__7__Impl ;
     public final void rule__LambdaTypeCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9302:1: ( rule__LambdaTypeCS__Group__7__Impl )
-            // InternalOCLstdlib.g:9303:2: rule__LambdaTypeCS__Group__7__Impl
+            // InternalOCLstdlib.g:9304:1: ( rule__LambdaTypeCS__Group__7__Impl )
+            // InternalOCLstdlib.g:9305:2: rule__LambdaTypeCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__Group__7__Impl();
@@ -28944,23 +28944,23 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group__7__Impl"
-    // InternalOCLstdlib.g:9309:1: rule__LambdaTypeCS__Group__7__Impl : ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) ) ;
+    // InternalOCLstdlib.g:9311:1: rule__LambdaTypeCS__Group__7__Impl : ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) ) ;
     public final void rule__LambdaTypeCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9313:1: ( ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) ) )
-            // InternalOCLstdlib.g:9314:1: ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) )
+            // InternalOCLstdlib.g:9315:1: ( ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) ) )
+            // InternalOCLstdlib.g:9316:1: ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) )
             {
-            // InternalOCLstdlib.g:9314:1: ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) )
-            // InternalOCLstdlib.g:9315:1: ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 )
+            // InternalOCLstdlib.g:9316:1: ( ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 ) )
+            // InternalOCLstdlib.g:9317:1: ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedResultTypeAssignment_7());
             }
-            // InternalOCLstdlib.g:9316:1: ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 )
-            // InternalOCLstdlib.g:9316:2: rule__LambdaTypeCS__OwnedResultTypeAssignment_7
+            // InternalOCLstdlib.g:9318:1: ( rule__LambdaTypeCS__OwnedResultTypeAssignment_7 )
+            // InternalOCLstdlib.g:9318:2: rule__LambdaTypeCS__OwnedResultTypeAssignment_7
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__OwnedResultTypeAssignment_7();
@@ -28995,14 +28995,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4__0"
-    // InternalOCLstdlib.g:9342:1: rule__LambdaTypeCS__Group_4__0 : rule__LambdaTypeCS__Group_4__0__Impl rule__LambdaTypeCS__Group_4__1 ;
+    // InternalOCLstdlib.g:9344:1: rule__LambdaTypeCS__Group_4__0 : rule__LambdaTypeCS__Group_4__0__Impl rule__LambdaTypeCS__Group_4__1 ;
     public final void rule__LambdaTypeCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9346:1: ( rule__LambdaTypeCS__Group_4__0__Impl rule__LambdaTypeCS__Group_4__1 )
-            // InternalOCLstdlib.g:9347:2: rule__LambdaTypeCS__Group_4__0__Impl rule__LambdaTypeCS__Group_4__1
+            // InternalOCLstdlib.g:9348:1: ( rule__LambdaTypeCS__Group_4__0__Impl rule__LambdaTypeCS__Group_4__1 )
+            // InternalOCLstdlib.g:9349:2: rule__LambdaTypeCS__Group_4__0__Impl rule__LambdaTypeCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__LambdaTypeCS__Group_4__0__Impl();
@@ -29033,23 +29033,23 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4__0__Impl"
-    // InternalOCLstdlib.g:9354:1: rule__LambdaTypeCS__Group_4__0__Impl : ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) ) ;
+    // InternalOCLstdlib.g:9356:1: rule__LambdaTypeCS__Group_4__0__Impl : ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) ) ;
     public final void rule__LambdaTypeCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9358:1: ( ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) ) )
-            // InternalOCLstdlib.g:9359:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) )
+            // InternalOCLstdlib.g:9360:1: ( ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) ) )
+            // InternalOCLstdlib.g:9361:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) )
             {
-            // InternalOCLstdlib.g:9359:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) )
-            // InternalOCLstdlib.g:9360:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 )
+            // InternalOCLstdlib.g:9361:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 ) )
+            // InternalOCLstdlib.g:9362:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedParameterTypesAssignment_4_0());
             }
-            // InternalOCLstdlib.g:9361:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 )
-            // InternalOCLstdlib.g:9361:2: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0
+            // InternalOCLstdlib.g:9363:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 )
+            // InternalOCLstdlib.g:9363:2: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0();
@@ -29084,14 +29084,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4__1"
-    // InternalOCLstdlib.g:9371:1: rule__LambdaTypeCS__Group_4__1 : rule__LambdaTypeCS__Group_4__1__Impl ;
+    // InternalOCLstdlib.g:9373:1: rule__LambdaTypeCS__Group_4__1 : rule__LambdaTypeCS__Group_4__1__Impl ;
     public final void rule__LambdaTypeCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9375:1: ( rule__LambdaTypeCS__Group_4__1__Impl )
-            // InternalOCLstdlib.g:9376:2: rule__LambdaTypeCS__Group_4__1__Impl
+            // InternalOCLstdlib.g:9377:1: ( rule__LambdaTypeCS__Group_4__1__Impl )
+            // InternalOCLstdlib.g:9378:2: rule__LambdaTypeCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__Group_4__1__Impl();
@@ -29117,22 +29117,22 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4__1__Impl"
-    // InternalOCLstdlib.g:9382:1: rule__LambdaTypeCS__Group_4__1__Impl : ( ( rule__LambdaTypeCS__Group_4_1__0 )* ) ;
+    // InternalOCLstdlib.g:9384:1: rule__LambdaTypeCS__Group_4__1__Impl : ( ( rule__LambdaTypeCS__Group_4_1__0 )* ) ;
     public final void rule__LambdaTypeCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9386:1: ( ( ( rule__LambdaTypeCS__Group_4_1__0 )* ) )
-            // InternalOCLstdlib.g:9387:1: ( ( rule__LambdaTypeCS__Group_4_1__0 )* )
+            // InternalOCLstdlib.g:9388:1: ( ( ( rule__LambdaTypeCS__Group_4_1__0 )* ) )
+            // InternalOCLstdlib.g:9389:1: ( ( rule__LambdaTypeCS__Group_4_1__0 )* )
             {
-            // InternalOCLstdlib.g:9387:1: ( ( rule__LambdaTypeCS__Group_4_1__0 )* )
-            // InternalOCLstdlib.g:9388:1: ( rule__LambdaTypeCS__Group_4_1__0 )*
+            // InternalOCLstdlib.g:9389:1: ( ( rule__LambdaTypeCS__Group_4_1__0 )* )
+            // InternalOCLstdlib.g:9390:1: ( rule__LambdaTypeCS__Group_4_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getGroup_4_1());
             }
-            // InternalOCLstdlib.g:9389:1: ( rule__LambdaTypeCS__Group_4_1__0 )*
+            // InternalOCLstdlib.g:9391:1: ( rule__LambdaTypeCS__Group_4_1__0 )*
             loop90:
             do {
                 int alt90=2;
@@ -29145,7 +29145,7 @@
 
                 switch (alt90) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9389:2: rule__LambdaTypeCS__Group_4_1__0
+            	    // InternalOCLstdlib.g:9391:2: rule__LambdaTypeCS__Group_4_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LambdaTypeCS__Group_4_1__0();
@@ -29186,14 +29186,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4_1__0"
-    // InternalOCLstdlib.g:9403:1: rule__LambdaTypeCS__Group_4_1__0 : rule__LambdaTypeCS__Group_4_1__0__Impl rule__LambdaTypeCS__Group_4_1__1 ;
+    // InternalOCLstdlib.g:9405:1: rule__LambdaTypeCS__Group_4_1__0 : rule__LambdaTypeCS__Group_4_1__0__Impl rule__LambdaTypeCS__Group_4_1__1 ;
     public final void rule__LambdaTypeCS__Group_4_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9407:1: ( rule__LambdaTypeCS__Group_4_1__0__Impl rule__LambdaTypeCS__Group_4_1__1 )
-            // InternalOCLstdlib.g:9408:2: rule__LambdaTypeCS__Group_4_1__0__Impl rule__LambdaTypeCS__Group_4_1__1
+            // InternalOCLstdlib.g:9409:1: ( rule__LambdaTypeCS__Group_4_1__0__Impl rule__LambdaTypeCS__Group_4_1__1 )
+            // InternalOCLstdlib.g:9410:2: rule__LambdaTypeCS__Group_4_1__0__Impl rule__LambdaTypeCS__Group_4_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LambdaTypeCS__Group_4_1__0__Impl();
@@ -29224,17 +29224,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4_1__0__Impl"
-    // InternalOCLstdlib.g:9415:1: rule__LambdaTypeCS__Group_4_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:9417:1: rule__LambdaTypeCS__Group_4_1__0__Impl : ( ',' ) ;
     public final void rule__LambdaTypeCS__Group_4_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9419:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:9420:1: ( ',' )
+            // InternalOCLstdlib.g:9421:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:9422:1: ( ',' )
             {
-            // InternalOCLstdlib.g:9420:1: ( ',' )
-            // InternalOCLstdlib.g:9421:1: ','
+            // InternalOCLstdlib.g:9422:1: ( ',' )
+            // InternalOCLstdlib.g:9423:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getCommaKeyword_4_1_0());
@@ -29265,14 +29265,14 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4_1__1"
-    // InternalOCLstdlib.g:9434:1: rule__LambdaTypeCS__Group_4_1__1 : rule__LambdaTypeCS__Group_4_1__1__Impl ;
+    // InternalOCLstdlib.g:9436:1: rule__LambdaTypeCS__Group_4_1__1 : rule__LambdaTypeCS__Group_4_1__1__Impl ;
     public final void rule__LambdaTypeCS__Group_4_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9438:1: ( rule__LambdaTypeCS__Group_4_1__1__Impl )
-            // InternalOCLstdlib.g:9439:2: rule__LambdaTypeCS__Group_4_1__1__Impl
+            // InternalOCLstdlib.g:9440:1: ( rule__LambdaTypeCS__Group_4_1__1__Impl )
+            // InternalOCLstdlib.g:9441:2: rule__LambdaTypeCS__Group_4_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__Group_4_1__1__Impl();
@@ -29298,23 +29298,23 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__Group_4_1__1__Impl"
-    // InternalOCLstdlib.g:9445:1: rule__LambdaTypeCS__Group_4_1__1__Impl : ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) ) ;
+    // InternalOCLstdlib.g:9447:1: rule__LambdaTypeCS__Group_4_1__1__Impl : ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) ) ;
     public final void rule__LambdaTypeCS__Group_4_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9449:1: ( ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) ) )
-            // InternalOCLstdlib.g:9450:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) )
+            // InternalOCLstdlib.g:9451:1: ( ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) ) )
+            // InternalOCLstdlib.g:9452:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) )
             {
-            // InternalOCLstdlib.g:9450:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) )
-            // InternalOCLstdlib.g:9451:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 )
+            // InternalOCLstdlib.g:9452:1: ( ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 ) )
+            // InternalOCLstdlib.g:9453:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedParameterTypesAssignment_4_1_1());
             }
-            // InternalOCLstdlib.g:9452:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 )
-            // InternalOCLstdlib.g:9452:2: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1
+            // InternalOCLstdlib.g:9454:1: ( rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 )
+            // InternalOCLstdlib.g:9454:2: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1();
@@ -29349,14 +29349,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__0"
-    // InternalOCLstdlib.g:9466:1: rule__LibOperationCS__Group__0 : rule__LibOperationCS__Group__0__Impl rule__LibOperationCS__Group__1 ;
+    // InternalOCLstdlib.g:9468:1: rule__LibOperationCS__Group__0 : rule__LibOperationCS__Group__0__Impl rule__LibOperationCS__Group__1 ;
     public final void rule__LibOperationCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9470:1: ( rule__LibOperationCS__Group__0__Impl rule__LibOperationCS__Group__1 )
-            // InternalOCLstdlib.g:9471:2: rule__LibOperationCS__Group__0__Impl rule__LibOperationCS__Group__1
+            // InternalOCLstdlib.g:9472:1: ( rule__LibOperationCS__Group__0__Impl rule__LibOperationCS__Group__1 )
+            // InternalOCLstdlib.g:9473:2: rule__LibOperationCS__Group__0__Impl rule__LibOperationCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_44);
             rule__LibOperationCS__Group__0__Impl();
@@ -29387,22 +29387,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__0__Impl"
-    // InternalOCLstdlib.g:9478:1: rule__LibOperationCS__Group__0__Impl : ( ( rule__LibOperationCS__IsStaticAssignment_0 )? ) ;
+    // InternalOCLstdlib.g:9480:1: rule__LibOperationCS__Group__0__Impl : ( ( rule__LibOperationCS__IsStaticAssignment_0 )? ) ;
     public final void rule__LibOperationCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9482:1: ( ( ( rule__LibOperationCS__IsStaticAssignment_0 )? ) )
-            // InternalOCLstdlib.g:9483:1: ( ( rule__LibOperationCS__IsStaticAssignment_0 )? )
+            // InternalOCLstdlib.g:9484:1: ( ( ( rule__LibOperationCS__IsStaticAssignment_0 )? ) )
+            // InternalOCLstdlib.g:9485:1: ( ( rule__LibOperationCS__IsStaticAssignment_0 )? )
             {
-            // InternalOCLstdlib.g:9483:1: ( ( rule__LibOperationCS__IsStaticAssignment_0 )? )
-            // InternalOCLstdlib.g:9484:1: ( rule__LibOperationCS__IsStaticAssignment_0 )?
+            // InternalOCLstdlib.g:9485:1: ( ( rule__LibOperationCS__IsStaticAssignment_0 )? )
+            // InternalOCLstdlib.g:9486:1: ( rule__LibOperationCS__IsStaticAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsStaticAssignment_0());
             }
-            // InternalOCLstdlib.g:9485:1: ( rule__LibOperationCS__IsStaticAssignment_0 )?
+            // InternalOCLstdlib.g:9487:1: ( rule__LibOperationCS__IsStaticAssignment_0 )?
             int alt91=2;
             int LA91_0 = input.LA(1);
 
@@ -29411,7 +29411,7 @@
             }
             switch (alt91) {
                 case 1 :
-                    // InternalOCLstdlib.g:9485:2: rule__LibOperationCS__IsStaticAssignment_0
+                    // InternalOCLstdlib.g:9487:2: rule__LibOperationCS__IsStaticAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__IsStaticAssignment_0();
@@ -29449,14 +29449,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__1"
-    // InternalOCLstdlib.g:9495:1: rule__LibOperationCS__Group__1 : rule__LibOperationCS__Group__1__Impl rule__LibOperationCS__Group__2 ;
+    // InternalOCLstdlib.g:9497:1: rule__LibOperationCS__Group__1 : rule__LibOperationCS__Group__1__Impl rule__LibOperationCS__Group__2 ;
     public final void rule__LibOperationCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9499:1: ( rule__LibOperationCS__Group__1__Impl rule__LibOperationCS__Group__2 )
-            // InternalOCLstdlib.g:9500:2: rule__LibOperationCS__Group__1__Impl rule__LibOperationCS__Group__2
+            // InternalOCLstdlib.g:9501:1: ( rule__LibOperationCS__Group__1__Impl rule__LibOperationCS__Group__2 )
+            // InternalOCLstdlib.g:9502:2: rule__LibOperationCS__Group__1__Impl rule__LibOperationCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibOperationCS__Group__1__Impl();
@@ -29487,17 +29487,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__1__Impl"
-    // InternalOCLstdlib.g:9507:1: rule__LibOperationCS__Group__1__Impl : ( 'operation' ) ;
+    // InternalOCLstdlib.g:9509:1: rule__LibOperationCS__Group__1__Impl : ( 'operation' ) ;
     public final void rule__LibOperationCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9511:1: ( ( 'operation' ) )
-            // InternalOCLstdlib.g:9512:1: ( 'operation' )
+            // InternalOCLstdlib.g:9513:1: ( ( 'operation' ) )
+            // InternalOCLstdlib.g:9514:1: ( 'operation' )
             {
-            // InternalOCLstdlib.g:9512:1: ( 'operation' )
-            // InternalOCLstdlib.g:9513:1: 'operation'
+            // InternalOCLstdlib.g:9514:1: ( 'operation' )
+            // InternalOCLstdlib.g:9515:1: 'operation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOperationKeyword_1());
@@ -29528,14 +29528,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__2"
-    // InternalOCLstdlib.g:9526:1: rule__LibOperationCS__Group__2 : rule__LibOperationCS__Group__2__Impl rule__LibOperationCS__Group__3 ;
+    // InternalOCLstdlib.g:9528:1: rule__LibOperationCS__Group__2 : rule__LibOperationCS__Group__2__Impl rule__LibOperationCS__Group__3 ;
     public final void rule__LibOperationCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9530:1: ( rule__LibOperationCS__Group__2__Impl rule__LibOperationCS__Group__3 )
-            // InternalOCLstdlib.g:9531:2: rule__LibOperationCS__Group__2__Impl rule__LibOperationCS__Group__3
+            // InternalOCLstdlib.g:9532:1: ( rule__LibOperationCS__Group__2__Impl rule__LibOperationCS__Group__3 )
+            // InternalOCLstdlib.g:9533:2: rule__LibOperationCS__Group__2__Impl rule__LibOperationCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__LibOperationCS__Group__2__Impl();
@@ -29566,23 +29566,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__2__Impl"
-    // InternalOCLstdlib.g:9538:1: rule__LibOperationCS__Group__2__Impl : ( ( rule__LibOperationCS__NameAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:9540:1: rule__LibOperationCS__Group__2__Impl : ( ( rule__LibOperationCS__NameAssignment_2 ) ) ;
     public final void rule__LibOperationCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9542:1: ( ( ( rule__LibOperationCS__NameAssignment_2 ) ) )
-            // InternalOCLstdlib.g:9543:1: ( ( rule__LibOperationCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:9544:1: ( ( ( rule__LibOperationCS__NameAssignment_2 ) ) )
+            // InternalOCLstdlib.g:9545:1: ( ( rule__LibOperationCS__NameAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:9543:1: ( ( rule__LibOperationCS__NameAssignment_2 ) )
-            // InternalOCLstdlib.g:9544:1: ( rule__LibOperationCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:9545:1: ( ( rule__LibOperationCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:9546:1: ( rule__LibOperationCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getNameAssignment_2());
             }
-            // InternalOCLstdlib.g:9545:1: ( rule__LibOperationCS__NameAssignment_2 )
-            // InternalOCLstdlib.g:9545:2: rule__LibOperationCS__NameAssignment_2
+            // InternalOCLstdlib.g:9547:1: ( rule__LibOperationCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:9547:2: rule__LibOperationCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__NameAssignment_2();
@@ -29617,14 +29617,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__3"
-    // InternalOCLstdlib.g:9555:1: rule__LibOperationCS__Group__3 : rule__LibOperationCS__Group__3__Impl rule__LibOperationCS__Group__4 ;
+    // InternalOCLstdlib.g:9557:1: rule__LibOperationCS__Group__3 : rule__LibOperationCS__Group__3__Impl rule__LibOperationCS__Group__4 ;
     public final void rule__LibOperationCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9559:1: ( rule__LibOperationCS__Group__3__Impl rule__LibOperationCS__Group__4 )
-            // InternalOCLstdlib.g:9560:2: rule__LibOperationCS__Group__3__Impl rule__LibOperationCS__Group__4
+            // InternalOCLstdlib.g:9561:1: ( rule__LibOperationCS__Group__3__Impl rule__LibOperationCS__Group__4 )
+            // InternalOCLstdlib.g:9562:2: rule__LibOperationCS__Group__3__Impl rule__LibOperationCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__LibOperationCS__Group__3__Impl();
@@ -29655,27 +29655,27 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__3__Impl"
-    // InternalOCLstdlib.g:9567:1: rule__LibOperationCS__Group__3__Impl : ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? ) ;
+    // InternalOCLstdlib.g:9569:1: rule__LibOperationCS__Group__3__Impl : ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? ) ;
     public final void rule__LibOperationCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9571:1: ( ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? ) )
-            // InternalOCLstdlib.g:9572:1: ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLstdlib.g:9573:1: ( ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? ) )
+            // InternalOCLstdlib.g:9574:1: ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? )
             {
-            // InternalOCLstdlib.g:9572:1: ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? )
-            // InternalOCLstdlib.g:9573:1: ( rule__LibOperationCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLstdlib.g:9574:1: ( ( rule__LibOperationCS__OwnedSignatureAssignment_3 )? )
+            // InternalOCLstdlib.g:9575:1: ( rule__LibOperationCS__OwnedSignatureAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedSignatureAssignment_3());
             }
-            // InternalOCLstdlib.g:9574:1: ( rule__LibOperationCS__OwnedSignatureAssignment_3 )?
+            // InternalOCLstdlib.g:9576:1: ( rule__LibOperationCS__OwnedSignatureAssignment_3 )?
             int alt92=2;
             alt92 = dfa92.predict(input);
             switch (alt92) {
                 case 1 :
-                    // InternalOCLstdlib.g:9574:2: rule__LibOperationCS__OwnedSignatureAssignment_3
+                    // InternalOCLstdlib.g:9576:2: rule__LibOperationCS__OwnedSignatureAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__OwnedSignatureAssignment_3();
@@ -29713,14 +29713,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__4"
-    // InternalOCLstdlib.g:9584:1: rule__LibOperationCS__Group__4 : rule__LibOperationCS__Group__4__Impl rule__LibOperationCS__Group__5 ;
+    // InternalOCLstdlib.g:9586:1: rule__LibOperationCS__Group__4 : rule__LibOperationCS__Group__4__Impl rule__LibOperationCS__Group__5 ;
     public final void rule__LibOperationCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9588:1: ( rule__LibOperationCS__Group__4__Impl rule__LibOperationCS__Group__5 )
-            // InternalOCLstdlib.g:9589:2: rule__LibOperationCS__Group__4__Impl rule__LibOperationCS__Group__5
+            // InternalOCLstdlib.g:9590:1: ( rule__LibOperationCS__Group__4__Impl rule__LibOperationCS__Group__5 )
+            // InternalOCLstdlib.g:9591:2: rule__LibOperationCS__Group__4__Impl rule__LibOperationCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__LibOperationCS__Group__4__Impl();
@@ -29751,17 +29751,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__4__Impl"
-    // InternalOCLstdlib.g:9596:1: rule__LibOperationCS__Group__4__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:9598:1: rule__LibOperationCS__Group__4__Impl : ( '(' ) ;
     public final void rule__LibOperationCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9600:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:9601:1: ( '(' )
+            // InternalOCLstdlib.g:9602:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:9603:1: ( '(' )
             {
-            // InternalOCLstdlib.g:9601:1: ( '(' )
-            // InternalOCLstdlib.g:9602:1: '('
+            // InternalOCLstdlib.g:9603:1: ( '(' )
+            // InternalOCLstdlib.g:9604:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getLeftParenthesisKeyword_4());
@@ -29792,14 +29792,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__5"
-    // InternalOCLstdlib.g:9615:1: rule__LibOperationCS__Group__5 : rule__LibOperationCS__Group__5__Impl rule__LibOperationCS__Group__6 ;
+    // InternalOCLstdlib.g:9617:1: rule__LibOperationCS__Group__5 : rule__LibOperationCS__Group__5__Impl rule__LibOperationCS__Group__6 ;
     public final void rule__LibOperationCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9619:1: ( rule__LibOperationCS__Group__5__Impl rule__LibOperationCS__Group__6 )
-            // InternalOCLstdlib.g:9620:2: rule__LibOperationCS__Group__5__Impl rule__LibOperationCS__Group__6
+            // InternalOCLstdlib.g:9621:1: ( rule__LibOperationCS__Group__5__Impl rule__LibOperationCS__Group__6 )
+            // InternalOCLstdlib.g:9622:2: rule__LibOperationCS__Group__5__Impl rule__LibOperationCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__LibOperationCS__Group__5__Impl();
@@ -29830,22 +29830,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__5__Impl"
-    // InternalOCLstdlib.g:9627:1: rule__LibOperationCS__Group__5__Impl : ( ( rule__LibOperationCS__Group_5__0 )? ) ;
+    // InternalOCLstdlib.g:9629:1: rule__LibOperationCS__Group__5__Impl : ( ( rule__LibOperationCS__Group_5__0 )? ) ;
     public final void rule__LibOperationCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9631:1: ( ( ( rule__LibOperationCS__Group_5__0 )? ) )
-            // InternalOCLstdlib.g:9632:1: ( ( rule__LibOperationCS__Group_5__0 )? )
+            // InternalOCLstdlib.g:9633:1: ( ( ( rule__LibOperationCS__Group_5__0 )? ) )
+            // InternalOCLstdlib.g:9634:1: ( ( rule__LibOperationCS__Group_5__0 )? )
             {
-            // InternalOCLstdlib.g:9632:1: ( ( rule__LibOperationCS__Group_5__0 )? )
-            // InternalOCLstdlib.g:9633:1: ( rule__LibOperationCS__Group_5__0 )?
+            // InternalOCLstdlib.g:9634:1: ( ( rule__LibOperationCS__Group_5__0 )? )
+            // InternalOCLstdlib.g:9635:1: ( rule__LibOperationCS__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getGroup_5());
             }
-            // InternalOCLstdlib.g:9634:1: ( rule__LibOperationCS__Group_5__0 )?
+            // InternalOCLstdlib.g:9636:1: ( rule__LibOperationCS__Group_5__0 )?
             int alt93=2;
             int LA93_0 = input.LA(1);
 
@@ -29854,7 +29854,7 @@
             }
             switch (alt93) {
                 case 1 :
-                    // InternalOCLstdlib.g:9634:2: rule__LibOperationCS__Group_5__0
+                    // InternalOCLstdlib.g:9636:2: rule__LibOperationCS__Group_5__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__Group_5__0();
@@ -29892,14 +29892,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__6"
-    // InternalOCLstdlib.g:9644:1: rule__LibOperationCS__Group__6 : rule__LibOperationCS__Group__6__Impl rule__LibOperationCS__Group__7 ;
+    // InternalOCLstdlib.g:9646:1: rule__LibOperationCS__Group__6 : rule__LibOperationCS__Group__6__Impl rule__LibOperationCS__Group__7 ;
     public final void rule__LibOperationCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9648:1: ( rule__LibOperationCS__Group__6__Impl rule__LibOperationCS__Group__7 )
-            // InternalOCLstdlib.g:9649:2: rule__LibOperationCS__Group__6__Impl rule__LibOperationCS__Group__7
+            // InternalOCLstdlib.g:9650:1: ( rule__LibOperationCS__Group__6__Impl rule__LibOperationCS__Group__7 )
+            // InternalOCLstdlib.g:9651:2: rule__LibOperationCS__Group__6__Impl rule__LibOperationCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__LibOperationCS__Group__6__Impl();
@@ -29930,17 +29930,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__6__Impl"
-    // InternalOCLstdlib.g:9656:1: rule__LibOperationCS__Group__6__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:9658:1: rule__LibOperationCS__Group__6__Impl : ( ')' ) ;
     public final void rule__LibOperationCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9660:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:9661:1: ( ')' )
+            // InternalOCLstdlib.g:9662:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:9663:1: ( ')' )
             {
-            // InternalOCLstdlib.g:9661:1: ( ')' )
-            // InternalOCLstdlib.g:9662:1: ')'
+            // InternalOCLstdlib.g:9663:1: ( ')' )
+            // InternalOCLstdlib.g:9664:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getRightParenthesisKeyword_6());
@@ -29971,14 +29971,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__7"
-    // InternalOCLstdlib.g:9675:1: rule__LibOperationCS__Group__7 : rule__LibOperationCS__Group__7__Impl rule__LibOperationCS__Group__8 ;
+    // InternalOCLstdlib.g:9677:1: rule__LibOperationCS__Group__7 : rule__LibOperationCS__Group__7__Impl rule__LibOperationCS__Group__8 ;
     public final void rule__LibOperationCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9679:1: ( rule__LibOperationCS__Group__7__Impl rule__LibOperationCS__Group__8 )
-            // InternalOCLstdlib.g:9680:2: rule__LibOperationCS__Group__7__Impl rule__LibOperationCS__Group__8
+            // InternalOCLstdlib.g:9681:1: ( rule__LibOperationCS__Group__7__Impl rule__LibOperationCS__Group__8 )
+            // InternalOCLstdlib.g:9682:2: rule__LibOperationCS__Group__7__Impl rule__LibOperationCS__Group__8
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibOperationCS__Group__7__Impl();
@@ -30009,17 +30009,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__7__Impl"
-    // InternalOCLstdlib.g:9687:1: rule__LibOperationCS__Group__7__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:9689:1: rule__LibOperationCS__Group__7__Impl : ( ':' ) ;
     public final void rule__LibOperationCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9691:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:9692:1: ( ':' )
+            // InternalOCLstdlib.g:9693:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:9694:1: ( ':' )
             {
-            // InternalOCLstdlib.g:9692:1: ( ':' )
-            // InternalOCLstdlib.g:9693:1: ':'
+            // InternalOCLstdlib.g:9694:1: ( ':' )
+            // InternalOCLstdlib.g:9695:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getColonKeyword_7());
@@ -30050,14 +30050,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__8"
-    // InternalOCLstdlib.g:9706:1: rule__LibOperationCS__Group__8 : rule__LibOperationCS__Group__8__Impl rule__LibOperationCS__Group__9 ;
+    // InternalOCLstdlib.g:9708:1: rule__LibOperationCS__Group__8 : rule__LibOperationCS__Group__8__Impl rule__LibOperationCS__Group__9 ;
     public final void rule__LibOperationCS__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9710:1: ( rule__LibOperationCS__Group__8__Impl rule__LibOperationCS__Group__9 )
-            // InternalOCLstdlib.g:9711:2: rule__LibOperationCS__Group__8__Impl rule__LibOperationCS__Group__9
+            // InternalOCLstdlib.g:9712:1: ( rule__LibOperationCS__Group__8__Impl rule__LibOperationCS__Group__9 )
+            // InternalOCLstdlib.g:9713:2: rule__LibOperationCS__Group__8__Impl rule__LibOperationCS__Group__9
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__LibOperationCS__Group__8__Impl();
@@ -30088,23 +30088,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__8__Impl"
-    // InternalOCLstdlib.g:9718:1: rule__LibOperationCS__Group__8__Impl : ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) ) ;
+    // InternalOCLstdlib.g:9720:1: rule__LibOperationCS__Group__8__Impl : ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) ) ;
     public final void rule__LibOperationCS__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9722:1: ( ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) ) )
-            // InternalOCLstdlib.g:9723:1: ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) )
+            // InternalOCLstdlib.g:9724:1: ( ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) ) )
+            // InternalOCLstdlib.g:9725:1: ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) )
             {
-            // InternalOCLstdlib.g:9723:1: ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) )
-            // InternalOCLstdlib.g:9724:1: ( rule__LibOperationCS__OwnedTypeAssignment_8 )
+            // InternalOCLstdlib.g:9725:1: ( ( rule__LibOperationCS__OwnedTypeAssignment_8 ) )
+            // InternalOCLstdlib.g:9726:1: ( rule__LibOperationCS__OwnedTypeAssignment_8 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedTypeAssignment_8());
             }
-            // InternalOCLstdlib.g:9725:1: ( rule__LibOperationCS__OwnedTypeAssignment_8 )
-            // InternalOCLstdlib.g:9725:2: rule__LibOperationCS__OwnedTypeAssignment_8
+            // InternalOCLstdlib.g:9727:1: ( rule__LibOperationCS__OwnedTypeAssignment_8 )
+            // InternalOCLstdlib.g:9727:2: rule__LibOperationCS__OwnedTypeAssignment_8
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__OwnedTypeAssignment_8();
@@ -30139,14 +30139,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__9"
-    // InternalOCLstdlib.g:9735:1: rule__LibOperationCS__Group__9 : rule__LibOperationCS__Group__9__Impl rule__LibOperationCS__Group__10 ;
+    // InternalOCLstdlib.g:9737:1: rule__LibOperationCS__Group__9 : rule__LibOperationCS__Group__9__Impl rule__LibOperationCS__Group__10 ;
     public final void rule__LibOperationCS__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9739:1: ( rule__LibOperationCS__Group__9__Impl rule__LibOperationCS__Group__10 )
-            // InternalOCLstdlib.g:9740:2: rule__LibOperationCS__Group__9__Impl rule__LibOperationCS__Group__10
+            // InternalOCLstdlib.g:9741:1: ( rule__LibOperationCS__Group__9__Impl rule__LibOperationCS__Group__10 )
+            // InternalOCLstdlib.g:9742:2: rule__LibOperationCS__Group__9__Impl rule__LibOperationCS__Group__10
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__LibOperationCS__Group__9__Impl();
@@ -30177,22 +30177,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__9__Impl"
-    // InternalOCLstdlib.g:9747:1: rule__LibOperationCS__Group__9__Impl : ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? ) ;
+    // InternalOCLstdlib.g:9749:1: rule__LibOperationCS__Group__9__Impl : ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? ) ;
     public final void rule__LibOperationCS__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9751:1: ( ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? ) )
-            // InternalOCLstdlib.g:9752:1: ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? )
+            // InternalOCLstdlib.g:9753:1: ( ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? ) )
+            // InternalOCLstdlib.g:9754:1: ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? )
             {
-            // InternalOCLstdlib.g:9752:1: ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? )
-            // InternalOCLstdlib.g:9753:1: ( rule__LibOperationCS__IsValidatingAssignment_9 )?
+            // InternalOCLstdlib.g:9754:1: ( ( rule__LibOperationCS__IsValidatingAssignment_9 )? )
+            // InternalOCLstdlib.g:9755:1: ( rule__LibOperationCS__IsValidatingAssignment_9 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsValidatingAssignment_9());
             }
-            // InternalOCLstdlib.g:9754:1: ( rule__LibOperationCS__IsValidatingAssignment_9 )?
+            // InternalOCLstdlib.g:9756:1: ( rule__LibOperationCS__IsValidatingAssignment_9 )?
             int alt94=2;
             int LA94_0 = input.LA(1);
 
@@ -30201,7 +30201,7 @@
             }
             switch (alt94) {
                 case 1 :
-                    // InternalOCLstdlib.g:9754:2: rule__LibOperationCS__IsValidatingAssignment_9
+                    // InternalOCLstdlib.g:9756:2: rule__LibOperationCS__IsValidatingAssignment_9
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__IsValidatingAssignment_9();
@@ -30239,14 +30239,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__10"
-    // InternalOCLstdlib.g:9764:1: rule__LibOperationCS__Group__10 : rule__LibOperationCS__Group__10__Impl rule__LibOperationCS__Group__11 ;
+    // InternalOCLstdlib.g:9766:1: rule__LibOperationCS__Group__10 : rule__LibOperationCS__Group__10__Impl rule__LibOperationCS__Group__11 ;
     public final void rule__LibOperationCS__Group__10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9768:1: ( rule__LibOperationCS__Group__10__Impl rule__LibOperationCS__Group__11 )
-            // InternalOCLstdlib.g:9769:2: rule__LibOperationCS__Group__10__Impl rule__LibOperationCS__Group__11
+            // InternalOCLstdlib.g:9770:1: ( rule__LibOperationCS__Group__10__Impl rule__LibOperationCS__Group__11 )
+            // InternalOCLstdlib.g:9771:2: rule__LibOperationCS__Group__10__Impl rule__LibOperationCS__Group__11
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__LibOperationCS__Group__10__Impl();
@@ -30277,22 +30277,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__10__Impl"
-    // InternalOCLstdlib.g:9776:1: rule__LibOperationCS__Group__10__Impl : ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? ) ;
+    // InternalOCLstdlib.g:9778:1: rule__LibOperationCS__Group__10__Impl : ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? ) ;
     public final void rule__LibOperationCS__Group__10__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9780:1: ( ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? ) )
-            // InternalOCLstdlib.g:9781:1: ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? )
+            // InternalOCLstdlib.g:9782:1: ( ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? ) )
+            // InternalOCLstdlib.g:9783:1: ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? )
             {
-            // InternalOCLstdlib.g:9781:1: ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? )
-            // InternalOCLstdlib.g:9782:1: ( rule__LibOperationCS__IsInvalidatingAssignment_10 )?
+            // InternalOCLstdlib.g:9783:1: ( ( rule__LibOperationCS__IsInvalidatingAssignment_10 )? )
+            // InternalOCLstdlib.g:9784:1: ( rule__LibOperationCS__IsInvalidatingAssignment_10 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsInvalidatingAssignment_10());
             }
-            // InternalOCLstdlib.g:9783:1: ( rule__LibOperationCS__IsInvalidatingAssignment_10 )?
+            // InternalOCLstdlib.g:9785:1: ( rule__LibOperationCS__IsInvalidatingAssignment_10 )?
             int alt95=2;
             int LA95_0 = input.LA(1);
 
@@ -30301,7 +30301,7 @@
             }
             switch (alt95) {
                 case 1 :
-                    // InternalOCLstdlib.g:9783:2: rule__LibOperationCS__IsInvalidatingAssignment_10
+                    // InternalOCLstdlib.g:9785:2: rule__LibOperationCS__IsInvalidatingAssignment_10
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__IsInvalidatingAssignment_10();
@@ -30339,14 +30339,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__11"
-    // InternalOCLstdlib.g:9793:1: rule__LibOperationCS__Group__11 : rule__LibOperationCS__Group__11__Impl rule__LibOperationCS__Group__12 ;
+    // InternalOCLstdlib.g:9795:1: rule__LibOperationCS__Group__11 : rule__LibOperationCS__Group__11__Impl rule__LibOperationCS__Group__12 ;
     public final void rule__LibOperationCS__Group__11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9797:1: ( rule__LibOperationCS__Group__11__Impl rule__LibOperationCS__Group__12 )
-            // InternalOCLstdlib.g:9798:2: rule__LibOperationCS__Group__11__Impl rule__LibOperationCS__Group__12
+            // InternalOCLstdlib.g:9799:1: ( rule__LibOperationCS__Group__11__Impl rule__LibOperationCS__Group__12 )
+            // InternalOCLstdlib.g:9800:2: rule__LibOperationCS__Group__11__Impl rule__LibOperationCS__Group__12
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__LibOperationCS__Group__11__Impl();
@@ -30377,22 +30377,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__11__Impl"
-    // InternalOCLstdlib.g:9805:1: rule__LibOperationCS__Group__11__Impl : ( ( rule__LibOperationCS__Group_11__0 )? ) ;
+    // InternalOCLstdlib.g:9807:1: rule__LibOperationCS__Group__11__Impl : ( ( rule__LibOperationCS__Group_11__0 )? ) ;
     public final void rule__LibOperationCS__Group__11__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9809:1: ( ( ( rule__LibOperationCS__Group_11__0 )? ) )
-            // InternalOCLstdlib.g:9810:1: ( ( rule__LibOperationCS__Group_11__0 )? )
+            // InternalOCLstdlib.g:9811:1: ( ( ( rule__LibOperationCS__Group_11__0 )? ) )
+            // InternalOCLstdlib.g:9812:1: ( ( rule__LibOperationCS__Group_11__0 )? )
             {
-            // InternalOCLstdlib.g:9810:1: ( ( rule__LibOperationCS__Group_11__0 )? )
-            // InternalOCLstdlib.g:9811:1: ( rule__LibOperationCS__Group_11__0 )?
+            // InternalOCLstdlib.g:9812:1: ( ( rule__LibOperationCS__Group_11__0 )? )
+            // InternalOCLstdlib.g:9813:1: ( rule__LibOperationCS__Group_11__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getGroup_11());
             }
-            // InternalOCLstdlib.g:9812:1: ( rule__LibOperationCS__Group_11__0 )?
+            // InternalOCLstdlib.g:9814:1: ( rule__LibOperationCS__Group_11__0 )?
             int alt96=2;
             int LA96_0 = input.LA(1);
 
@@ -30401,7 +30401,7 @@
             }
             switch (alt96) {
                 case 1 :
-                    // InternalOCLstdlib.g:9812:2: rule__LibOperationCS__Group_11__0
+                    // InternalOCLstdlib.g:9814:2: rule__LibOperationCS__Group_11__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__Group_11__0();
@@ -30439,14 +30439,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__12"
-    // InternalOCLstdlib.g:9822:1: rule__LibOperationCS__Group__12 : rule__LibOperationCS__Group__12__Impl rule__LibOperationCS__Group__13 ;
+    // InternalOCLstdlib.g:9824:1: rule__LibOperationCS__Group__12 : rule__LibOperationCS__Group__12__Impl rule__LibOperationCS__Group__13 ;
     public final void rule__LibOperationCS__Group__12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9826:1: ( rule__LibOperationCS__Group__12__Impl rule__LibOperationCS__Group__13 )
-            // InternalOCLstdlib.g:9827:2: rule__LibOperationCS__Group__12__Impl rule__LibOperationCS__Group__13
+            // InternalOCLstdlib.g:9828:1: ( rule__LibOperationCS__Group__12__Impl rule__LibOperationCS__Group__13 )
+            // InternalOCLstdlib.g:9829:2: rule__LibOperationCS__Group__12__Impl rule__LibOperationCS__Group__13
             {
             pushFollow(FollowSets000.FOLLOW_46);
             rule__LibOperationCS__Group__12__Impl();
@@ -30477,22 +30477,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__12__Impl"
-    // InternalOCLstdlib.g:9834:1: rule__LibOperationCS__Group__12__Impl : ( ( rule__LibOperationCS__Group_12__0 )? ) ;
+    // InternalOCLstdlib.g:9836:1: rule__LibOperationCS__Group__12__Impl : ( ( rule__LibOperationCS__Group_12__0 )? ) ;
     public final void rule__LibOperationCS__Group__12__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9838:1: ( ( ( rule__LibOperationCS__Group_12__0 )? ) )
-            // InternalOCLstdlib.g:9839:1: ( ( rule__LibOperationCS__Group_12__0 )? )
+            // InternalOCLstdlib.g:9840:1: ( ( ( rule__LibOperationCS__Group_12__0 )? ) )
+            // InternalOCLstdlib.g:9841:1: ( ( rule__LibOperationCS__Group_12__0 )? )
             {
-            // InternalOCLstdlib.g:9839:1: ( ( rule__LibOperationCS__Group_12__0 )? )
-            // InternalOCLstdlib.g:9840:1: ( rule__LibOperationCS__Group_12__0 )?
+            // InternalOCLstdlib.g:9841:1: ( ( rule__LibOperationCS__Group_12__0 )? )
+            // InternalOCLstdlib.g:9842:1: ( rule__LibOperationCS__Group_12__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getGroup_12());
             }
-            // InternalOCLstdlib.g:9841:1: ( rule__LibOperationCS__Group_12__0 )?
+            // InternalOCLstdlib.g:9843:1: ( rule__LibOperationCS__Group_12__0 )?
             int alt97=2;
             int LA97_0 = input.LA(1);
 
@@ -30501,7 +30501,7 @@
             }
             switch (alt97) {
                 case 1 :
-                    // InternalOCLstdlib.g:9841:2: rule__LibOperationCS__Group_12__0
+                    // InternalOCLstdlib.g:9843:2: rule__LibOperationCS__Group_12__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibOperationCS__Group_12__0();
@@ -30539,14 +30539,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__13"
-    // InternalOCLstdlib.g:9851:1: rule__LibOperationCS__Group__13 : rule__LibOperationCS__Group__13__Impl ;
+    // InternalOCLstdlib.g:9853:1: rule__LibOperationCS__Group__13 : rule__LibOperationCS__Group__13__Impl ;
     public final void rule__LibOperationCS__Group__13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9855:1: ( rule__LibOperationCS__Group__13__Impl )
-            // InternalOCLstdlib.g:9856:2: rule__LibOperationCS__Group__13__Impl
+            // InternalOCLstdlib.g:9857:1: ( rule__LibOperationCS__Group__13__Impl )
+            // InternalOCLstdlib.g:9858:2: rule__LibOperationCS__Group__13__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group__13__Impl();
@@ -30572,23 +30572,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group__13__Impl"
-    // InternalOCLstdlib.g:9862:1: rule__LibOperationCS__Group__13__Impl : ( ( rule__LibOperationCS__Alternatives_13 ) ) ;
+    // InternalOCLstdlib.g:9864:1: rule__LibOperationCS__Group__13__Impl : ( ( rule__LibOperationCS__Alternatives_13 ) ) ;
     public final void rule__LibOperationCS__Group__13__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9866:1: ( ( ( rule__LibOperationCS__Alternatives_13 ) ) )
-            // InternalOCLstdlib.g:9867:1: ( ( rule__LibOperationCS__Alternatives_13 ) )
+            // InternalOCLstdlib.g:9868:1: ( ( ( rule__LibOperationCS__Alternatives_13 ) ) )
+            // InternalOCLstdlib.g:9869:1: ( ( rule__LibOperationCS__Alternatives_13 ) )
             {
-            // InternalOCLstdlib.g:9867:1: ( ( rule__LibOperationCS__Alternatives_13 ) )
-            // InternalOCLstdlib.g:9868:1: ( rule__LibOperationCS__Alternatives_13 )
+            // InternalOCLstdlib.g:9869:1: ( ( rule__LibOperationCS__Alternatives_13 ) )
+            // InternalOCLstdlib.g:9870:1: ( rule__LibOperationCS__Alternatives_13 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getAlternatives_13());
             }
-            // InternalOCLstdlib.g:9869:1: ( rule__LibOperationCS__Alternatives_13 )
-            // InternalOCLstdlib.g:9869:2: rule__LibOperationCS__Alternatives_13
+            // InternalOCLstdlib.g:9871:1: ( rule__LibOperationCS__Alternatives_13 )
+            // InternalOCLstdlib.g:9871:2: rule__LibOperationCS__Alternatives_13
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Alternatives_13();
@@ -30623,14 +30623,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5__0"
-    // InternalOCLstdlib.g:9907:1: rule__LibOperationCS__Group_5__0 : rule__LibOperationCS__Group_5__0__Impl rule__LibOperationCS__Group_5__1 ;
+    // InternalOCLstdlib.g:9909:1: rule__LibOperationCS__Group_5__0 : rule__LibOperationCS__Group_5__0__Impl rule__LibOperationCS__Group_5__1 ;
     public final void rule__LibOperationCS__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9911:1: ( rule__LibOperationCS__Group_5__0__Impl rule__LibOperationCS__Group_5__1 )
-            // InternalOCLstdlib.g:9912:2: rule__LibOperationCS__Group_5__0__Impl rule__LibOperationCS__Group_5__1
+            // InternalOCLstdlib.g:9913:1: ( rule__LibOperationCS__Group_5__0__Impl rule__LibOperationCS__Group_5__1 )
+            // InternalOCLstdlib.g:9914:2: rule__LibOperationCS__Group_5__0__Impl rule__LibOperationCS__Group_5__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__LibOperationCS__Group_5__0__Impl();
@@ -30661,23 +30661,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5__0__Impl"
-    // InternalOCLstdlib.g:9919:1: rule__LibOperationCS__Group_5__0__Impl : ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) ) ;
+    // InternalOCLstdlib.g:9921:1: rule__LibOperationCS__Group_5__0__Impl : ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) ) ;
     public final void rule__LibOperationCS__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9923:1: ( ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) ) )
-            // InternalOCLstdlib.g:9924:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) )
+            // InternalOCLstdlib.g:9925:1: ( ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) ) )
+            // InternalOCLstdlib.g:9926:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) )
             {
-            // InternalOCLstdlib.g:9924:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) )
-            // InternalOCLstdlib.g:9925:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_0 )
+            // InternalOCLstdlib.g:9926:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_0 ) )
+            // InternalOCLstdlib.g:9927:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedParametersAssignment_5_0());
             }
-            // InternalOCLstdlib.g:9926:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_0 )
-            // InternalOCLstdlib.g:9926:2: rule__LibOperationCS__OwnedParametersAssignment_5_0
+            // InternalOCLstdlib.g:9928:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_0 )
+            // InternalOCLstdlib.g:9928:2: rule__LibOperationCS__OwnedParametersAssignment_5_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__OwnedParametersAssignment_5_0();
@@ -30712,14 +30712,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5__1"
-    // InternalOCLstdlib.g:9936:1: rule__LibOperationCS__Group_5__1 : rule__LibOperationCS__Group_5__1__Impl ;
+    // InternalOCLstdlib.g:9938:1: rule__LibOperationCS__Group_5__1 : rule__LibOperationCS__Group_5__1__Impl ;
     public final void rule__LibOperationCS__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9940:1: ( rule__LibOperationCS__Group_5__1__Impl )
-            // InternalOCLstdlib.g:9941:2: rule__LibOperationCS__Group_5__1__Impl
+            // InternalOCLstdlib.g:9942:1: ( rule__LibOperationCS__Group_5__1__Impl )
+            // InternalOCLstdlib.g:9943:2: rule__LibOperationCS__Group_5__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group_5__1__Impl();
@@ -30745,22 +30745,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5__1__Impl"
-    // InternalOCLstdlib.g:9947:1: rule__LibOperationCS__Group_5__1__Impl : ( ( rule__LibOperationCS__Group_5_1__0 )* ) ;
+    // InternalOCLstdlib.g:9949:1: rule__LibOperationCS__Group_5__1__Impl : ( ( rule__LibOperationCS__Group_5_1__0 )* ) ;
     public final void rule__LibOperationCS__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9951:1: ( ( ( rule__LibOperationCS__Group_5_1__0 )* ) )
-            // InternalOCLstdlib.g:9952:1: ( ( rule__LibOperationCS__Group_5_1__0 )* )
+            // InternalOCLstdlib.g:9953:1: ( ( ( rule__LibOperationCS__Group_5_1__0 )* ) )
+            // InternalOCLstdlib.g:9954:1: ( ( rule__LibOperationCS__Group_5_1__0 )* )
             {
-            // InternalOCLstdlib.g:9952:1: ( ( rule__LibOperationCS__Group_5_1__0 )* )
-            // InternalOCLstdlib.g:9953:1: ( rule__LibOperationCS__Group_5_1__0 )*
+            // InternalOCLstdlib.g:9954:1: ( ( rule__LibOperationCS__Group_5_1__0 )* )
+            // InternalOCLstdlib.g:9955:1: ( rule__LibOperationCS__Group_5_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getGroup_5_1());
             }
-            // InternalOCLstdlib.g:9954:1: ( rule__LibOperationCS__Group_5_1__0 )*
+            // InternalOCLstdlib.g:9956:1: ( rule__LibOperationCS__Group_5_1__0 )*
             loop98:
             do {
                 int alt98=2;
@@ -30773,7 +30773,7 @@
 
                 switch (alt98) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9954:2: rule__LibOperationCS__Group_5_1__0
+            	    // InternalOCLstdlib.g:9956:2: rule__LibOperationCS__Group_5_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LibOperationCS__Group_5_1__0();
@@ -30814,14 +30814,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5_1__0"
-    // InternalOCLstdlib.g:9968:1: rule__LibOperationCS__Group_5_1__0 : rule__LibOperationCS__Group_5_1__0__Impl rule__LibOperationCS__Group_5_1__1 ;
+    // InternalOCLstdlib.g:9970:1: rule__LibOperationCS__Group_5_1__0 : rule__LibOperationCS__Group_5_1__0__Impl rule__LibOperationCS__Group_5_1__1 ;
     public final void rule__LibOperationCS__Group_5_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9972:1: ( rule__LibOperationCS__Group_5_1__0__Impl rule__LibOperationCS__Group_5_1__1 )
-            // InternalOCLstdlib.g:9973:2: rule__LibOperationCS__Group_5_1__0__Impl rule__LibOperationCS__Group_5_1__1
+            // InternalOCLstdlib.g:9974:1: ( rule__LibOperationCS__Group_5_1__0__Impl rule__LibOperationCS__Group_5_1__1 )
+            // InternalOCLstdlib.g:9975:2: rule__LibOperationCS__Group_5_1__0__Impl rule__LibOperationCS__Group_5_1__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibOperationCS__Group_5_1__0__Impl();
@@ -30852,17 +30852,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5_1__0__Impl"
-    // InternalOCLstdlib.g:9980:1: rule__LibOperationCS__Group_5_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:9982:1: rule__LibOperationCS__Group_5_1__0__Impl : ( ',' ) ;
     public final void rule__LibOperationCS__Group_5_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:9984:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:9985:1: ( ',' )
+            // InternalOCLstdlib.g:9986:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:9987:1: ( ',' )
             {
-            // InternalOCLstdlib.g:9985:1: ( ',' )
-            // InternalOCLstdlib.g:9986:1: ','
+            // InternalOCLstdlib.g:9987:1: ( ',' )
+            // InternalOCLstdlib.g:9988:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getCommaKeyword_5_1_0());
@@ -30893,14 +30893,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5_1__1"
-    // InternalOCLstdlib.g:9999:1: rule__LibOperationCS__Group_5_1__1 : rule__LibOperationCS__Group_5_1__1__Impl ;
+    // InternalOCLstdlib.g:10001:1: rule__LibOperationCS__Group_5_1__1 : rule__LibOperationCS__Group_5_1__1__Impl ;
     public final void rule__LibOperationCS__Group_5_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10003:1: ( rule__LibOperationCS__Group_5_1__1__Impl )
-            // InternalOCLstdlib.g:10004:2: rule__LibOperationCS__Group_5_1__1__Impl
+            // InternalOCLstdlib.g:10005:1: ( rule__LibOperationCS__Group_5_1__1__Impl )
+            // InternalOCLstdlib.g:10006:2: rule__LibOperationCS__Group_5_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group_5_1__1__Impl();
@@ -30926,23 +30926,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_5_1__1__Impl"
-    // InternalOCLstdlib.g:10010:1: rule__LibOperationCS__Group_5_1__1__Impl : ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) ) ;
+    // InternalOCLstdlib.g:10012:1: rule__LibOperationCS__Group_5_1__1__Impl : ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) ) ;
     public final void rule__LibOperationCS__Group_5_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10014:1: ( ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) ) )
-            // InternalOCLstdlib.g:10015:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) )
+            // InternalOCLstdlib.g:10016:1: ( ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) ) )
+            // InternalOCLstdlib.g:10017:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) )
             {
-            // InternalOCLstdlib.g:10015:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) )
-            // InternalOCLstdlib.g:10016:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 )
+            // InternalOCLstdlib.g:10017:1: ( ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 ) )
+            // InternalOCLstdlib.g:10018:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedParametersAssignment_5_1_1());
             }
-            // InternalOCLstdlib.g:10017:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 )
-            // InternalOCLstdlib.g:10017:2: rule__LibOperationCS__OwnedParametersAssignment_5_1_1
+            // InternalOCLstdlib.g:10019:1: ( rule__LibOperationCS__OwnedParametersAssignment_5_1_1 )
+            // InternalOCLstdlib.g:10019:2: rule__LibOperationCS__OwnedParametersAssignment_5_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__OwnedParametersAssignment_5_1_1();
@@ -30977,14 +30977,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_11__0"
-    // InternalOCLstdlib.g:10031:1: rule__LibOperationCS__Group_11__0 : rule__LibOperationCS__Group_11__0__Impl rule__LibOperationCS__Group_11__1 ;
+    // InternalOCLstdlib.g:10033:1: rule__LibOperationCS__Group_11__0 : rule__LibOperationCS__Group_11__0__Impl rule__LibOperationCS__Group_11__1 ;
     public final void rule__LibOperationCS__Group_11__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10035:1: ( rule__LibOperationCS__Group_11__0__Impl rule__LibOperationCS__Group_11__1 )
-            // InternalOCLstdlib.g:10036:2: rule__LibOperationCS__Group_11__0__Impl rule__LibOperationCS__Group_11__1
+            // InternalOCLstdlib.g:10037:1: ( rule__LibOperationCS__Group_11__0__Impl rule__LibOperationCS__Group_11__1 )
+            // InternalOCLstdlib.g:10038:2: rule__LibOperationCS__Group_11__0__Impl rule__LibOperationCS__Group_11__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__LibOperationCS__Group_11__0__Impl();
@@ -31015,17 +31015,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_11__0__Impl"
-    // InternalOCLstdlib.g:10043:1: rule__LibOperationCS__Group_11__0__Impl : ( 'precedence' ) ;
+    // InternalOCLstdlib.g:10045:1: rule__LibOperationCS__Group_11__0__Impl : ( 'precedence' ) ;
     public final void rule__LibOperationCS__Group_11__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10047:1: ( ( 'precedence' ) )
-            // InternalOCLstdlib.g:10048:1: ( 'precedence' )
+            // InternalOCLstdlib.g:10049:1: ( ( 'precedence' ) )
+            // InternalOCLstdlib.g:10050:1: ( 'precedence' )
             {
-            // InternalOCLstdlib.g:10048:1: ( 'precedence' )
-            // InternalOCLstdlib.g:10049:1: 'precedence'
+            // InternalOCLstdlib.g:10050:1: ( 'precedence' )
+            // InternalOCLstdlib.g:10051:1: 'precedence'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getPrecedenceKeyword_11_0());
@@ -31056,14 +31056,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_11__1"
-    // InternalOCLstdlib.g:10062:1: rule__LibOperationCS__Group_11__1 : rule__LibOperationCS__Group_11__1__Impl rule__LibOperationCS__Group_11__2 ;
+    // InternalOCLstdlib.g:10064:1: rule__LibOperationCS__Group_11__1 : rule__LibOperationCS__Group_11__1__Impl rule__LibOperationCS__Group_11__2 ;
     public final void rule__LibOperationCS__Group_11__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10066:1: ( rule__LibOperationCS__Group_11__1__Impl rule__LibOperationCS__Group_11__2 )
-            // InternalOCLstdlib.g:10067:2: rule__LibOperationCS__Group_11__1__Impl rule__LibOperationCS__Group_11__2
+            // InternalOCLstdlib.g:10068:1: ( rule__LibOperationCS__Group_11__1__Impl rule__LibOperationCS__Group_11__2 )
+            // InternalOCLstdlib.g:10069:2: rule__LibOperationCS__Group_11__1__Impl rule__LibOperationCS__Group_11__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibOperationCS__Group_11__1__Impl();
@@ -31094,17 +31094,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_11__1__Impl"
-    // InternalOCLstdlib.g:10074:1: rule__LibOperationCS__Group_11__1__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:10076:1: rule__LibOperationCS__Group_11__1__Impl : ( '=' ) ;
     public final void rule__LibOperationCS__Group_11__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10078:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:10079:1: ( '=' )
+            // InternalOCLstdlib.g:10080:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:10081:1: ( '=' )
             {
-            // InternalOCLstdlib.g:10079:1: ( '=' )
-            // InternalOCLstdlib.g:10080:1: '='
+            // InternalOCLstdlib.g:10081:1: ( '=' )
+            // InternalOCLstdlib.g:10082:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getEqualsSignKeyword_11_1());
@@ -31135,14 +31135,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_11__2"
-    // InternalOCLstdlib.g:10093:1: rule__LibOperationCS__Group_11__2 : rule__LibOperationCS__Group_11__2__Impl ;
+    // InternalOCLstdlib.g:10095:1: rule__LibOperationCS__Group_11__2 : rule__LibOperationCS__Group_11__2__Impl ;
     public final void rule__LibOperationCS__Group_11__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10097:1: ( rule__LibOperationCS__Group_11__2__Impl )
-            // InternalOCLstdlib.g:10098:2: rule__LibOperationCS__Group_11__2__Impl
+            // InternalOCLstdlib.g:10099:1: ( rule__LibOperationCS__Group_11__2__Impl )
+            // InternalOCLstdlib.g:10100:2: rule__LibOperationCS__Group_11__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group_11__2__Impl();
@@ -31168,23 +31168,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_11__2__Impl"
-    // InternalOCLstdlib.g:10104:1: rule__LibOperationCS__Group_11__2__Impl : ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) ) ;
+    // InternalOCLstdlib.g:10106:1: rule__LibOperationCS__Group_11__2__Impl : ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) ) ;
     public final void rule__LibOperationCS__Group_11__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10108:1: ( ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) ) )
-            // InternalOCLstdlib.g:10109:1: ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) )
+            // InternalOCLstdlib.g:10110:1: ( ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) ) )
+            // InternalOCLstdlib.g:10111:1: ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) )
             {
-            // InternalOCLstdlib.g:10109:1: ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) )
-            // InternalOCLstdlib.g:10110:1: ( rule__LibOperationCS__PrecedenceAssignment_11_2 )
+            // InternalOCLstdlib.g:10111:1: ( ( rule__LibOperationCS__PrecedenceAssignment_11_2 ) )
+            // InternalOCLstdlib.g:10112:1: ( rule__LibOperationCS__PrecedenceAssignment_11_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getPrecedenceAssignment_11_2());
             }
-            // InternalOCLstdlib.g:10111:1: ( rule__LibOperationCS__PrecedenceAssignment_11_2 )
-            // InternalOCLstdlib.g:10111:2: rule__LibOperationCS__PrecedenceAssignment_11_2
+            // InternalOCLstdlib.g:10113:1: ( rule__LibOperationCS__PrecedenceAssignment_11_2 )
+            // InternalOCLstdlib.g:10113:2: rule__LibOperationCS__PrecedenceAssignment_11_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__PrecedenceAssignment_11_2();
@@ -31219,14 +31219,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_12__0"
-    // InternalOCLstdlib.g:10127:1: rule__LibOperationCS__Group_12__0 : rule__LibOperationCS__Group_12__0__Impl rule__LibOperationCS__Group_12__1 ;
+    // InternalOCLstdlib.g:10129:1: rule__LibOperationCS__Group_12__0 : rule__LibOperationCS__Group_12__0__Impl rule__LibOperationCS__Group_12__1 ;
     public final void rule__LibOperationCS__Group_12__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10131:1: ( rule__LibOperationCS__Group_12__0__Impl rule__LibOperationCS__Group_12__1 )
-            // InternalOCLstdlib.g:10132:2: rule__LibOperationCS__Group_12__0__Impl rule__LibOperationCS__Group_12__1
+            // InternalOCLstdlib.g:10133:1: ( rule__LibOperationCS__Group_12__0__Impl rule__LibOperationCS__Group_12__1 )
+            // InternalOCLstdlib.g:10134:2: rule__LibOperationCS__Group_12__0__Impl rule__LibOperationCS__Group_12__1
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__LibOperationCS__Group_12__0__Impl();
@@ -31257,17 +31257,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_12__0__Impl"
-    // InternalOCLstdlib.g:10139:1: rule__LibOperationCS__Group_12__0__Impl : ( '=>' ) ;
+    // InternalOCLstdlib.g:10141:1: rule__LibOperationCS__Group_12__0__Impl : ( '=>' ) ;
     public final void rule__LibOperationCS__Group_12__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10143:1: ( ( '=>' ) )
-            // InternalOCLstdlib.g:10144:1: ( '=>' )
+            // InternalOCLstdlib.g:10145:1: ( ( '=>' ) )
+            // InternalOCLstdlib.g:10146:1: ( '=>' )
             {
-            // InternalOCLstdlib.g:10144:1: ( '=>' )
-            // InternalOCLstdlib.g:10145:1: '=>'
+            // InternalOCLstdlib.g:10146:1: ( '=>' )
+            // InternalOCLstdlib.g:10147:1: '=>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getEqualsSignGreaterThanSignKeyword_12_0());
@@ -31298,14 +31298,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_12__1"
-    // InternalOCLstdlib.g:10158:1: rule__LibOperationCS__Group_12__1 : rule__LibOperationCS__Group_12__1__Impl ;
+    // InternalOCLstdlib.g:10160:1: rule__LibOperationCS__Group_12__1 : rule__LibOperationCS__Group_12__1__Impl ;
     public final void rule__LibOperationCS__Group_12__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10162:1: ( rule__LibOperationCS__Group_12__1__Impl )
-            // InternalOCLstdlib.g:10163:2: rule__LibOperationCS__Group_12__1__Impl
+            // InternalOCLstdlib.g:10164:1: ( rule__LibOperationCS__Group_12__1__Impl )
+            // InternalOCLstdlib.g:10165:2: rule__LibOperationCS__Group_12__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group_12__1__Impl();
@@ -31331,23 +31331,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_12__1__Impl"
-    // InternalOCLstdlib.g:10169:1: rule__LibOperationCS__Group_12__1__Impl : ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) ) ;
+    // InternalOCLstdlib.g:10171:1: rule__LibOperationCS__Group_12__1__Impl : ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) ) ;
     public final void rule__LibOperationCS__Group_12__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10173:1: ( ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) ) )
-            // InternalOCLstdlib.g:10174:1: ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) )
+            // InternalOCLstdlib.g:10175:1: ( ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) ) )
+            // InternalOCLstdlib.g:10176:1: ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) )
             {
-            // InternalOCLstdlib.g:10174:1: ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) )
-            // InternalOCLstdlib.g:10175:1: ( rule__LibOperationCS__ImplementationAssignment_12_1 )
+            // InternalOCLstdlib.g:10176:1: ( ( rule__LibOperationCS__ImplementationAssignment_12_1 ) )
+            // InternalOCLstdlib.g:10177:1: ( rule__LibOperationCS__ImplementationAssignment_12_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getImplementationAssignment_12_1());
             }
-            // InternalOCLstdlib.g:10176:1: ( rule__LibOperationCS__ImplementationAssignment_12_1 )
-            // InternalOCLstdlib.g:10176:2: rule__LibOperationCS__ImplementationAssignment_12_1
+            // InternalOCLstdlib.g:10178:1: ( rule__LibOperationCS__ImplementationAssignment_12_1 )
+            // InternalOCLstdlib.g:10178:2: rule__LibOperationCS__ImplementationAssignment_12_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__ImplementationAssignment_12_1();
@@ -31382,14 +31382,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0__0"
-    // InternalOCLstdlib.g:10190:1: rule__LibOperationCS__Group_13_0__0 : rule__LibOperationCS__Group_13_0__0__Impl rule__LibOperationCS__Group_13_0__1 ;
+    // InternalOCLstdlib.g:10192:1: rule__LibOperationCS__Group_13_0__0 : rule__LibOperationCS__Group_13_0__0__Impl rule__LibOperationCS__Group_13_0__1 ;
     public final void rule__LibOperationCS__Group_13_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10194:1: ( rule__LibOperationCS__Group_13_0__0__Impl rule__LibOperationCS__Group_13_0__1 )
-            // InternalOCLstdlib.g:10195:2: rule__LibOperationCS__Group_13_0__0__Impl rule__LibOperationCS__Group_13_0__1
+            // InternalOCLstdlib.g:10196:1: ( rule__LibOperationCS__Group_13_0__0__Impl rule__LibOperationCS__Group_13_0__1 )
+            // InternalOCLstdlib.g:10197:2: rule__LibOperationCS__Group_13_0__0__Impl rule__LibOperationCS__Group_13_0__1
             {
             pushFollow(FollowSets000.FOLLOW_47);
             rule__LibOperationCS__Group_13_0__0__Impl();
@@ -31420,17 +31420,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0__0__Impl"
-    // InternalOCLstdlib.g:10202:1: rule__LibOperationCS__Group_13_0__0__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:10204:1: rule__LibOperationCS__Group_13_0__0__Impl : ( '{' ) ;
     public final void rule__LibOperationCS__Group_13_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10206:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:10207:1: ( '{' )
+            // InternalOCLstdlib.g:10208:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:10209:1: ( '{' )
             {
-            // InternalOCLstdlib.g:10207:1: ( '{' )
-            // InternalOCLstdlib.g:10208:1: '{'
+            // InternalOCLstdlib.g:10209:1: ( '{' )
+            // InternalOCLstdlib.g:10210:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getLeftCurlyBracketKeyword_13_0_0());
@@ -31461,14 +31461,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0__1"
-    // InternalOCLstdlib.g:10221:1: rule__LibOperationCS__Group_13_0__1 : rule__LibOperationCS__Group_13_0__1__Impl rule__LibOperationCS__Group_13_0__2 ;
+    // InternalOCLstdlib.g:10223:1: rule__LibOperationCS__Group_13_0__1 : rule__LibOperationCS__Group_13_0__1__Impl rule__LibOperationCS__Group_13_0__2 ;
     public final void rule__LibOperationCS__Group_13_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10225:1: ( rule__LibOperationCS__Group_13_0__1__Impl rule__LibOperationCS__Group_13_0__2 )
-            // InternalOCLstdlib.g:10226:2: rule__LibOperationCS__Group_13_0__1__Impl rule__LibOperationCS__Group_13_0__2
+            // InternalOCLstdlib.g:10227:1: ( rule__LibOperationCS__Group_13_0__1__Impl rule__LibOperationCS__Group_13_0__2 )
+            // InternalOCLstdlib.g:10228:2: rule__LibOperationCS__Group_13_0__1__Impl rule__LibOperationCS__Group_13_0__2
             {
             pushFollow(FollowSets000.FOLLOW_47);
             rule__LibOperationCS__Group_13_0__1__Impl();
@@ -31499,22 +31499,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0__1__Impl"
-    // InternalOCLstdlib.g:10233:1: rule__LibOperationCS__Group_13_0__1__Impl : ( ( rule__LibOperationCS__Alternatives_13_0_1 )* ) ;
+    // InternalOCLstdlib.g:10235:1: rule__LibOperationCS__Group_13_0__1__Impl : ( ( rule__LibOperationCS__Alternatives_13_0_1 )* ) ;
     public final void rule__LibOperationCS__Group_13_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10237:1: ( ( ( rule__LibOperationCS__Alternatives_13_0_1 )* ) )
-            // InternalOCLstdlib.g:10238:1: ( ( rule__LibOperationCS__Alternatives_13_0_1 )* )
+            // InternalOCLstdlib.g:10239:1: ( ( ( rule__LibOperationCS__Alternatives_13_0_1 )* ) )
+            // InternalOCLstdlib.g:10240:1: ( ( rule__LibOperationCS__Alternatives_13_0_1 )* )
             {
-            // InternalOCLstdlib.g:10238:1: ( ( rule__LibOperationCS__Alternatives_13_0_1 )* )
-            // InternalOCLstdlib.g:10239:1: ( rule__LibOperationCS__Alternatives_13_0_1 )*
+            // InternalOCLstdlib.g:10240:1: ( ( rule__LibOperationCS__Alternatives_13_0_1 )* )
+            // InternalOCLstdlib.g:10241:1: ( rule__LibOperationCS__Alternatives_13_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getAlternatives_13_0_1());
             }
-            // InternalOCLstdlib.g:10240:1: ( rule__LibOperationCS__Alternatives_13_0_1 )*
+            // InternalOCLstdlib.g:10242:1: ( rule__LibOperationCS__Alternatives_13_0_1 )*
             loop99:
             do {
                 int alt99=2;
@@ -31527,7 +31527,7 @@
 
                 switch (alt99) {
             	case 1 :
-            	    // InternalOCLstdlib.g:10240:2: rule__LibOperationCS__Alternatives_13_0_1
+            	    // InternalOCLstdlib.g:10242:2: rule__LibOperationCS__Alternatives_13_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_48);
             	    rule__LibOperationCS__Alternatives_13_0_1();
@@ -31568,14 +31568,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0__2"
-    // InternalOCLstdlib.g:10250:1: rule__LibOperationCS__Group_13_0__2 : rule__LibOperationCS__Group_13_0__2__Impl ;
+    // InternalOCLstdlib.g:10252:1: rule__LibOperationCS__Group_13_0__2 : rule__LibOperationCS__Group_13_0__2__Impl ;
     public final void rule__LibOperationCS__Group_13_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10254:1: ( rule__LibOperationCS__Group_13_0__2__Impl )
-            // InternalOCLstdlib.g:10255:2: rule__LibOperationCS__Group_13_0__2__Impl
+            // InternalOCLstdlib.g:10256:1: ( rule__LibOperationCS__Group_13_0__2__Impl )
+            // InternalOCLstdlib.g:10257:2: rule__LibOperationCS__Group_13_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group_13_0__2__Impl();
@@ -31601,17 +31601,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0__2__Impl"
-    // InternalOCLstdlib.g:10261:1: rule__LibOperationCS__Group_13_0__2__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:10263:1: rule__LibOperationCS__Group_13_0__2__Impl : ( '}' ) ;
     public final void rule__LibOperationCS__Group_13_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10265:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:10266:1: ( '}' )
+            // InternalOCLstdlib.g:10267:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:10268:1: ( '}' )
             {
-            // InternalOCLstdlib.g:10266:1: ( '}' )
-            // InternalOCLstdlib.g:10267:1: '}'
+            // InternalOCLstdlib.g:10268:1: ( '}' )
+            // InternalOCLstdlib.g:10269:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getRightCurlyBracketKeyword_13_0_2());
@@ -31642,14 +31642,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__0"
-    // InternalOCLstdlib.g:10286:1: rule__LibOperationCS__Group_13_0_1_1__0 : rule__LibOperationCS__Group_13_0_1_1__0__Impl rule__LibOperationCS__Group_13_0_1_1__1 ;
+    // InternalOCLstdlib.g:10288:1: rule__LibOperationCS__Group_13_0_1_1__0 : rule__LibOperationCS__Group_13_0_1_1__0__Impl rule__LibOperationCS__Group_13_0_1_1__1 ;
     public final void rule__LibOperationCS__Group_13_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10290:1: ( rule__LibOperationCS__Group_13_0_1_1__0__Impl rule__LibOperationCS__Group_13_0_1_1__1 )
-            // InternalOCLstdlib.g:10291:2: rule__LibOperationCS__Group_13_0_1_1__0__Impl rule__LibOperationCS__Group_13_0_1_1__1
+            // InternalOCLstdlib.g:10292:1: ( rule__LibOperationCS__Group_13_0_1_1__0__Impl rule__LibOperationCS__Group_13_0_1_1__1 )
+            // InternalOCLstdlib.g:10293:2: rule__LibOperationCS__Group_13_0_1_1__0__Impl rule__LibOperationCS__Group_13_0_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__LibOperationCS__Group_13_0_1_1__0__Impl();
@@ -31680,17 +31680,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__0__Impl"
-    // InternalOCLstdlib.g:10298:1: rule__LibOperationCS__Group_13_0_1_1__0__Impl : ( 'body' ) ;
+    // InternalOCLstdlib.g:10300:1: rule__LibOperationCS__Group_13_0_1_1__0__Impl : ( 'body' ) ;
     public final void rule__LibOperationCS__Group_13_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10302:1: ( ( 'body' ) )
-            // InternalOCLstdlib.g:10303:1: ( 'body' )
+            // InternalOCLstdlib.g:10304:1: ( ( 'body' ) )
+            // InternalOCLstdlib.g:10305:1: ( 'body' )
             {
-            // InternalOCLstdlib.g:10303:1: ( 'body' )
-            // InternalOCLstdlib.g:10304:1: 'body'
+            // InternalOCLstdlib.g:10305:1: ( 'body' )
+            // InternalOCLstdlib.g:10306:1: 'body'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getBodyKeyword_13_0_1_1_0());
@@ -31721,14 +31721,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__1"
-    // InternalOCLstdlib.g:10317:1: rule__LibOperationCS__Group_13_0_1_1__1 : rule__LibOperationCS__Group_13_0_1_1__1__Impl rule__LibOperationCS__Group_13_0_1_1__2 ;
+    // InternalOCLstdlib.g:10319:1: rule__LibOperationCS__Group_13_0_1_1__1 : rule__LibOperationCS__Group_13_0_1_1__1__Impl rule__LibOperationCS__Group_13_0_1_1__2 ;
     public final void rule__LibOperationCS__Group_13_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10321:1: ( rule__LibOperationCS__Group_13_0_1_1__1__Impl rule__LibOperationCS__Group_13_0_1_1__2 )
-            // InternalOCLstdlib.g:10322:2: rule__LibOperationCS__Group_13_0_1_1__1__Impl rule__LibOperationCS__Group_13_0_1_1__2
+            // InternalOCLstdlib.g:10323:1: ( rule__LibOperationCS__Group_13_0_1_1__1__Impl rule__LibOperationCS__Group_13_0_1_1__2 )
+            // InternalOCLstdlib.g:10324:2: rule__LibOperationCS__Group_13_0_1_1__1__Impl rule__LibOperationCS__Group_13_0_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__LibOperationCS__Group_13_0_1_1__1__Impl();
@@ -31759,22 +31759,22 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__1__Impl"
-    // InternalOCLstdlib.g:10329:1: rule__LibOperationCS__Group_13_0_1_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
+    // InternalOCLstdlib.g:10331:1: rule__LibOperationCS__Group_13_0_1_1__1__Impl : ( ( ruleUnrestrictedName )? ) ;
     public final void rule__LibOperationCS__Group_13_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10333:1: ( ( ( ruleUnrestrictedName )? ) )
-            // InternalOCLstdlib.g:10334:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLstdlib.g:10335:1: ( ( ( ruleUnrestrictedName )? ) )
+            // InternalOCLstdlib.g:10336:1: ( ( ruleUnrestrictedName )? )
             {
-            // InternalOCLstdlib.g:10334:1: ( ( ruleUnrestrictedName )? )
-            // InternalOCLstdlib.g:10335:1: ( ruleUnrestrictedName )?
+            // InternalOCLstdlib.g:10336:1: ( ( ruleUnrestrictedName )? )
+            // InternalOCLstdlib.g:10337:1: ( ruleUnrestrictedName )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getUnrestrictedNameParserRuleCall_13_0_1_1_1());
             }
-            // InternalOCLstdlib.g:10336:1: ( ruleUnrestrictedName )?
+            // InternalOCLstdlib.g:10338:1: ( ruleUnrestrictedName )?
             int alt100=2;
             int LA100_0 = input.LA(1);
 
@@ -31783,7 +31783,7 @@
             }
             switch (alt100) {
                 case 1 :
-                    // InternalOCLstdlib.g:10336:3: ruleUnrestrictedName
+                    // InternalOCLstdlib.g:10338:3: ruleUnrestrictedName
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     ruleUnrestrictedName();
@@ -31821,14 +31821,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__2"
-    // InternalOCLstdlib.g:10346:1: rule__LibOperationCS__Group_13_0_1_1__2 : rule__LibOperationCS__Group_13_0_1_1__2__Impl rule__LibOperationCS__Group_13_0_1_1__3 ;
+    // InternalOCLstdlib.g:10348:1: rule__LibOperationCS__Group_13_0_1_1__2 : rule__LibOperationCS__Group_13_0_1_1__2__Impl rule__LibOperationCS__Group_13_0_1_1__3 ;
     public final void rule__LibOperationCS__Group_13_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10350:1: ( rule__LibOperationCS__Group_13_0_1_1__2__Impl rule__LibOperationCS__Group_13_0_1_1__3 )
-            // InternalOCLstdlib.g:10351:2: rule__LibOperationCS__Group_13_0_1_1__2__Impl rule__LibOperationCS__Group_13_0_1_1__3
+            // InternalOCLstdlib.g:10352:1: ( rule__LibOperationCS__Group_13_0_1_1__2__Impl rule__LibOperationCS__Group_13_0_1_1__3 )
+            // InternalOCLstdlib.g:10353:2: rule__LibOperationCS__Group_13_0_1_1__2__Impl rule__LibOperationCS__Group_13_0_1_1__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__LibOperationCS__Group_13_0_1_1__2__Impl();
@@ -31859,17 +31859,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__2__Impl"
-    // InternalOCLstdlib.g:10358:1: rule__LibOperationCS__Group_13_0_1_1__2__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:10360:1: rule__LibOperationCS__Group_13_0_1_1__2__Impl : ( ':' ) ;
     public final void rule__LibOperationCS__Group_13_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10362:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:10363:1: ( ':' )
+            // InternalOCLstdlib.g:10364:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:10365:1: ( ':' )
             {
-            // InternalOCLstdlib.g:10363:1: ( ':' )
-            // InternalOCLstdlib.g:10364:1: ':'
+            // InternalOCLstdlib.g:10365:1: ( ':' )
+            // InternalOCLstdlib.g:10366:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getColonKeyword_13_0_1_1_2());
@@ -31900,14 +31900,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__3"
-    // InternalOCLstdlib.g:10377:1: rule__LibOperationCS__Group_13_0_1_1__3 : rule__LibOperationCS__Group_13_0_1_1__3__Impl rule__LibOperationCS__Group_13_0_1_1__4 ;
+    // InternalOCLstdlib.g:10379:1: rule__LibOperationCS__Group_13_0_1_1__3 : rule__LibOperationCS__Group_13_0_1_1__3__Impl rule__LibOperationCS__Group_13_0_1_1__4 ;
     public final void rule__LibOperationCS__Group_13_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10381:1: ( rule__LibOperationCS__Group_13_0_1_1__3__Impl rule__LibOperationCS__Group_13_0_1_1__4 )
-            // InternalOCLstdlib.g:10382:2: rule__LibOperationCS__Group_13_0_1_1__3__Impl rule__LibOperationCS__Group_13_0_1_1__4
+            // InternalOCLstdlib.g:10383:1: ( rule__LibOperationCS__Group_13_0_1_1__3__Impl rule__LibOperationCS__Group_13_0_1_1__4 )
+            // InternalOCLstdlib.g:10384:2: rule__LibOperationCS__Group_13_0_1_1__3__Impl rule__LibOperationCS__Group_13_0_1_1__4
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__LibOperationCS__Group_13_0_1_1__3__Impl();
@@ -31938,23 +31938,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__3__Impl"
-    // InternalOCLstdlib.g:10389:1: rule__LibOperationCS__Group_13_0_1_1__3__Impl : ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) ) ;
+    // InternalOCLstdlib.g:10391:1: rule__LibOperationCS__Group_13_0_1_1__3__Impl : ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) ) ;
     public final void rule__LibOperationCS__Group_13_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10393:1: ( ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) ) )
-            // InternalOCLstdlib.g:10394:1: ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) )
+            // InternalOCLstdlib.g:10395:1: ( ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) ) )
+            // InternalOCLstdlib.g:10396:1: ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) )
             {
-            // InternalOCLstdlib.g:10394:1: ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) )
-            // InternalOCLstdlib.g:10395:1: ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 )
+            // InternalOCLstdlib.g:10396:1: ( ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 ) )
+            // InternalOCLstdlib.g:10397:1: ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedBodyExpressionsAssignment_13_0_1_1_3());
             }
-            // InternalOCLstdlib.g:10396:1: ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 )
-            // InternalOCLstdlib.g:10396:2: rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3
+            // InternalOCLstdlib.g:10398:1: ( rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 )
+            // InternalOCLstdlib.g:10398:2: rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3();
@@ -31989,14 +31989,14 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__4"
-    // InternalOCLstdlib.g:10406:1: rule__LibOperationCS__Group_13_0_1_1__4 : rule__LibOperationCS__Group_13_0_1_1__4__Impl ;
+    // InternalOCLstdlib.g:10408:1: rule__LibOperationCS__Group_13_0_1_1__4 : rule__LibOperationCS__Group_13_0_1_1__4__Impl ;
     public final void rule__LibOperationCS__Group_13_0_1_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10410:1: ( rule__LibOperationCS__Group_13_0_1_1__4__Impl )
-            // InternalOCLstdlib.g:10411:2: rule__LibOperationCS__Group_13_0_1_1__4__Impl
+            // InternalOCLstdlib.g:10412:1: ( rule__LibOperationCS__Group_13_0_1_1__4__Impl )
+            // InternalOCLstdlib.g:10413:2: rule__LibOperationCS__Group_13_0_1_1__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOperationCS__Group_13_0_1_1__4__Impl();
@@ -32022,17 +32022,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__Group_13_0_1_1__4__Impl"
-    // InternalOCLstdlib.g:10417:1: rule__LibOperationCS__Group_13_0_1_1__4__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:10419:1: rule__LibOperationCS__Group_13_0_1_1__4__Impl : ( ';' ) ;
     public final void rule__LibOperationCS__Group_13_0_1_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10421:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:10422:1: ( ';' )
+            // InternalOCLstdlib.g:10423:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:10424:1: ( ';' )
             {
-            // InternalOCLstdlib.g:10422:1: ( ';' )
-            // InternalOCLstdlib.g:10423:1: ';'
+            // InternalOCLstdlib.g:10424:1: ( ';' )
+            // InternalOCLstdlib.g:10425:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getSemicolonKeyword_13_0_1_1_4());
@@ -32063,14 +32063,14 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__0"
-    // InternalOCLstdlib.g:10446:1: rule__LibOppositeCS__Group__0 : rule__LibOppositeCS__Group__0__Impl rule__LibOppositeCS__Group__1 ;
+    // InternalOCLstdlib.g:10448:1: rule__LibOppositeCS__Group__0 : rule__LibOppositeCS__Group__0__Impl rule__LibOppositeCS__Group__1 ;
     public final void rule__LibOppositeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10450:1: ( rule__LibOppositeCS__Group__0__Impl rule__LibOppositeCS__Group__1 )
-            // InternalOCLstdlib.g:10451:2: rule__LibOppositeCS__Group__0__Impl rule__LibOppositeCS__Group__1
+            // InternalOCLstdlib.g:10452:1: ( rule__LibOppositeCS__Group__0__Impl rule__LibOppositeCS__Group__1 )
+            // InternalOCLstdlib.g:10453:2: rule__LibOppositeCS__Group__0__Impl rule__LibOppositeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibOppositeCS__Group__0__Impl();
@@ -32101,17 +32101,17 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__0__Impl"
-    // InternalOCLstdlib.g:10458:1: rule__LibOppositeCS__Group__0__Impl : ( 'opposite' ) ;
+    // InternalOCLstdlib.g:10460:1: rule__LibOppositeCS__Group__0__Impl : ( 'opposite' ) ;
     public final void rule__LibOppositeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10462:1: ( ( 'opposite' ) )
-            // InternalOCLstdlib.g:10463:1: ( 'opposite' )
+            // InternalOCLstdlib.g:10464:1: ( ( 'opposite' ) )
+            // InternalOCLstdlib.g:10465:1: ( 'opposite' )
             {
-            // InternalOCLstdlib.g:10463:1: ( 'opposite' )
-            // InternalOCLstdlib.g:10464:1: 'opposite'
+            // InternalOCLstdlib.g:10465:1: ( 'opposite' )
+            // InternalOCLstdlib.g:10466:1: 'opposite'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOppositeCSAccess().getOppositeKeyword_0());
@@ -32142,14 +32142,14 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__1"
-    // InternalOCLstdlib.g:10477:1: rule__LibOppositeCS__Group__1 : rule__LibOppositeCS__Group__1__Impl rule__LibOppositeCS__Group__2 ;
+    // InternalOCLstdlib.g:10479:1: rule__LibOppositeCS__Group__1 : rule__LibOppositeCS__Group__1__Impl rule__LibOppositeCS__Group__2 ;
     public final void rule__LibOppositeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10481:1: ( rule__LibOppositeCS__Group__1__Impl rule__LibOppositeCS__Group__2 )
-            // InternalOCLstdlib.g:10482:2: rule__LibOppositeCS__Group__1__Impl rule__LibOppositeCS__Group__2
+            // InternalOCLstdlib.g:10483:1: ( rule__LibOppositeCS__Group__1__Impl rule__LibOppositeCS__Group__2 )
+            // InternalOCLstdlib.g:10484:2: rule__LibOppositeCS__Group__1__Impl rule__LibOppositeCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__LibOppositeCS__Group__1__Impl();
@@ -32180,23 +32180,23 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__1__Impl"
-    // InternalOCLstdlib.g:10489:1: rule__LibOppositeCS__Group__1__Impl : ( ( rule__LibOppositeCS__NameAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:10491:1: rule__LibOppositeCS__Group__1__Impl : ( ( rule__LibOppositeCS__NameAssignment_1 ) ) ;
     public final void rule__LibOppositeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10493:1: ( ( ( rule__LibOppositeCS__NameAssignment_1 ) ) )
-            // InternalOCLstdlib.g:10494:1: ( ( rule__LibOppositeCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:10495:1: ( ( ( rule__LibOppositeCS__NameAssignment_1 ) ) )
+            // InternalOCLstdlib.g:10496:1: ( ( rule__LibOppositeCS__NameAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:10494:1: ( ( rule__LibOppositeCS__NameAssignment_1 ) )
-            // InternalOCLstdlib.g:10495:1: ( rule__LibOppositeCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:10496:1: ( ( rule__LibOppositeCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:10497:1: ( rule__LibOppositeCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOppositeCSAccess().getNameAssignment_1());
             }
-            // InternalOCLstdlib.g:10496:1: ( rule__LibOppositeCS__NameAssignment_1 )
-            // InternalOCLstdlib.g:10496:2: rule__LibOppositeCS__NameAssignment_1
+            // InternalOCLstdlib.g:10498:1: ( rule__LibOppositeCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:10498:2: rule__LibOppositeCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOppositeCS__NameAssignment_1();
@@ -32231,14 +32231,14 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__2"
-    // InternalOCLstdlib.g:10506:1: rule__LibOppositeCS__Group__2 : rule__LibOppositeCS__Group__2__Impl rule__LibOppositeCS__Group__3 ;
+    // InternalOCLstdlib.g:10508:1: rule__LibOppositeCS__Group__2 : rule__LibOppositeCS__Group__2__Impl rule__LibOppositeCS__Group__3 ;
     public final void rule__LibOppositeCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10510:1: ( rule__LibOppositeCS__Group__2__Impl rule__LibOppositeCS__Group__3 )
-            // InternalOCLstdlib.g:10511:2: rule__LibOppositeCS__Group__2__Impl rule__LibOppositeCS__Group__3
+            // InternalOCLstdlib.g:10512:1: ( rule__LibOppositeCS__Group__2__Impl rule__LibOppositeCS__Group__3 )
+            // InternalOCLstdlib.g:10513:2: rule__LibOppositeCS__Group__2__Impl rule__LibOppositeCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibOppositeCS__Group__2__Impl();
@@ -32269,17 +32269,17 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__2__Impl"
-    // InternalOCLstdlib.g:10518:1: rule__LibOppositeCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:10520:1: rule__LibOppositeCS__Group__2__Impl : ( ':' ) ;
     public final void rule__LibOppositeCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10522:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:10523:1: ( ':' )
+            // InternalOCLstdlib.g:10524:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:10525:1: ( ':' )
             {
-            // InternalOCLstdlib.g:10523:1: ( ':' )
-            // InternalOCLstdlib.g:10524:1: ':'
+            // InternalOCLstdlib.g:10525:1: ( ':' )
+            // InternalOCLstdlib.g:10526:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOppositeCSAccess().getColonKeyword_2());
@@ -32310,14 +32310,14 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__3"
-    // InternalOCLstdlib.g:10537:1: rule__LibOppositeCS__Group__3 : rule__LibOppositeCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:10539:1: rule__LibOppositeCS__Group__3 : rule__LibOppositeCS__Group__3__Impl ;
     public final void rule__LibOppositeCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10541:1: ( rule__LibOppositeCS__Group__3__Impl )
-            // InternalOCLstdlib.g:10542:2: rule__LibOppositeCS__Group__3__Impl
+            // InternalOCLstdlib.g:10543:1: ( rule__LibOppositeCS__Group__3__Impl )
+            // InternalOCLstdlib.g:10544:2: rule__LibOppositeCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOppositeCS__Group__3__Impl();
@@ -32343,23 +32343,23 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__Group__3__Impl"
-    // InternalOCLstdlib.g:10548:1: rule__LibOppositeCS__Group__3__Impl : ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:10550:1: rule__LibOppositeCS__Group__3__Impl : ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) ) ;
     public final void rule__LibOppositeCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10552:1: ( ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) ) )
-            // InternalOCLstdlib.g:10553:1: ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) )
+            // InternalOCLstdlib.g:10554:1: ( ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) ) )
+            // InternalOCLstdlib.g:10555:1: ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:10553:1: ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) )
-            // InternalOCLstdlib.g:10554:1: ( rule__LibOppositeCS__OwnedTypeAssignment_3 )
+            // InternalOCLstdlib.g:10555:1: ( ( rule__LibOppositeCS__OwnedTypeAssignment_3 ) )
+            // InternalOCLstdlib.g:10556:1: ( rule__LibOppositeCS__OwnedTypeAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOppositeCSAccess().getOwnedTypeAssignment_3());
             }
-            // InternalOCLstdlib.g:10555:1: ( rule__LibOppositeCS__OwnedTypeAssignment_3 )
-            // InternalOCLstdlib.g:10555:2: rule__LibOppositeCS__OwnedTypeAssignment_3
+            // InternalOCLstdlib.g:10557:1: ( rule__LibOppositeCS__OwnedTypeAssignment_3 )
+            // InternalOCLstdlib.g:10557:2: rule__LibOppositeCS__OwnedTypeAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibOppositeCS__OwnedTypeAssignment_3();
@@ -32394,14 +32394,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__0"
-    // InternalOCLstdlib.g:10573:1: rule__LibPackageCS__Group__0 : rule__LibPackageCS__Group__0__Impl rule__LibPackageCS__Group__1 ;
+    // InternalOCLstdlib.g:10575:1: rule__LibPackageCS__Group__0 : rule__LibPackageCS__Group__0__Impl rule__LibPackageCS__Group__1 ;
     public final void rule__LibPackageCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10577:1: ( rule__LibPackageCS__Group__0__Impl rule__LibPackageCS__Group__1 )
-            // InternalOCLstdlib.g:10578:2: rule__LibPackageCS__Group__0__Impl rule__LibPackageCS__Group__1
+            // InternalOCLstdlib.g:10579:1: ( rule__LibPackageCS__Group__0__Impl rule__LibPackageCS__Group__1 )
+            // InternalOCLstdlib.g:10580:2: rule__LibPackageCS__Group__0__Impl rule__LibPackageCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibPackageCS__Group__0__Impl();
@@ -32432,17 +32432,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__0__Impl"
-    // InternalOCLstdlib.g:10585:1: rule__LibPackageCS__Group__0__Impl : ( 'library' ) ;
+    // InternalOCLstdlib.g:10587:1: rule__LibPackageCS__Group__0__Impl : ( 'library' ) ;
     public final void rule__LibPackageCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10589:1: ( ( 'library' ) )
-            // InternalOCLstdlib.g:10590:1: ( 'library' )
+            // InternalOCLstdlib.g:10591:1: ( ( 'library' ) )
+            // InternalOCLstdlib.g:10592:1: ( 'library' )
             {
-            // InternalOCLstdlib.g:10590:1: ( 'library' )
-            // InternalOCLstdlib.g:10591:1: 'library'
+            // InternalOCLstdlib.g:10592:1: ( 'library' )
+            // InternalOCLstdlib.g:10593:1: 'library'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getLibraryKeyword_0());
@@ -32473,14 +32473,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__1"
-    // InternalOCLstdlib.g:10604:1: rule__LibPackageCS__Group__1 : rule__LibPackageCS__Group__1__Impl rule__LibPackageCS__Group__2 ;
+    // InternalOCLstdlib.g:10606:1: rule__LibPackageCS__Group__1 : rule__LibPackageCS__Group__1__Impl rule__LibPackageCS__Group__2 ;
     public final void rule__LibPackageCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10608:1: ( rule__LibPackageCS__Group__1__Impl rule__LibPackageCS__Group__2 )
-            // InternalOCLstdlib.g:10609:2: rule__LibPackageCS__Group__1__Impl rule__LibPackageCS__Group__2
+            // InternalOCLstdlib.g:10610:1: ( rule__LibPackageCS__Group__1__Impl rule__LibPackageCS__Group__2 )
+            // InternalOCLstdlib.g:10611:2: rule__LibPackageCS__Group__1__Impl rule__LibPackageCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__LibPackageCS__Group__1__Impl();
@@ -32511,23 +32511,23 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__1__Impl"
-    // InternalOCLstdlib.g:10616:1: rule__LibPackageCS__Group__1__Impl : ( ( rule__LibPackageCS__NameAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:10618:1: rule__LibPackageCS__Group__1__Impl : ( ( rule__LibPackageCS__NameAssignment_1 ) ) ;
     public final void rule__LibPackageCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10620:1: ( ( ( rule__LibPackageCS__NameAssignment_1 ) ) )
-            // InternalOCLstdlib.g:10621:1: ( ( rule__LibPackageCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:10622:1: ( ( ( rule__LibPackageCS__NameAssignment_1 ) ) )
+            // InternalOCLstdlib.g:10623:1: ( ( rule__LibPackageCS__NameAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:10621:1: ( ( rule__LibPackageCS__NameAssignment_1 ) )
-            // InternalOCLstdlib.g:10622:1: ( rule__LibPackageCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:10623:1: ( ( rule__LibPackageCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:10624:1: ( rule__LibPackageCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getNameAssignment_1());
             }
-            // InternalOCLstdlib.g:10623:1: ( rule__LibPackageCS__NameAssignment_1 )
-            // InternalOCLstdlib.g:10623:2: rule__LibPackageCS__NameAssignment_1
+            // InternalOCLstdlib.g:10625:1: ( rule__LibPackageCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:10625:2: rule__LibPackageCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPackageCS__NameAssignment_1();
@@ -32562,14 +32562,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__2"
-    // InternalOCLstdlib.g:10633:1: rule__LibPackageCS__Group__2 : rule__LibPackageCS__Group__2__Impl rule__LibPackageCS__Group__3 ;
+    // InternalOCLstdlib.g:10635:1: rule__LibPackageCS__Group__2 : rule__LibPackageCS__Group__2__Impl rule__LibPackageCS__Group__3 ;
     public final void rule__LibPackageCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10637:1: ( rule__LibPackageCS__Group__2__Impl rule__LibPackageCS__Group__3 )
-            // InternalOCLstdlib.g:10638:2: rule__LibPackageCS__Group__2__Impl rule__LibPackageCS__Group__3
+            // InternalOCLstdlib.g:10639:1: ( rule__LibPackageCS__Group__2__Impl rule__LibPackageCS__Group__3 )
+            // InternalOCLstdlib.g:10640:2: rule__LibPackageCS__Group__2__Impl rule__LibPackageCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__LibPackageCS__Group__2__Impl();
@@ -32600,22 +32600,22 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__2__Impl"
-    // InternalOCLstdlib.g:10645:1: rule__LibPackageCS__Group__2__Impl : ( ( rule__LibPackageCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:10647:1: rule__LibPackageCS__Group__2__Impl : ( ( rule__LibPackageCS__Group_2__0 )? ) ;
     public final void rule__LibPackageCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10649:1: ( ( ( rule__LibPackageCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:10650:1: ( ( rule__LibPackageCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:10651:1: ( ( ( rule__LibPackageCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:10652:1: ( ( rule__LibPackageCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:10650:1: ( ( rule__LibPackageCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:10651:1: ( rule__LibPackageCS__Group_2__0 )?
+            // InternalOCLstdlib.g:10652:1: ( ( rule__LibPackageCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:10653:1: ( rule__LibPackageCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:10652:1: ( rule__LibPackageCS__Group_2__0 )?
+            // InternalOCLstdlib.g:10654:1: ( rule__LibPackageCS__Group_2__0 )?
             int alt101=2;
             int LA101_0 = input.LA(1);
 
@@ -32624,7 +32624,7 @@
             }
             switch (alt101) {
                 case 1 :
-                    // InternalOCLstdlib.g:10652:2: rule__LibPackageCS__Group_2__0
+                    // InternalOCLstdlib.g:10654:2: rule__LibPackageCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPackageCS__Group_2__0();
@@ -32662,14 +32662,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__3"
-    // InternalOCLstdlib.g:10662:1: rule__LibPackageCS__Group__3 : rule__LibPackageCS__Group__3__Impl rule__LibPackageCS__Group__4 ;
+    // InternalOCLstdlib.g:10664:1: rule__LibPackageCS__Group__3 : rule__LibPackageCS__Group__3__Impl rule__LibPackageCS__Group__4 ;
     public final void rule__LibPackageCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10666:1: ( rule__LibPackageCS__Group__3__Impl rule__LibPackageCS__Group__4 )
-            // InternalOCLstdlib.g:10667:2: rule__LibPackageCS__Group__3__Impl rule__LibPackageCS__Group__4
+            // InternalOCLstdlib.g:10668:1: ( rule__LibPackageCS__Group__3__Impl rule__LibPackageCS__Group__4 )
+            // InternalOCLstdlib.g:10669:2: rule__LibPackageCS__Group__3__Impl rule__LibPackageCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__LibPackageCS__Group__3__Impl();
@@ -32700,17 +32700,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__3__Impl"
-    // InternalOCLstdlib.g:10674:1: rule__LibPackageCS__Group__3__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:10676:1: rule__LibPackageCS__Group__3__Impl : ( '{' ) ;
     public final void rule__LibPackageCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10678:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:10679:1: ( '{' )
+            // InternalOCLstdlib.g:10680:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:10681:1: ( '{' )
             {
-            // InternalOCLstdlib.g:10679:1: ( '{' )
-            // InternalOCLstdlib.g:10680:1: '{'
+            // InternalOCLstdlib.g:10681:1: ( '{' )
+            // InternalOCLstdlib.g:10682:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getLeftCurlyBracketKeyword_3());
@@ -32741,14 +32741,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__4"
-    // InternalOCLstdlib.g:10693:1: rule__LibPackageCS__Group__4 : rule__LibPackageCS__Group__4__Impl rule__LibPackageCS__Group__5 ;
+    // InternalOCLstdlib.g:10695:1: rule__LibPackageCS__Group__4 : rule__LibPackageCS__Group__4__Impl rule__LibPackageCS__Group__5 ;
     public final void rule__LibPackageCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10697:1: ( rule__LibPackageCS__Group__4__Impl rule__LibPackageCS__Group__5 )
-            // InternalOCLstdlib.g:10698:2: rule__LibPackageCS__Group__4__Impl rule__LibPackageCS__Group__5
+            // InternalOCLstdlib.g:10699:1: ( rule__LibPackageCS__Group__4__Impl rule__LibPackageCS__Group__5 )
+            // InternalOCLstdlib.g:10700:2: rule__LibPackageCS__Group__4__Impl rule__LibPackageCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_50);
             rule__LibPackageCS__Group__4__Impl();
@@ -32779,22 +32779,22 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__4__Impl"
-    // InternalOCLstdlib.g:10705:1: rule__LibPackageCS__Group__4__Impl : ( ( rule__LibPackageCS__Alternatives_4 )* ) ;
+    // InternalOCLstdlib.g:10707:1: rule__LibPackageCS__Group__4__Impl : ( ( rule__LibPackageCS__Alternatives_4 )* ) ;
     public final void rule__LibPackageCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10709:1: ( ( ( rule__LibPackageCS__Alternatives_4 )* ) )
-            // InternalOCLstdlib.g:10710:1: ( ( rule__LibPackageCS__Alternatives_4 )* )
+            // InternalOCLstdlib.g:10711:1: ( ( ( rule__LibPackageCS__Alternatives_4 )* ) )
+            // InternalOCLstdlib.g:10712:1: ( ( rule__LibPackageCS__Alternatives_4 )* )
             {
-            // InternalOCLstdlib.g:10710:1: ( ( rule__LibPackageCS__Alternatives_4 )* )
-            // InternalOCLstdlib.g:10711:1: ( rule__LibPackageCS__Alternatives_4 )*
+            // InternalOCLstdlib.g:10712:1: ( ( rule__LibPackageCS__Alternatives_4 )* )
+            // InternalOCLstdlib.g:10713:1: ( rule__LibPackageCS__Alternatives_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getAlternatives_4());
             }
-            // InternalOCLstdlib.g:10712:1: ( rule__LibPackageCS__Alternatives_4 )*
+            // InternalOCLstdlib.g:10714:1: ( rule__LibPackageCS__Alternatives_4 )*
             loop102:
             do {
                 int alt102=2;
@@ -32807,7 +32807,7 @@
 
                 switch (alt102) {
             	case 1 :
-            	    // InternalOCLstdlib.g:10712:2: rule__LibPackageCS__Alternatives_4
+            	    // InternalOCLstdlib.g:10714:2: rule__LibPackageCS__Alternatives_4
             	    {
             	    pushFollow(FollowSets000.FOLLOW_51);
             	    rule__LibPackageCS__Alternatives_4();
@@ -32848,14 +32848,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__5"
-    // InternalOCLstdlib.g:10722:1: rule__LibPackageCS__Group__5 : rule__LibPackageCS__Group__5__Impl ;
+    // InternalOCLstdlib.g:10724:1: rule__LibPackageCS__Group__5 : rule__LibPackageCS__Group__5__Impl ;
     public final void rule__LibPackageCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10726:1: ( rule__LibPackageCS__Group__5__Impl )
-            // InternalOCLstdlib.g:10727:2: rule__LibPackageCS__Group__5__Impl
+            // InternalOCLstdlib.g:10728:1: ( rule__LibPackageCS__Group__5__Impl )
+            // InternalOCLstdlib.g:10729:2: rule__LibPackageCS__Group__5__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPackageCS__Group__5__Impl();
@@ -32881,17 +32881,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group__5__Impl"
-    // InternalOCLstdlib.g:10733:1: rule__LibPackageCS__Group__5__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:10735:1: rule__LibPackageCS__Group__5__Impl : ( '}' ) ;
     public final void rule__LibPackageCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10737:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:10738:1: ( '}' )
+            // InternalOCLstdlib.g:10739:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:10740:1: ( '}' )
             {
-            // InternalOCLstdlib.g:10738:1: ( '}' )
-            // InternalOCLstdlib.g:10739:1: '}'
+            // InternalOCLstdlib.g:10740:1: ( '}' )
+            // InternalOCLstdlib.g:10741:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getRightCurlyBracketKeyword_5());
@@ -32922,14 +32922,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__0"
-    // InternalOCLstdlib.g:10764:1: rule__LibPackageCS__Group_2__0 : rule__LibPackageCS__Group_2__0__Impl rule__LibPackageCS__Group_2__1 ;
+    // InternalOCLstdlib.g:10766:1: rule__LibPackageCS__Group_2__0 : rule__LibPackageCS__Group_2__0__Impl rule__LibPackageCS__Group_2__1 ;
     public final void rule__LibPackageCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10768:1: ( rule__LibPackageCS__Group_2__0__Impl rule__LibPackageCS__Group_2__1 )
-            // InternalOCLstdlib.g:10769:2: rule__LibPackageCS__Group_2__0__Impl rule__LibPackageCS__Group_2__1
+            // InternalOCLstdlib.g:10770:1: ( rule__LibPackageCS__Group_2__0__Impl rule__LibPackageCS__Group_2__1 )
+            // InternalOCLstdlib.g:10771:2: rule__LibPackageCS__Group_2__0__Impl rule__LibPackageCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LibPackageCS__Group_2__0__Impl();
@@ -32960,17 +32960,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:10776:1: rule__LibPackageCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:10778:1: rule__LibPackageCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__LibPackageCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10780:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:10781:1: ( ':' )
+            // InternalOCLstdlib.g:10782:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:10783:1: ( ':' )
             {
-            // InternalOCLstdlib.g:10781:1: ( ':' )
-            // InternalOCLstdlib.g:10782:1: ':'
+            // InternalOCLstdlib.g:10783:1: ( ':' )
+            // InternalOCLstdlib.g:10784:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getColonKeyword_2_0());
@@ -33001,14 +33001,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__1"
-    // InternalOCLstdlib.g:10795:1: rule__LibPackageCS__Group_2__1 : rule__LibPackageCS__Group_2__1__Impl rule__LibPackageCS__Group_2__2 ;
+    // InternalOCLstdlib.g:10797:1: rule__LibPackageCS__Group_2__1 : rule__LibPackageCS__Group_2__1__Impl rule__LibPackageCS__Group_2__2 ;
     public final void rule__LibPackageCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10799:1: ( rule__LibPackageCS__Group_2__1__Impl rule__LibPackageCS__Group_2__2 )
-            // InternalOCLstdlib.g:10800:2: rule__LibPackageCS__Group_2__1__Impl rule__LibPackageCS__Group_2__2
+            // InternalOCLstdlib.g:10801:1: ( rule__LibPackageCS__Group_2__1__Impl rule__LibPackageCS__Group_2__2 )
+            // InternalOCLstdlib.g:10802:2: rule__LibPackageCS__Group_2__1__Impl rule__LibPackageCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__LibPackageCS__Group_2__1__Impl();
@@ -33039,23 +33039,23 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:10807:1: rule__LibPackageCS__Group_2__1__Impl : ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:10809:1: rule__LibPackageCS__Group_2__1__Impl : ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) ) ;
     public final void rule__LibPackageCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10811:1: ( ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:10812:1: ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) )
+            // InternalOCLstdlib.g:10813:1: ( ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:10814:1: ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:10812:1: ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) )
-            // InternalOCLstdlib.g:10813:1: ( rule__LibPackageCS__NsPrefixAssignment_2_1 )
+            // InternalOCLstdlib.g:10814:1: ( ( rule__LibPackageCS__NsPrefixAssignment_2_1 ) )
+            // InternalOCLstdlib.g:10815:1: ( rule__LibPackageCS__NsPrefixAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getNsPrefixAssignment_2_1());
             }
-            // InternalOCLstdlib.g:10814:1: ( rule__LibPackageCS__NsPrefixAssignment_2_1 )
-            // InternalOCLstdlib.g:10814:2: rule__LibPackageCS__NsPrefixAssignment_2_1
+            // InternalOCLstdlib.g:10816:1: ( rule__LibPackageCS__NsPrefixAssignment_2_1 )
+            // InternalOCLstdlib.g:10816:2: rule__LibPackageCS__NsPrefixAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPackageCS__NsPrefixAssignment_2_1();
@@ -33090,14 +33090,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__2"
-    // InternalOCLstdlib.g:10824:1: rule__LibPackageCS__Group_2__2 : rule__LibPackageCS__Group_2__2__Impl rule__LibPackageCS__Group_2__3 ;
+    // InternalOCLstdlib.g:10826:1: rule__LibPackageCS__Group_2__2 : rule__LibPackageCS__Group_2__2__Impl rule__LibPackageCS__Group_2__3 ;
     public final void rule__LibPackageCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10828:1: ( rule__LibPackageCS__Group_2__2__Impl rule__LibPackageCS__Group_2__3 )
-            // InternalOCLstdlib.g:10829:2: rule__LibPackageCS__Group_2__2__Impl rule__LibPackageCS__Group_2__3
+            // InternalOCLstdlib.g:10830:1: ( rule__LibPackageCS__Group_2__2__Impl rule__LibPackageCS__Group_2__3 )
+            // InternalOCLstdlib.g:10831:2: rule__LibPackageCS__Group_2__2__Impl rule__LibPackageCS__Group_2__3
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__LibPackageCS__Group_2__2__Impl();
@@ -33128,17 +33128,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__2__Impl"
-    // InternalOCLstdlib.g:10836:1: rule__LibPackageCS__Group_2__2__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:10838:1: rule__LibPackageCS__Group_2__2__Impl : ( '=' ) ;
     public final void rule__LibPackageCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10840:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:10841:1: ( '=' )
+            // InternalOCLstdlib.g:10842:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:10843:1: ( '=' )
             {
-            // InternalOCLstdlib.g:10841:1: ( '=' )
-            // InternalOCLstdlib.g:10842:1: '='
+            // InternalOCLstdlib.g:10843:1: ( '=' )
+            // InternalOCLstdlib.g:10844:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getEqualsSignKeyword_2_2());
@@ -33169,14 +33169,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__3"
-    // InternalOCLstdlib.g:10855:1: rule__LibPackageCS__Group_2__3 : rule__LibPackageCS__Group_2__3__Impl ;
+    // InternalOCLstdlib.g:10857:1: rule__LibPackageCS__Group_2__3 : rule__LibPackageCS__Group_2__3__Impl ;
     public final void rule__LibPackageCS__Group_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10859:1: ( rule__LibPackageCS__Group_2__3__Impl )
-            // InternalOCLstdlib.g:10860:2: rule__LibPackageCS__Group_2__3__Impl
+            // InternalOCLstdlib.g:10861:1: ( rule__LibPackageCS__Group_2__3__Impl )
+            // InternalOCLstdlib.g:10862:2: rule__LibPackageCS__Group_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPackageCS__Group_2__3__Impl();
@@ -33202,23 +33202,23 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_2__3__Impl"
-    // InternalOCLstdlib.g:10866:1: rule__LibPackageCS__Group_2__3__Impl : ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) ) ;
+    // InternalOCLstdlib.g:10868:1: rule__LibPackageCS__Group_2__3__Impl : ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) ) ;
     public final void rule__LibPackageCS__Group_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10870:1: ( ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) ) )
-            // InternalOCLstdlib.g:10871:1: ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) )
+            // InternalOCLstdlib.g:10872:1: ( ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) ) )
+            // InternalOCLstdlib.g:10873:1: ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) )
             {
-            // InternalOCLstdlib.g:10871:1: ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) )
-            // InternalOCLstdlib.g:10872:1: ( rule__LibPackageCS__NsURIAssignment_2_3 )
+            // InternalOCLstdlib.g:10873:1: ( ( rule__LibPackageCS__NsURIAssignment_2_3 ) )
+            // InternalOCLstdlib.g:10874:1: ( rule__LibPackageCS__NsURIAssignment_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getNsURIAssignment_2_3());
             }
-            // InternalOCLstdlib.g:10873:1: ( rule__LibPackageCS__NsURIAssignment_2_3 )
-            // InternalOCLstdlib.g:10873:2: rule__LibPackageCS__NsURIAssignment_2_3
+            // InternalOCLstdlib.g:10875:1: ( rule__LibPackageCS__NsURIAssignment_2_3 )
+            // InternalOCLstdlib.g:10875:2: rule__LibPackageCS__NsURIAssignment_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPackageCS__NsURIAssignment_2_3();
@@ -33253,14 +33253,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_4_1__0"
-    // InternalOCLstdlib.g:10891:1: rule__LibPackageCS__Group_4_1__0 : rule__LibPackageCS__Group_4_1__0__Impl rule__LibPackageCS__Group_4_1__1 ;
+    // InternalOCLstdlib.g:10893:1: rule__LibPackageCS__Group_4_1__0 : rule__LibPackageCS__Group_4_1__0__Impl rule__LibPackageCS__Group_4_1__1 ;
     public final void rule__LibPackageCS__Group_4_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10895:1: ( rule__LibPackageCS__Group_4_1__0__Impl rule__LibPackageCS__Group_4_1__1 )
-            // InternalOCLstdlib.g:10896:2: rule__LibPackageCS__Group_4_1__0__Impl rule__LibPackageCS__Group_4_1__1
+            // InternalOCLstdlib.g:10897:1: ( rule__LibPackageCS__Group_4_1__0__Impl rule__LibPackageCS__Group_4_1__1 )
+            // InternalOCLstdlib.g:10898:2: rule__LibPackageCS__Group_4_1__0__Impl rule__LibPackageCS__Group_4_1__1
             {
             pushFollow(FollowSets000.FOLLOW_52);
             rule__LibPackageCS__Group_4_1__0__Impl();
@@ -33291,17 +33291,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_4_1__0__Impl"
-    // InternalOCLstdlib.g:10903:1: rule__LibPackageCS__Group_4_1__0__Impl : ( 'precedence' ) ;
+    // InternalOCLstdlib.g:10905:1: rule__LibPackageCS__Group_4_1__0__Impl : ( 'precedence' ) ;
     public final void rule__LibPackageCS__Group_4_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10907:1: ( ( 'precedence' ) )
-            // InternalOCLstdlib.g:10908:1: ( 'precedence' )
+            // InternalOCLstdlib.g:10909:1: ( ( 'precedence' ) )
+            // InternalOCLstdlib.g:10910:1: ( 'precedence' )
             {
-            // InternalOCLstdlib.g:10908:1: ( 'precedence' )
-            // InternalOCLstdlib.g:10909:1: 'precedence'
+            // InternalOCLstdlib.g:10910:1: ( 'precedence' )
+            // InternalOCLstdlib.g:10911:1: 'precedence'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getPrecedenceKeyword_4_1_0());
@@ -33332,14 +33332,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_4_1__1"
-    // InternalOCLstdlib.g:10922:1: rule__LibPackageCS__Group_4_1__1 : rule__LibPackageCS__Group_4_1__1__Impl rule__LibPackageCS__Group_4_1__2 ;
+    // InternalOCLstdlib.g:10924:1: rule__LibPackageCS__Group_4_1__1 : rule__LibPackageCS__Group_4_1__1__Impl rule__LibPackageCS__Group_4_1__2 ;
     public final void rule__LibPackageCS__Group_4_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10926:1: ( rule__LibPackageCS__Group_4_1__1__Impl rule__LibPackageCS__Group_4_1__2 )
-            // InternalOCLstdlib.g:10927:2: rule__LibPackageCS__Group_4_1__1__Impl rule__LibPackageCS__Group_4_1__2
+            // InternalOCLstdlib.g:10928:1: ( rule__LibPackageCS__Group_4_1__1__Impl rule__LibPackageCS__Group_4_1__2 )
+            // InternalOCLstdlib.g:10929:2: rule__LibPackageCS__Group_4_1__1__Impl rule__LibPackageCS__Group_4_1__2
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__LibPackageCS__Group_4_1__1__Impl();
@@ -33370,26 +33370,26 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_4_1__1__Impl"
-    // InternalOCLstdlib.g:10934:1: rule__LibPackageCS__Group_4_1__1__Impl : ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) ) ;
+    // InternalOCLstdlib.g:10936:1: rule__LibPackageCS__Group_4_1__1__Impl : ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) ) ;
     public final void rule__LibPackageCS__Group_4_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10938:1: ( ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) ) )
-            // InternalOCLstdlib.g:10939:1: ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) )
+            // InternalOCLstdlib.g:10940:1: ( ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) ) )
+            // InternalOCLstdlib.g:10941:1: ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) )
             {
-            // InternalOCLstdlib.g:10939:1: ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) )
-            // InternalOCLstdlib.g:10940:1: ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* )
+            // InternalOCLstdlib.g:10941:1: ( ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* ) )
+            // InternalOCLstdlib.g:10942:1: ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) ) ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* )
             {
-            // InternalOCLstdlib.g:10940:1: ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) )
-            // InternalOCLstdlib.g:10941:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )
+            // InternalOCLstdlib.g:10942:1: ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 ) )
+            // InternalOCLstdlib.g:10943:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getOwnedPrecedencesAssignment_4_1_1());
             }
-            // InternalOCLstdlib.g:10942:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )
-            // InternalOCLstdlib.g:10942:2: rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1
+            // InternalOCLstdlib.g:10944:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )
+            // InternalOCLstdlib.g:10944:2: rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1
             {
             pushFollow(FollowSets000.FOLLOW_53);
             rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1();
@@ -33405,13 +33405,13 @@
 
             }
 
-            // InternalOCLstdlib.g:10945:1: ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* )
-            // InternalOCLstdlib.g:10946:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )*
+            // InternalOCLstdlib.g:10947:1: ( ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )* )
+            // InternalOCLstdlib.g:10948:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getOwnedPrecedencesAssignment_4_1_1());
             }
-            // InternalOCLstdlib.g:10947:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )*
+            // InternalOCLstdlib.g:10949:1: ( rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 )*
             loop103:
             do {
                 int alt103=2;
@@ -33424,7 +33424,7 @@
 
                 switch (alt103) {
             	case 1 :
-            	    // InternalOCLstdlib.g:10947:2: rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1
+            	    // InternalOCLstdlib.g:10949:2: rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_53);
             	    rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1();
@@ -33468,14 +33468,14 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_4_1__2"
-    // InternalOCLstdlib.g:10958:1: rule__LibPackageCS__Group_4_1__2 : rule__LibPackageCS__Group_4_1__2__Impl ;
+    // InternalOCLstdlib.g:10960:1: rule__LibPackageCS__Group_4_1__2 : rule__LibPackageCS__Group_4_1__2__Impl ;
     public final void rule__LibPackageCS__Group_4_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10962:1: ( rule__LibPackageCS__Group_4_1__2__Impl )
-            // InternalOCLstdlib.g:10963:2: rule__LibPackageCS__Group_4_1__2__Impl
+            // InternalOCLstdlib.g:10964:1: ( rule__LibPackageCS__Group_4_1__2__Impl )
+            // InternalOCLstdlib.g:10965:2: rule__LibPackageCS__Group_4_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPackageCS__Group_4_1__2__Impl();
@@ -33501,17 +33501,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__Group_4_1__2__Impl"
-    // InternalOCLstdlib.g:10969:1: rule__LibPackageCS__Group_4_1__2__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:10971:1: rule__LibPackageCS__Group_4_1__2__Impl : ( ';' ) ;
     public final void rule__LibPackageCS__Group_4_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10973:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:10974:1: ( ';' )
+            // InternalOCLstdlib.g:10975:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:10976:1: ( ';' )
             {
-            // InternalOCLstdlib.g:10974:1: ( ';' )
-            // InternalOCLstdlib.g:10975:1: ';'
+            // InternalOCLstdlib.g:10976:1: ( ';' )
+            // InternalOCLstdlib.g:10977:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getSemicolonKeyword_4_1_2());
@@ -33542,14 +33542,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__0"
-    // InternalOCLstdlib.g:10994:1: rule__PackageCS__Group__0 : rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 ;
+    // InternalOCLstdlib.g:10996:1: rule__PackageCS__Group__0 : rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 ;
     public final void rule__PackageCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:10998:1: ( rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 )
-            // InternalOCLstdlib.g:10999:2: rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1
+            // InternalOCLstdlib.g:11000:1: ( rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1 )
+            // InternalOCLstdlib.g:11001:2: rule__PackageCS__Group__0__Impl rule__PackageCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PackageCS__Group__0__Impl();
@@ -33580,17 +33580,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__0__Impl"
-    // InternalOCLstdlib.g:11006:1: rule__PackageCS__Group__0__Impl : ( 'package' ) ;
+    // InternalOCLstdlib.g:11008:1: rule__PackageCS__Group__0__Impl : ( 'package' ) ;
     public final void rule__PackageCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11010:1: ( ( 'package' ) )
-            // InternalOCLstdlib.g:11011:1: ( 'package' )
+            // InternalOCLstdlib.g:11012:1: ( ( 'package' ) )
+            // InternalOCLstdlib.g:11013:1: ( 'package' )
             {
-            // InternalOCLstdlib.g:11011:1: ( 'package' )
-            // InternalOCLstdlib.g:11012:1: 'package'
+            // InternalOCLstdlib.g:11013:1: ( 'package' )
+            // InternalOCLstdlib.g:11014:1: 'package'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getPackageKeyword_0());
@@ -33621,14 +33621,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__1"
-    // InternalOCLstdlib.g:11025:1: rule__PackageCS__Group__1 : rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 ;
+    // InternalOCLstdlib.g:11027:1: rule__PackageCS__Group__1 : rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 ;
     public final void rule__PackageCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11029:1: ( rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 )
-            // InternalOCLstdlib.g:11030:2: rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2
+            // InternalOCLstdlib.g:11031:1: ( rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2 )
+            // InternalOCLstdlib.g:11032:2: rule__PackageCS__Group__1__Impl rule__PackageCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__PackageCS__Group__1__Impl();
@@ -33659,23 +33659,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__1__Impl"
-    // InternalOCLstdlib.g:11037:1: rule__PackageCS__Group__1__Impl : ( ( rule__PackageCS__NameAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:11039:1: rule__PackageCS__Group__1__Impl : ( ( rule__PackageCS__NameAssignment_1 ) ) ;
     public final void rule__PackageCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11041:1: ( ( ( rule__PackageCS__NameAssignment_1 ) ) )
-            // InternalOCLstdlib.g:11042:1: ( ( rule__PackageCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:11043:1: ( ( ( rule__PackageCS__NameAssignment_1 ) ) )
+            // InternalOCLstdlib.g:11044:1: ( ( rule__PackageCS__NameAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:11042:1: ( ( rule__PackageCS__NameAssignment_1 ) )
-            // InternalOCLstdlib.g:11043:1: ( rule__PackageCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:11044:1: ( ( rule__PackageCS__NameAssignment_1 ) )
+            // InternalOCLstdlib.g:11045:1: ( rule__PackageCS__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNameAssignment_1());
             }
-            // InternalOCLstdlib.g:11044:1: ( rule__PackageCS__NameAssignment_1 )
-            // InternalOCLstdlib.g:11044:2: rule__PackageCS__NameAssignment_1
+            // InternalOCLstdlib.g:11046:1: ( rule__PackageCS__NameAssignment_1 )
+            // InternalOCLstdlib.g:11046:2: rule__PackageCS__NameAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__NameAssignment_1();
@@ -33710,14 +33710,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__2"
-    // InternalOCLstdlib.g:11054:1: rule__PackageCS__Group__2 : rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 ;
+    // InternalOCLstdlib.g:11056:1: rule__PackageCS__Group__2 : rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 ;
     public final void rule__PackageCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11058:1: ( rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 )
-            // InternalOCLstdlib.g:11059:2: rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3
+            // InternalOCLstdlib.g:11060:1: ( rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3 )
+            // InternalOCLstdlib.g:11061:2: rule__PackageCS__Group__2__Impl rule__PackageCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_49);
             rule__PackageCS__Group__2__Impl();
@@ -33748,22 +33748,22 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__2__Impl"
-    // InternalOCLstdlib.g:11066:1: rule__PackageCS__Group__2__Impl : ( ( rule__PackageCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:11068:1: rule__PackageCS__Group__2__Impl : ( ( rule__PackageCS__Group_2__0 )? ) ;
     public final void rule__PackageCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11070:1: ( ( ( rule__PackageCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:11071:1: ( ( rule__PackageCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:11072:1: ( ( ( rule__PackageCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:11073:1: ( ( rule__PackageCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:11071:1: ( ( rule__PackageCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:11072:1: ( rule__PackageCS__Group_2__0 )?
+            // InternalOCLstdlib.g:11073:1: ( ( rule__PackageCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:11074:1: ( rule__PackageCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:11073:1: ( rule__PackageCS__Group_2__0 )?
+            // InternalOCLstdlib.g:11075:1: ( rule__PackageCS__Group_2__0 )?
             int alt104=2;
             int LA104_0 = input.LA(1);
 
@@ -33772,7 +33772,7 @@
             }
             switch (alt104) {
                 case 1 :
-                    // InternalOCLstdlib.g:11073:2: rule__PackageCS__Group_2__0
+                    // InternalOCLstdlib.g:11075:2: rule__PackageCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PackageCS__Group_2__0();
@@ -33810,14 +33810,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__3"
-    // InternalOCLstdlib.g:11083:1: rule__PackageCS__Group__3 : rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 ;
+    // InternalOCLstdlib.g:11085:1: rule__PackageCS__Group__3 : rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 ;
     public final void rule__PackageCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11087:1: ( rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 )
-            // InternalOCLstdlib.g:11088:2: rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4
+            // InternalOCLstdlib.g:11089:1: ( rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4 )
+            // InternalOCLstdlib.g:11090:2: rule__PackageCS__Group__3__Impl rule__PackageCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__PackageCS__Group__3__Impl();
@@ -33848,17 +33848,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__3__Impl"
-    // InternalOCLstdlib.g:11095:1: rule__PackageCS__Group__3__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:11097:1: rule__PackageCS__Group__3__Impl : ( '{' ) ;
     public final void rule__PackageCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11099:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:11100:1: ( '{' )
+            // InternalOCLstdlib.g:11101:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:11102:1: ( '{' )
             {
-            // InternalOCLstdlib.g:11100:1: ( '{' )
-            // InternalOCLstdlib.g:11101:1: '{'
+            // InternalOCLstdlib.g:11102:1: ( '{' )
+            // InternalOCLstdlib.g:11103:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getLeftCurlyBracketKeyword_3());
@@ -33889,14 +33889,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__4"
-    // InternalOCLstdlib.g:11114:1: rule__PackageCS__Group__4 : rule__PackageCS__Group__4__Impl rule__PackageCS__Group__5 ;
+    // InternalOCLstdlib.g:11116:1: rule__PackageCS__Group__4 : rule__PackageCS__Group__4__Impl rule__PackageCS__Group__5 ;
     public final void rule__PackageCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11118:1: ( rule__PackageCS__Group__4__Impl rule__PackageCS__Group__5 )
-            // InternalOCLstdlib.g:11119:2: rule__PackageCS__Group__4__Impl rule__PackageCS__Group__5
+            // InternalOCLstdlib.g:11120:1: ( rule__PackageCS__Group__4__Impl rule__PackageCS__Group__5 )
+            // InternalOCLstdlib.g:11121:2: rule__PackageCS__Group__4__Impl rule__PackageCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_54);
             rule__PackageCS__Group__4__Impl();
@@ -33927,22 +33927,22 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__4__Impl"
-    // InternalOCLstdlib.g:11126:1: rule__PackageCS__Group__4__Impl : ( ( rule__PackageCS__Alternatives_4 )* ) ;
+    // InternalOCLstdlib.g:11128:1: rule__PackageCS__Group__4__Impl : ( ( rule__PackageCS__Alternatives_4 )* ) ;
     public final void rule__PackageCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11130:1: ( ( ( rule__PackageCS__Alternatives_4 )* ) )
-            // InternalOCLstdlib.g:11131:1: ( ( rule__PackageCS__Alternatives_4 )* )
+            // InternalOCLstdlib.g:11132:1: ( ( ( rule__PackageCS__Alternatives_4 )* ) )
+            // InternalOCLstdlib.g:11133:1: ( ( rule__PackageCS__Alternatives_4 )* )
             {
-            // InternalOCLstdlib.g:11131:1: ( ( rule__PackageCS__Alternatives_4 )* )
-            // InternalOCLstdlib.g:11132:1: ( rule__PackageCS__Alternatives_4 )*
+            // InternalOCLstdlib.g:11133:1: ( ( rule__PackageCS__Alternatives_4 )* )
+            // InternalOCLstdlib.g:11134:1: ( rule__PackageCS__Alternatives_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getAlternatives_4());
             }
-            // InternalOCLstdlib.g:11133:1: ( rule__PackageCS__Alternatives_4 )*
+            // InternalOCLstdlib.g:11135:1: ( rule__PackageCS__Alternatives_4 )*
             loop105:
             do {
                 int alt105=2;
@@ -33955,7 +33955,7 @@
 
                 switch (alt105) {
             	case 1 :
-            	    // InternalOCLstdlib.g:11133:2: rule__PackageCS__Alternatives_4
+            	    // InternalOCLstdlib.g:11135:2: rule__PackageCS__Alternatives_4
             	    {
             	    pushFollow(FollowSets000.FOLLOW_55);
             	    rule__PackageCS__Alternatives_4();
@@ -33996,14 +33996,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__5"
-    // InternalOCLstdlib.g:11143:1: rule__PackageCS__Group__5 : rule__PackageCS__Group__5__Impl ;
+    // InternalOCLstdlib.g:11145:1: rule__PackageCS__Group__5 : rule__PackageCS__Group__5__Impl ;
     public final void rule__PackageCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11147:1: ( rule__PackageCS__Group__5__Impl )
-            // InternalOCLstdlib.g:11148:2: rule__PackageCS__Group__5__Impl
+            // InternalOCLstdlib.g:11149:1: ( rule__PackageCS__Group__5__Impl )
+            // InternalOCLstdlib.g:11150:2: rule__PackageCS__Group__5__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Group__5__Impl();
@@ -34029,17 +34029,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group__5__Impl"
-    // InternalOCLstdlib.g:11154:1: rule__PackageCS__Group__5__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:11156:1: rule__PackageCS__Group__5__Impl : ( '}' ) ;
     public final void rule__PackageCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11158:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:11159:1: ( '}' )
+            // InternalOCLstdlib.g:11160:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:11161:1: ( '}' )
             {
-            // InternalOCLstdlib.g:11159:1: ( '}' )
-            // InternalOCLstdlib.g:11160:1: '}'
+            // InternalOCLstdlib.g:11161:1: ( '}' )
+            // InternalOCLstdlib.g:11162:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getRightCurlyBracketKeyword_5());
@@ -34070,14 +34070,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__0"
-    // InternalOCLstdlib.g:11185:1: rule__PackageCS__Group_2__0 : rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 ;
+    // InternalOCLstdlib.g:11187:1: rule__PackageCS__Group_2__0 : rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 ;
     public final void rule__PackageCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11189:1: ( rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 )
-            // InternalOCLstdlib.g:11190:2: rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1
+            // InternalOCLstdlib.g:11191:1: ( rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1 )
+            // InternalOCLstdlib.g:11192:2: rule__PackageCS__Group_2__0__Impl rule__PackageCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__PackageCS__Group_2__0__Impl();
@@ -34108,17 +34108,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:11197:1: rule__PackageCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:11199:1: rule__PackageCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__PackageCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11201:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:11202:1: ( ':' )
+            // InternalOCLstdlib.g:11203:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:11204:1: ( ':' )
             {
-            // InternalOCLstdlib.g:11202:1: ( ':' )
-            // InternalOCLstdlib.g:11203:1: ':'
+            // InternalOCLstdlib.g:11204:1: ( ':' )
+            // InternalOCLstdlib.g:11205:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getColonKeyword_2_0());
@@ -34149,14 +34149,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__1"
-    // InternalOCLstdlib.g:11216:1: rule__PackageCS__Group_2__1 : rule__PackageCS__Group_2__1__Impl rule__PackageCS__Group_2__2 ;
+    // InternalOCLstdlib.g:11218:1: rule__PackageCS__Group_2__1 : rule__PackageCS__Group_2__1__Impl rule__PackageCS__Group_2__2 ;
     public final void rule__PackageCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11220:1: ( rule__PackageCS__Group_2__1__Impl rule__PackageCS__Group_2__2 )
-            // InternalOCLstdlib.g:11221:2: rule__PackageCS__Group_2__1__Impl rule__PackageCS__Group_2__2
+            // InternalOCLstdlib.g:11222:1: ( rule__PackageCS__Group_2__1__Impl rule__PackageCS__Group_2__2 )
+            // InternalOCLstdlib.g:11223:2: rule__PackageCS__Group_2__1__Impl rule__PackageCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__PackageCS__Group_2__1__Impl();
@@ -34187,23 +34187,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:11228:1: rule__PackageCS__Group_2__1__Impl : ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:11230:1: rule__PackageCS__Group_2__1__Impl : ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) ;
     public final void rule__PackageCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11232:1: ( ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:11233:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
+            // InternalOCLstdlib.g:11234:1: ( ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:11235:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:11233:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
-            // InternalOCLstdlib.g:11234:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
+            // InternalOCLstdlib.g:11235:1: ( ( rule__PackageCS__NsPrefixAssignment_2_1 ) )
+            // InternalOCLstdlib.g:11236:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsPrefixAssignment_2_1());
             }
-            // InternalOCLstdlib.g:11235:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
-            // InternalOCLstdlib.g:11235:2: rule__PackageCS__NsPrefixAssignment_2_1
+            // InternalOCLstdlib.g:11237:1: ( rule__PackageCS__NsPrefixAssignment_2_1 )
+            // InternalOCLstdlib.g:11237:2: rule__PackageCS__NsPrefixAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__NsPrefixAssignment_2_1();
@@ -34238,14 +34238,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__2"
-    // InternalOCLstdlib.g:11245:1: rule__PackageCS__Group_2__2 : rule__PackageCS__Group_2__2__Impl rule__PackageCS__Group_2__3 ;
+    // InternalOCLstdlib.g:11247:1: rule__PackageCS__Group_2__2 : rule__PackageCS__Group_2__2__Impl rule__PackageCS__Group_2__3 ;
     public final void rule__PackageCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11249:1: ( rule__PackageCS__Group_2__2__Impl rule__PackageCS__Group_2__3 )
-            // InternalOCLstdlib.g:11250:2: rule__PackageCS__Group_2__2__Impl rule__PackageCS__Group_2__3
+            // InternalOCLstdlib.g:11251:1: ( rule__PackageCS__Group_2__2__Impl rule__PackageCS__Group_2__3 )
+            // InternalOCLstdlib.g:11252:2: rule__PackageCS__Group_2__2__Impl rule__PackageCS__Group_2__3
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__PackageCS__Group_2__2__Impl();
@@ -34276,17 +34276,17 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__2__Impl"
-    // InternalOCLstdlib.g:11257:1: rule__PackageCS__Group_2__2__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:11259:1: rule__PackageCS__Group_2__2__Impl : ( '=' ) ;
     public final void rule__PackageCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11261:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:11262:1: ( '=' )
+            // InternalOCLstdlib.g:11263:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:11264:1: ( '=' )
             {
-            // InternalOCLstdlib.g:11262:1: ( '=' )
-            // InternalOCLstdlib.g:11263:1: '='
+            // InternalOCLstdlib.g:11264:1: ( '=' )
+            // InternalOCLstdlib.g:11265:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getEqualsSignKeyword_2_2());
@@ -34317,14 +34317,14 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__3"
-    // InternalOCLstdlib.g:11276:1: rule__PackageCS__Group_2__3 : rule__PackageCS__Group_2__3__Impl ;
+    // InternalOCLstdlib.g:11278:1: rule__PackageCS__Group_2__3 : rule__PackageCS__Group_2__3__Impl ;
     public final void rule__PackageCS__Group_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11280:1: ( rule__PackageCS__Group_2__3__Impl )
-            // InternalOCLstdlib.g:11281:2: rule__PackageCS__Group_2__3__Impl
+            // InternalOCLstdlib.g:11282:1: ( rule__PackageCS__Group_2__3__Impl )
+            // InternalOCLstdlib.g:11283:2: rule__PackageCS__Group_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__Group_2__3__Impl();
@@ -34350,23 +34350,23 @@
 
 
     // $ANTLR start "rule__PackageCS__Group_2__3__Impl"
-    // InternalOCLstdlib.g:11287:1: rule__PackageCS__Group_2__3__Impl : ( ( rule__PackageCS__NsURIAssignment_2_3 ) ) ;
+    // InternalOCLstdlib.g:11289:1: rule__PackageCS__Group_2__3__Impl : ( ( rule__PackageCS__NsURIAssignment_2_3 ) ) ;
     public final void rule__PackageCS__Group_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11291:1: ( ( ( rule__PackageCS__NsURIAssignment_2_3 ) ) )
-            // InternalOCLstdlib.g:11292:1: ( ( rule__PackageCS__NsURIAssignment_2_3 ) )
+            // InternalOCLstdlib.g:11293:1: ( ( ( rule__PackageCS__NsURIAssignment_2_3 ) ) )
+            // InternalOCLstdlib.g:11294:1: ( ( rule__PackageCS__NsURIAssignment_2_3 ) )
             {
-            // InternalOCLstdlib.g:11292:1: ( ( rule__PackageCS__NsURIAssignment_2_3 ) )
-            // InternalOCLstdlib.g:11293:1: ( rule__PackageCS__NsURIAssignment_2_3 )
+            // InternalOCLstdlib.g:11294:1: ( ( rule__PackageCS__NsURIAssignment_2_3 ) )
+            // InternalOCLstdlib.g:11295:1: ( rule__PackageCS__NsURIAssignment_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsURIAssignment_2_3());
             }
-            // InternalOCLstdlib.g:11294:1: ( rule__PackageCS__NsURIAssignment_2_3 )
-            // InternalOCLstdlib.g:11294:2: rule__PackageCS__NsURIAssignment_2_3
+            // InternalOCLstdlib.g:11296:1: ( rule__PackageCS__NsURIAssignment_2_3 )
+            // InternalOCLstdlib.g:11296:2: rule__PackageCS__NsURIAssignment_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PackageCS__NsURIAssignment_2_3();
@@ -34401,14 +34401,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__0"
-    // InternalOCLstdlib.g:11312:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
+    // InternalOCLstdlib.g:11314:1: rule__ParameterCS__Group__0 : rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 ;
     public final void rule__ParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11316:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
-            // InternalOCLstdlib.g:11317:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
+            // InternalOCLstdlib.g:11318:1: ( rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1 )
+            // InternalOCLstdlib.g:11319:2: rule__ParameterCS__Group__0__Impl rule__ParameterCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__ParameterCS__Group__0__Impl();
@@ -34439,23 +34439,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__0__Impl"
-    // InternalOCLstdlib.g:11324:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:11326:1: rule__ParameterCS__Group__0__Impl : ( ( rule__ParameterCS__NameAssignment_0 ) ) ;
     public final void rule__ParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11328:1: ( ( ( rule__ParameterCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:11329:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:11330:1: ( ( ( rule__ParameterCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:11331:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:11329:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:11330:1: ( rule__ParameterCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:11331:1: ( ( rule__ParameterCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:11332:1: ( rule__ParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:11331:1: ( rule__ParameterCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:11331:2: rule__ParameterCS__NameAssignment_0
+            // InternalOCLstdlib.g:11333:1: ( rule__ParameterCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:11333:2: rule__ParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__NameAssignment_0();
@@ -34490,14 +34490,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__1"
-    // InternalOCLstdlib.g:11341:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 ;
+    // InternalOCLstdlib.g:11343:1: rule__ParameterCS__Group__1 : rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 ;
     public final void rule__ParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11345:1: ( rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 )
-            // InternalOCLstdlib.g:11346:2: rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2
+            // InternalOCLstdlib.g:11347:1: ( rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2 )
+            // InternalOCLstdlib.g:11348:2: rule__ParameterCS__Group__1__Impl rule__ParameterCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__ParameterCS__Group__1__Impl();
@@ -34528,17 +34528,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__1__Impl"
-    // InternalOCLstdlib.g:11353:1: rule__ParameterCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:11355:1: rule__ParameterCS__Group__1__Impl : ( ':' ) ;
     public final void rule__ParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11357:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:11358:1: ( ':' )
+            // InternalOCLstdlib.g:11359:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:11360:1: ( ':' )
             {
-            // InternalOCLstdlib.g:11358:1: ( ':' )
-            // InternalOCLstdlib.g:11359:1: ':'
+            // InternalOCLstdlib.g:11360:1: ( ':' )
+            // InternalOCLstdlib.g:11361:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getColonKeyword_1());
@@ -34569,14 +34569,14 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__2"
-    // InternalOCLstdlib.g:11372:1: rule__ParameterCS__Group__2 : rule__ParameterCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:11374:1: rule__ParameterCS__Group__2 : rule__ParameterCS__Group__2__Impl ;
     public final void rule__ParameterCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11376:1: ( rule__ParameterCS__Group__2__Impl )
-            // InternalOCLstdlib.g:11377:2: rule__ParameterCS__Group__2__Impl
+            // InternalOCLstdlib.g:11378:1: ( rule__ParameterCS__Group__2__Impl )
+            // InternalOCLstdlib.g:11379:2: rule__ParameterCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__Group__2__Impl();
@@ -34602,23 +34602,23 @@
 
 
     // $ANTLR start "rule__ParameterCS__Group__2__Impl"
-    // InternalOCLstdlib.g:11383:1: rule__ParameterCS__Group__2__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:11385:1: rule__ParameterCS__Group__2__Impl : ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__ParameterCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11387:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) ) )
-            // InternalOCLstdlib.g:11388:1: ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:11389:1: ( ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) ) )
+            // InternalOCLstdlib.g:11390:1: ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:11388:1: ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) )
-            // InternalOCLstdlib.g:11389:1: ( rule__ParameterCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:11390:1: ( ( rule__ParameterCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:11391:1: ( rule__ParameterCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalOCLstdlib.g:11390:1: ( rule__ParameterCS__OwnedTypeAssignment_2 )
-            // InternalOCLstdlib.g:11390:2: rule__ParameterCS__OwnedTypeAssignment_2
+            // InternalOCLstdlib.g:11392:1: ( rule__ParameterCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:11392:2: rule__ParameterCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ParameterCS__OwnedTypeAssignment_2();
@@ -34653,14 +34653,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__0"
-    // InternalOCLstdlib.g:11406:1: rule__LibPropertyCS__Group__0 : rule__LibPropertyCS__Group__0__Impl rule__LibPropertyCS__Group__1 ;
+    // InternalOCLstdlib.g:11408:1: rule__LibPropertyCS__Group__0 : rule__LibPropertyCS__Group__0__Impl rule__LibPropertyCS__Group__1 ;
     public final void rule__LibPropertyCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11410:1: ( rule__LibPropertyCS__Group__0__Impl rule__LibPropertyCS__Group__1 )
-            // InternalOCLstdlib.g:11411:2: rule__LibPropertyCS__Group__0__Impl rule__LibPropertyCS__Group__1
+            // InternalOCLstdlib.g:11412:1: ( rule__LibPropertyCS__Group__0__Impl rule__LibPropertyCS__Group__1 )
+            // InternalOCLstdlib.g:11413:2: rule__LibPropertyCS__Group__0__Impl rule__LibPropertyCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_56);
             rule__LibPropertyCS__Group__0__Impl();
@@ -34691,22 +34691,22 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__0__Impl"
-    // InternalOCLstdlib.g:11418:1: rule__LibPropertyCS__Group__0__Impl : ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? ) ;
+    // InternalOCLstdlib.g:11420:1: rule__LibPropertyCS__Group__0__Impl : ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? ) ;
     public final void rule__LibPropertyCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11422:1: ( ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? ) )
-            // InternalOCLstdlib.g:11423:1: ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? )
+            // InternalOCLstdlib.g:11424:1: ( ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? ) )
+            // InternalOCLstdlib.g:11425:1: ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? )
             {
-            // InternalOCLstdlib.g:11423:1: ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? )
-            // InternalOCLstdlib.g:11424:1: ( rule__LibPropertyCS__IsStaticAssignment_0 )?
+            // InternalOCLstdlib.g:11425:1: ( ( rule__LibPropertyCS__IsStaticAssignment_0 )? )
+            // InternalOCLstdlib.g:11426:1: ( rule__LibPropertyCS__IsStaticAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getIsStaticAssignment_0());
             }
-            // InternalOCLstdlib.g:11425:1: ( rule__LibPropertyCS__IsStaticAssignment_0 )?
+            // InternalOCLstdlib.g:11427:1: ( rule__LibPropertyCS__IsStaticAssignment_0 )?
             int alt106=2;
             int LA106_0 = input.LA(1);
 
@@ -34715,7 +34715,7 @@
             }
             switch (alt106) {
                 case 1 :
-                    // InternalOCLstdlib.g:11425:2: rule__LibPropertyCS__IsStaticAssignment_0
+                    // InternalOCLstdlib.g:11427:2: rule__LibPropertyCS__IsStaticAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPropertyCS__IsStaticAssignment_0();
@@ -34753,14 +34753,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__1"
-    // InternalOCLstdlib.g:11435:1: rule__LibPropertyCS__Group__1 : rule__LibPropertyCS__Group__1__Impl rule__LibPropertyCS__Group__2 ;
+    // InternalOCLstdlib.g:11437:1: rule__LibPropertyCS__Group__1 : rule__LibPropertyCS__Group__1__Impl rule__LibPropertyCS__Group__2 ;
     public final void rule__LibPropertyCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11439:1: ( rule__LibPropertyCS__Group__1__Impl rule__LibPropertyCS__Group__2 )
-            // InternalOCLstdlib.g:11440:2: rule__LibPropertyCS__Group__1__Impl rule__LibPropertyCS__Group__2
+            // InternalOCLstdlib.g:11441:1: ( rule__LibPropertyCS__Group__1__Impl rule__LibPropertyCS__Group__2 )
+            // InternalOCLstdlib.g:11442:2: rule__LibPropertyCS__Group__1__Impl rule__LibPropertyCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__LibPropertyCS__Group__1__Impl();
@@ -34791,17 +34791,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__1__Impl"
-    // InternalOCLstdlib.g:11447:1: rule__LibPropertyCS__Group__1__Impl : ( 'property' ) ;
+    // InternalOCLstdlib.g:11449:1: rule__LibPropertyCS__Group__1__Impl : ( 'property' ) ;
     public final void rule__LibPropertyCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11451:1: ( ( 'property' ) )
-            // InternalOCLstdlib.g:11452:1: ( 'property' )
+            // InternalOCLstdlib.g:11453:1: ( ( 'property' ) )
+            // InternalOCLstdlib.g:11454:1: ( 'property' )
             {
-            // InternalOCLstdlib.g:11452:1: ( 'property' )
-            // InternalOCLstdlib.g:11453:1: 'property'
+            // InternalOCLstdlib.g:11454:1: ( 'property' )
+            // InternalOCLstdlib.g:11455:1: 'property'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getPropertyKeyword_1());
@@ -34832,14 +34832,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__2"
-    // InternalOCLstdlib.g:11466:1: rule__LibPropertyCS__Group__2 : rule__LibPropertyCS__Group__2__Impl rule__LibPropertyCS__Group__3 ;
+    // InternalOCLstdlib.g:11468:1: rule__LibPropertyCS__Group__2 : rule__LibPropertyCS__Group__2__Impl rule__LibPropertyCS__Group__3 ;
     public final void rule__LibPropertyCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11470:1: ( rule__LibPropertyCS__Group__2__Impl rule__LibPropertyCS__Group__3 )
-            // InternalOCLstdlib.g:11471:2: rule__LibPropertyCS__Group__2__Impl rule__LibPropertyCS__Group__3
+            // InternalOCLstdlib.g:11472:1: ( rule__LibPropertyCS__Group__2__Impl rule__LibPropertyCS__Group__3 )
+            // InternalOCLstdlib.g:11473:2: rule__LibPropertyCS__Group__2__Impl rule__LibPropertyCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__LibPropertyCS__Group__2__Impl();
@@ -34870,23 +34870,23 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__2__Impl"
-    // InternalOCLstdlib.g:11478:1: rule__LibPropertyCS__Group__2__Impl : ( ( rule__LibPropertyCS__NameAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:11480:1: rule__LibPropertyCS__Group__2__Impl : ( ( rule__LibPropertyCS__NameAssignment_2 ) ) ;
     public final void rule__LibPropertyCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11482:1: ( ( ( rule__LibPropertyCS__NameAssignment_2 ) ) )
-            // InternalOCLstdlib.g:11483:1: ( ( rule__LibPropertyCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:11484:1: ( ( ( rule__LibPropertyCS__NameAssignment_2 ) ) )
+            // InternalOCLstdlib.g:11485:1: ( ( rule__LibPropertyCS__NameAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:11483:1: ( ( rule__LibPropertyCS__NameAssignment_2 ) )
-            // InternalOCLstdlib.g:11484:1: ( rule__LibPropertyCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:11485:1: ( ( rule__LibPropertyCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:11486:1: ( rule__LibPropertyCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getNameAssignment_2());
             }
-            // InternalOCLstdlib.g:11485:1: ( rule__LibPropertyCS__NameAssignment_2 )
-            // InternalOCLstdlib.g:11485:2: rule__LibPropertyCS__NameAssignment_2
+            // InternalOCLstdlib.g:11487:1: ( rule__LibPropertyCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:11487:2: rule__LibPropertyCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__NameAssignment_2();
@@ -34921,14 +34921,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__3"
-    // InternalOCLstdlib.g:11495:1: rule__LibPropertyCS__Group__3 : rule__LibPropertyCS__Group__3__Impl rule__LibPropertyCS__Group__4 ;
+    // InternalOCLstdlib.g:11497:1: rule__LibPropertyCS__Group__3 : rule__LibPropertyCS__Group__3__Impl rule__LibPropertyCS__Group__4 ;
     public final void rule__LibPropertyCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11499:1: ( rule__LibPropertyCS__Group__3__Impl rule__LibPropertyCS__Group__4 )
-            // InternalOCLstdlib.g:11500:2: rule__LibPropertyCS__Group__3__Impl rule__LibPropertyCS__Group__4
+            // InternalOCLstdlib.g:11501:1: ( rule__LibPropertyCS__Group__3__Impl rule__LibPropertyCS__Group__4 )
+            // InternalOCLstdlib.g:11502:2: rule__LibPropertyCS__Group__3__Impl rule__LibPropertyCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__LibPropertyCS__Group__3__Impl();
@@ -34959,17 +34959,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__3__Impl"
-    // InternalOCLstdlib.g:11507:1: rule__LibPropertyCS__Group__3__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:11509:1: rule__LibPropertyCS__Group__3__Impl : ( ':' ) ;
     public final void rule__LibPropertyCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11511:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:11512:1: ( ':' )
+            // InternalOCLstdlib.g:11513:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:11514:1: ( ':' )
             {
-            // InternalOCLstdlib.g:11512:1: ( ':' )
-            // InternalOCLstdlib.g:11513:1: ':'
+            // InternalOCLstdlib.g:11514:1: ( ':' )
+            // InternalOCLstdlib.g:11515:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getColonKeyword_3());
@@ -35000,14 +35000,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__4"
-    // InternalOCLstdlib.g:11526:1: rule__LibPropertyCS__Group__4 : rule__LibPropertyCS__Group__4__Impl rule__LibPropertyCS__Group__5 ;
+    // InternalOCLstdlib.g:11528:1: rule__LibPropertyCS__Group__4 : rule__LibPropertyCS__Group__4__Impl rule__LibPropertyCS__Group__5 ;
     public final void rule__LibPropertyCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11530:1: ( rule__LibPropertyCS__Group__4__Impl rule__LibPropertyCS__Group__5 )
-            // InternalOCLstdlib.g:11531:2: rule__LibPropertyCS__Group__4__Impl rule__LibPropertyCS__Group__5
+            // InternalOCLstdlib.g:11532:1: ( rule__LibPropertyCS__Group__4__Impl rule__LibPropertyCS__Group__5 )
+            // InternalOCLstdlib.g:11533:2: rule__LibPropertyCS__Group__4__Impl rule__LibPropertyCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__LibPropertyCS__Group__4__Impl();
@@ -35038,23 +35038,23 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__4__Impl"
-    // InternalOCLstdlib.g:11538:1: rule__LibPropertyCS__Group__4__Impl : ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) ) ;
+    // InternalOCLstdlib.g:11540:1: rule__LibPropertyCS__Group__4__Impl : ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) ) ;
     public final void rule__LibPropertyCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11542:1: ( ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) ) )
-            // InternalOCLstdlib.g:11543:1: ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) )
+            // InternalOCLstdlib.g:11544:1: ( ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) ) )
+            // InternalOCLstdlib.g:11545:1: ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) )
             {
-            // InternalOCLstdlib.g:11543:1: ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) )
-            // InternalOCLstdlib.g:11544:1: ( rule__LibPropertyCS__OwnedTypeAssignment_4 )
+            // InternalOCLstdlib.g:11545:1: ( ( rule__LibPropertyCS__OwnedTypeAssignment_4 ) )
+            // InternalOCLstdlib.g:11546:1: ( rule__LibPropertyCS__OwnedTypeAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getOwnedTypeAssignment_4());
             }
-            // InternalOCLstdlib.g:11545:1: ( rule__LibPropertyCS__OwnedTypeAssignment_4 )
-            // InternalOCLstdlib.g:11545:2: rule__LibPropertyCS__OwnedTypeAssignment_4
+            // InternalOCLstdlib.g:11547:1: ( rule__LibPropertyCS__OwnedTypeAssignment_4 )
+            // InternalOCLstdlib.g:11547:2: rule__LibPropertyCS__OwnedTypeAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__OwnedTypeAssignment_4();
@@ -35089,14 +35089,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__5"
-    // InternalOCLstdlib.g:11555:1: rule__LibPropertyCS__Group__5 : rule__LibPropertyCS__Group__5__Impl rule__LibPropertyCS__Group__6 ;
+    // InternalOCLstdlib.g:11557:1: rule__LibPropertyCS__Group__5 : rule__LibPropertyCS__Group__5__Impl rule__LibPropertyCS__Group__6 ;
     public final void rule__LibPropertyCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11559:1: ( rule__LibPropertyCS__Group__5__Impl rule__LibPropertyCS__Group__6 )
-            // InternalOCLstdlib.g:11560:2: rule__LibPropertyCS__Group__5__Impl rule__LibPropertyCS__Group__6
+            // InternalOCLstdlib.g:11561:1: ( rule__LibPropertyCS__Group__5__Impl rule__LibPropertyCS__Group__6 )
+            // InternalOCLstdlib.g:11562:2: rule__LibPropertyCS__Group__5__Impl rule__LibPropertyCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__LibPropertyCS__Group__5__Impl();
@@ -35127,22 +35127,22 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__5__Impl"
-    // InternalOCLstdlib.g:11567:1: rule__LibPropertyCS__Group__5__Impl : ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? ) ;
+    // InternalOCLstdlib.g:11569:1: rule__LibPropertyCS__Group__5__Impl : ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? ) ;
     public final void rule__LibPropertyCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11571:1: ( ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? ) )
-            // InternalOCLstdlib.g:11572:1: ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? )
+            // InternalOCLstdlib.g:11573:1: ( ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? ) )
+            // InternalOCLstdlib.g:11574:1: ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? )
             {
-            // InternalOCLstdlib.g:11572:1: ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? )
-            // InternalOCLstdlib.g:11573:1: ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )?
+            // InternalOCLstdlib.g:11574:1: ( ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )? )
+            // InternalOCLstdlib.g:11575:1: ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getOwnedOppositeAssignment_5());
             }
-            // InternalOCLstdlib.g:11574:1: ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )?
+            // InternalOCLstdlib.g:11576:1: ( rule__LibPropertyCS__OwnedOppositeAssignment_5 )?
             int alt107=2;
             int LA107_0 = input.LA(1);
 
@@ -35151,7 +35151,7 @@
             }
             switch (alt107) {
                 case 1 :
-                    // InternalOCLstdlib.g:11574:2: rule__LibPropertyCS__OwnedOppositeAssignment_5
+                    // InternalOCLstdlib.g:11576:2: rule__LibPropertyCS__OwnedOppositeAssignment_5
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPropertyCS__OwnedOppositeAssignment_5();
@@ -35189,14 +35189,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__6"
-    // InternalOCLstdlib.g:11584:1: rule__LibPropertyCS__Group__6 : rule__LibPropertyCS__Group__6__Impl rule__LibPropertyCS__Group__7 ;
+    // InternalOCLstdlib.g:11586:1: rule__LibPropertyCS__Group__6 : rule__LibPropertyCS__Group__6__Impl rule__LibPropertyCS__Group__7 ;
     public final void rule__LibPropertyCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11588:1: ( rule__LibPropertyCS__Group__6__Impl rule__LibPropertyCS__Group__7 )
-            // InternalOCLstdlib.g:11589:2: rule__LibPropertyCS__Group__6__Impl rule__LibPropertyCS__Group__7
+            // InternalOCLstdlib.g:11590:1: ( rule__LibPropertyCS__Group__6__Impl rule__LibPropertyCS__Group__7 )
+            // InternalOCLstdlib.g:11591:2: rule__LibPropertyCS__Group__6__Impl rule__LibPropertyCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_57);
             rule__LibPropertyCS__Group__6__Impl();
@@ -35227,22 +35227,22 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__6__Impl"
-    // InternalOCLstdlib.g:11596:1: rule__LibPropertyCS__Group__6__Impl : ( ( rule__LibPropertyCS__Group_6__0 )? ) ;
+    // InternalOCLstdlib.g:11598:1: rule__LibPropertyCS__Group__6__Impl : ( ( rule__LibPropertyCS__Group_6__0 )? ) ;
     public final void rule__LibPropertyCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11600:1: ( ( ( rule__LibPropertyCS__Group_6__0 )? ) )
-            // InternalOCLstdlib.g:11601:1: ( ( rule__LibPropertyCS__Group_6__0 )? )
+            // InternalOCLstdlib.g:11602:1: ( ( ( rule__LibPropertyCS__Group_6__0 )? ) )
+            // InternalOCLstdlib.g:11603:1: ( ( rule__LibPropertyCS__Group_6__0 )? )
             {
-            // InternalOCLstdlib.g:11601:1: ( ( rule__LibPropertyCS__Group_6__0 )? )
-            // InternalOCLstdlib.g:11602:1: ( rule__LibPropertyCS__Group_6__0 )?
+            // InternalOCLstdlib.g:11603:1: ( ( rule__LibPropertyCS__Group_6__0 )? )
+            // InternalOCLstdlib.g:11604:1: ( rule__LibPropertyCS__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getGroup_6());
             }
-            // InternalOCLstdlib.g:11603:1: ( rule__LibPropertyCS__Group_6__0 )?
+            // InternalOCLstdlib.g:11605:1: ( rule__LibPropertyCS__Group_6__0 )?
             int alt108=2;
             int LA108_0 = input.LA(1);
 
@@ -35251,7 +35251,7 @@
             }
             switch (alt108) {
                 case 1 :
-                    // InternalOCLstdlib.g:11603:2: rule__LibPropertyCS__Group_6__0
+                    // InternalOCLstdlib.g:11605:2: rule__LibPropertyCS__Group_6__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LibPropertyCS__Group_6__0();
@@ -35289,14 +35289,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__7"
-    // InternalOCLstdlib.g:11613:1: rule__LibPropertyCS__Group__7 : rule__LibPropertyCS__Group__7__Impl ;
+    // InternalOCLstdlib.g:11615:1: rule__LibPropertyCS__Group__7 : rule__LibPropertyCS__Group__7__Impl ;
     public final void rule__LibPropertyCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11617:1: ( rule__LibPropertyCS__Group__7__Impl )
-            // InternalOCLstdlib.g:11618:2: rule__LibPropertyCS__Group__7__Impl
+            // InternalOCLstdlib.g:11619:1: ( rule__LibPropertyCS__Group__7__Impl )
+            // InternalOCLstdlib.g:11620:2: rule__LibPropertyCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__Group__7__Impl();
@@ -35322,23 +35322,23 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group__7__Impl"
-    // InternalOCLstdlib.g:11624:1: rule__LibPropertyCS__Group__7__Impl : ( ( rule__LibPropertyCS__Alternatives_7 ) ) ;
+    // InternalOCLstdlib.g:11626:1: rule__LibPropertyCS__Group__7__Impl : ( ( rule__LibPropertyCS__Alternatives_7 ) ) ;
     public final void rule__LibPropertyCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11628:1: ( ( ( rule__LibPropertyCS__Alternatives_7 ) ) )
-            // InternalOCLstdlib.g:11629:1: ( ( rule__LibPropertyCS__Alternatives_7 ) )
+            // InternalOCLstdlib.g:11630:1: ( ( ( rule__LibPropertyCS__Alternatives_7 ) ) )
+            // InternalOCLstdlib.g:11631:1: ( ( rule__LibPropertyCS__Alternatives_7 ) )
             {
-            // InternalOCLstdlib.g:11629:1: ( ( rule__LibPropertyCS__Alternatives_7 ) )
-            // InternalOCLstdlib.g:11630:1: ( rule__LibPropertyCS__Alternatives_7 )
+            // InternalOCLstdlib.g:11631:1: ( ( rule__LibPropertyCS__Alternatives_7 ) )
+            // InternalOCLstdlib.g:11632:1: ( rule__LibPropertyCS__Alternatives_7 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getAlternatives_7());
             }
-            // InternalOCLstdlib.g:11631:1: ( rule__LibPropertyCS__Alternatives_7 )
-            // InternalOCLstdlib.g:11631:2: rule__LibPropertyCS__Alternatives_7
+            // InternalOCLstdlib.g:11633:1: ( rule__LibPropertyCS__Alternatives_7 )
+            // InternalOCLstdlib.g:11633:2: rule__LibPropertyCS__Alternatives_7
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__Alternatives_7();
@@ -35373,14 +35373,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_6__0"
-    // InternalOCLstdlib.g:11657:1: rule__LibPropertyCS__Group_6__0 : rule__LibPropertyCS__Group_6__0__Impl rule__LibPropertyCS__Group_6__1 ;
+    // InternalOCLstdlib.g:11659:1: rule__LibPropertyCS__Group_6__0 : rule__LibPropertyCS__Group_6__0__Impl rule__LibPropertyCS__Group_6__1 ;
     public final void rule__LibPropertyCS__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11661:1: ( rule__LibPropertyCS__Group_6__0__Impl rule__LibPropertyCS__Group_6__1 )
-            // InternalOCLstdlib.g:11662:2: rule__LibPropertyCS__Group_6__0__Impl rule__LibPropertyCS__Group_6__1
+            // InternalOCLstdlib.g:11663:1: ( rule__LibPropertyCS__Group_6__0__Impl rule__LibPropertyCS__Group_6__1 )
+            // InternalOCLstdlib.g:11664:2: rule__LibPropertyCS__Group_6__0__Impl rule__LibPropertyCS__Group_6__1
             {
             pushFollow(FollowSets000.FOLLOW_36);
             rule__LibPropertyCS__Group_6__0__Impl();
@@ -35411,17 +35411,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_6__0__Impl"
-    // InternalOCLstdlib.g:11669:1: rule__LibPropertyCS__Group_6__0__Impl : ( '=>' ) ;
+    // InternalOCLstdlib.g:11671:1: rule__LibPropertyCS__Group_6__0__Impl : ( '=>' ) ;
     public final void rule__LibPropertyCS__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11673:1: ( ( '=>' ) )
-            // InternalOCLstdlib.g:11674:1: ( '=>' )
+            // InternalOCLstdlib.g:11675:1: ( ( '=>' ) )
+            // InternalOCLstdlib.g:11676:1: ( '=>' )
             {
-            // InternalOCLstdlib.g:11674:1: ( '=>' )
-            // InternalOCLstdlib.g:11675:1: '=>'
+            // InternalOCLstdlib.g:11676:1: ( '=>' )
+            // InternalOCLstdlib.g:11677:1: '=>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getEqualsSignGreaterThanSignKeyword_6_0());
@@ -35452,14 +35452,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_6__1"
-    // InternalOCLstdlib.g:11688:1: rule__LibPropertyCS__Group_6__1 : rule__LibPropertyCS__Group_6__1__Impl ;
+    // InternalOCLstdlib.g:11690:1: rule__LibPropertyCS__Group_6__1 : rule__LibPropertyCS__Group_6__1__Impl ;
     public final void rule__LibPropertyCS__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11692:1: ( rule__LibPropertyCS__Group_6__1__Impl )
-            // InternalOCLstdlib.g:11693:2: rule__LibPropertyCS__Group_6__1__Impl
+            // InternalOCLstdlib.g:11694:1: ( rule__LibPropertyCS__Group_6__1__Impl )
+            // InternalOCLstdlib.g:11695:2: rule__LibPropertyCS__Group_6__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__Group_6__1__Impl();
@@ -35485,23 +35485,23 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_6__1__Impl"
-    // InternalOCLstdlib.g:11699:1: rule__LibPropertyCS__Group_6__1__Impl : ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) ) ;
+    // InternalOCLstdlib.g:11701:1: rule__LibPropertyCS__Group_6__1__Impl : ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) ) ;
     public final void rule__LibPropertyCS__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11703:1: ( ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) ) )
-            // InternalOCLstdlib.g:11704:1: ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) )
+            // InternalOCLstdlib.g:11705:1: ( ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) ) )
+            // InternalOCLstdlib.g:11706:1: ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) )
             {
-            // InternalOCLstdlib.g:11704:1: ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) )
-            // InternalOCLstdlib.g:11705:1: ( rule__LibPropertyCS__ImplementationAssignment_6_1 )
+            // InternalOCLstdlib.g:11706:1: ( ( rule__LibPropertyCS__ImplementationAssignment_6_1 ) )
+            // InternalOCLstdlib.g:11707:1: ( rule__LibPropertyCS__ImplementationAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getImplementationAssignment_6_1());
             }
-            // InternalOCLstdlib.g:11706:1: ( rule__LibPropertyCS__ImplementationAssignment_6_1 )
-            // InternalOCLstdlib.g:11706:2: rule__LibPropertyCS__ImplementationAssignment_6_1
+            // InternalOCLstdlib.g:11708:1: ( rule__LibPropertyCS__ImplementationAssignment_6_1 )
+            // InternalOCLstdlib.g:11708:2: rule__LibPropertyCS__ImplementationAssignment_6_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__ImplementationAssignment_6_1();
@@ -35536,14 +35536,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_7_0__0"
-    // InternalOCLstdlib.g:11720:1: rule__LibPropertyCS__Group_7_0__0 : rule__LibPropertyCS__Group_7_0__0__Impl rule__LibPropertyCS__Group_7_0__1 ;
+    // InternalOCLstdlib.g:11722:1: rule__LibPropertyCS__Group_7_0__0 : rule__LibPropertyCS__Group_7_0__0__Impl rule__LibPropertyCS__Group_7_0__1 ;
     public final void rule__LibPropertyCS__Group_7_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11724:1: ( rule__LibPropertyCS__Group_7_0__0__Impl rule__LibPropertyCS__Group_7_0__1 )
-            // InternalOCLstdlib.g:11725:2: rule__LibPropertyCS__Group_7_0__0__Impl rule__LibPropertyCS__Group_7_0__1
+            // InternalOCLstdlib.g:11726:1: ( rule__LibPropertyCS__Group_7_0__0__Impl rule__LibPropertyCS__Group_7_0__1 )
+            // InternalOCLstdlib.g:11727:2: rule__LibPropertyCS__Group_7_0__0__Impl rule__LibPropertyCS__Group_7_0__1
             {
             pushFollow(FollowSets000.FOLLOW_58);
             rule__LibPropertyCS__Group_7_0__0__Impl();
@@ -35574,17 +35574,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_7_0__0__Impl"
-    // InternalOCLstdlib.g:11732:1: rule__LibPropertyCS__Group_7_0__0__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:11734:1: rule__LibPropertyCS__Group_7_0__0__Impl : ( '{' ) ;
     public final void rule__LibPropertyCS__Group_7_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11736:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:11737:1: ( '{' )
+            // InternalOCLstdlib.g:11738:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:11739:1: ( '{' )
             {
-            // InternalOCLstdlib.g:11737:1: ( '{' )
-            // InternalOCLstdlib.g:11738:1: '{'
+            // InternalOCLstdlib.g:11739:1: ( '{' )
+            // InternalOCLstdlib.g:11740:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getLeftCurlyBracketKeyword_7_0_0());
@@ -35615,14 +35615,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_7_0__1"
-    // InternalOCLstdlib.g:11751:1: rule__LibPropertyCS__Group_7_0__1 : rule__LibPropertyCS__Group_7_0__1__Impl rule__LibPropertyCS__Group_7_0__2 ;
+    // InternalOCLstdlib.g:11753:1: rule__LibPropertyCS__Group_7_0__1 : rule__LibPropertyCS__Group_7_0__1__Impl rule__LibPropertyCS__Group_7_0__2 ;
     public final void rule__LibPropertyCS__Group_7_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11755:1: ( rule__LibPropertyCS__Group_7_0__1__Impl rule__LibPropertyCS__Group_7_0__2 )
-            // InternalOCLstdlib.g:11756:2: rule__LibPropertyCS__Group_7_0__1__Impl rule__LibPropertyCS__Group_7_0__2
+            // InternalOCLstdlib.g:11757:1: ( rule__LibPropertyCS__Group_7_0__1__Impl rule__LibPropertyCS__Group_7_0__2 )
+            // InternalOCLstdlib.g:11758:2: rule__LibPropertyCS__Group_7_0__1__Impl rule__LibPropertyCS__Group_7_0__2
             {
             pushFollow(FollowSets000.FOLLOW_58);
             rule__LibPropertyCS__Group_7_0__1__Impl();
@@ -35653,22 +35653,22 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_7_0__1__Impl"
-    // InternalOCLstdlib.g:11763:1: rule__LibPropertyCS__Group_7_0__1__Impl : ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* ) ;
+    // InternalOCLstdlib.g:11765:1: rule__LibPropertyCS__Group_7_0__1__Impl : ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* ) ;
     public final void rule__LibPropertyCS__Group_7_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11767:1: ( ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* ) )
-            // InternalOCLstdlib.g:11768:1: ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* )
+            // InternalOCLstdlib.g:11769:1: ( ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* ) )
+            // InternalOCLstdlib.g:11770:1: ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* )
             {
-            // InternalOCLstdlib.g:11768:1: ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* )
-            // InternalOCLstdlib.g:11769:1: ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )*
+            // InternalOCLstdlib.g:11770:1: ( ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )* )
+            // InternalOCLstdlib.g:11771:1: ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getOwnedAnnotationsAssignment_7_0_1());
             }
-            // InternalOCLstdlib.g:11770:1: ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )*
+            // InternalOCLstdlib.g:11772:1: ( rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 )*
             loop109:
             do {
                 int alt109=2;
@@ -35681,7 +35681,7 @@
 
                 switch (alt109) {
             	case 1 :
-            	    // InternalOCLstdlib.g:11770:2: rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1
+            	    // InternalOCLstdlib.g:11772:2: rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_59);
             	    rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1();
@@ -35722,14 +35722,14 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_7_0__2"
-    // InternalOCLstdlib.g:11780:1: rule__LibPropertyCS__Group_7_0__2 : rule__LibPropertyCS__Group_7_0__2__Impl ;
+    // InternalOCLstdlib.g:11782:1: rule__LibPropertyCS__Group_7_0__2 : rule__LibPropertyCS__Group_7_0__2__Impl ;
     public final void rule__LibPropertyCS__Group_7_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11784:1: ( rule__LibPropertyCS__Group_7_0__2__Impl )
-            // InternalOCLstdlib.g:11785:2: rule__LibPropertyCS__Group_7_0__2__Impl
+            // InternalOCLstdlib.g:11786:1: ( rule__LibPropertyCS__Group_7_0__2__Impl )
+            // InternalOCLstdlib.g:11787:2: rule__LibPropertyCS__Group_7_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LibPropertyCS__Group_7_0__2__Impl();
@@ -35755,17 +35755,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__Group_7_0__2__Impl"
-    // InternalOCLstdlib.g:11791:1: rule__LibPropertyCS__Group_7_0__2__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:11793:1: rule__LibPropertyCS__Group_7_0__2__Impl : ( '}' ) ;
     public final void rule__LibPropertyCS__Group_7_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11795:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:11796:1: ( '}' )
+            // InternalOCLstdlib.g:11797:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:11798:1: ( '}' )
             {
-            // InternalOCLstdlib.g:11796:1: ( '}' )
-            // InternalOCLstdlib.g:11797:1: '}'
+            // InternalOCLstdlib.g:11798:1: ( '}' )
+            // InternalOCLstdlib.g:11799:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getRightCurlyBracketKeyword_7_0_2());
@@ -35796,14 +35796,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group__0"
-    // InternalOCLstdlib.g:11816:1: rule__PostCS__Group__0 : rule__PostCS__Group__0__Impl rule__PostCS__Group__1 ;
+    // InternalOCLstdlib.g:11818:1: rule__PostCS__Group__0 : rule__PostCS__Group__0__Impl rule__PostCS__Group__1 ;
     public final void rule__PostCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11820:1: ( rule__PostCS__Group__0__Impl rule__PostCS__Group__1 )
-            // InternalOCLstdlib.g:11821:2: rule__PostCS__Group__0__Impl rule__PostCS__Group__1
+            // InternalOCLstdlib.g:11822:1: ( rule__PostCS__Group__0__Impl rule__PostCS__Group__1 )
+            // InternalOCLstdlib.g:11823:2: rule__PostCS__Group__0__Impl rule__PostCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__PostCS__Group__0__Impl();
@@ -35834,23 +35834,23 @@
 
 
     // $ANTLR start "rule__PostCS__Group__0__Impl"
-    // InternalOCLstdlib.g:11828:1: rule__PostCS__Group__0__Impl : ( ( rule__PostCS__StereotypeAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:11830:1: rule__PostCS__Group__0__Impl : ( ( rule__PostCS__StereotypeAssignment_0 ) ) ;
     public final void rule__PostCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11832:1: ( ( ( rule__PostCS__StereotypeAssignment_0 ) ) )
-            // InternalOCLstdlib.g:11833:1: ( ( rule__PostCS__StereotypeAssignment_0 ) )
+            // InternalOCLstdlib.g:11834:1: ( ( ( rule__PostCS__StereotypeAssignment_0 ) ) )
+            // InternalOCLstdlib.g:11835:1: ( ( rule__PostCS__StereotypeAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:11833:1: ( ( rule__PostCS__StereotypeAssignment_0 ) )
-            // InternalOCLstdlib.g:11834:1: ( rule__PostCS__StereotypeAssignment_0 )
+            // InternalOCLstdlib.g:11835:1: ( ( rule__PostCS__StereotypeAssignment_0 ) )
+            // InternalOCLstdlib.g:11836:1: ( rule__PostCS__StereotypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getStereotypeAssignment_0());
             }
-            // InternalOCLstdlib.g:11835:1: ( rule__PostCS__StereotypeAssignment_0 )
-            // InternalOCLstdlib.g:11835:2: rule__PostCS__StereotypeAssignment_0
+            // InternalOCLstdlib.g:11837:1: ( rule__PostCS__StereotypeAssignment_0 )
+            // InternalOCLstdlib.g:11837:2: rule__PostCS__StereotypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__StereotypeAssignment_0();
@@ -35885,14 +35885,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group__1"
-    // InternalOCLstdlib.g:11845:1: rule__PostCS__Group__1 : rule__PostCS__Group__1__Impl rule__PostCS__Group__2 ;
+    // InternalOCLstdlib.g:11847:1: rule__PostCS__Group__1 : rule__PostCS__Group__1__Impl rule__PostCS__Group__2 ;
     public final void rule__PostCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11849:1: ( rule__PostCS__Group__1__Impl rule__PostCS__Group__2 )
-            // InternalOCLstdlib.g:11850:2: rule__PostCS__Group__1__Impl rule__PostCS__Group__2
+            // InternalOCLstdlib.g:11851:1: ( rule__PostCS__Group__1__Impl rule__PostCS__Group__2 )
+            // InternalOCLstdlib.g:11852:2: rule__PostCS__Group__1__Impl rule__PostCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__PostCS__Group__1__Impl();
@@ -35923,22 +35923,22 @@
 
 
     // $ANTLR start "rule__PostCS__Group__1__Impl"
-    // InternalOCLstdlib.g:11857:1: rule__PostCS__Group__1__Impl : ( ( rule__PostCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:11859:1: rule__PostCS__Group__1__Impl : ( ( rule__PostCS__Group_1__0 )? ) ;
     public final void rule__PostCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11861:1: ( ( ( rule__PostCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:11862:1: ( ( rule__PostCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:11863:1: ( ( ( rule__PostCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:11864:1: ( ( rule__PostCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:11862:1: ( ( rule__PostCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:11863:1: ( rule__PostCS__Group_1__0 )?
+            // InternalOCLstdlib.g:11864:1: ( ( rule__PostCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:11865:1: ( rule__PostCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:11864:1: ( rule__PostCS__Group_1__0 )?
+            // InternalOCLstdlib.g:11866:1: ( rule__PostCS__Group_1__0 )?
             int alt110=2;
             int LA110_0 = input.LA(1);
 
@@ -35947,7 +35947,7 @@
             }
             switch (alt110) {
                 case 1 :
-                    // InternalOCLstdlib.g:11864:2: rule__PostCS__Group_1__0
+                    // InternalOCLstdlib.g:11866:2: rule__PostCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PostCS__Group_1__0();
@@ -35985,14 +35985,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group__2"
-    // InternalOCLstdlib.g:11874:1: rule__PostCS__Group__2 : rule__PostCS__Group__2__Impl rule__PostCS__Group__3 ;
+    // InternalOCLstdlib.g:11876:1: rule__PostCS__Group__2 : rule__PostCS__Group__2__Impl rule__PostCS__Group__3 ;
     public final void rule__PostCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11878:1: ( rule__PostCS__Group__2__Impl rule__PostCS__Group__3 )
-            // InternalOCLstdlib.g:11879:2: rule__PostCS__Group__2__Impl rule__PostCS__Group__3
+            // InternalOCLstdlib.g:11880:1: ( rule__PostCS__Group__2__Impl rule__PostCS__Group__3 )
+            // InternalOCLstdlib.g:11881:2: rule__PostCS__Group__2__Impl rule__PostCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PostCS__Group__2__Impl();
@@ -36023,17 +36023,17 @@
 
 
     // $ANTLR start "rule__PostCS__Group__2__Impl"
-    // InternalOCLstdlib.g:11886:1: rule__PostCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:11888:1: rule__PostCS__Group__2__Impl : ( ':' ) ;
     public final void rule__PostCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11890:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:11891:1: ( ':' )
+            // InternalOCLstdlib.g:11892:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:11893:1: ( ':' )
             {
-            // InternalOCLstdlib.g:11891:1: ( ':' )
-            // InternalOCLstdlib.g:11892:1: ':'
+            // InternalOCLstdlib.g:11893:1: ( ':' )
+            // InternalOCLstdlib.g:11894:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getColonKeyword_2());
@@ -36064,14 +36064,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group__3"
-    // InternalOCLstdlib.g:11905:1: rule__PostCS__Group__3 : rule__PostCS__Group__3__Impl rule__PostCS__Group__4 ;
+    // InternalOCLstdlib.g:11907:1: rule__PostCS__Group__3 : rule__PostCS__Group__3__Impl rule__PostCS__Group__4 ;
     public final void rule__PostCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11909:1: ( rule__PostCS__Group__3__Impl rule__PostCS__Group__4 )
-            // InternalOCLstdlib.g:11910:2: rule__PostCS__Group__3__Impl rule__PostCS__Group__4
+            // InternalOCLstdlib.g:11911:1: ( rule__PostCS__Group__3__Impl rule__PostCS__Group__4 )
+            // InternalOCLstdlib.g:11912:2: rule__PostCS__Group__3__Impl rule__PostCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PostCS__Group__3__Impl();
@@ -36102,23 +36102,23 @@
 
 
     // $ANTLR start "rule__PostCS__Group__3__Impl"
-    // InternalOCLstdlib.g:11917:1: rule__PostCS__Group__3__Impl : ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:11919:1: rule__PostCS__Group__3__Impl : ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) ) ;
     public final void rule__PostCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11921:1: ( ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) ) )
-            // InternalOCLstdlib.g:11922:1: ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) )
+            // InternalOCLstdlib.g:11923:1: ( ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) ) )
+            // InternalOCLstdlib.g:11924:1: ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:11922:1: ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) )
-            // InternalOCLstdlib.g:11923:1: ( rule__PostCS__OwnedSpecificationAssignment_3 )
+            // InternalOCLstdlib.g:11924:1: ( ( rule__PostCS__OwnedSpecificationAssignment_3 ) )
+            // InternalOCLstdlib.g:11925:1: ( rule__PostCS__OwnedSpecificationAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getOwnedSpecificationAssignment_3());
             }
-            // InternalOCLstdlib.g:11924:1: ( rule__PostCS__OwnedSpecificationAssignment_3 )
-            // InternalOCLstdlib.g:11924:2: rule__PostCS__OwnedSpecificationAssignment_3
+            // InternalOCLstdlib.g:11926:1: ( rule__PostCS__OwnedSpecificationAssignment_3 )
+            // InternalOCLstdlib.g:11926:2: rule__PostCS__OwnedSpecificationAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__OwnedSpecificationAssignment_3();
@@ -36153,14 +36153,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group__4"
-    // InternalOCLstdlib.g:11934:1: rule__PostCS__Group__4 : rule__PostCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:11936:1: rule__PostCS__Group__4 : rule__PostCS__Group__4__Impl ;
     public final void rule__PostCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11938:1: ( rule__PostCS__Group__4__Impl )
-            // InternalOCLstdlib.g:11939:2: rule__PostCS__Group__4__Impl
+            // InternalOCLstdlib.g:11940:1: ( rule__PostCS__Group__4__Impl )
+            // InternalOCLstdlib.g:11941:2: rule__PostCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__Group__4__Impl();
@@ -36186,17 +36186,17 @@
 
 
     // $ANTLR start "rule__PostCS__Group__4__Impl"
-    // InternalOCLstdlib.g:11945:1: rule__PostCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:11947:1: rule__PostCS__Group__4__Impl : ( ';' ) ;
     public final void rule__PostCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11949:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:11950:1: ( ';' )
+            // InternalOCLstdlib.g:11951:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:11952:1: ( ';' )
             {
-            // InternalOCLstdlib.g:11950:1: ( ';' )
-            // InternalOCLstdlib.g:11951:1: ';'
+            // InternalOCLstdlib.g:11952:1: ( ';' )
+            // InternalOCLstdlib.g:11953:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getSemicolonKeyword_4());
@@ -36227,14 +36227,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1__0"
-    // InternalOCLstdlib.g:11974:1: rule__PostCS__Group_1__0 : rule__PostCS__Group_1__0__Impl rule__PostCS__Group_1__1 ;
+    // InternalOCLstdlib.g:11976:1: rule__PostCS__Group_1__0 : rule__PostCS__Group_1__0__Impl rule__PostCS__Group_1__1 ;
     public final void rule__PostCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11978:1: ( rule__PostCS__Group_1__0__Impl rule__PostCS__Group_1__1 )
-            // InternalOCLstdlib.g:11979:2: rule__PostCS__Group_1__0__Impl rule__PostCS__Group_1__1
+            // InternalOCLstdlib.g:11980:1: ( rule__PostCS__Group_1__0__Impl rule__PostCS__Group_1__1 )
+            // InternalOCLstdlib.g:11981:2: rule__PostCS__Group_1__0__Impl rule__PostCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__PostCS__Group_1__0__Impl();
@@ -36265,23 +36265,23 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:11986:1: rule__PostCS__Group_1__0__Impl : ( ( rule__PostCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLstdlib.g:11988:1: rule__PostCS__Group_1__0__Impl : ( ( rule__PostCS__NameAssignment_1_0 ) ) ;
     public final void rule__PostCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:11990:1: ( ( ( rule__PostCS__NameAssignment_1_0 ) ) )
-            // InternalOCLstdlib.g:11991:1: ( ( rule__PostCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:11992:1: ( ( ( rule__PostCS__NameAssignment_1_0 ) ) )
+            // InternalOCLstdlib.g:11993:1: ( ( rule__PostCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLstdlib.g:11991:1: ( ( rule__PostCS__NameAssignment_1_0 ) )
-            // InternalOCLstdlib.g:11992:1: ( rule__PostCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:11993:1: ( ( rule__PostCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:11994:1: ( rule__PostCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLstdlib.g:11993:1: ( rule__PostCS__NameAssignment_1_0 )
-            // InternalOCLstdlib.g:11993:2: rule__PostCS__NameAssignment_1_0
+            // InternalOCLstdlib.g:11995:1: ( rule__PostCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:11995:2: rule__PostCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__NameAssignment_1_0();
@@ -36316,14 +36316,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1__1"
-    // InternalOCLstdlib.g:12003:1: rule__PostCS__Group_1__1 : rule__PostCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:12005:1: rule__PostCS__Group_1__1 : rule__PostCS__Group_1__1__Impl ;
     public final void rule__PostCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12007:1: ( rule__PostCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:12008:2: rule__PostCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:12009:1: ( rule__PostCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:12010:2: rule__PostCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__Group_1__1__Impl();
@@ -36349,22 +36349,22 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:12014:1: rule__PostCS__Group_1__1__Impl : ( ( rule__PostCS__Group_1_1__0 )? ) ;
+    // InternalOCLstdlib.g:12016:1: rule__PostCS__Group_1__1__Impl : ( ( rule__PostCS__Group_1_1__0 )? ) ;
     public final void rule__PostCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12018:1: ( ( ( rule__PostCS__Group_1_1__0 )? ) )
-            // InternalOCLstdlib.g:12019:1: ( ( rule__PostCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:12020:1: ( ( ( rule__PostCS__Group_1_1__0 )? ) )
+            // InternalOCLstdlib.g:12021:1: ( ( rule__PostCS__Group_1_1__0 )? )
             {
-            // InternalOCLstdlib.g:12019:1: ( ( rule__PostCS__Group_1_1__0 )? )
-            // InternalOCLstdlib.g:12020:1: ( rule__PostCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:12021:1: ( ( rule__PostCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:12022:1: ( rule__PostCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getGroup_1_1());
             }
-            // InternalOCLstdlib.g:12021:1: ( rule__PostCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:12023:1: ( rule__PostCS__Group_1_1__0 )?
             int alt111=2;
             int LA111_0 = input.LA(1);
 
@@ -36373,7 +36373,7 @@
             }
             switch (alt111) {
                 case 1 :
-                    // InternalOCLstdlib.g:12021:2: rule__PostCS__Group_1_1__0
+                    // InternalOCLstdlib.g:12023:2: rule__PostCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PostCS__Group_1_1__0();
@@ -36411,14 +36411,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1_1__0"
-    // InternalOCLstdlib.g:12035:1: rule__PostCS__Group_1_1__0 : rule__PostCS__Group_1_1__0__Impl rule__PostCS__Group_1_1__1 ;
+    // InternalOCLstdlib.g:12037:1: rule__PostCS__Group_1_1__0 : rule__PostCS__Group_1_1__0__Impl rule__PostCS__Group_1_1__1 ;
     public final void rule__PostCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12039:1: ( rule__PostCS__Group_1_1__0__Impl rule__PostCS__Group_1_1__1 )
-            // InternalOCLstdlib.g:12040:2: rule__PostCS__Group_1_1__0__Impl rule__PostCS__Group_1_1__1
+            // InternalOCLstdlib.g:12041:1: ( rule__PostCS__Group_1_1__0__Impl rule__PostCS__Group_1_1__1 )
+            // InternalOCLstdlib.g:12042:2: rule__PostCS__Group_1_1__0__Impl rule__PostCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PostCS__Group_1_1__0__Impl();
@@ -36449,17 +36449,17 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1_1__0__Impl"
-    // InternalOCLstdlib.g:12047:1: rule__PostCS__Group_1_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:12049:1: rule__PostCS__Group_1_1__0__Impl : ( '(' ) ;
     public final void rule__PostCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12051:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:12052:1: ( '(' )
+            // InternalOCLstdlib.g:12053:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:12054:1: ( '(' )
             {
-            // InternalOCLstdlib.g:12052:1: ( '(' )
-            // InternalOCLstdlib.g:12053:1: '('
+            // InternalOCLstdlib.g:12054:1: ( '(' )
+            // InternalOCLstdlib.g:12055:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getLeftParenthesisKeyword_1_1_0());
@@ -36490,14 +36490,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1_1__1"
-    // InternalOCLstdlib.g:12066:1: rule__PostCS__Group_1_1__1 : rule__PostCS__Group_1_1__1__Impl rule__PostCS__Group_1_1__2 ;
+    // InternalOCLstdlib.g:12068:1: rule__PostCS__Group_1_1__1 : rule__PostCS__Group_1_1__1__Impl rule__PostCS__Group_1_1__2 ;
     public final void rule__PostCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12070:1: ( rule__PostCS__Group_1_1__1__Impl rule__PostCS__Group_1_1__2 )
-            // InternalOCLstdlib.g:12071:2: rule__PostCS__Group_1_1__1__Impl rule__PostCS__Group_1_1__2
+            // InternalOCLstdlib.g:12072:1: ( rule__PostCS__Group_1_1__1__Impl rule__PostCS__Group_1_1__2 )
+            // InternalOCLstdlib.g:12073:2: rule__PostCS__Group_1_1__1__Impl rule__PostCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__PostCS__Group_1_1__1__Impl();
@@ -36528,23 +36528,23 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1_1__1__Impl"
-    // InternalOCLstdlib.g:12078:1: rule__PostCS__Group_1_1__1__Impl : ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:12080:1: rule__PostCS__Group_1_1__1__Impl : ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
     public final void rule__PostCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12082:1: ( ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
-            // InternalOCLstdlib.g:12083:1: ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:12084:1: ( ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
+            // InternalOCLstdlib.g:12085:1: ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:12083:1: ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
-            // InternalOCLstdlib.g:12084:1: ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLstdlib.g:12085:1: ( ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:12086:1: ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
             }
-            // InternalOCLstdlib.g:12085:1: ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 )
-            // InternalOCLstdlib.g:12085:2: rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1
+            // InternalOCLstdlib.g:12087:1: ( rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLstdlib.g:12087:2: rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1();
@@ -36579,14 +36579,14 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1_1__2"
-    // InternalOCLstdlib.g:12095:1: rule__PostCS__Group_1_1__2 : rule__PostCS__Group_1_1__2__Impl ;
+    // InternalOCLstdlib.g:12097:1: rule__PostCS__Group_1_1__2 : rule__PostCS__Group_1_1__2__Impl ;
     public final void rule__PostCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12099:1: ( rule__PostCS__Group_1_1__2__Impl )
-            // InternalOCLstdlib.g:12100:2: rule__PostCS__Group_1_1__2__Impl
+            // InternalOCLstdlib.g:12101:1: ( rule__PostCS__Group_1_1__2__Impl )
+            // InternalOCLstdlib.g:12102:2: rule__PostCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PostCS__Group_1_1__2__Impl();
@@ -36612,17 +36612,17 @@
 
 
     // $ANTLR start "rule__PostCS__Group_1_1__2__Impl"
-    // InternalOCLstdlib.g:12106:1: rule__PostCS__Group_1_1__2__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:12108:1: rule__PostCS__Group_1_1__2__Impl : ( ')' ) ;
     public final void rule__PostCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12110:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:12111:1: ( ')' )
+            // InternalOCLstdlib.g:12112:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:12113:1: ( ')' )
             {
-            // InternalOCLstdlib.g:12111:1: ( ')' )
-            // InternalOCLstdlib.g:12112:1: ')'
+            // InternalOCLstdlib.g:12113:1: ( ')' )
+            // InternalOCLstdlib.g:12114:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getRightParenthesisKeyword_1_1_2());
@@ -36653,14 +36653,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group__0"
-    // InternalOCLstdlib.g:12131:1: rule__PreCS__Group__0 : rule__PreCS__Group__0__Impl rule__PreCS__Group__1 ;
+    // InternalOCLstdlib.g:12133:1: rule__PreCS__Group__0 : rule__PreCS__Group__0__Impl rule__PreCS__Group__1 ;
     public final void rule__PreCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12135:1: ( rule__PreCS__Group__0__Impl rule__PreCS__Group__1 )
-            // InternalOCLstdlib.g:12136:2: rule__PreCS__Group__0__Impl rule__PreCS__Group__1
+            // InternalOCLstdlib.g:12137:1: ( rule__PreCS__Group__0__Impl rule__PreCS__Group__1 )
+            // InternalOCLstdlib.g:12138:2: rule__PreCS__Group__0__Impl rule__PreCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__PreCS__Group__0__Impl();
@@ -36691,23 +36691,23 @@
 
 
     // $ANTLR start "rule__PreCS__Group__0__Impl"
-    // InternalOCLstdlib.g:12143:1: rule__PreCS__Group__0__Impl : ( ( rule__PreCS__StereotypeAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:12145:1: rule__PreCS__Group__0__Impl : ( ( rule__PreCS__StereotypeAssignment_0 ) ) ;
     public final void rule__PreCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12147:1: ( ( ( rule__PreCS__StereotypeAssignment_0 ) ) )
-            // InternalOCLstdlib.g:12148:1: ( ( rule__PreCS__StereotypeAssignment_0 ) )
+            // InternalOCLstdlib.g:12149:1: ( ( ( rule__PreCS__StereotypeAssignment_0 ) ) )
+            // InternalOCLstdlib.g:12150:1: ( ( rule__PreCS__StereotypeAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:12148:1: ( ( rule__PreCS__StereotypeAssignment_0 ) )
-            // InternalOCLstdlib.g:12149:1: ( rule__PreCS__StereotypeAssignment_0 )
+            // InternalOCLstdlib.g:12150:1: ( ( rule__PreCS__StereotypeAssignment_0 ) )
+            // InternalOCLstdlib.g:12151:1: ( rule__PreCS__StereotypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getStereotypeAssignment_0());
             }
-            // InternalOCLstdlib.g:12150:1: ( rule__PreCS__StereotypeAssignment_0 )
-            // InternalOCLstdlib.g:12150:2: rule__PreCS__StereotypeAssignment_0
+            // InternalOCLstdlib.g:12152:1: ( rule__PreCS__StereotypeAssignment_0 )
+            // InternalOCLstdlib.g:12152:2: rule__PreCS__StereotypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__StereotypeAssignment_0();
@@ -36742,14 +36742,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group__1"
-    // InternalOCLstdlib.g:12160:1: rule__PreCS__Group__1 : rule__PreCS__Group__1__Impl rule__PreCS__Group__2 ;
+    // InternalOCLstdlib.g:12162:1: rule__PreCS__Group__1 : rule__PreCS__Group__1__Impl rule__PreCS__Group__2 ;
     public final void rule__PreCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12164:1: ( rule__PreCS__Group__1__Impl rule__PreCS__Group__2 )
-            // InternalOCLstdlib.g:12165:2: rule__PreCS__Group__1__Impl rule__PreCS__Group__2
+            // InternalOCLstdlib.g:12166:1: ( rule__PreCS__Group__1__Impl rule__PreCS__Group__2 )
+            // InternalOCLstdlib.g:12167:2: rule__PreCS__Group__1__Impl rule__PreCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_31);
             rule__PreCS__Group__1__Impl();
@@ -36780,22 +36780,22 @@
 
 
     // $ANTLR start "rule__PreCS__Group__1__Impl"
-    // InternalOCLstdlib.g:12172:1: rule__PreCS__Group__1__Impl : ( ( rule__PreCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:12174:1: rule__PreCS__Group__1__Impl : ( ( rule__PreCS__Group_1__0 )? ) ;
     public final void rule__PreCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12176:1: ( ( ( rule__PreCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:12177:1: ( ( rule__PreCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:12178:1: ( ( ( rule__PreCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:12179:1: ( ( rule__PreCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:12177:1: ( ( rule__PreCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:12178:1: ( rule__PreCS__Group_1__0 )?
+            // InternalOCLstdlib.g:12179:1: ( ( rule__PreCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:12180:1: ( rule__PreCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:12179:1: ( rule__PreCS__Group_1__0 )?
+            // InternalOCLstdlib.g:12181:1: ( rule__PreCS__Group_1__0 )?
             int alt112=2;
             int LA112_0 = input.LA(1);
 
@@ -36804,7 +36804,7 @@
             }
             switch (alt112) {
                 case 1 :
-                    // InternalOCLstdlib.g:12179:2: rule__PreCS__Group_1__0
+                    // InternalOCLstdlib.g:12181:2: rule__PreCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PreCS__Group_1__0();
@@ -36842,14 +36842,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group__2"
-    // InternalOCLstdlib.g:12189:1: rule__PreCS__Group__2 : rule__PreCS__Group__2__Impl rule__PreCS__Group__3 ;
+    // InternalOCLstdlib.g:12191:1: rule__PreCS__Group__2 : rule__PreCS__Group__2__Impl rule__PreCS__Group__3 ;
     public final void rule__PreCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12193:1: ( rule__PreCS__Group__2__Impl rule__PreCS__Group__3 )
-            // InternalOCLstdlib.g:12194:2: rule__PreCS__Group__2__Impl rule__PreCS__Group__3
+            // InternalOCLstdlib.g:12195:1: ( rule__PreCS__Group__2__Impl rule__PreCS__Group__3 )
+            // InternalOCLstdlib.g:12196:2: rule__PreCS__Group__2__Impl rule__PreCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PreCS__Group__2__Impl();
@@ -36880,17 +36880,17 @@
 
 
     // $ANTLR start "rule__PreCS__Group__2__Impl"
-    // InternalOCLstdlib.g:12201:1: rule__PreCS__Group__2__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:12203:1: rule__PreCS__Group__2__Impl : ( ':' ) ;
     public final void rule__PreCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12205:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:12206:1: ( ':' )
+            // InternalOCLstdlib.g:12207:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:12208:1: ( ':' )
             {
-            // InternalOCLstdlib.g:12206:1: ( ':' )
-            // InternalOCLstdlib.g:12207:1: ':'
+            // InternalOCLstdlib.g:12208:1: ( ':' )
+            // InternalOCLstdlib.g:12209:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getColonKeyword_2());
@@ -36921,14 +36921,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group__3"
-    // InternalOCLstdlib.g:12220:1: rule__PreCS__Group__3 : rule__PreCS__Group__3__Impl rule__PreCS__Group__4 ;
+    // InternalOCLstdlib.g:12222:1: rule__PreCS__Group__3 : rule__PreCS__Group__3__Impl rule__PreCS__Group__4 ;
     public final void rule__PreCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12224:1: ( rule__PreCS__Group__3__Impl rule__PreCS__Group__4 )
-            // InternalOCLstdlib.g:12225:2: rule__PreCS__Group__3__Impl rule__PreCS__Group__4
+            // InternalOCLstdlib.g:12226:1: ( rule__PreCS__Group__3__Impl rule__PreCS__Group__4 )
+            // InternalOCLstdlib.g:12227:2: rule__PreCS__Group__3__Impl rule__PreCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_7);
             rule__PreCS__Group__3__Impl();
@@ -36959,23 +36959,23 @@
 
 
     // $ANTLR start "rule__PreCS__Group__3__Impl"
-    // InternalOCLstdlib.g:12232:1: rule__PreCS__Group__3__Impl : ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:12234:1: rule__PreCS__Group__3__Impl : ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) ) ;
     public final void rule__PreCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12236:1: ( ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) ) )
-            // InternalOCLstdlib.g:12237:1: ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) )
+            // InternalOCLstdlib.g:12238:1: ( ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) ) )
+            // InternalOCLstdlib.g:12239:1: ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:12237:1: ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) )
-            // InternalOCLstdlib.g:12238:1: ( rule__PreCS__OwnedSpecificationAssignment_3 )
+            // InternalOCLstdlib.g:12239:1: ( ( rule__PreCS__OwnedSpecificationAssignment_3 ) )
+            // InternalOCLstdlib.g:12240:1: ( rule__PreCS__OwnedSpecificationAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getOwnedSpecificationAssignment_3());
             }
-            // InternalOCLstdlib.g:12239:1: ( rule__PreCS__OwnedSpecificationAssignment_3 )
-            // InternalOCLstdlib.g:12239:2: rule__PreCS__OwnedSpecificationAssignment_3
+            // InternalOCLstdlib.g:12241:1: ( rule__PreCS__OwnedSpecificationAssignment_3 )
+            // InternalOCLstdlib.g:12241:2: rule__PreCS__OwnedSpecificationAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__OwnedSpecificationAssignment_3();
@@ -37010,14 +37010,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group__4"
-    // InternalOCLstdlib.g:12249:1: rule__PreCS__Group__4 : rule__PreCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:12251:1: rule__PreCS__Group__4 : rule__PreCS__Group__4__Impl ;
     public final void rule__PreCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12253:1: ( rule__PreCS__Group__4__Impl )
-            // InternalOCLstdlib.g:12254:2: rule__PreCS__Group__4__Impl
+            // InternalOCLstdlib.g:12255:1: ( rule__PreCS__Group__4__Impl )
+            // InternalOCLstdlib.g:12256:2: rule__PreCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__Group__4__Impl();
@@ -37043,17 +37043,17 @@
 
 
     // $ANTLR start "rule__PreCS__Group__4__Impl"
-    // InternalOCLstdlib.g:12260:1: rule__PreCS__Group__4__Impl : ( ';' ) ;
+    // InternalOCLstdlib.g:12262:1: rule__PreCS__Group__4__Impl : ( ';' ) ;
     public final void rule__PreCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12264:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:12265:1: ( ';' )
+            // InternalOCLstdlib.g:12266:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:12267:1: ( ';' )
             {
-            // InternalOCLstdlib.g:12265:1: ( ';' )
-            // InternalOCLstdlib.g:12266:1: ';'
+            // InternalOCLstdlib.g:12267:1: ( ';' )
+            // InternalOCLstdlib.g:12268:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getSemicolonKeyword_4());
@@ -37084,14 +37084,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1__0"
-    // InternalOCLstdlib.g:12289:1: rule__PreCS__Group_1__0 : rule__PreCS__Group_1__0__Impl rule__PreCS__Group_1__1 ;
+    // InternalOCLstdlib.g:12291:1: rule__PreCS__Group_1__0 : rule__PreCS__Group_1__0__Impl rule__PreCS__Group_1__1 ;
     public final void rule__PreCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12293:1: ( rule__PreCS__Group_1__0__Impl rule__PreCS__Group_1__1 )
-            // InternalOCLstdlib.g:12294:2: rule__PreCS__Group_1__0__Impl rule__PreCS__Group_1__1
+            // InternalOCLstdlib.g:12295:1: ( rule__PreCS__Group_1__0__Impl rule__PreCS__Group_1__1 )
+            // InternalOCLstdlib.g:12296:2: rule__PreCS__Group_1__0__Impl rule__PreCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__PreCS__Group_1__0__Impl();
@@ -37122,23 +37122,23 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:12301:1: rule__PreCS__Group_1__0__Impl : ( ( rule__PreCS__NameAssignment_1_0 ) ) ;
+    // InternalOCLstdlib.g:12303:1: rule__PreCS__Group_1__0__Impl : ( ( rule__PreCS__NameAssignment_1_0 ) ) ;
     public final void rule__PreCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12305:1: ( ( ( rule__PreCS__NameAssignment_1_0 ) ) )
-            // InternalOCLstdlib.g:12306:1: ( ( rule__PreCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:12307:1: ( ( ( rule__PreCS__NameAssignment_1_0 ) ) )
+            // InternalOCLstdlib.g:12308:1: ( ( rule__PreCS__NameAssignment_1_0 ) )
             {
-            // InternalOCLstdlib.g:12306:1: ( ( rule__PreCS__NameAssignment_1_0 ) )
-            // InternalOCLstdlib.g:12307:1: ( rule__PreCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:12308:1: ( ( rule__PreCS__NameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:12309:1: ( rule__PreCS__NameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getNameAssignment_1_0());
             }
-            // InternalOCLstdlib.g:12308:1: ( rule__PreCS__NameAssignment_1_0 )
-            // InternalOCLstdlib.g:12308:2: rule__PreCS__NameAssignment_1_0
+            // InternalOCLstdlib.g:12310:1: ( rule__PreCS__NameAssignment_1_0 )
+            // InternalOCLstdlib.g:12310:2: rule__PreCS__NameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__NameAssignment_1_0();
@@ -37173,14 +37173,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1__1"
-    // InternalOCLstdlib.g:12318:1: rule__PreCS__Group_1__1 : rule__PreCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:12320:1: rule__PreCS__Group_1__1 : rule__PreCS__Group_1__1__Impl ;
     public final void rule__PreCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12322:1: ( rule__PreCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:12323:2: rule__PreCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:12324:1: ( rule__PreCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:12325:2: rule__PreCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__Group_1__1__Impl();
@@ -37206,22 +37206,22 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:12329:1: rule__PreCS__Group_1__1__Impl : ( ( rule__PreCS__Group_1_1__0 )? ) ;
+    // InternalOCLstdlib.g:12331:1: rule__PreCS__Group_1__1__Impl : ( ( rule__PreCS__Group_1_1__0 )? ) ;
     public final void rule__PreCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12333:1: ( ( ( rule__PreCS__Group_1_1__0 )? ) )
-            // InternalOCLstdlib.g:12334:1: ( ( rule__PreCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:12335:1: ( ( ( rule__PreCS__Group_1_1__0 )? ) )
+            // InternalOCLstdlib.g:12336:1: ( ( rule__PreCS__Group_1_1__0 )? )
             {
-            // InternalOCLstdlib.g:12334:1: ( ( rule__PreCS__Group_1_1__0 )? )
-            // InternalOCLstdlib.g:12335:1: ( rule__PreCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:12336:1: ( ( rule__PreCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:12337:1: ( rule__PreCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getGroup_1_1());
             }
-            // InternalOCLstdlib.g:12336:1: ( rule__PreCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:12338:1: ( rule__PreCS__Group_1_1__0 )?
             int alt113=2;
             int LA113_0 = input.LA(1);
 
@@ -37230,7 +37230,7 @@
             }
             switch (alt113) {
                 case 1 :
-                    // InternalOCLstdlib.g:12336:2: rule__PreCS__Group_1_1__0
+                    // InternalOCLstdlib.g:12338:2: rule__PreCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PreCS__Group_1_1__0();
@@ -37268,14 +37268,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1_1__0"
-    // InternalOCLstdlib.g:12350:1: rule__PreCS__Group_1_1__0 : rule__PreCS__Group_1_1__0__Impl rule__PreCS__Group_1_1__1 ;
+    // InternalOCLstdlib.g:12352:1: rule__PreCS__Group_1_1__0 : rule__PreCS__Group_1_1__0__Impl rule__PreCS__Group_1_1__1 ;
     public final void rule__PreCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12354:1: ( rule__PreCS__Group_1_1__0__Impl rule__PreCS__Group_1_1__1 )
-            // InternalOCLstdlib.g:12355:2: rule__PreCS__Group_1_1__0__Impl rule__PreCS__Group_1_1__1
+            // InternalOCLstdlib.g:12356:1: ( rule__PreCS__Group_1_1__0__Impl rule__PreCS__Group_1_1__1 )
+            // InternalOCLstdlib.g:12357:2: rule__PreCS__Group_1_1__0__Impl rule__PreCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PreCS__Group_1_1__0__Impl();
@@ -37306,17 +37306,17 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1_1__0__Impl"
-    // InternalOCLstdlib.g:12362:1: rule__PreCS__Group_1_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:12364:1: rule__PreCS__Group_1_1__0__Impl : ( '(' ) ;
     public final void rule__PreCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12366:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:12367:1: ( '(' )
+            // InternalOCLstdlib.g:12368:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:12369:1: ( '(' )
             {
-            // InternalOCLstdlib.g:12367:1: ( '(' )
-            // InternalOCLstdlib.g:12368:1: '('
+            // InternalOCLstdlib.g:12369:1: ( '(' )
+            // InternalOCLstdlib.g:12370:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getLeftParenthesisKeyword_1_1_0());
@@ -37347,14 +37347,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1_1__1"
-    // InternalOCLstdlib.g:12381:1: rule__PreCS__Group_1_1__1 : rule__PreCS__Group_1_1__1__Impl rule__PreCS__Group_1_1__2 ;
+    // InternalOCLstdlib.g:12383:1: rule__PreCS__Group_1_1__1 : rule__PreCS__Group_1_1__1__Impl rule__PreCS__Group_1_1__2 ;
     public final void rule__PreCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12385:1: ( rule__PreCS__Group_1_1__1__Impl rule__PreCS__Group_1_1__2 )
-            // InternalOCLstdlib.g:12386:2: rule__PreCS__Group_1_1__1__Impl rule__PreCS__Group_1_1__2
+            // InternalOCLstdlib.g:12387:1: ( rule__PreCS__Group_1_1__1__Impl rule__PreCS__Group_1_1__2 )
+            // InternalOCLstdlib.g:12388:2: rule__PreCS__Group_1_1__1__Impl rule__PreCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__PreCS__Group_1_1__1__Impl();
@@ -37385,23 +37385,23 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1_1__1__Impl"
-    // InternalOCLstdlib.g:12393:1: rule__PreCS__Group_1_1__1__Impl : ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:12395:1: rule__PreCS__Group_1_1__1__Impl : ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) ;
     public final void rule__PreCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12397:1: ( ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
-            // InternalOCLstdlib.g:12398:1: ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:12399:1: ( ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) ) )
+            // InternalOCLstdlib.g:12400:1: ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:12398:1: ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
-            // InternalOCLstdlib.g:12399:1: ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLstdlib.g:12400:1: ( ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:12401:1: ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getOwnedMessageSpecificationAssignment_1_1_1());
             }
-            // InternalOCLstdlib.g:12400:1: ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 )
-            // InternalOCLstdlib.g:12400:2: rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1
+            // InternalOCLstdlib.g:12402:1: ( rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 )
+            // InternalOCLstdlib.g:12402:2: rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1();
@@ -37436,14 +37436,14 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1_1__2"
-    // InternalOCLstdlib.g:12410:1: rule__PreCS__Group_1_1__2 : rule__PreCS__Group_1_1__2__Impl ;
+    // InternalOCLstdlib.g:12412:1: rule__PreCS__Group_1_1__2 : rule__PreCS__Group_1_1__2__Impl ;
     public final void rule__PreCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12414:1: ( rule__PreCS__Group_1_1__2__Impl )
-            // InternalOCLstdlib.g:12415:2: rule__PreCS__Group_1_1__2__Impl
+            // InternalOCLstdlib.g:12416:1: ( rule__PreCS__Group_1_1__2__Impl )
+            // InternalOCLstdlib.g:12417:2: rule__PreCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PreCS__Group_1_1__2__Impl();
@@ -37469,17 +37469,17 @@
 
 
     // $ANTLR start "rule__PreCS__Group_1_1__2__Impl"
-    // InternalOCLstdlib.g:12421:1: rule__PreCS__Group_1_1__2__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:12423:1: rule__PreCS__Group_1_1__2__Impl : ( ')' ) ;
     public final void rule__PreCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12425:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:12426:1: ( ')' )
+            // InternalOCLstdlib.g:12427:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:12428:1: ( ')' )
             {
-            // InternalOCLstdlib.g:12426:1: ( ')' )
-            // InternalOCLstdlib.g:12427:1: ')'
+            // InternalOCLstdlib.g:12428:1: ( ')' )
+            // InternalOCLstdlib.g:12429:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getRightParenthesisKeyword_1_1_2());
@@ -37510,14 +37510,14 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Group__0"
-    // InternalOCLstdlib.g:12446:1: rule__PrecedenceCS__Group__0 : rule__PrecedenceCS__Group__0__Impl rule__PrecedenceCS__Group__1 ;
+    // InternalOCLstdlib.g:12448:1: rule__PrecedenceCS__Group__0 : rule__PrecedenceCS__Group__0__Impl rule__PrecedenceCS__Group__1 ;
     public final void rule__PrecedenceCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12450:1: ( rule__PrecedenceCS__Group__0__Impl rule__PrecedenceCS__Group__1 )
-            // InternalOCLstdlib.g:12451:2: rule__PrecedenceCS__Group__0__Impl rule__PrecedenceCS__Group__1
+            // InternalOCLstdlib.g:12452:1: ( rule__PrecedenceCS__Group__0__Impl rule__PrecedenceCS__Group__1 )
+            // InternalOCLstdlib.g:12453:2: rule__PrecedenceCS__Group__0__Impl rule__PrecedenceCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__PrecedenceCS__Group__0__Impl();
@@ -37548,23 +37548,23 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Group__0__Impl"
-    // InternalOCLstdlib.g:12458:1: rule__PrecedenceCS__Group__0__Impl : ( ( rule__PrecedenceCS__Alternatives_0 ) ) ;
+    // InternalOCLstdlib.g:12460:1: rule__PrecedenceCS__Group__0__Impl : ( ( rule__PrecedenceCS__Alternatives_0 ) ) ;
     public final void rule__PrecedenceCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12462:1: ( ( ( rule__PrecedenceCS__Alternatives_0 ) ) )
-            // InternalOCLstdlib.g:12463:1: ( ( rule__PrecedenceCS__Alternatives_0 ) )
+            // InternalOCLstdlib.g:12464:1: ( ( ( rule__PrecedenceCS__Alternatives_0 ) ) )
+            // InternalOCLstdlib.g:12465:1: ( ( rule__PrecedenceCS__Alternatives_0 ) )
             {
-            // InternalOCLstdlib.g:12463:1: ( ( rule__PrecedenceCS__Alternatives_0 ) )
-            // InternalOCLstdlib.g:12464:1: ( rule__PrecedenceCS__Alternatives_0 )
+            // InternalOCLstdlib.g:12465:1: ( ( rule__PrecedenceCS__Alternatives_0 ) )
+            // InternalOCLstdlib.g:12466:1: ( rule__PrecedenceCS__Alternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrecedenceCSAccess().getAlternatives_0());
             }
-            // InternalOCLstdlib.g:12465:1: ( rule__PrecedenceCS__Alternatives_0 )
-            // InternalOCLstdlib.g:12465:2: rule__PrecedenceCS__Alternatives_0
+            // InternalOCLstdlib.g:12467:1: ( rule__PrecedenceCS__Alternatives_0 )
+            // InternalOCLstdlib.g:12467:2: rule__PrecedenceCS__Alternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrecedenceCS__Alternatives_0();
@@ -37599,14 +37599,14 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Group__1"
-    // InternalOCLstdlib.g:12475:1: rule__PrecedenceCS__Group__1 : rule__PrecedenceCS__Group__1__Impl rule__PrecedenceCS__Group__2 ;
+    // InternalOCLstdlib.g:12477:1: rule__PrecedenceCS__Group__1 : rule__PrecedenceCS__Group__1__Impl rule__PrecedenceCS__Group__2 ;
     public final void rule__PrecedenceCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12479:1: ( rule__PrecedenceCS__Group__1__Impl rule__PrecedenceCS__Group__2 )
-            // InternalOCLstdlib.g:12480:2: rule__PrecedenceCS__Group__1__Impl rule__PrecedenceCS__Group__2
+            // InternalOCLstdlib.g:12481:1: ( rule__PrecedenceCS__Group__1__Impl rule__PrecedenceCS__Group__2 )
+            // InternalOCLstdlib.g:12482:2: rule__PrecedenceCS__Group__1__Impl rule__PrecedenceCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_10);
             rule__PrecedenceCS__Group__1__Impl();
@@ -37637,17 +37637,17 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Group__1__Impl"
-    // InternalOCLstdlib.g:12487:1: rule__PrecedenceCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:12489:1: rule__PrecedenceCS__Group__1__Impl : ( ':' ) ;
     public final void rule__PrecedenceCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12491:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:12492:1: ( ':' )
+            // InternalOCLstdlib.g:12493:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:12494:1: ( ':' )
             {
-            // InternalOCLstdlib.g:12492:1: ( ':' )
-            // InternalOCLstdlib.g:12493:1: ':'
+            // InternalOCLstdlib.g:12494:1: ( ':' )
+            // InternalOCLstdlib.g:12495:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrecedenceCSAccess().getColonKeyword_1());
@@ -37678,14 +37678,14 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Group__2"
-    // InternalOCLstdlib.g:12506:1: rule__PrecedenceCS__Group__2 : rule__PrecedenceCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:12508:1: rule__PrecedenceCS__Group__2 : rule__PrecedenceCS__Group__2__Impl ;
     public final void rule__PrecedenceCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12510:1: ( rule__PrecedenceCS__Group__2__Impl )
-            // InternalOCLstdlib.g:12511:2: rule__PrecedenceCS__Group__2__Impl
+            // InternalOCLstdlib.g:12512:1: ( rule__PrecedenceCS__Group__2__Impl )
+            // InternalOCLstdlib.g:12513:2: rule__PrecedenceCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrecedenceCS__Group__2__Impl();
@@ -37711,23 +37711,23 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__Group__2__Impl"
-    // InternalOCLstdlib.g:12517:1: rule__PrecedenceCS__Group__2__Impl : ( ( rule__PrecedenceCS__NameAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:12519:1: rule__PrecedenceCS__Group__2__Impl : ( ( rule__PrecedenceCS__NameAssignment_2 ) ) ;
     public final void rule__PrecedenceCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12521:1: ( ( ( rule__PrecedenceCS__NameAssignment_2 ) ) )
-            // InternalOCLstdlib.g:12522:1: ( ( rule__PrecedenceCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:12523:1: ( ( ( rule__PrecedenceCS__NameAssignment_2 ) ) )
+            // InternalOCLstdlib.g:12524:1: ( ( rule__PrecedenceCS__NameAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:12522:1: ( ( rule__PrecedenceCS__NameAssignment_2 ) )
-            // InternalOCLstdlib.g:12523:1: ( rule__PrecedenceCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:12524:1: ( ( rule__PrecedenceCS__NameAssignment_2 ) )
+            // InternalOCLstdlib.g:12525:1: ( rule__PrecedenceCS__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrecedenceCSAccess().getNameAssignment_2());
             }
-            // InternalOCLstdlib.g:12524:1: ( rule__PrecedenceCS__NameAssignment_2 )
-            // InternalOCLstdlib.g:12524:2: rule__PrecedenceCS__NameAssignment_2
+            // InternalOCLstdlib.g:12526:1: ( rule__PrecedenceCS__NameAssignment_2 )
+            // InternalOCLstdlib.g:12526:2: rule__PrecedenceCS__NameAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrecedenceCS__NameAssignment_2();
@@ -37762,14 +37762,14 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__0"
-    // InternalOCLstdlib.g:12540:1: rule__TypedMultiplicityRefCS__Group__0 : rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 ;
+    // InternalOCLstdlib.g:12542:1: rule__TypedMultiplicityRefCS__Group__0 : rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 ;
     public final void rule__TypedMultiplicityRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12544:1: ( rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 )
-            // InternalOCLstdlib.g:12545:2: rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1
+            // InternalOCLstdlib.g:12546:1: ( rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1 )
+            // InternalOCLstdlib.g:12547:2: rule__TypedMultiplicityRefCS__Group__0__Impl rule__TypedMultiplicityRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_60);
             rule__TypedMultiplicityRefCS__Group__0__Impl();
@@ -37800,23 +37800,23 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__0__Impl"
-    // InternalOCLstdlib.g:12552:1: rule__TypedMultiplicityRefCS__Group__0__Impl : ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) ) ;
+    // InternalOCLstdlib.g:12554:1: rule__TypedMultiplicityRefCS__Group__0__Impl : ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) ) ;
     public final void rule__TypedMultiplicityRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12556:1: ( ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) ) )
-            // InternalOCLstdlib.g:12557:1: ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) )
+            // InternalOCLstdlib.g:12558:1: ( ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) ) )
+            // InternalOCLstdlib.g:12559:1: ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) )
             {
-            // InternalOCLstdlib.g:12557:1: ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) )
-            // InternalOCLstdlib.g:12558:1: ( rule__TypedMultiplicityRefCS__Alternatives_0 )
+            // InternalOCLstdlib.g:12559:1: ( ( rule__TypedMultiplicityRefCS__Alternatives_0 ) )
+            // InternalOCLstdlib.g:12560:1: ( rule__TypedMultiplicityRefCS__Alternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedMultiplicityRefCSAccess().getAlternatives_0());
             }
-            // InternalOCLstdlib.g:12559:1: ( rule__TypedMultiplicityRefCS__Alternatives_0 )
-            // InternalOCLstdlib.g:12559:2: rule__TypedMultiplicityRefCS__Alternatives_0
+            // InternalOCLstdlib.g:12561:1: ( rule__TypedMultiplicityRefCS__Alternatives_0 )
+            // InternalOCLstdlib.g:12561:2: rule__TypedMultiplicityRefCS__Alternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedMultiplicityRefCS__Alternatives_0();
@@ -37851,14 +37851,14 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__1"
-    // InternalOCLstdlib.g:12569:1: rule__TypedMultiplicityRefCS__Group__1 : rule__TypedMultiplicityRefCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:12571:1: rule__TypedMultiplicityRefCS__Group__1 : rule__TypedMultiplicityRefCS__Group__1__Impl ;
     public final void rule__TypedMultiplicityRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12573:1: ( rule__TypedMultiplicityRefCS__Group__1__Impl )
-            // InternalOCLstdlib.g:12574:2: rule__TypedMultiplicityRefCS__Group__1__Impl
+            // InternalOCLstdlib.g:12575:1: ( rule__TypedMultiplicityRefCS__Group__1__Impl )
+            // InternalOCLstdlib.g:12576:2: rule__TypedMultiplicityRefCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedMultiplicityRefCS__Group__1__Impl();
@@ -37884,22 +37884,22 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__Group__1__Impl"
-    // InternalOCLstdlib.g:12580:1: rule__TypedMultiplicityRefCS__Group__1__Impl : ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalOCLstdlib.g:12582:1: rule__TypedMultiplicityRefCS__Group__1__Impl : ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypedMultiplicityRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12584:1: ( ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalOCLstdlib.g:12585:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLstdlib.g:12586:1: ( ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalOCLstdlib.g:12587:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalOCLstdlib.g:12585:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalOCLstdlib.g:12586:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLstdlib.g:12587:1: ( ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLstdlib.g:12588:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalOCLstdlib.g:12587:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLstdlib.g:12589:1: ( rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 )?
             int alt114=2;
             int LA114_0 = input.LA(1);
 
@@ -37908,7 +37908,7 @@
             }
             switch (alt114) {
                 case 1 :
-                    // InternalOCLstdlib.g:12587:2: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1
+                    // InternalOCLstdlib.g:12589:2: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1();
@@ -37946,14 +37946,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__0"
-    // InternalOCLstdlib.g:12601:1: rule__TypedTypeRefCS__Group_0__0 : rule__TypedTypeRefCS__Group_0__0__Impl rule__TypedTypeRefCS__Group_0__1 ;
+    // InternalOCLstdlib.g:12603:1: rule__TypedTypeRefCS__Group_0__0 : rule__TypedTypeRefCS__Group_0__0__Impl rule__TypedTypeRefCS__Group_0__1 ;
     public final void rule__TypedTypeRefCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12605:1: ( rule__TypedTypeRefCS__Group_0__0__Impl rule__TypedTypeRefCS__Group_0__1 )
-            // InternalOCLstdlib.g:12606:2: rule__TypedTypeRefCS__Group_0__0__Impl rule__TypedTypeRefCS__Group_0__1
+            // InternalOCLstdlib.g:12607:1: ( rule__TypedTypeRefCS__Group_0__0__Impl rule__TypedTypeRefCS__Group_0__1 )
+            // InternalOCLstdlib.g:12608:2: rule__TypedTypeRefCS__Group_0__0__Impl rule__TypedTypeRefCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__TypedTypeRefCS__Group_0__0__Impl();
@@ -37984,23 +37984,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:12613:1: rule__TypedTypeRefCS__Group_0__0__Impl : ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) ) ;
+    // InternalOCLstdlib.g:12615:1: rule__TypedTypeRefCS__Group_0__0__Impl : ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) ) ;
     public final void rule__TypedTypeRefCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12617:1: ( ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) ) )
-            // InternalOCLstdlib.g:12618:1: ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) )
+            // InternalOCLstdlib.g:12619:1: ( ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) ) )
+            // InternalOCLstdlib.g:12620:1: ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) )
             {
-            // InternalOCLstdlib.g:12618:1: ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) )
-            // InternalOCLstdlib.g:12619:1: ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 )
+            // InternalOCLstdlib.g:12620:1: ( ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 ) )
+            // InternalOCLstdlib.g:12621:1: ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getIsTypeofAssignment_0_0());
             }
-            // InternalOCLstdlib.g:12620:1: ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 )
-            // InternalOCLstdlib.g:12620:2: rule__TypedTypeRefCS__IsTypeofAssignment_0_0
+            // InternalOCLstdlib.g:12622:1: ( rule__TypedTypeRefCS__IsTypeofAssignment_0_0 )
+            // InternalOCLstdlib.g:12622:2: rule__TypedTypeRefCS__IsTypeofAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__IsTypeofAssignment_0_0();
@@ -38035,14 +38035,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__1"
-    // InternalOCLstdlib.g:12630:1: rule__TypedTypeRefCS__Group_0__1 : rule__TypedTypeRefCS__Group_0__1__Impl rule__TypedTypeRefCS__Group_0__2 ;
+    // InternalOCLstdlib.g:12632:1: rule__TypedTypeRefCS__Group_0__1 : rule__TypedTypeRefCS__Group_0__1__Impl rule__TypedTypeRefCS__Group_0__2 ;
     public final void rule__TypedTypeRefCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12634:1: ( rule__TypedTypeRefCS__Group_0__1__Impl rule__TypedTypeRefCS__Group_0__2 )
-            // InternalOCLstdlib.g:12635:2: rule__TypedTypeRefCS__Group_0__1__Impl rule__TypedTypeRefCS__Group_0__2
+            // InternalOCLstdlib.g:12636:1: ( rule__TypedTypeRefCS__Group_0__1__Impl rule__TypedTypeRefCS__Group_0__2 )
+            // InternalOCLstdlib.g:12637:2: rule__TypedTypeRefCS__Group_0__1__Impl rule__TypedTypeRefCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_61);
             rule__TypedTypeRefCS__Group_0__1__Impl();
@@ -38073,17 +38073,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:12642:1: rule__TypedTypeRefCS__Group_0__1__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:12644:1: rule__TypedTypeRefCS__Group_0__1__Impl : ( '(' ) ;
     public final void rule__TypedTypeRefCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12646:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:12647:1: ( '(' )
+            // InternalOCLstdlib.g:12648:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:12649:1: ( '(' )
             {
-            // InternalOCLstdlib.g:12647:1: ( '(' )
-            // InternalOCLstdlib.g:12648:1: '('
+            // InternalOCLstdlib.g:12649:1: ( '(' )
+            // InternalOCLstdlib.g:12650:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_0_1());
@@ -38114,14 +38114,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__2"
-    // InternalOCLstdlib.g:12661:1: rule__TypedTypeRefCS__Group_0__2 : rule__TypedTypeRefCS__Group_0__2__Impl rule__TypedTypeRefCS__Group_0__3 ;
+    // InternalOCLstdlib.g:12663:1: rule__TypedTypeRefCS__Group_0__2 : rule__TypedTypeRefCS__Group_0__2__Impl rule__TypedTypeRefCS__Group_0__3 ;
     public final void rule__TypedTypeRefCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12665:1: ( rule__TypedTypeRefCS__Group_0__2__Impl rule__TypedTypeRefCS__Group_0__3 )
-            // InternalOCLstdlib.g:12666:2: rule__TypedTypeRefCS__Group_0__2__Impl rule__TypedTypeRefCS__Group_0__3
+            // InternalOCLstdlib.g:12667:1: ( rule__TypedTypeRefCS__Group_0__2__Impl rule__TypedTypeRefCS__Group_0__3 )
+            // InternalOCLstdlib.g:12668:2: rule__TypedTypeRefCS__Group_0__2__Impl rule__TypedTypeRefCS__Group_0__3
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__TypedTypeRefCS__Group_0__2__Impl();
@@ -38152,23 +38152,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__2__Impl"
-    // InternalOCLstdlib.g:12673:1: rule__TypedTypeRefCS__Group_0__2__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) ) ;
+    // InternalOCLstdlib.g:12675:1: rule__TypedTypeRefCS__Group_0__2__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) ) ;
     public final void rule__TypedTypeRefCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12677:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) ) )
-            // InternalOCLstdlib.g:12678:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) )
+            // InternalOCLstdlib.g:12679:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) ) )
+            // InternalOCLstdlib.g:12680:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) )
             {
-            // InternalOCLstdlib.g:12678:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) )
-            // InternalOCLstdlib.g:12679:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 )
+            // InternalOCLstdlib.g:12680:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 ) )
+            // InternalOCLstdlib.g:12681:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_0_2());
             }
-            // InternalOCLstdlib.g:12680:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 )
-            // InternalOCLstdlib.g:12680:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2
+            // InternalOCLstdlib.g:12682:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 )
+            // InternalOCLstdlib.g:12682:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2();
@@ -38203,14 +38203,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__3"
-    // InternalOCLstdlib.g:12690:1: rule__TypedTypeRefCS__Group_0__3 : rule__TypedTypeRefCS__Group_0__3__Impl ;
+    // InternalOCLstdlib.g:12692:1: rule__TypedTypeRefCS__Group_0__3 : rule__TypedTypeRefCS__Group_0__3__Impl ;
     public final void rule__TypedTypeRefCS__Group_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12694:1: ( rule__TypedTypeRefCS__Group_0__3__Impl )
-            // InternalOCLstdlib.g:12695:2: rule__TypedTypeRefCS__Group_0__3__Impl
+            // InternalOCLstdlib.g:12696:1: ( rule__TypedTypeRefCS__Group_0__3__Impl )
+            // InternalOCLstdlib.g:12697:2: rule__TypedTypeRefCS__Group_0__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_0__3__Impl();
@@ -38236,17 +38236,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_0__3__Impl"
-    // InternalOCLstdlib.g:12701:1: rule__TypedTypeRefCS__Group_0__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:12703:1: rule__TypedTypeRefCS__Group_0__3__Impl : ( ')' ) ;
     public final void rule__TypedTypeRefCS__Group_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12705:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:12706:1: ( ')' )
+            // InternalOCLstdlib.g:12707:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:12708:1: ( ')' )
             {
-            // InternalOCLstdlib.g:12706:1: ( ')' )
-            // InternalOCLstdlib.g:12707:1: ')'
+            // InternalOCLstdlib.g:12708:1: ( ')' )
+            // InternalOCLstdlib.g:12709:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_0_3());
@@ -38277,14 +38277,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0"
-    // InternalOCLstdlib.g:12728:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
+    // InternalOCLstdlib.g:12730:1: rule__TypedTypeRefCS__Group_1__0 : rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 ;
     public final void rule__TypedTypeRefCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12732:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
-            // InternalOCLstdlib.g:12733:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
+            // InternalOCLstdlib.g:12734:1: ( rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1 )
+            // InternalOCLstdlib.g:12735:2: rule__TypedTypeRefCS__Group_1__0__Impl rule__TypedTypeRefCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__TypedTypeRefCS__Group_1__0__Impl();
@@ -38315,23 +38315,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:12740:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) ) ;
+    // InternalOCLstdlib.g:12742:1: rule__TypedTypeRefCS__Group_1__0__Impl : ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12744:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) ) )
-            // InternalOCLstdlib.g:12745:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:12746:1: ( ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) ) )
+            // InternalOCLstdlib.g:12747:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) )
             {
-            // InternalOCLstdlib.g:12745:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) )
-            // InternalOCLstdlib.g:12746:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 )
+            // InternalOCLstdlib.g:12747:1: ( ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 ) )
+            // InternalOCLstdlib.g:12748:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameAssignment_1_0());
             }
-            // InternalOCLstdlib.g:12747:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 )
-            // InternalOCLstdlib.g:12747:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0
+            // InternalOCLstdlib.g:12749:1: ( rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 )
+            // InternalOCLstdlib.g:12749:2: rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0();
@@ -38366,14 +38366,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1"
-    // InternalOCLstdlib.g:12757:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:12759:1: rule__TypedTypeRefCS__Group_1__1 : rule__TypedTypeRefCS__Group_1__1__Impl ;
     public final void rule__TypedTypeRefCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12761:1: ( rule__TypedTypeRefCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:12762:2: rule__TypedTypeRefCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:12763:1: ( rule__TypedTypeRefCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:12764:2: rule__TypedTypeRefCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1__1__Impl();
@@ -38399,22 +38399,22 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:12768:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__Group_1_1__0 )? ) ;
+    // InternalOCLstdlib.g:12770:1: rule__TypedTypeRefCS__Group_1__1__Impl : ( ( rule__TypedTypeRefCS__Group_1_1__0 )? ) ;
     public final void rule__TypedTypeRefCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12772:1: ( ( ( rule__TypedTypeRefCS__Group_1_1__0 )? ) )
-            // InternalOCLstdlib.g:12773:1: ( ( rule__TypedTypeRefCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:12774:1: ( ( ( rule__TypedTypeRefCS__Group_1_1__0 )? ) )
+            // InternalOCLstdlib.g:12775:1: ( ( rule__TypedTypeRefCS__Group_1_1__0 )? )
             {
-            // InternalOCLstdlib.g:12773:1: ( ( rule__TypedTypeRefCS__Group_1_1__0 )? )
-            // InternalOCLstdlib.g:12774:1: ( rule__TypedTypeRefCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:12775:1: ( ( rule__TypedTypeRefCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:12776:1: ( rule__TypedTypeRefCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getGroup_1_1());
             }
-            // InternalOCLstdlib.g:12775:1: ( rule__TypedTypeRefCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:12777:1: ( rule__TypedTypeRefCS__Group_1_1__0 )?
             int alt115=2;
             int LA115_0 = input.LA(1);
 
@@ -38423,7 +38423,7 @@
             }
             switch (alt115) {
                 case 1 :
-                    // InternalOCLstdlib.g:12775:2: rule__TypedTypeRefCS__Group_1_1__0
+                    // InternalOCLstdlib.g:12777:2: rule__TypedTypeRefCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypedTypeRefCS__Group_1_1__0();
@@ -38461,14 +38461,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__0"
-    // InternalOCLstdlib.g:12789:1: rule__TypedTypeRefCS__Group_1_1__0 : rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 ;
+    // InternalOCLstdlib.g:12791:1: rule__TypedTypeRefCS__Group_1_1__0 : rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 ;
     public final void rule__TypedTypeRefCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12793:1: ( rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 )
-            // InternalOCLstdlib.g:12794:2: rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1
+            // InternalOCLstdlib.g:12795:1: ( rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1 )
+            // InternalOCLstdlib.g:12796:2: rule__TypedTypeRefCS__Group_1_1__0__Impl rule__TypedTypeRefCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_62);
             rule__TypedTypeRefCS__Group_1_1__0__Impl();
@@ -38499,17 +38499,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__0__Impl"
-    // InternalOCLstdlib.g:12801:1: rule__TypedTypeRefCS__Group_1_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:12803:1: rule__TypedTypeRefCS__Group_1_1__0__Impl : ( '(' ) ;
     public final void rule__TypedTypeRefCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12805:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:12806:1: ( '(' )
+            // InternalOCLstdlib.g:12807:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:12808:1: ( '(' )
             {
-            // InternalOCLstdlib.g:12806:1: ( '(' )
-            // InternalOCLstdlib.g:12807:1: '('
+            // InternalOCLstdlib.g:12808:1: ( '(' )
+            // InternalOCLstdlib.g:12809:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getLeftParenthesisKeyword_1_1_0());
@@ -38540,14 +38540,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__1"
-    // InternalOCLstdlib.g:12820:1: rule__TypedTypeRefCS__Group_1_1__1 : rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 ;
+    // InternalOCLstdlib.g:12822:1: rule__TypedTypeRefCS__Group_1_1__1 : rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 ;
     public final void rule__TypedTypeRefCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12824:1: ( rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 )
-            // InternalOCLstdlib.g:12825:2: rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2
+            // InternalOCLstdlib.g:12826:1: ( rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2 )
+            // InternalOCLstdlib.g:12827:2: rule__TypedTypeRefCS__Group_1_1__1__Impl rule__TypedTypeRefCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__TypedTypeRefCS__Group_1_1__1__Impl();
@@ -38578,23 +38578,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__1__Impl"
-    // InternalOCLstdlib.g:12832:1: rule__TypedTypeRefCS__Group_1_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:12834:1: rule__TypedTypeRefCS__Group_1_1__1__Impl : ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) ;
     public final void rule__TypedTypeRefCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12836:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) )
-            // InternalOCLstdlib.g:12837:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:12838:1: ( ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) ) )
+            // InternalOCLstdlib.g:12839:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:12837:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
-            // InternalOCLstdlib.g:12838:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
+            // InternalOCLstdlib.g:12839:1: ( ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:12840:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingAssignment_1_1_1());
             }
-            // InternalOCLstdlib.g:12839:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
-            // InternalOCLstdlib.g:12839:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1
+            // InternalOCLstdlib.g:12841:1: ( rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 )
+            // InternalOCLstdlib.g:12841:2: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1();
@@ -38629,14 +38629,14 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__2"
-    // InternalOCLstdlib.g:12849:1: rule__TypedTypeRefCS__Group_1_1__2 : rule__TypedTypeRefCS__Group_1_1__2__Impl ;
+    // InternalOCLstdlib.g:12851:1: rule__TypedTypeRefCS__Group_1_1__2 : rule__TypedTypeRefCS__Group_1_1__2__Impl ;
     public final void rule__TypedTypeRefCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12853:1: ( rule__TypedTypeRefCS__Group_1_1__2__Impl )
-            // InternalOCLstdlib.g:12854:2: rule__TypedTypeRefCS__Group_1_1__2__Impl
+            // InternalOCLstdlib.g:12855:1: ( rule__TypedTypeRefCS__Group_1_1__2__Impl )
+            // InternalOCLstdlib.g:12856:2: rule__TypedTypeRefCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypedTypeRefCS__Group_1_1__2__Impl();
@@ -38662,17 +38662,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__Group_1_1__2__Impl"
-    // InternalOCLstdlib.g:12860:1: rule__TypedTypeRefCS__Group_1_1__2__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:12862:1: rule__TypedTypeRefCS__Group_1_1__2__Impl : ( ')' ) ;
     public final void rule__TypedTypeRefCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12864:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:12865:1: ( ')' )
+            // InternalOCLstdlib.g:12866:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:12867:1: ( ')' )
             {
-            // InternalOCLstdlib.g:12865:1: ( ')' )
-            // InternalOCLstdlib.g:12866:1: ')'
+            // InternalOCLstdlib.g:12867:1: ( ')' )
+            // InternalOCLstdlib.g:12868:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getRightParenthesisKeyword_1_1_2());
@@ -38703,14 +38703,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0"
-    // InternalOCLstdlib.g:12885:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
+    // InternalOCLstdlib.g:12887:1: rule__TuplePartCS__Group__0 : rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 ;
     public final void rule__TuplePartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12889:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
-            // InternalOCLstdlib.g:12890:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
+            // InternalOCLstdlib.g:12891:1: ( rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1 )
+            // InternalOCLstdlib.g:12892:2: rule__TuplePartCS__Group__0__Impl rule__TuplePartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__TuplePartCS__Group__0__Impl();
@@ -38741,23 +38741,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__0__Impl"
-    // InternalOCLstdlib.g:12897:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:12899:1: rule__TuplePartCS__Group__0__Impl : ( ( rule__TuplePartCS__NameAssignment_0 ) ) ;
     public final void rule__TuplePartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12901:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:12902:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:12903:1: ( ( ( rule__TuplePartCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:12904:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:12902:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:12903:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:12904:1: ( ( rule__TuplePartCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:12905:1: ( rule__TuplePartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:12904:1: ( rule__TuplePartCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:12904:2: rule__TuplePartCS__NameAssignment_0
+            // InternalOCLstdlib.g:12906:1: ( rule__TuplePartCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:12906:2: rule__TuplePartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__NameAssignment_0();
@@ -38792,14 +38792,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1"
-    // InternalOCLstdlib.g:12914:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
+    // InternalOCLstdlib.g:12916:1: rule__TuplePartCS__Group__1 : rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 ;
     public final void rule__TuplePartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12918:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
-            // InternalOCLstdlib.g:12919:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
+            // InternalOCLstdlib.g:12920:1: ( rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2 )
+            // InternalOCLstdlib.g:12921:2: rule__TuplePartCS__Group__1__Impl rule__TuplePartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TuplePartCS__Group__1__Impl();
@@ -38830,17 +38830,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__1__Impl"
-    // InternalOCLstdlib.g:12926:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:12928:1: rule__TuplePartCS__Group__1__Impl : ( ':' ) ;
     public final void rule__TuplePartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12930:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:12931:1: ( ':' )
+            // InternalOCLstdlib.g:12932:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:12933:1: ( ':' )
             {
-            // InternalOCLstdlib.g:12931:1: ( ':' )
-            // InternalOCLstdlib.g:12932:1: ':'
+            // InternalOCLstdlib.g:12933:1: ( ':' )
+            // InternalOCLstdlib.g:12934:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getColonKeyword_1());
@@ -38871,14 +38871,14 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2"
-    // InternalOCLstdlib.g:12945:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:12947:1: rule__TuplePartCS__Group__2 : rule__TuplePartCS__Group__2__Impl ;
     public final void rule__TuplePartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12949:1: ( rule__TuplePartCS__Group__2__Impl )
-            // InternalOCLstdlib.g:12950:2: rule__TuplePartCS__Group__2__Impl
+            // InternalOCLstdlib.g:12951:1: ( rule__TuplePartCS__Group__2__Impl )
+            // InternalOCLstdlib.g:12952:2: rule__TuplePartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__Group__2__Impl();
@@ -38904,23 +38904,23 @@
 
 
     // $ANTLR start "rule__TuplePartCS__Group__2__Impl"
-    // InternalOCLstdlib.g:12956:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:12958:1: rule__TuplePartCS__Group__2__Impl : ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) ;
     public final void rule__TuplePartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12960:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
-            // InternalOCLstdlib.g:12961:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:12962:1: ( ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) ) )
+            // InternalOCLstdlib.g:12963:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:12961:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
-            // InternalOCLstdlib.g:12962:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:12963:1: ( ( rule__TuplePartCS__OwnedTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:12964:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeAssignment_2());
             }
-            // InternalOCLstdlib.g:12963:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
-            // InternalOCLstdlib.g:12963:2: rule__TuplePartCS__OwnedTypeAssignment_2
+            // InternalOCLstdlib.g:12965:1: ( rule__TuplePartCS__OwnedTypeAssignment_2 )
+            // InternalOCLstdlib.g:12965:2: rule__TuplePartCS__OwnedTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TuplePartCS__OwnedTypeAssignment_2();
@@ -38955,14 +38955,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__0"
-    // InternalOCLstdlib.g:12979:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
+    // InternalOCLstdlib.g:12981:1: rule__URIPathNameCS__Group__0 : rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 ;
     public final void rule__URIPathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12983:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
-            // InternalOCLstdlib.g:12984:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
+            // InternalOCLstdlib.g:12985:1: ( rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1 )
+            // InternalOCLstdlib.g:12986:2: rule__URIPathNameCS__Group__0__Impl rule__URIPathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__URIPathNameCS__Group__0__Impl();
@@ -38993,23 +38993,23 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__0__Impl"
-    // InternalOCLstdlib.g:12991:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:12993:1: rule__URIPathNameCS__Group__0__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__URIPathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:12995:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalOCLstdlib.g:12996:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLstdlib.g:12997:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalOCLstdlib.g:12998:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:12996:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalOCLstdlib.g:12997:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLstdlib.g:12998:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLstdlib.g:12999:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalOCLstdlib.g:12998:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalOCLstdlib.g:12998:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
+            // InternalOCLstdlib.g:13000:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLstdlib.g:13000:2: rule__URIPathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__OwnedPathElementsAssignment_0();
@@ -39044,14 +39044,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__1"
-    // InternalOCLstdlib.g:13008:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:13010:1: rule__URIPathNameCS__Group__1 : rule__URIPathNameCS__Group__1__Impl ;
     public final void rule__URIPathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13012:1: ( rule__URIPathNameCS__Group__1__Impl )
-            // InternalOCLstdlib.g:13013:2: rule__URIPathNameCS__Group__1__Impl
+            // InternalOCLstdlib.g:13014:1: ( rule__URIPathNameCS__Group__1__Impl )
+            // InternalOCLstdlib.g:13015:2: rule__URIPathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__Group__1__Impl();
@@ -39077,22 +39077,22 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group__1__Impl"
-    // InternalOCLstdlib.g:13019:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
+    // InternalOCLstdlib.g:13021:1: rule__URIPathNameCS__Group__1__Impl : ( ( rule__URIPathNameCS__Group_1__0 )* ) ;
     public final void rule__URIPathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13023:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
-            // InternalOCLstdlib.g:13024:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:13025:1: ( ( ( rule__URIPathNameCS__Group_1__0 )* ) )
+            // InternalOCLstdlib.g:13026:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
             {
-            // InternalOCLstdlib.g:13024:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
-            // InternalOCLstdlib.g:13025:1: ( rule__URIPathNameCS__Group_1__0 )*
+            // InternalOCLstdlib.g:13026:1: ( ( rule__URIPathNameCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:13027:1: ( rule__URIPathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:13026:1: ( rule__URIPathNameCS__Group_1__0 )*
+            // InternalOCLstdlib.g:13028:1: ( rule__URIPathNameCS__Group_1__0 )*
             loop116:
             do {
                 int alt116=2;
@@ -39105,7 +39105,7 @@
 
                 switch (alt116) {
             	case 1 :
-            	    // InternalOCLstdlib.g:13026:2: rule__URIPathNameCS__Group_1__0
+            	    // InternalOCLstdlib.g:13028:2: rule__URIPathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_9);
             	    rule__URIPathNameCS__Group_1__0();
@@ -39146,14 +39146,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__0"
-    // InternalOCLstdlib.g:13040:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
+    // InternalOCLstdlib.g:13042:1: rule__URIPathNameCS__Group_1__0 : rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 ;
     public final void rule__URIPathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13044:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
-            // InternalOCLstdlib.g:13045:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
+            // InternalOCLstdlib.g:13046:1: ( rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1 )
+            // InternalOCLstdlib.g:13047:2: rule__URIPathNameCS__Group_1__0__Impl rule__URIPathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_63);
             rule__URIPathNameCS__Group_1__0__Impl();
@@ -39184,17 +39184,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:13052:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalOCLstdlib.g:13054:1: rule__URIPathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__URIPathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13056:1: ( ( '::' ) )
-            // InternalOCLstdlib.g:13057:1: ( '::' )
+            // InternalOCLstdlib.g:13058:1: ( ( '::' ) )
+            // InternalOCLstdlib.g:13059:1: ( '::' )
             {
-            // InternalOCLstdlib.g:13057:1: ( '::' )
-            // InternalOCLstdlib.g:13058:1: '::'
+            // InternalOCLstdlib.g:13059:1: ( '::' )
+            // InternalOCLstdlib.g:13060:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());
@@ -39225,14 +39225,14 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__1"
-    // InternalOCLstdlib.g:13071:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:13073:1: rule__URIPathNameCS__Group_1__1 : rule__URIPathNameCS__Group_1__1__Impl ;
     public final void rule__URIPathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13075:1: ( rule__URIPathNameCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:13076:2: rule__URIPathNameCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:13077:1: ( rule__URIPathNameCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:13078:2: rule__URIPathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__Group_1__1__Impl();
@@ -39258,23 +39258,23 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:13082:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:13084:1: rule__URIPathNameCS__Group_1__1__Impl : ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__URIPathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13086:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:13087:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13088:1: ( ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:13089:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:13087:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalOCLstdlib.g:13088:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLstdlib.g:13089:1: ( ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13090:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalOCLstdlib.g:13089:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalOCLstdlib.g:13089:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalOCLstdlib.g:13091:1: ( rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLstdlib.g:13091:2: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIPathNameCS__OwnedPathElementsAssignment_1_1();
@@ -39309,14 +39309,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0"
-    // InternalOCLstdlib.g:13103:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
+    // InternalOCLstdlib.g:13105:1: rule__URIFirstPathElementCS__Group_1__0 : rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 ;
     public final void rule__URIFirstPathElementCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13107:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
-            // InternalOCLstdlib.g:13108:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
+            // InternalOCLstdlib.g:13109:1: ( rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1 )
+            // InternalOCLstdlib.g:13110:2: rule__URIFirstPathElementCS__Group_1__0__Impl rule__URIFirstPathElementCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__URIFirstPathElementCS__Group_1__0__Impl();
@@ -39347,23 +39347,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:13115:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:13117:1: rule__URIFirstPathElementCS__Group_1__0__Impl : ( () ) ;
     public final void rule__URIFirstPathElementCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13119:1: ( ( () ) )
-            // InternalOCLstdlib.g:13120:1: ( () )
+            // InternalOCLstdlib.g:13121:1: ( ( () ) )
+            // InternalOCLstdlib.g:13122:1: ( () )
             {
-            // InternalOCLstdlib.g:13120:1: ( () )
-            // InternalOCLstdlib.g:13121:1: ()
+            // InternalOCLstdlib.g:13122:1: ( () )
+            // InternalOCLstdlib.g:13123:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0());
             }
-            // InternalOCLstdlib.g:13122:1: ()
-            // InternalOCLstdlib.g:13124:1:
+            // InternalOCLstdlib.g:13124:1: ()
+            // InternalOCLstdlib.g:13126:1:
             {
             }
 
@@ -39388,14 +39388,14 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1"
-    // InternalOCLstdlib.g:13134:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:13136:1: rule__URIFirstPathElementCS__Group_1__1 : rule__URIFirstPathElementCS__Group_1__1__Impl ;
     public final void rule__URIFirstPathElementCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13138:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:13139:2: rule__URIFirstPathElementCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:13140:1: ( rule__URIFirstPathElementCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:13141:2: rule__URIFirstPathElementCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__Group_1__1__Impl();
@@ -39421,23 +39421,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:13145:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:13147:1: rule__URIFirstPathElementCS__Group_1__1__Impl : ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) ;
     public final void rule__URIFirstPathElementCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13149:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:13150:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13151:1: ( ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:13152:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:13150:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
-            // InternalOCLstdlib.g:13151:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalOCLstdlib.g:13152:1: ( ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13153:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementAssignment_1_1());
             }
-            // InternalOCLstdlib.g:13152:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
-            // InternalOCLstdlib.g:13152:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
+            // InternalOCLstdlib.g:13154:1: ( rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 )
+            // InternalOCLstdlib.g:13154:2: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__URIFirstPathElementCS__ReferredElementAssignment_1_1();
@@ -39472,14 +39472,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0"
-    // InternalOCLstdlib.g:13166:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
+    // InternalOCLstdlib.g:13168:1: rule__CollectionTypeCS__Group__0 : rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 ;
     public final void rule__CollectionTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13170:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
-            // InternalOCLstdlib.g:13171:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
+            // InternalOCLstdlib.g:13172:1: ( rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1 )
+            // InternalOCLstdlib.g:13173:2: rule__CollectionTypeCS__Group__0__Impl rule__CollectionTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__CollectionTypeCS__Group__0__Impl();
@@ -39510,23 +39510,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__0__Impl"
-    // InternalOCLstdlib.g:13178:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:13180:1: rule__CollectionTypeCS__Group__0__Impl : ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) ;
     public final void rule__CollectionTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13182:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:13183:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:13184:1: ( ( ( rule__CollectionTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:13185:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:13183:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:13184:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:13185:1: ( ( rule__CollectionTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:13186:1: ( rule__CollectionTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:13185:1: ( rule__CollectionTypeCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:13185:2: rule__CollectionTypeCS__NameAssignment_0
+            // InternalOCLstdlib.g:13187:1: ( rule__CollectionTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:13187:2: rule__CollectionTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__NameAssignment_0();
@@ -39561,14 +39561,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1"
-    // InternalOCLstdlib.g:13195:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:13197:1: rule__CollectionTypeCS__Group__1 : rule__CollectionTypeCS__Group__1__Impl ;
     public final void rule__CollectionTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13199:1: ( rule__CollectionTypeCS__Group__1__Impl )
-            // InternalOCLstdlib.g:13200:2: rule__CollectionTypeCS__Group__1__Impl
+            // InternalOCLstdlib.g:13201:1: ( rule__CollectionTypeCS__Group__1__Impl )
+            // InternalOCLstdlib.g:13202:2: rule__CollectionTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group__1__Impl();
@@ -39594,22 +39594,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group__1__Impl"
-    // InternalOCLstdlib.g:13206:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:13208:1: rule__CollectionTypeCS__Group__1__Impl : ( ( rule__CollectionTypeCS__Group_1__0 )? ) ;
     public final void rule__CollectionTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13210:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:13211:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:13212:1: ( ( ( rule__CollectionTypeCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:13213:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:13211:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:13212:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalOCLstdlib.g:13213:1: ( ( rule__CollectionTypeCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:13214:1: ( rule__CollectionTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:13213:1: ( rule__CollectionTypeCS__Group_1__0 )?
+            // InternalOCLstdlib.g:13215:1: ( rule__CollectionTypeCS__Group_1__0 )?
             int alt117=2;
             int LA117_0 = input.LA(1);
 
@@ -39618,7 +39618,7 @@
             }
             switch (alt117) {
                 case 1 :
-                    // InternalOCLstdlib.g:13213:2: rule__CollectionTypeCS__Group_1__0
+                    // InternalOCLstdlib.g:13215:2: rule__CollectionTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__Group_1__0();
@@ -39656,14 +39656,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0"
-    // InternalOCLstdlib.g:13227:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
+    // InternalOCLstdlib.g:13229:1: rule__CollectionTypeCS__Group_1__0 : rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 ;
     public final void rule__CollectionTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13231:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
-            // InternalOCLstdlib.g:13232:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
+            // InternalOCLstdlib.g:13233:1: ( rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1 )
+            // InternalOCLstdlib.g:13234:2: rule__CollectionTypeCS__Group_1__0__Impl rule__CollectionTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__CollectionTypeCS__Group_1__0__Impl();
@@ -39694,17 +39694,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:13239:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:13241:1: rule__CollectionTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__CollectionTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13243:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:13244:1: ( '(' )
+            // InternalOCLstdlib.g:13245:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:13246:1: ( '(' )
             {
-            // InternalOCLstdlib.g:13244:1: ( '(' )
-            // InternalOCLstdlib.g:13245:1: '('
+            // InternalOCLstdlib.g:13246:1: ( '(' )
+            // InternalOCLstdlib.g:13247:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -39735,14 +39735,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1"
-    // InternalOCLstdlib.g:13258:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
+    // InternalOCLstdlib.g:13260:1: rule__CollectionTypeCS__Group_1__1 : rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 ;
     public final void rule__CollectionTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13262:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
-            // InternalOCLstdlib.g:13263:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
+            // InternalOCLstdlib.g:13264:1: ( rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2 )
+            // InternalOCLstdlib.g:13265:2: rule__CollectionTypeCS__Group_1__1__Impl rule__CollectionTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_64);
             rule__CollectionTypeCS__Group_1__1__Impl();
@@ -39773,23 +39773,23 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:13270:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:13272:1: rule__CollectionTypeCS__Group_1__1__Impl : ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CollectionTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13274:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:13275:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13276:1: ( ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:13277:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:13275:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLstdlib.g:13276:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:13277:1: ( ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13278:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLstdlib.g:13277:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLstdlib.g:13277:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
+            // InternalOCLstdlib.g:13279:1: ( rule__CollectionTypeCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:13279:2: rule__CollectionTypeCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__OwnedTypeAssignment_1_1();
@@ -39824,14 +39824,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2"
-    // InternalOCLstdlib.g:13287:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
+    // InternalOCLstdlib.g:13289:1: rule__CollectionTypeCS__Group_1__2 : rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 ;
     public final void rule__CollectionTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13291:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
-            // InternalOCLstdlib.g:13292:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
+            // InternalOCLstdlib.g:13293:1: ( rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3 )
+            // InternalOCLstdlib.g:13294:2: rule__CollectionTypeCS__Group_1__2__Impl rule__CollectionTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_64);
             rule__CollectionTypeCS__Group_1__2__Impl();
@@ -39862,22 +39862,22 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__2__Impl"
-    // InternalOCLstdlib.g:13299:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
+    // InternalOCLstdlib.g:13301:1: rule__CollectionTypeCS__Group_1__2__Impl : ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) ;
     public final void rule__CollectionTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13303:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
-            // InternalOCLstdlib.g:13304:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalOCLstdlib.g:13305:1: ( ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? ) )
+            // InternalOCLstdlib.g:13306:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
             {
-            // InternalOCLstdlib.g:13304:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
-            // InternalOCLstdlib.g:13305:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalOCLstdlib.g:13306:1: ( ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )? )
+            // InternalOCLstdlib.g:13307:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityAssignment_1_2());
             }
-            // InternalOCLstdlib.g:13306:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
+            // InternalOCLstdlib.g:13308:1: ( rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 )?
             int alt118=2;
             int LA118_0 = input.LA(1);
 
@@ -39886,7 +39886,7 @@
             }
             switch (alt118) {
                 case 1 :
-                    // InternalOCLstdlib.g:13306:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
+                    // InternalOCLstdlib.g:13308:2: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2();
@@ -39924,14 +39924,14 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3"
-    // InternalOCLstdlib.g:13316:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
+    // InternalOCLstdlib.g:13318:1: rule__CollectionTypeCS__Group_1__3 : rule__CollectionTypeCS__Group_1__3__Impl ;
     public final void rule__CollectionTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13320:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
-            // InternalOCLstdlib.g:13321:2: rule__CollectionTypeCS__Group_1__3__Impl
+            // InternalOCLstdlib.g:13322:1: ( rule__CollectionTypeCS__Group_1__3__Impl )
+            // InternalOCLstdlib.g:13323:2: rule__CollectionTypeCS__Group_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionTypeCS__Group_1__3__Impl();
@@ -39957,17 +39957,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__Group_1__3__Impl"
-    // InternalOCLstdlib.g:13327:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:13329:1: rule__CollectionTypeCS__Group_1__3__Impl : ( ')' ) ;
     public final void rule__CollectionTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13331:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:13332:1: ( ')' )
+            // InternalOCLstdlib.g:13333:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:13334:1: ( ')' )
             {
-            // InternalOCLstdlib.g:13332:1: ( ')' )
-            // InternalOCLstdlib.g:13333:1: ')'
+            // InternalOCLstdlib.g:13334:1: ( ')' )
+            // InternalOCLstdlib.g:13335:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());
@@ -39998,14 +39998,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0"
-    // InternalOCLstdlib.g:13354:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
+    // InternalOCLstdlib.g:13356:1: rule__MapTypeCS__Group__0 : rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 ;
     public final void rule__MapTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13358:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
-            // InternalOCLstdlib.g:13359:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
+            // InternalOCLstdlib.g:13360:1: ( rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1 )
+            // InternalOCLstdlib.g:13361:2: rule__MapTypeCS__Group__0__Impl rule__MapTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__MapTypeCS__Group__0__Impl();
@@ -40036,23 +40036,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__0__Impl"
-    // InternalOCLstdlib.g:13366:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:13368:1: rule__MapTypeCS__Group__0__Impl : ( ( rule__MapTypeCS__NameAssignment_0 ) ) ;
     public final void rule__MapTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13370:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:13371:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:13372:1: ( ( ( rule__MapTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:13373:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:13371:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:13372:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:13373:1: ( ( rule__MapTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:13374:1: ( rule__MapTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:13373:1: ( rule__MapTypeCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:13373:2: rule__MapTypeCS__NameAssignment_0
+            // InternalOCLstdlib.g:13375:1: ( rule__MapTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:13375:2: rule__MapTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__NameAssignment_0();
@@ -40087,14 +40087,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1"
-    // InternalOCLstdlib.g:13383:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:13385:1: rule__MapTypeCS__Group__1 : rule__MapTypeCS__Group__1__Impl ;
     public final void rule__MapTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13387:1: ( rule__MapTypeCS__Group__1__Impl )
-            // InternalOCLstdlib.g:13388:2: rule__MapTypeCS__Group__1__Impl
+            // InternalOCLstdlib.g:13389:1: ( rule__MapTypeCS__Group__1__Impl )
+            // InternalOCLstdlib.g:13390:2: rule__MapTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group__1__Impl();
@@ -40120,22 +40120,22 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group__1__Impl"
-    // InternalOCLstdlib.g:13394:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:13396:1: rule__MapTypeCS__Group__1__Impl : ( ( rule__MapTypeCS__Group_1__0 )? ) ;
     public final void rule__MapTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13398:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:13399:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:13400:1: ( ( ( rule__MapTypeCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:13401:1: ( ( rule__MapTypeCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:13399:1: ( ( rule__MapTypeCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:13400:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalOCLstdlib.g:13401:1: ( ( rule__MapTypeCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:13402:1: ( rule__MapTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:13401:1: ( rule__MapTypeCS__Group_1__0 )?
+            // InternalOCLstdlib.g:13403:1: ( rule__MapTypeCS__Group_1__0 )?
             int alt119=2;
             int LA119_0 = input.LA(1);
 
@@ -40144,7 +40144,7 @@
             }
             switch (alt119) {
                 case 1 :
-                    // InternalOCLstdlib.g:13401:2: rule__MapTypeCS__Group_1__0
+                    // InternalOCLstdlib.g:13403:2: rule__MapTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapTypeCS__Group_1__0();
@@ -40182,14 +40182,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0"
-    // InternalOCLstdlib.g:13415:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
+    // InternalOCLstdlib.g:13417:1: rule__MapTypeCS__Group_1__0 : rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 ;
     public final void rule__MapTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13419:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
-            // InternalOCLstdlib.g:13420:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
+            // InternalOCLstdlib.g:13421:1: ( rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1 )
+            // InternalOCLstdlib.g:13422:2: rule__MapTypeCS__Group_1__0__Impl rule__MapTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__MapTypeCS__Group_1__0__Impl();
@@ -40220,17 +40220,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:13427:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:13429:1: rule__MapTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__MapTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13431:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:13432:1: ( '(' )
+            // InternalOCLstdlib.g:13433:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:13434:1: ( '(' )
             {
-            // InternalOCLstdlib.g:13432:1: ( '(' )
-            // InternalOCLstdlib.g:13433:1: '('
+            // InternalOCLstdlib.g:13434:1: ( '(' )
+            // InternalOCLstdlib.g:13435:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -40261,14 +40261,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1"
-    // InternalOCLstdlib.g:13446:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
+    // InternalOCLstdlib.g:13448:1: rule__MapTypeCS__Group_1__1 : rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 ;
     public final void rule__MapTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13450:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
-            // InternalOCLstdlib.g:13451:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
+            // InternalOCLstdlib.g:13452:1: ( rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2 )
+            // InternalOCLstdlib.g:13453:2: rule__MapTypeCS__Group_1__1__Impl rule__MapTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__MapTypeCS__Group_1__1__Impl();
@@ -40299,23 +40299,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:13458:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:13460:1: rule__MapTypeCS__Group_1__1__Impl : ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) ;
     public final void rule__MapTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13462:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:13463:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13464:1: ( ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:13465:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:13463:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
-            // InternalOCLstdlib.g:13464:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:13465:1: ( ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:13466:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeAssignment_1_1());
             }
-            // InternalOCLstdlib.g:13465:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
-            // InternalOCLstdlib.g:13465:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
+            // InternalOCLstdlib.g:13467:1: ( rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:13467:2: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedKeyTypeAssignment_1_1();
@@ -40350,14 +40350,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2"
-    // InternalOCLstdlib.g:13475:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
+    // InternalOCLstdlib.g:13477:1: rule__MapTypeCS__Group_1__2 : rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 ;
     public final void rule__MapTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13479:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
-            // InternalOCLstdlib.g:13480:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
+            // InternalOCLstdlib.g:13481:1: ( rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3 )
+            // InternalOCLstdlib.g:13482:2: rule__MapTypeCS__Group_1__2__Impl rule__MapTypeCS__Group_1__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__MapTypeCS__Group_1__2__Impl();
@@ -40388,17 +40388,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__2__Impl"
-    // InternalOCLstdlib.g:13487:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:13489:1: rule__MapTypeCS__Group_1__2__Impl : ( ',' ) ;
     public final void rule__MapTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13491:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:13492:1: ( ',' )
+            // InternalOCLstdlib.g:13493:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:13494:1: ( ',' )
             {
-            // InternalOCLstdlib.g:13492:1: ( ',' )
-            // InternalOCLstdlib.g:13493:1: ','
+            // InternalOCLstdlib.g:13494:1: ( ',' )
+            // InternalOCLstdlib.g:13495:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());
@@ -40429,14 +40429,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3"
-    // InternalOCLstdlib.g:13506:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
+    // InternalOCLstdlib.g:13508:1: rule__MapTypeCS__Group_1__3 : rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 ;
     public final void rule__MapTypeCS__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13510:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
-            // InternalOCLstdlib.g:13511:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
+            // InternalOCLstdlib.g:13512:1: ( rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4 )
+            // InternalOCLstdlib.g:13513:2: rule__MapTypeCS__Group_1__3__Impl rule__MapTypeCS__Group_1__4
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__MapTypeCS__Group_1__3__Impl();
@@ -40467,23 +40467,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__3__Impl"
-    // InternalOCLstdlib.g:13518:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
+    // InternalOCLstdlib.g:13520:1: rule__MapTypeCS__Group_1__3__Impl : ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) ;
     public final void rule__MapTypeCS__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13522:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
-            // InternalOCLstdlib.g:13523:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalOCLstdlib.g:13524:1: ( ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) ) )
+            // InternalOCLstdlib.g:13525:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
             {
-            // InternalOCLstdlib.g:13523:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
-            // InternalOCLstdlib.g:13524:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalOCLstdlib.g:13525:1: ( ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 ) )
+            // InternalOCLstdlib.g:13526:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeAssignment_1_3());
             }
-            // InternalOCLstdlib.g:13525:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
-            // InternalOCLstdlib.g:13525:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
+            // InternalOCLstdlib.g:13527:1: ( rule__MapTypeCS__OwnedValueTypeAssignment_1_3 )
+            // InternalOCLstdlib.g:13527:2: rule__MapTypeCS__OwnedValueTypeAssignment_1_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__OwnedValueTypeAssignment_1_3();
@@ -40518,14 +40518,14 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4"
-    // InternalOCLstdlib.g:13535:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
+    // InternalOCLstdlib.g:13537:1: rule__MapTypeCS__Group_1__4 : rule__MapTypeCS__Group_1__4__Impl ;
     public final void rule__MapTypeCS__Group_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13539:1: ( rule__MapTypeCS__Group_1__4__Impl )
-            // InternalOCLstdlib.g:13540:2: rule__MapTypeCS__Group_1__4__Impl
+            // InternalOCLstdlib.g:13541:1: ( rule__MapTypeCS__Group_1__4__Impl )
+            // InternalOCLstdlib.g:13542:2: rule__MapTypeCS__Group_1__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapTypeCS__Group_1__4__Impl();
@@ -40551,17 +40551,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__Group_1__4__Impl"
-    // InternalOCLstdlib.g:13546:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:13548:1: rule__MapTypeCS__Group_1__4__Impl : ( ')' ) ;
     public final void rule__MapTypeCS__Group_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13550:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:13551:1: ( ')' )
+            // InternalOCLstdlib.g:13552:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:13553:1: ( ')' )
             {
-            // InternalOCLstdlib.g:13551:1: ( ')' )
-            // InternalOCLstdlib.g:13552:1: ')'
+            // InternalOCLstdlib.g:13553:1: ( ')' )
+            // InternalOCLstdlib.g:13554:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());
@@ -40592,14 +40592,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0"
-    // InternalOCLstdlib.g:13575:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
+    // InternalOCLstdlib.g:13577:1: rule__TupleTypeCS__Group__0 : rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 ;
     public final void rule__TupleTypeCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13579:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
-            // InternalOCLstdlib.g:13580:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
+            // InternalOCLstdlib.g:13581:1: ( rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1 )
+            // InternalOCLstdlib.g:13582:2: rule__TupleTypeCS__Group__0__Impl rule__TupleTypeCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__TupleTypeCS__Group__0__Impl();
@@ -40630,23 +40630,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__0__Impl"
-    // InternalOCLstdlib.g:13587:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:13589:1: rule__TupleTypeCS__Group__0__Impl : ( ( rule__TupleTypeCS__NameAssignment_0 ) ) ;
     public final void rule__TupleTypeCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13591:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:13592:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:13593:1: ( ( ( rule__TupleTypeCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:13594:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:13592:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:13593:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:13594:1: ( ( rule__TupleTypeCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:13595:1: ( rule__TupleTypeCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:13594:1: ( rule__TupleTypeCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:13594:2: rule__TupleTypeCS__NameAssignment_0
+            // InternalOCLstdlib.g:13596:1: ( rule__TupleTypeCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:13596:2: rule__TupleTypeCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__NameAssignment_0();
@@ -40681,14 +40681,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1"
-    // InternalOCLstdlib.g:13604:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:13606:1: rule__TupleTypeCS__Group__1 : rule__TupleTypeCS__Group__1__Impl ;
     public final void rule__TupleTypeCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13608:1: ( rule__TupleTypeCS__Group__1__Impl )
-            // InternalOCLstdlib.g:13609:2: rule__TupleTypeCS__Group__1__Impl
+            // InternalOCLstdlib.g:13610:1: ( rule__TupleTypeCS__Group__1__Impl )
+            // InternalOCLstdlib.g:13611:2: rule__TupleTypeCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group__1__Impl();
@@ -40714,22 +40714,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group__1__Impl"
-    // InternalOCLstdlib.g:13615:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:13617:1: rule__TupleTypeCS__Group__1__Impl : ( ( rule__TupleTypeCS__Group_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13619:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:13620:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:13621:1: ( ( ( rule__TupleTypeCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:13622:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:13620:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:13621:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalOCLstdlib.g:13622:1: ( ( rule__TupleTypeCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:13623:1: ( rule__TupleTypeCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:13622:1: ( rule__TupleTypeCS__Group_1__0 )?
+            // InternalOCLstdlib.g:13624:1: ( rule__TupleTypeCS__Group_1__0 )?
             int alt120=2;
             int LA120_0 = input.LA(1);
 
@@ -40738,7 +40738,7 @@
             }
             switch (alt120) {
                 case 1 :
-                    // InternalOCLstdlib.g:13622:2: rule__TupleTypeCS__Group_1__0
+                    // InternalOCLstdlib.g:13624:2: rule__TupleTypeCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1__0();
@@ -40776,14 +40776,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0"
-    // InternalOCLstdlib.g:13636:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
+    // InternalOCLstdlib.g:13638:1: rule__TupleTypeCS__Group_1__0 : rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 ;
     public final void rule__TupleTypeCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13640:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
-            // InternalOCLstdlib.g:13641:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
+            // InternalOCLstdlib.g:13642:1: ( rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1 )
+            // InternalOCLstdlib.g:13643:2: rule__TupleTypeCS__Group_1__0__Impl rule__TupleTypeCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__TupleTypeCS__Group_1__0__Impl();
@@ -40814,17 +40814,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:13648:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:13650:1: rule__TupleTypeCS__Group_1__0__Impl : ( '(' ) ;
     public final void rule__TupleTypeCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13652:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:13653:1: ( '(' )
+            // InternalOCLstdlib.g:13654:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:13655:1: ( '(' )
             {
-            // InternalOCLstdlib.g:13653:1: ( '(' )
-            // InternalOCLstdlib.g:13654:1: '('
+            // InternalOCLstdlib.g:13655:1: ( '(' )
+            // InternalOCLstdlib.g:13656:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());
@@ -40855,14 +40855,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1"
-    // InternalOCLstdlib.g:13667:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
+    // InternalOCLstdlib.g:13669:1: rule__TupleTypeCS__Group_1__1 : rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 ;
     public final void rule__TupleTypeCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13671:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
-            // InternalOCLstdlib.g:13672:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
+            // InternalOCLstdlib.g:13673:1: ( rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2 )
+            // InternalOCLstdlib.g:13674:2: rule__TupleTypeCS__Group_1__1__Impl rule__TupleTypeCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_45);
             rule__TupleTypeCS__Group_1__1__Impl();
@@ -40893,22 +40893,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:13679:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
+    // InternalOCLstdlib.g:13681:1: rule__TupleTypeCS__Group_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1__0 )? ) ;
     public final void rule__TupleTypeCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13683:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
-            // InternalOCLstdlib.g:13684:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:13685:1: ( ( ( rule__TupleTypeCS__Group_1_1__0 )? ) )
+            // InternalOCLstdlib.g:13686:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
             {
-            // InternalOCLstdlib.g:13684:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
-            // InternalOCLstdlib.g:13685:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:13686:1: ( ( rule__TupleTypeCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:13687:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1());
             }
-            // InternalOCLstdlib.g:13686:1: ( rule__TupleTypeCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:13688:1: ( rule__TupleTypeCS__Group_1_1__0 )?
             int alt121=2;
             int LA121_0 = input.LA(1);
 
@@ -40917,7 +40917,7 @@
             }
             switch (alt121) {
                 case 1 :
-                    // InternalOCLstdlib.g:13686:2: rule__TupleTypeCS__Group_1_1__0
+                    // InternalOCLstdlib.g:13688:2: rule__TupleTypeCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleTypeCS__Group_1_1__0();
@@ -40955,14 +40955,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2"
-    // InternalOCLstdlib.g:13696:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
+    // InternalOCLstdlib.g:13698:1: rule__TupleTypeCS__Group_1__2 : rule__TupleTypeCS__Group_1__2__Impl ;
     public final void rule__TupleTypeCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13700:1: ( rule__TupleTypeCS__Group_1__2__Impl )
-            // InternalOCLstdlib.g:13701:2: rule__TupleTypeCS__Group_1__2__Impl
+            // InternalOCLstdlib.g:13702:1: ( rule__TupleTypeCS__Group_1__2__Impl )
+            // InternalOCLstdlib.g:13703:2: rule__TupleTypeCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1__2__Impl();
@@ -40988,17 +40988,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1__2__Impl"
-    // InternalOCLstdlib.g:13707:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:13709:1: rule__TupleTypeCS__Group_1__2__Impl : ( ')' ) ;
     public final void rule__TupleTypeCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13711:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:13712:1: ( ')' )
+            // InternalOCLstdlib.g:13713:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:13714:1: ( ')' )
             {
-            // InternalOCLstdlib.g:13712:1: ( ')' )
-            // InternalOCLstdlib.g:13713:1: ')'
+            // InternalOCLstdlib.g:13714:1: ( ')' )
+            // InternalOCLstdlib.g:13715:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());
@@ -41029,14 +41029,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0"
-    // InternalOCLstdlib.g:13732:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
+    // InternalOCLstdlib.g:13734:1: rule__TupleTypeCS__Group_1_1__0 : rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13736:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
-            // InternalOCLstdlib.g:13737:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
+            // InternalOCLstdlib.g:13738:1: ( rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1 )
+            // InternalOCLstdlib.g:13739:2: rule__TupleTypeCS__Group_1_1__0__Impl rule__TupleTypeCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__TupleTypeCS__Group_1_1__0__Impl();
@@ -41067,23 +41067,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__0__Impl"
-    // InternalOCLstdlib.g:13744:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
+    // InternalOCLstdlib.g:13746:1: rule__TupleTypeCS__Group_1_1__0__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13748:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
-            // InternalOCLstdlib.g:13749:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalOCLstdlib.g:13750:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) ) )
+            // InternalOCLstdlib.g:13751:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
             {
-            // InternalOCLstdlib.g:13749:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
-            // InternalOCLstdlib.g:13750:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalOCLstdlib.g:13751:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 ) )
+            // InternalOCLstdlib.g:13752:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_0());
             }
-            // InternalOCLstdlib.g:13751:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
-            // InternalOCLstdlib.g:13751:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
+            // InternalOCLstdlib.g:13753:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 )
+            // InternalOCLstdlib.g:13753:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_0();
@@ -41118,14 +41118,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1"
-    // InternalOCLstdlib.g:13761:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
+    // InternalOCLstdlib.g:13763:1: rule__TupleTypeCS__Group_1_1__1 : rule__TupleTypeCS__Group_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13765:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
-            // InternalOCLstdlib.g:13766:2: rule__TupleTypeCS__Group_1_1__1__Impl
+            // InternalOCLstdlib.g:13767:1: ( rule__TupleTypeCS__Group_1_1__1__Impl )
+            // InternalOCLstdlib.g:13768:2: rule__TupleTypeCS__Group_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1__1__Impl();
@@ -41151,22 +41151,22 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1__1__Impl"
-    // InternalOCLstdlib.g:13772:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
+    // InternalOCLstdlib.g:13774:1: rule__TupleTypeCS__Group_1_1__1__Impl : ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) ;
     public final void rule__TupleTypeCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13776:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
-            // InternalOCLstdlib.g:13777:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalOCLstdlib.g:13778:1: ( ( ( rule__TupleTypeCS__Group_1_1_1__0 )* ) )
+            // InternalOCLstdlib.g:13779:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
             {
-            // InternalOCLstdlib.g:13777:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
-            // InternalOCLstdlib.g:13778:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalOCLstdlib.g:13779:1: ( ( rule__TupleTypeCS__Group_1_1_1__0 )* )
+            // InternalOCLstdlib.g:13780:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getGroup_1_1_1());
             }
-            // InternalOCLstdlib.g:13779:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
+            // InternalOCLstdlib.g:13781:1: ( rule__TupleTypeCS__Group_1_1_1__0 )*
             loop122:
             do {
                 int alt122=2;
@@ -41179,7 +41179,7 @@
 
                 switch (alt122) {
             	case 1 :
-            	    // InternalOCLstdlib.g:13779:2: rule__TupleTypeCS__Group_1_1_1__0
+            	    // InternalOCLstdlib.g:13781:2: rule__TupleTypeCS__Group_1_1_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__TupleTypeCS__Group_1_1_1__0();
@@ -41220,14 +41220,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0"
-    // InternalOCLstdlib.g:13793:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
+    // InternalOCLstdlib.g:13795:1: rule__TupleTypeCS__Group_1_1_1__0 : rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 ;
     public final void rule__TupleTypeCS__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13797:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
-            // InternalOCLstdlib.g:13798:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
+            // InternalOCLstdlib.g:13799:1: ( rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1 )
+            // InternalOCLstdlib.g:13800:2: rule__TupleTypeCS__Group_1_1_1__0__Impl rule__TupleTypeCS__Group_1_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TupleTypeCS__Group_1_1_1__0__Impl();
@@ -41258,17 +41258,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__0__Impl"
-    // InternalOCLstdlib.g:13805:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:13807:1: rule__TupleTypeCS__Group_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13809:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:13810:1: ( ',' )
+            // InternalOCLstdlib.g:13811:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:13812:1: ( ',' )
             {
-            // InternalOCLstdlib.g:13810:1: ( ',' )
-            // InternalOCLstdlib.g:13811:1: ','
+            // InternalOCLstdlib.g:13812:1: ( ',' )
+            // InternalOCLstdlib.g:13813:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());
@@ -41299,14 +41299,14 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1"
-    // InternalOCLstdlib.g:13824:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
+    // InternalOCLstdlib.g:13826:1: rule__TupleTypeCS__Group_1_1_1__1 : rule__TupleTypeCS__Group_1_1_1__1__Impl ;
     public final void rule__TupleTypeCS__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13828:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
-            // InternalOCLstdlib.g:13829:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
+            // InternalOCLstdlib.g:13830:1: ( rule__TupleTypeCS__Group_1_1_1__1__Impl )
+            // InternalOCLstdlib.g:13831:2: rule__TupleTypeCS__Group_1_1_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__Group_1_1_1__1__Impl();
@@ -41332,23 +41332,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__Group_1_1_1__1__Impl"
-    // InternalOCLstdlib.g:13835:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:13837:1: rule__TupleTypeCS__Group_1_1_1__1__Impl : ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) ;
     public final void rule__TupleTypeCS__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13839:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
-            // InternalOCLstdlib.g:13840:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalOCLstdlib.g:13841:1: ( ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) ) )
+            // InternalOCLstdlib.g:13842:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:13840:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
-            // InternalOCLstdlib.g:13841:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalOCLstdlib.g:13842:1: ( ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 ) )
+            // InternalOCLstdlib.g:13843:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsAssignment_1_1_1_1());
             }
-            // InternalOCLstdlib.g:13842:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
-            // InternalOCLstdlib.g:13842:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
+            // InternalOCLstdlib.g:13844:1: ( rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 )
+            // InternalOCLstdlib.g:13844:2: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1();
@@ -41383,14 +41383,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:13856:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:13858:1: rule__CollectionLiteralExpCS__Group__0 : rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 ;
     public final void rule__CollectionLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13860:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:13861:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:13862:1: ( rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:13863:2: rule__CollectionLiteralExpCS__Group__0__Impl rule__CollectionLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__CollectionLiteralExpCS__Group__0__Impl();
@@ -41421,23 +41421,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:13868:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:13870:1: rule__CollectionLiteralExpCS__Group__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13872:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalOCLstdlib.g:13873:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLstdlib.g:13874:1: ( ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalOCLstdlib.g:13875:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:13873:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalOCLstdlib.g:13874:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLstdlib.g:13875:1: ( ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLstdlib.g:13876:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalOCLstdlib.g:13875:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalOCLstdlib.g:13875:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
+            // InternalOCLstdlib.g:13877:1: ( rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLstdlib.g:13877:2: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedTypeAssignment_0();
@@ -41472,14 +41472,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:13885:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
+    // InternalOCLstdlib.g:13887:1: rule__CollectionLiteralExpCS__Group__1 : rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 ;
     public final void rule__CollectionLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13889:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
-            // InternalOCLstdlib.g:13890:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
+            // InternalOCLstdlib.g:13891:1: ( rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2 )
+            // InternalOCLstdlib.g:13892:2: rule__CollectionLiteralExpCS__Group__1__Impl rule__CollectionLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CollectionLiteralExpCS__Group__1__Impl();
@@ -41510,17 +41510,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:13897:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:13899:1: rule__CollectionLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13901:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:13902:1: ( '{' )
+            // InternalOCLstdlib.g:13903:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:13904:1: ( '{' )
             {
-            // InternalOCLstdlib.g:13902:1: ( '{' )
-            // InternalOCLstdlib.g:13903:1: '{'
+            // InternalOCLstdlib.g:13904:1: ( '{' )
+            // InternalOCLstdlib.g:13905:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -41551,14 +41551,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2"
-    // InternalOCLstdlib.g:13916:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
+    // InternalOCLstdlib.g:13918:1: rule__CollectionLiteralExpCS__Group__2 : rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 ;
     public final void rule__CollectionLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13920:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
-            // InternalOCLstdlib.g:13921:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
+            // InternalOCLstdlib.g:13922:1: ( rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3 )
+            // InternalOCLstdlib.g:13923:2: rule__CollectionLiteralExpCS__Group__2__Impl rule__CollectionLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CollectionLiteralExpCS__Group__2__Impl();
@@ -41589,22 +41589,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:13928:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:13930:1: rule__CollectionLiteralExpCS__Group__2__Impl : ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__CollectionLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13932:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:13933:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:13934:1: ( ( ( rule__CollectionLiteralExpCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:13935:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:13933:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:13934:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalOCLstdlib.g:13935:1: ( ( rule__CollectionLiteralExpCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:13936:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:13935:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
+            // InternalOCLstdlib.g:13937:1: ( rule__CollectionLiteralExpCS__Group_2__0 )?
             int alt123=2;
             int LA123_0 = input.LA(1);
 
@@ -41613,7 +41613,7 @@
             }
             switch (alt123) {
                 case 1 :
-                    // InternalOCLstdlib.g:13935:2: rule__CollectionLiteralExpCS__Group_2__0
+                    // InternalOCLstdlib.g:13937:2: rule__CollectionLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralExpCS__Group_2__0();
@@ -41651,14 +41651,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3"
-    // InternalOCLstdlib.g:13945:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:13947:1: rule__CollectionLiteralExpCS__Group__3 : rule__CollectionLiteralExpCS__Group__3__Impl ;
     public final void rule__CollectionLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13949:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
-            // InternalOCLstdlib.g:13950:2: rule__CollectionLiteralExpCS__Group__3__Impl
+            // InternalOCLstdlib.g:13951:1: ( rule__CollectionLiteralExpCS__Group__3__Impl )
+            // InternalOCLstdlib.g:13952:2: rule__CollectionLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group__3__Impl();
@@ -41684,17 +41684,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:13956:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:13958:1: rule__CollectionLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13960:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:13961:1: ( '}' )
+            // InternalOCLstdlib.g:13962:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:13963:1: ( '}' )
             {
-            // InternalOCLstdlib.g:13961:1: ( '}' )
-            // InternalOCLstdlib.g:13962:1: '}'
+            // InternalOCLstdlib.g:13963:1: ( '}' )
+            // InternalOCLstdlib.g:13964:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -41725,14 +41725,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0"
-    // InternalOCLstdlib.g:13983:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
+    // InternalOCLstdlib.g:13985:1: rule__CollectionLiteralExpCS__Group_2__0 : rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13987:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
-            // InternalOCLstdlib.g:13988:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
+            // InternalOCLstdlib.g:13989:1: ( rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1 )
+            // InternalOCLstdlib.g:13990:2: rule__CollectionLiteralExpCS__Group_2__0__Impl rule__CollectionLiteralExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__CollectionLiteralExpCS__Group_2__0__Impl();
@@ -41763,23 +41763,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:13995:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLstdlib.g:13997:1: rule__CollectionLiteralExpCS__Group_2__0__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:13999:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLstdlib.g:14000:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:14001:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLstdlib.g:14002:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLstdlib.g:14000:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLstdlib.g:14001:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:14002:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:14003:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLstdlib.g:14002:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLstdlib.g:14002:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalOCLstdlib.g:14004:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:14004:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -41814,14 +41814,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1"
-    // InternalOCLstdlib.g:14012:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:14014:1: rule__CollectionLiteralExpCS__Group_2__1 : rule__CollectionLiteralExpCS__Group_2__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14016:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:14017:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:14018:1: ( rule__CollectionLiteralExpCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:14019:2: rule__CollectionLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2__1__Impl();
@@ -41847,22 +41847,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:14023:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalOCLstdlib.g:14025:1: rule__CollectionLiteralExpCS__Group_2__1__Impl : ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14027:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalOCLstdlib.g:14028:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:14029:1: ( ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalOCLstdlib.g:14030:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalOCLstdlib.g:14028:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
-            // InternalOCLstdlib.g:14029:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:14030:1: ( ( rule__CollectionLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:14031:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalOCLstdlib.g:14030:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:14032:1: ( rule__CollectionLiteralExpCS__Group_2_1__0 )*
             loop124:
             do {
                 int alt124=2;
@@ -41875,7 +41875,7 @@
 
                 switch (alt124) {
             	case 1 :
-            	    // InternalOCLstdlib.g:14030:2: rule__CollectionLiteralExpCS__Group_2_1__0
+            	    // InternalOCLstdlib.g:14032:2: rule__CollectionLiteralExpCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__CollectionLiteralExpCS__Group_2_1__0();
@@ -41916,14 +41916,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0"
-    // InternalOCLstdlib.g:14044:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
+    // InternalOCLstdlib.g:14046:1: rule__CollectionLiteralExpCS__Group_2_1__0 : rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14048:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
-            // InternalOCLstdlib.g:14049:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
+            // InternalOCLstdlib.g:14050:1: ( rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1 )
+            // InternalOCLstdlib.g:14051:2: rule__CollectionLiteralExpCS__Group_2_1__0__Impl rule__CollectionLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_67);
             rule__CollectionLiteralExpCS__Group_2_1__0__Impl();
@@ -41954,17 +41954,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__0__Impl"
-    // InternalOCLstdlib.g:14056:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:14058:1: rule__CollectionLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14060:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:14061:1: ( ',' )
+            // InternalOCLstdlib.g:14062:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:14063:1: ( ',' )
             {
-            // InternalOCLstdlib.g:14061:1: ( ',' )
-            // InternalOCLstdlib.g:14062:1: ','
+            // InternalOCLstdlib.g:14063:1: ( ',' )
+            // InternalOCLstdlib.g:14064:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -41995,14 +41995,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1"
-    // InternalOCLstdlib.g:14075:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalOCLstdlib.g:14077:1: rule__CollectionLiteralExpCS__Group_2_1__1 : rule__CollectionLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14079:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
-            // InternalOCLstdlib.g:14080:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
+            // InternalOCLstdlib.g:14081:1: ( rule__CollectionLiteralExpCS__Group_2_1__1__Impl )
+            // InternalOCLstdlib.g:14082:2: rule__CollectionLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__Group_2_1__1__Impl();
@@ -42028,23 +42028,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__Group_2_1__1__Impl"
-    // InternalOCLstdlib.g:14086:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:14088:1: rule__CollectionLiteralExpCS__Group_2_1__1__Impl : ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14090:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLstdlib.g:14091:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:14092:1: ( ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLstdlib.g:14093:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:14091:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLstdlib.g:14092:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:14093:1: ( ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:14094:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLstdlib.g:14093:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLstdlib.g:14093:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLstdlib.g:14095:1: ( rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:14095:2: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -42079,14 +42079,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0"
-    // InternalOCLstdlib.g:14107:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
+    // InternalOCLstdlib.g:14109:1: rule__CollectionLiteralPartCS__Group_0__0 : rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14111:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
-            // InternalOCLstdlib.g:14112:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
+            // InternalOCLstdlib.g:14113:1: ( rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1 )
+            // InternalOCLstdlib.g:14114:2: rule__CollectionLiteralPartCS__Group_0__0__Impl rule__CollectionLiteralPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__CollectionLiteralPartCS__Group_0__0__Impl();
@@ -42117,23 +42117,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:14119:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
+    // InternalOCLstdlib.g:14121:1: rule__CollectionLiteralPartCS__Group_0__0__Impl : ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14123:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
-            // InternalOCLstdlib.g:14124:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalOCLstdlib.g:14125:1: ( ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) ) )
+            // InternalOCLstdlib.g:14126:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
             {
-            // InternalOCLstdlib.g:14124:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
-            // InternalOCLstdlib.g:14125:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalOCLstdlib.g:14126:1: ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 ) )
+            // InternalOCLstdlib.g:14127:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionAssignment_0_0());
             }
-            // InternalOCLstdlib.g:14126:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
-            // InternalOCLstdlib.g:14126:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
+            // InternalOCLstdlib.g:14128:1: ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 )
+            // InternalOCLstdlib.g:14128:2: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0();
@@ -42168,14 +42168,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1"
-    // InternalOCLstdlib.g:14136:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
+    // InternalOCLstdlib.g:14138:1: rule__CollectionLiteralPartCS__Group_0__1 : rule__CollectionLiteralPartCS__Group_0__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14140:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
-            // InternalOCLstdlib.g:14141:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
+            // InternalOCLstdlib.g:14142:1: ( rule__CollectionLiteralPartCS__Group_0__1__Impl )
+            // InternalOCLstdlib.g:14143:2: rule__CollectionLiteralPartCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0__1__Impl();
@@ -42201,22 +42201,22 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:14147:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
+    // InternalOCLstdlib.g:14149:1: rule__CollectionLiteralPartCS__Group_0__1__Impl : ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) ;
     public final void rule__CollectionLiteralPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14151:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
-            // InternalOCLstdlib.g:14152:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalOCLstdlib.g:14153:1: ( ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? ) )
+            // InternalOCLstdlib.g:14154:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
             {
-            // InternalOCLstdlib.g:14152:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
-            // InternalOCLstdlib.g:14153:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalOCLstdlib.g:14154:1: ( ( rule__CollectionLiteralPartCS__Group_0_1__0 )? )
+            // InternalOCLstdlib.g:14155:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_0_1());
             }
-            // InternalOCLstdlib.g:14154:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
+            // InternalOCLstdlib.g:14156:1: ( rule__CollectionLiteralPartCS__Group_0_1__0 )?
             int alt125=2;
             int LA125_0 = input.LA(1);
 
@@ -42225,7 +42225,7 @@
             }
             switch (alt125) {
                 case 1 :
-                    // InternalOCLstdlib.g:14154:2: rule__CollectionLiteralPartCS__Group_0_1__0
+                    // InternalOCLstdlib.g:14156:2: rule__CollectionLiteralPartCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionLiteralPartCS__Group_0_1__0();
@@ -42263,14 +42263,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0"
-    // InternalOCLstdlib.g:14168:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
+    // InternalOCLstdlib.g:14170:1: rule__CollectionLiteralPartCS__Group_0_1__0 : rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14172:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
-            // InternalOCLstdlib.g:14173:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
+            // InternalOCLstdlib.g:14174:1: ( rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1 )
+            // InternalOCLstdlib.g:14175:2: rule__CollectionLiteralPartCS__Group_0_1__0__Impl rule__CollectionLiteralPartCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__CollectionLiteralPartCS__Group_0_1__0__Impl();
@@ -42301,17 +42301,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__0__Impl"
-    // InternalOCLstdlib.g:14180:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
+    // InternalOCLstdlib.g:14182:1: rule__CollectionLiteralPartCS__Group_0_1__0__Impl : ( '..' ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14184:1: ( ( '..' ) )
-            // InternalOCLstdlib.g:14185:1: ( '..' )
+            // InternalOCLstdlib.g:14186:1: ( ( '..' ) )
+            // InternalOCLstdlib.g:14187:1: ( '..' )
             {
-            // InternalOCLstdlib.g:14185:1: ( '..' )
-            // InternalOCLstdlib.g:14186:1: '..'
+            // InternalOCLstdlib.g:14187:1: ( '..' )
+            // InternalOCLstdlib.g:14188:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());
@@ -42342,14 +42342,14 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1"
-    // InternalOCLstdlib.g:14199:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
+    // InternalOCLstdlib.g:14201:1: rule__CollectionLiteralPartCS__Group_0_1__1 : rule__CollectionLiteralPartCS__Group_0_1__1__Impl ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14203:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
-            // InternalOCLstdlib.g:14204:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
+            // InternalOCLstdlib.g:14205:1: ( rule__CollectionLiteralPartCS__Group_0_1__1__Impl )
+            // InternalOCLstdlib.g:14206:2: rule__CollectionLiteralPartCS__Group_0_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__Group_0_1__1__Impl();
@@ -42375,23 +42375,23 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__Group_0_1__1__Impl"
-    // InternalOCLstdlib.g:14210:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
+    // InternalOCLstdlib.g:14212:1: rule__CollectionLiteralPartCS__Group_0_1__1__Impl : ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) ;
     public final void rule__CollectionLiteralPartCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14214:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
-            // InternalOCLstdlib.g:14215:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalOCLstdlib.g:14216:1: ( ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) ) )
+            // InternalOCLstdlib.g:14217:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
             {
-            // InternalOCLstdlib.g:14215:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
-            // InternalOCLstdlib.g:14216:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalOCLstdlib.g:14217:1: ( ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 ) )
+            // InternalOCLstdlib.g:14218:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionAssignment_0_1_1());
             }
-            // InternalOCLstdlib.g:14217:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
-            // InternalOCLstdlib.g:14217:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
+            // InternalOCLstdlib.g:14219:1: ( rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 )
+            // InternalOCLstdlib.g:14219:2: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1();
@@ -42426,14 +42426,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0"
-    // InternalOCLstdlib.g:14231:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
+    // InternalOCLstdlib.g:14233:1: rule__CollectionPatternCS__Group__0 : rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 ;
     public final void rule__CollectionPatternCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14235:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
-            // InternalOCLstdlib.g:14236:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
+            // InternalOCLstdlib.g:14237:1: ( rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1 )
+            // InternalOCLstdlib.g:14238:2: rule__CollectionPatternCS__Group__0__Impl rule__CollectionPatternCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__CollectionPatternCS__Group__0__Impl();
@@ -42464,23 +42464,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__0__Impl"
-    // InternalOCLstdlib.g:14243:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:14245:1: rule__CollectionPatternCS__Group__0__Impl : ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__CollectionPatternCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14247:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
-            // InternalOCLstdlib.g:14248:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLstdlib.g:14249:1: ( ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) ) )
+            // InternalOCLstdlib.g:14250:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:14248:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
-            // InternalOCLstdlib.g:14249:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalOCLstdlib.g:14250:1: ( ( rule__CollectionPatternCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLstdlib.g:14251:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalOCLstdlib.g:14250:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
-            // InternalOCLstdlib.g:14250:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
+            // InternalOCLstdlib.g:14252:1: ( rule__CollectionPatternCS__OwnedTypeAssignment_0 )
+            // InternalOCLstdlib.g:14252:2: rule__CollectionPatternCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedTypeAssignment_0();
@@ -42515,14 +42515,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1"
-    // InternalOCLstdlib.g:14260:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
+    // InternalOCLstdlib.g:14262:1: rule__CollectionPatternCS__Group__1 : rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 ;
     public final void rule__CollectionPatternCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14264:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
-            // InternalOCLstdlib.g:14265:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
+            // InternalOCLstdlib.g:14266:1: ( rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2 )
+            // InternalOCLstdlib.g:14267:2: rule__CollectionPatternCS__Group__1__Impl rule__CollectionPatternCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CollectionPatternCS__Group__1__Impl();
@@ -42553,17 +42553,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__1__Impl"
-    // InternalOCLstdlib.g:14272:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:14274:1: rule__CollectionPatternCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CollectionPatternCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14276:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:14277:1: ( '{' )
+            // InternalOCLstdlib.g:14278:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:14279:1: ( '{' )
             {
-            // InternalOCLstdlib.g:14277:1: ( '{' )
-            // InternalOCLstdlib.g:14278:1: '{'
+            // InternalOCLstdlib.g:14279:1: ( '{' )
+            // InternalOCLstdlib.g:14280:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());
@@ -42594,14 +42594,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2"
-    // InternalOCLstdlib.g:14291:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
+    // InternalOCLstdlib.g:14293:1: rule__CollectionPatternCS__Group__2 : rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 ;
     public final void rule__CollectionPatternCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14295:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
-            // InternalOCLstdlib.g:14296:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
+            // InternalOCLstdlib.g:14297:1: ( rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3 )
+            // InternalOCLstdlib.g:14298:2: rule__CollectionPatternCS__Group__2__Impl rule__CollectionPatternCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_66);
             rule__CollectionPatternCS__Group__2__Impl();
@@ -42632,22 +42632,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__2__Impl"
-    // InternalOCLstdlib.g:14303:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:14305:1: rule__CollectionPatternCS__Group__2__Impl : ( ( rule__CollectionPatternCS__Group_2__0 )? ) ;
     public final void rule__CollectionPatternCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14307:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:14308:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:14309:1: ( ( ( rule__CollectionPatternCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:14310:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:14308:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:14309:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalOCLstdlib.g:14310:1: ( ( rule__CollectionPatternCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:14311:1: ( rule__CollectionPatternCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:14310:1: ( rule__CollectionPatternCS__Group_2__0 )?
+            // InternalOCLstdlib.g:14312:1: ( rule__CollectionPatternCS__Group_2__0 )?
             int alt126=2;
             int LA126_0 = input.LA(1);
 
@@ -42656,7 +42656,7 @@
             }
             switch (alt126) {
                 case 1 :
-                    // InternalOCLstdlib.g:14310:2: rule__CollectionPatternCS__Group_2__0
+                    // InternalOCLstdlib.g:14312:2: rule__CollectionPatternCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CollectionPatternCS__Group_2__0();
@@ -42694,14 +42694,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3"
-    // InternalOCLstdlib.g:14320:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:14322:1: rule__CollectionPatternCS__Group__3 : rule__CollectionPatternCS__Group__3__Impl ;
     public final void rule__CollectionPatternCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14324:1: ( rule__CollectionPatternCS__Group__3__Impl )
-            // InternalOCLstdlib.g:14325:2: rule__CollectionPatternCS__Group__3__Impl
+            // InternalOCLstdlib.g:14326:1: ( rule__CollectionPatternCS__Group__3__Impl )
+            // InternalOCLstdlib.g:14327:2: rule__CollectionPatternCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group__3__Impl();
@@ -42727,17 +42727,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group__3__Impl"
-    // InternalOCLstdlib.g:14331:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:14333:1: rule__CollectionPatternCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CollectionPatternCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14335:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:14336:1: ( '}' )
+            // InternalOCLstdlib.g:14337:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:14338:1: ( '}' )
             {
-            // InternalOCLstdlib.g:14336:1: ( '}' )
-            // InternalOCLstdlib.g:14337:1: '}'
+            // InternalOCLstdlib.g:14338:1: ( '}' )
+            // InternalOCLstdlib.g:14339:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());
@@ -42768,14 +42768,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0"
-    // InternalOCLstdlib.g:14358:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
+    // InternalOCLstdlib.g:14360:1: rule__CollectionPatternCS__Group_2__0 : rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 ;
     public final void rule__CollectionPatternCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14362:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
-            // InternalOCLstdlib.g:14363:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
+            // InternalOCLstdlib.g:14364:1: ( rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1 )
+            // InternalOCLstdlib.g:14365:2: rule__CollectionPatternCS__Group_2__0__Impl rule__CollectionPatternCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_69);
             rule__CollectionPatternCS__Group_2__0__Impl();
@@ -42806,23 +42806,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:14370:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLstdlib.g:14372:1: rule__CollectionPatternCS__Group_2__0__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14374:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLstdlib.g:14375:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:14376:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLstdlib.g:14377:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLstdlib.g:14375:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLstdlib.g:14376:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:14377:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:14378:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLstdlib.g:14377:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLstdlib.g:14377:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
+            // InternalOCLstdlib.g:14379:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:14379:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_0();
@@ -42857,14 +42857,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1"
-    // InternalOCLstdlib.g:14387:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
+    // InternalOCLstdlib.g:14389:1: rule__CollectionPatternCS__Group_2__1 : rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 ;
     public final void rule__CollectionPatternCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14391:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
-            // InternalOCLstdlib.g:14392:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
+            // InternalOCLstdlib.g:14393:1: ( rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2 )
+            // InternalOCLstdlib.g:14394:2: rule__CollectionPatternCS__Group_2__1__Impl rule__CollectionPatternCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_69);
             rule__CollectionPatternCS__Group_2__1__Impl();
@@ -42895,22 +42895,22 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:14399:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
+    // InternalOCLstdlib.g:14401:1: rule__CollectionPatternCS__Group_2__1__Impl : ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) ;
     public final void rule__CollectionPatternCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14403:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
-            // InternalOCLstdlib.g:14404:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:14405:1: ( ( ( rule__CollectionPatternCS__Group_2_1__0 )* ) )
+            // InternalOCLstdlib.g:14406:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
             {
-            // InternalOCLstdlib.g:14404:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
-            // InternalOCLstdlib.g:14405:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:14406:1: ( ( rule__CollectionPatternCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:14407:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_1());
             }
-            // InternalOCLstdlib.g:14406:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:14408:1: ( rule__CollectionPatternCS__Group_2_1__0 )*
             loop127:
             do {
                 int alt127=2;
@@ -42923,7 +42923,7 @@
 
                 switch (alt127) {
             	case 1 :
-            	    // InternalOCLstdlib.g:14406:2: rule__CollectionPatternCS__Group_2_1__0
+            	    // InternalOCLstdlib.g:14408:2: rule__CollectionPatternCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__CollectionPatternCS__Group_2_1__0();
@@ -42964,14 +42964,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2"
-    // InternalOCLstdlib.g:14416:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
+    // InternalOCLstdlib.g:14418:1: rule__CollectionPatternCS__Group_2__2 : rule__CollectionPatternCS__Group_2__2__Impl ;
     public final void rule__CollectionPatternCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14420:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
-            // InternalOCLstdlib.g:14421:2: rule__CollectionPatternCS__Group_2__2__Impl
+            // InternalOCLstdlib.g:14422:1: ( rule__CollectionPatternCS__Group_2__2__Impl )
+            // InternalOCLstdlib.g:14423:2: rule__CollectionPatternCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2__2__Impl();
@@ -42997,23 +42997,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2__2__Impl"
-    // InternalOCLstdlib.g:14427:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
+    // InternalOCLstdlib.g:14429:1: rule__CollectionPatternCS__Group_2__2__Impl : ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) ;
     public final void rule__CollectionPatternCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14431:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
-            // InternalOCLstdlib.g:14432:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalOCLstdlib.g:14433:1: ( ( ( rule__CollectionPatternCS__Group_2_2__0 ) ) )
+            // InternalOCLstdlib.g:14434:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
             {
-            // InternalOCLstdlib.g:14432:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
-            // InternalOCLstdlib.g:14433:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalOCLstdlib.g:14434:1: ( ( rule__CollectionPatternCS__Group_2_2__0 ) )
+            // InternalOCLstdlib.g:14435:1: ( rule__CollectionPatternCS__Group_2_2__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getGroup_2_2());
             }
-            // InternalOCLstdlib.g:14434:1: ( rule__CollectionPatternCS__Group_2_2__0 )
-            // InternalOCLstdlib.g:14434:2: rule__CollectionPatternCS__Group_2_2__0
+            // InternalOCLstdlib.g:14436:1: ( rule__CollectionPatternCS__Group_2_2__0 )
+            // InternalOCLstdlib.g:14436:2: rule__CollectionPatternCS__Group_2_2__0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__0();
@@ -43048,14 +43048,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0"
-    // InternalOCLstdlib.g:14450:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
+    // InternalOCLstdlib.g:14452:1: rule__CollectionPatternCS__Group_2_1__0 : rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 ;
     public final void rule__CollectionPatternCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14454:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
-            // InternalOCLstdlib.g:14455:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
+            // InternalOCLstdlib.g:14456:1: ( rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1 )
+            // InternalOCLstdlib.g:14457:2: rule__CollectionPatternCS__Group_2_1__0__Impl rule__CollectionPatternCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_67);
             rule__CollectionPatternCS__Group_2_1__0__Impl();
@@ -43086,17 +43086,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__0__Impl"
-    // InternalOCLstdlib.g:14462:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:14464:1: rule__CollectionPatternCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CollectionPatternCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14466:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:14467:1: ( ',' )
+            // InternalOCLstdlib.g:14468:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:14469:1: ( ',' )
             {
-            // InternalOCLstdlib.g:14467:1: ( ',' )
-            // InternalOCLstdlib.g:14468:1: ','
+            // InternalOCLstdlib.g:14469:1: ( ',' )
+            // InternalOCLstdlib.g:14470:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());
@@ -43127,14 +43127,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1"
-    // InternalOCLstdlib.g:14481:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
+    // InternalOCLstdlib.g:14483:1: rule__CollectionPatternCS__Group_2_1__1 : rule__CollectionPatternCS__Group_2_1__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14485:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
-            // InternalOCLstdlib.g:14486:2: rule__CollectionPatternCS__Group_2_1__1__Impl
+            // InternalOCLstdlib.g:14487:1: ( rule__CollectionPatternCS__Group_2_1__1__Impl )
+            // InternalOCLstdlib.g:14488:2: rule__CollectionPatternCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_1__1__Impl();
@@ -43160,23 +43160,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_1__1__Impl"
-    // InternalOCLstdlib.g:14492:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:14494:1: rule__CollectionPatternCS__Group_2_1__1__Impl : ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14496:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLstdlib.g:14497:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:14498:1: ( ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLstdlib.g:14499:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:14497:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLstdlib.g:14498:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:14499:1: ( ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:14500:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLstdlib.g:14499:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLstdlib.g:14499:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLstdlib.g:14501:1: ( rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:14501:2: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1();
@@ -43211,14 +43211,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0"
-    // InternalOCLstdlib.g:14513:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
+    // InternalOCLstdlib.g:14515:1: rule__CollectionPatternCS__Group_2_2__0 : rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 ;
     public final void rule__CollectionPatternCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14517:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
-            // InternalOCLstdlib.g:14518:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
+            // InternalOCLstdlib.g:14519:1: ( rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1 )
+            // InternalOCLstdlib.g:14520:2: rule__CollectionPatternCS__Group_2_2__0__Impl rule__CollectionPatternCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__CollectionPatternCS__Group_2_2__0__Impl();
@@ -43249,17 +43249,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__0__Impl"
-    // InternalOCLstdlib.g:14525:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
+    // InternalOCLstdlib.g:14527:1: rule__CollectionPatternCS__Group_2_2__0__Impl : ( '++' ) ;
     public final void rule__CollectionPatternCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14529:1: ( ( '++' ) )
-            // InternalOCLstdlib.g:14530:1: ( '++' )
+            // InternalOCLstdlib.g:14531:1: ( ( '++' ) )
+            // InternalOCLstdlib.g:14532:1: ( '++' )
             {
-            // InternalOCLstdlib.g:14530:1: ( '++' )
-            // InternalOCLstdlib.g:14531:1: '++'
+            // InternalOCLstdlib.g:14532:1: ( '++' )
+            // InternalOCLstdlib.g:14533:1: '++'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());
@@ -43290,14 +43290,14 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1"
-    // InternalOCLstdlib.g:14544:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
+    // InternalOCLstdlib.g:14546:1: rule__CollectionPatternCS__Group_2_2__1 : rule__CollectionPatternCS__Group_2_2__1__Impl ;
     public final void rule__CollectionPatternCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14548:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
-            // InternalOCLstdlib.g:14549:2: rule__CollectionPatternCS__Group_2_2__1__Impl
+            // InternalOCLstdlib.g:14550:1: ( rule__CollectionPatternCS__Group_2_2__1__Impl )
+            // InternalOCLstdlib.g:14551:2: rule__CollectionPatternCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__Group_2_2__1__Impl();
@@ -43323,23 +43323,23 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__Group_2_2__1__Impl"
-    // InternalOCLstdlib.g:14555:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
+    // InternalOCLstdlib.g:14557:1: rule__CollectionPatternCS__Group_2_2__1__Impl : ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) ;
     public final void rule__CollectionPatternCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14559:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
-            // InternalOCLstdlib.g:14560:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:14561:1: ( ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) ) )
+            // InternalOCLstdlib.g:14562:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
             {
-            // InternalOCLstdlib.g:14560:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
-            // InternalOCLstdlib.g:14561:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalOCLstdlib.g:14562:1: ( ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:14563:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameAssignment_2_2_1());
             }
-            // InternalOCLstdlib.g:14562:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
-            // InternalOCLstdlib.g:14562:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
+            // InternalOCLstdlib.g:14564:1: ( rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 )
+            // InternalOCLstdlib.g:14564:2: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1();
@@ -43374,14 +43374,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0"
-    // InternalOCLstdlib.g:14576:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
+    // InternalOCLstdlib.g:14578:1: rule__ShadowPartCS__Group_0__0 : rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 ;
     public final void rule__ShadowPartCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14580:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
-            // InternalOCLstdlib.g:14581:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
+            // InternalOCLstdlib.g:14582:1: ( rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1 )
+            // InternalOCLstdlib.g:14583:2: rule__ShadowPartCS__Group_0__0__Impl rule__ShadowPartCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__ShadowPartCS__Group_0__0__Impl();
@@ -43412,23 +43412,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:14588:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
+    // InternalOCLstdlib.g:14590:1: rule__ShadowPartCS__Group_0__0__Impl : ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) ;
     public final void rule__ShadowPartCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14592:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
-            // InternalOCLstdlib.g:14593:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalOCLstdlib.g:14594:1: ( ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) ) )
+            // InternalOCLstdlib.g:14595:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
             {
-            // InternalOCLstdlib.g:14593:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
-            // InternalOCLstdlib.g:14594:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalOCLstdlib.g:14595:1: ( ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 ) )
+            // InternalOCLstdlib.g:14596:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyAssignment_0_0());
             }
-            // InternalOCLstdlib.g:14595:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
-            // InternalOCLstdlib.g:14595:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
+            // InternalOCLstdlib.g:14597:1: ( rule__ShadowPartCS__ReferredPropertyAssignment_0_0 )
+            // InternalOCLstdlib.g:14597:2: rule__ShadowPartCS__ReferredPropertyAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__ReferredPropertyAssignment_0_0();
@@ -43463,14 +43463,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1"
-    // InternalOCLstdlib.g:14605:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
+    // InternalOCLstdlib.g:14607:1: rule__ShadowPartCS__Group_0__1 : rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 ;
     public final void rule__ShadowPartCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14609:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
-            // InternalOCLstdlib.g:14610:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
+            // InternalOCLstdlib.g:14611:1: ( rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2 )
+            // InternalOCLstdlib.g:14612:2: rule__ShadowPartCS__Group_0__1__Impl rule__ShadowPartCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_67);
             rule__ShadowPartCS__Group_0__1__Impl();
@@ -43501,17 +43501,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:14617:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:14619:1: rule__ShadowPartCS__Group_0__1__Impl : ( '=' ) ;
     public final void rule__ShadowPartCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14621:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:14622:1: ( '=' )
+            // InternalOCLstdlib.g:14623:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:14624:1: ( '=' )
             {
-            // InternalOCLstdlib.g:14622:1: ( '=' )
-            // InternalOCLstdlib.g:14623:1: '='
+            // InternalOCLstdlib.g:14624:1: ( '=' )
+            // InternalOCLstdlib.g:14625:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());
@@ -43542,14 +43542,14 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2"
-    // InternalOCLstdlib.g:14636:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
+    // InternalOCLstdlib.g:14638:1: rule__ShadowPartCS__Group_0__2 : rule__ShadowPartCS__Group_0__2__Impl ;
     public final void rule__ShadowPartCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14640:1: ( rule__ShadowPartCS__Group_0__2__Impl )
-            // InternalOCLstdlib.g:14641:2: rule__ShadowPartCS__Group_0__2__Impl
+            // InternalOCLstdlib.g:14642:1: ( rule__ShadowPartCS__Group_0__2__Impl )
+            // InternalOCLstdlib.g:14643:2: rule__ShadowPartCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__Group_0__2__Impl();
@@ -43575,23 +43575,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__Group_0__2__Impl"
-    // InternalOCLstdlib.g:14647:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
+    // InternalOCLstdlib.g:14649:1: rule__ShadowPartCS__Group_0__2__Impl : ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) ;
     public final void rule__ShadowPartCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14651:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
-            // InternalOCLstdlib.g:14652:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalOCLstdlib.g:14653:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) ) )
+            // InternalOCLstdlib.g:14654:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
             {
-            // InternalOCLstdlib.g:14652:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
-            // InternalOCLstdlib.g:14653:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalOCLstdlib.g:14654:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 ) )
+            // InternalOCLstdlib.g:14655:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAssignment_0_2());
             }
-            // InternalOCLstdlib.g:14654:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
-            // InternalOCLstdlib.g:14654:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
+            // InternalOCLstdlib.g:14656:1: ( rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 )
+            // InternalOCLstdlib.g:14656:2: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2();
@@ -43626,14 +43626,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0"
-    // InternalOCLstdlib.g:14670:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
+    // InternalOCLstdlib.g:14672:1: rule__PatternExpCS__Group__0 : rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 ;
     public final void rule__PatternExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14674:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
-            // InternalOCLstdlib.g:14675:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
+            // InternalOCLstdlib.g:14676:1: ( rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1 )
+            // InternalOCLstdlib.g:14677:2: rule__PatternExpCS__Group__0__Impl rule__PatternExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_67);
             rule__PatternExpCS__Group__0__Impl();
@@ -43664,22 +43664,22 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:14682:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
+    // InternalOCLstdlib.g:14684:1: rule__PatternExpCS__Group__0__Impl : ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) ;
     public final void rule__PatternExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14686:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
-            // InternalOCLstdlib.g:14687:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalOCLstdlib.g:14688:1: ( ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? ) )
+            // InternalOCLstdlib.g:14689:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
             {
-            // InternalOCLstdlib.g:14687:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
-            // InternalOCLstdlib.g:14688:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalOCLstdlib.g:14689:1: ( ( rule__PatternExpCS__PatternVariableNameAssignment_0 )? )
+            // InternalOCLstdlib.g:14690:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameAssignment_0());
             }
-            // InternalOCLstdlib.g:14689:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
+            // InternalOCLstdlib.g:14691:1: ( rule__PatternExpCS__PatternVariableNameAssignment_0 )?
             int alt128=2;
             int LA128_0 = input.LA(1);
 
@@ -43688,7 +43688,7 @@
             }
             switch (alt128) {
                 case 1 :
-                    // InternalOCLstdlib.g:14689:2: rule__PatternExpCS__PatternVariableNameAssignment_0
+                    // InternalOCLstdlib.g:14691:2: rule__PatternExpCS__PatternVariableNameAssignment_0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__PatternExpCS__PatternVariableNameAssignment_0();
@@ -43726,14 +43726,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1"
-    // InternalOCLstdlib.g:14699:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
+    // InternalOCLstdlib.g:14701:1: rule__PatternExpCS__Group__1 : rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 ;
     public final void rule__PatternExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14703:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
-            // InternalOCLstdlib.g:14704:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
+            // InternalOCLstdlib.g:14705:1: ( rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2 )
+            // InternalOCLstdlib.g:14706:2: rule__PatternExpCS__Group__1__Impl rule__PatternExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PatternExpCS__Group__1__Impl();
@@ -43764,17 +43764,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:14711:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:14713:1: rule__PatternExpCS__Group__1__Impl : ( ':' ) ;
     public final void rule__PatternExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14715:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:14716:1: ( ':' )
+            // InternalOCLstdlib.g:14717:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:14718:1: ( ':' )
             {
-            // InternalOCLstdlib.g:14716:1: ( ':' )
-            // InternalOCLstdlib.g:14717:1: ':'
+            // InternalOCLstdlib.g:14718:1: ( ':' )
+            // InternalOCLstdlib.g:14719:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getColonKeyword_1());
@@ -43805,14 +43805,14 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2"
-    // InternalOCLstdlib.g:14730:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:14732:1: rule__PatternExpCS__Group__2 : rule__PatternExpCS__Group__2__Impl ;
     public final void rule__PatternExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14734:1: ( rule__PatternExpCS__Group__2__Impl )
-            // InternalOCLstdlib.g:14735:2: rule__PatternExpCS__Group__2__Impl
+            // InternalOCLstdlib.g:14736:1: ( rule__PatternExpCS__Group__2__Impl )
+            // InternalOCLstdlib.g:14737:2: rule__PatternExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__Group__2__Impl();
@@ -43838,23 +43838,23 @@
 
 
     // $ANTLR start "rule__PatternExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:14741:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:14743:1: rule__PatternExpCS__Group__2__Impl : ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) ;
     public final void rule__PatternExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14745:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
-            // InternalOCLstdlib.g:14746:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:14747:1: ( ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) ) )
+            // InternalOCLstdlib.g:14748:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:14746:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
-            // InternalOCLstdlib.g:14747:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalOCLstdlib.g:14748:1: ( ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 ) )
+            // InternalOCLstdlib.g:14749:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeAssignment_2());
             }
-            // InternalOCLstdlib.g:14748:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
-            // InternalOCLstdlib.g:14748:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
+            // InternalOCLstdlib.g:14750:1: ( rule__PatternExpCS__OwnedPatternTypeAssignment_2 )
+            // InternalOCLstdlib.g:14750:2: rule__PatternExpCS__OwnedPatternTypeAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PatternExpCS__OwnedPatternTypeAssignment_2();
@@ -43889,14 +43889,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:14764:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:14766:1: rule__LambdaLiteralExpCS__Group__0 : rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 ;
     public final void rule__LambdaLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14768:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:14769:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:14770:1: ( rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:14771:2: rule__LambdaLiteralExpCS__Group__0__Impl rule__LambdaLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__LambdaLiteralExpCS__Group__0__Impl();
@@ -43927,17 +43927,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:14776:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
+    // InternalOCLstdlib.g:14778:1: rule__LambdaLiteralExpCS__Group__0__Impl : ( 'Lambda' ) ;
     public final void rule__LambdaLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14780:1: ( ( 'Lambda' ) )
-            // InternalOCLstdlib.g:14781:1: ( 'Lambda' )
+            // InternalOCLstdlib.g:14782:1: ( ( 'Lambda' ) )
+            // InternalOCLstdlib.g:14783:1: ( 'Lambda' )
             {
-            // InternalOCLstdlib.g:14781:1: ( 'Lambda' )
-            // InternalOCLstdlib.g:14782:1: 'Lambda'
+            // InternalOCLstdlib.g:14783:1: ( 'Lambda' )
+            // InternalOCLstdlib.g:14784:1: 'Lambda'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());
@@ -43968,14 +43968,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:14795:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
+    // InternalOCLstdlib.g:14797:1: rule__LambdaLiteralExpCS__Group__1 : rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 ;
     public final void rule__LambdaLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14799:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
-            // InternalOCLstdlib.g:14800:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
+            // InternalOCLstdlib.g:14801:1: ( rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2 )
+            // InternalOCLstdlib.g:14802:2: rule__LambdaLiteralExpCS__Group__1__Impl rule__LambdaLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__LambdaLiteralExpCS__Group__1__Impl();
@@ -44006,17 +44006,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:14807:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:14809:1: rule__LambdaLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__LambdaLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14811:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:14812:1: ( '{' )
+            // InternalOCLstdlib.g:14813:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:14814:1: ( '{' )
             {
-            // InternalOCLstdlib.g:14812:1: ( '{' )
-            // InternalOCLstdlib.g:14813:1: '{'
+            // InternalOCLstdlib.g:14814:1: ( '{' )
+            // InternalOCLstdlib.g:14815:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -44047,14 +44047,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2"
-    // InternalOCLstdlib.g:14826:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
+    // InternalOCLstdlib.g:14828:1: rule__LambdaLiteralExpCS__Group__2 : rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 ;
     public final void rule__LambdaLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14830:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
-            // InternalOCLstdlib.g:14831:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
+            // InternalOCLstdlib.g:14832:1: ( rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3 )
+            // InternalOCLstdlib.g:14833:2: rule__LambdaLiteralExpCS__Group__2__Impl rule__LambdaLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__LambdaLiteralExpCS__Group__2__Impl();
@@ -44085,23 +44085,23 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:14838:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:14840:1: rule__LambdaLiteralExpCS__Group__2__Impl : ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) ;
     public final void rule__LambdaLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14842:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
-            // InternalOCLstdlib.g:14843:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalOCLstdlib.g:14844:1: ( ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) ) )
+            // InternalOCLstdlib.g:14845:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:14843:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
-            // InternalOCLstdlib.g:14844:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalOCLstdlib.g:14845:1: ( ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 ) )
+            // InternalOCLstdlib.g:14846:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSAssignment_2());
             }
-            // InternalOCLstdlib.g:14845:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
-            // InternalOCLstdlib.g:14845:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
+            // InternalOCLstdlib.g:14847:1: ( rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 )
+            // InternalOCLstdlib.g:14847:2: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2();
@@ -44136,14 +44136,14 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3"
-    // InternalOCLstdlib.g:14855:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:14857:1: rule__LambdaLiteralExpCS__Group__3 : rule__LambdaLiteralExpCS__Group__3__Impl ;
     public final void rule__LambdaLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14859:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
-            // InternalOCLstdlib.g:14860:2: rule__LambdaLiteralExpCS__Group__3__Impl
+            // InternalOCLstdlib.g:14861:1: ( rule__LambdaLiteralExpCS__Group__3__Impl )
+            // InternalOCLstdlib.g:14862:2: rule__LambdaLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LambdaLiteralExpCS__Group__3__Impl();
@@ -44169,17 +44169,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:14866:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:14868:1: rule__LambdaLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__LambdaLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14870:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:14871:1: ( '}' )
+            // InternalOCLstdlib.g:14872:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:14873:1: ( '}' )
             {
-            // InternalOCLstdlib.g:14871:1: ( '}' )
-            // InternalOCLstdlib.g:14872:1: '}'
+            // InternalOCLstdlib.g:14873:1: ( '}' )
+            // InternalOCLstdlib.g:14874:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -44210,14 +44210,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:14893:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:14895:1: rule__MapLiteralExpCS__Group__0 : rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 ;
     public final void rule__MapLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14897:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:14898:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:14899:1: ( rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:14900:2: rule__MapLiteralExpCS__Group__0__Impl rule__MapLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__MapLiteralExpCS__Group__0__Impl();
@@ -44248,23 +44248,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:14905:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:14907:1: rule__MapLiteralExpCS__Group__0__Impl : ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14909:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
-            // InternalOCLstdlib.g:14910:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLstdlib.g:14911:1: ( ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) ) )
+            // InternalOCLstdlib.g:14912:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:14910:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
-            // InternalOCLstdlib.g:14911:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLstdlib.g:14912:1: ( ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 ) )
+            // InternalOCLstdlib.g:14913:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeAssignment_0());
             }
-            // InternalOCLstdlib.g:14912:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
-            // InternalOCLstdlib.g:14912:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
+            // InternalOCLstdlib.g:14914:1: ( rule__MapLiteralExpCS__OwnedTypeAssignment_0 )
+            // InternalOCLstdlib.g:14914:2: rule__MapLiteralExpCS__OwnedTypeAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedTypeAssignment_0();
@@ -44299,14 +44299,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:14922:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
+    // InternalOCLstdlib.g:14924:1: rule__MapLiteralExpCS__Group__1 : rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 ;
     public final void rule__MapLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14926:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
-            // InternalOCLstdlib.g:14927:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
+            // InternalOCLstdlib.g:14928:1: ( rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2 )
+            // InternalOCLstdlib.g:14929:2: rule__MapLiteralExpCS__Group__1__Impl rule__MapLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_70);
             rule__MapLiteralExpCS__Group__1__Impl();
@@ -44337,17 +44337,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:14934:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:14936:1: rule__MapLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__MapLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14938:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:14939:1: ( '{' )
+            // InternalOCLstdlib.g:14940:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:14941:1: ( '{' )
             {
-            // InternalOCLstdlib.g:14939:1: ( '{' )
-            // InternalOCLstdlib.g:14940:1: '{'
+            // InternalOCLstdlib.g:14941:1: ( '{' )
+            // InternalOCLstdlib.g:14942:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -44378,14 +44378,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2"
-    // InternalOCLstdlib.g:14953:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
+    // InternalOCLstdlib.g:14955:1: rule__MapLiteralExpCS__Group__2 : rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 ;
     public final void rule__MapLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14957:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
-            // InternalOCLstdlib.g:14958:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
+            // InternalOCLstdlib.g:14959:1: ( rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3 )
+            // InternalOCLstdlib.g:14960:2: rule__MapLiteralExpCS__Group__2__Impl rule__MapLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_70);
             rule__MapLiteralExpCS__Group__2__Impl();
@@ -44416,22 +44416,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:14965:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:14967:1: rule__MapLiteralExpCS__Group__2__Impl : ( ( rule__MapLiteralExpCS__Group_2__0 )? ) ;
     public final void rule__MapLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14969:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:14970:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:14971:1: ( ( ( rule__MapLiteralExpCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:14972:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:14970:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:14971:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalOCLstdlib.g:14972:1: ( ( rule__MapLiteralExpCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:14973:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:14972:1: ( rule__MapLiteralExpCS__Group_2__0 )?
+            // InternalOCLstdlib.g:14974:1: ( rule__MapLiteralExpCS__Group_2__0 )?
             int alt129=2;
             int LA129_0 = input.LA(1);
 
@@ -44440,7 +44440,7 @@
             }
             switch (alt129) {
                 case 1 :
-                    // InternalOCLstdlib.g:14972:2: rule__MapLiteralExpCS__Group_2__0
+                    // InternalOCLstdlib.g:14974:2: rule__MapLiteralExpCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MapLiteralExpCS__Group_2__0();
@@ -44478,14 +44478,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3"
-    // InternalOCLstdlib.g:14982:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:14984:1: rule__MapLiteralExpCS__Group__3 : rule__MapLiteralExpCS__Group__3__Impl ;
     public final void rule__MapLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14986:1: ( rule__MapLiteralExpCS__Group__3__Impl )
-            // InternalOCLstdlib.g:14987:2: rule__MapLiteralExpCS__Group__3__Impl
+            // InternalOCLstdlib.g:14988:1: ( rule__MapLiteralExpCS__Group__3__Impl )
+            // InternalOCLstdlib.g:14989:2: rule__MapLiteralExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group__3__Impl();
@@ -44511,17 +44511,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:14993:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:14995:1: rule__MapLiteralExpCS__Group__3__Impl : ( '}' ) ;
     public final void rule__MapLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:14997:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:14998:1: ( '}' )
+            // InternalOCLstdlib.g:14999:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:15000:1: ( '}' )
             {
-            // InternalOCLstdlib.g:14998:1: ( '}' )
-            // InternalOCLstdlib.g:14999:1: '}'
+            // InternalOCLstdlib.g:15000:1: ( '}' )
+            // InternalOCLstdlib.g:15001:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());
@@ -44552,14 +44552,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0"
-    // InternalOCLstdlib.g:15020:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
+    // InternalOCLstdlib.g:15022:1: rule__MapLiteralExpCS__Group_2__0 : rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 ;
     public final void rule__MapLiteralExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15024:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
-            // InternalOCLstdlib.g:15025:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
+            // InternalOCLstdlib.g:15026:1: ( rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1 )
+            // InternalOCLstdlib.g:15027:2: rule__MapLiteralExpCS__Group_2__0__Impl rule__MapLiteralExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__MapLiteralExpCS__Group_2__0__Impl();
@@ -44590,23 +44590,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:15032:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLstdlib.g:15034:1: rule__MapLiteralExpCS__Group_2__0__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15036:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLstdlib.g:15037:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:15038:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLstdlib.g:15039:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLstdlib.g:15037:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLstdlib.g:15038:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:15039:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:15040:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLstdlib.g:15039:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLstdlib.g:15039:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
+            // InternalOCLstdlib.g:15041:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:15041:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_0();
@@ -44641,14 +44641,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1"
-    // InternalOCLstdlib.g:15049:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:15051:1: rule__MapLiteralExpCS__Group_2__1 : rule__MapLiteralExpCS__Group_2__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15053:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:15054:2: rule__MapLiteralExpCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:15055:1: ( rule__MapLiteralExpCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:15056:2: rule__MapLiteralExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2__1__Impl();
@@ -44674,22 +44674,22 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:15060:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
+    // InternalOCLstdlib.g:15062:1: rule__MapLiteralExpCS__Group_2__1__Impl : ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) ;
     public final void rule__MapLiteralExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15064:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
-            // InternalOCLstdlib.g:15065:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:15066:1: ( ( ( rule__MapLiteralExpCS__Group_2_1__0 )* ) )
+            // InternalOCLstdlib.g:15067:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
             {
-            // InternalOCLstdlib.g:15065:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
-            // InternalOCLstdlib.g:15066:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:15067:1: ( ( rule__MapLiteralExpCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:15068:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getGroup_2_1());
             }
-            // InternalOCLstdlib.g:15067:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:15069:1: ( rule__MapLiteralExpCS__Group_2_1__0 )*
             loop130:
             do {
                 int alt130=2;
@@ -44702,7 +44702,7 @@
 
                 switch (alt130) {
             	case 1 :
-            	    // InternalOCLstdlib.g:15067:2: rule__MapLiteralExpCS__Group_2_1__0
+            	    // InternalOCLstdlib.g:15069:2: rule__MapLiteralExpCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__MapLiteralExpCS__Group_2_1__0();
@@ -44743,14 +44743,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0"
-    // InternalOCLstdlib.g:15081:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
+    // InternalOCLstdlib.g:15083:1: rule__MapLiteralExpCS__Group_2_1__0 : rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 ;
     public final void rule__MapLiteralExpCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15085:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
-            // InternalOCLstdlib.g:15086:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
+            // InternalOCLstdlib.g:15087:1: ( rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1 )
+            // InternalOCLstdlib.g:15088:2: rule__MapLiteralExpCS__Group_2_1__0__Impl rule__MapLiteralExpCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__MapLiteralExpCS__Group_2_1__0__Impl();
@@ -44781,17 +44781,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__0__Impl"
-    // InternalOCLstdlib.g:15093:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:15095:1: rule__MapLiteralExpCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15097:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:15098:1: ( ',' )
+            // InternalOCLstdlib.g:15099:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:15100:1: ( ',' )
             {
-            // InternalOCLstdlib.g:15098:1: ( ',' )
-            // InternalOCLstdlib.g:15099:1: ','
+            // InternalOCLstdlib.g:15100:1: ( ',' )
+            // InternalOCLstdlib.g:15101:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());
@@ -44822,14 +44822,14 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1"
-    // InternalOCLstdlib.g:15112:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
+    // InternalOCLstdlib.g:15114:1: rule__MapLiteralExpCS__Group_2_1__1 : rule__MapLiteralExpCS__Group_2_1__1__Impl ;
     public final void rule__MapLiteralExpCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15116:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
-            // InternalOCLstdlib.g:15117:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
+            // InternalOCLstdlib.g:15118:1: ( rule__MapLiteralExpCS__Group_2_1__1__Impl )
+            // InternalOCLstdlib.g:15119:2: rule__MapLiteralExpCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__Group_2_1__1__Impl();
@@ -44855,23 +44855,23 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__Group_2_1__1__Impl"
-    // InternalOCLstdlib.g:15123:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:15125:1: rule__MapLiteralExpCS__Group_2_1__1__Impl : ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__MapLiteralExpCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15127:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLstdlib.g:15128:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:15129:1: ( ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLstdlib.g:15130:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:15128:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLstdlib.g:15129:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:15130:1: ( ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:15131:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLstdlib.g:15130:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLstdlib.g:15130:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLstdlib.g:15132:1: ( rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:15132:2: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1();
@@ -44906,14 +44906,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0"
-    // InternalOCLstdlib.g:15144:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
+    // InternalOCLstdlib.g:15146:1: rule__MapLiteralPartCS__Group__0 : rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 ;
     public final void rule__MapLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15148:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
-            // InternalOCLstdlib.g:15149:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
+            // InternalOCLstdlib.g:15150:1: ( rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1 )
+            // InternalOCLstdlib.g:15151:2: rule__MapLiteralPartCS__Group__0__Impl rule__MapLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_71);
             rule__MapLiteralPartCS__Group__0__Impl();
@@ -44944,23 +44944,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15156:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:15158:1: rule__MapLiteralPartCS__Group__0__Impl : ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) ;
     public final void rule__MapLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15160:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
-            // InternalOCLstdlib.g:15161:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalOCLstdlib.g:15162:1: ( ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) ) )
+            // InternalOCLstdlib.g:15163:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:15161:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
-            // InternalOCLstdlib.g:15162:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalOCLstdlib.g:15163:1: ( ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 ) )
+            // InternalOCLstdlib.g:15164:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyAssignment_0());
             }
-            // InternalOCLstdlib.g:15163:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
-            // InternalOCLstdlib.g:15163:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
+            // InternalOCLstdlib.g:15165:1: ( rule__MapLiteralPartCS__OwnedKeyAssignment_0 )
+            // InternalOCLstdlib.g:15165:2: rule__MapLiteralPartCS__OwnedKeyAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedKeyAssignment_0();
@@ -44995,14 +44995,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1"
-    // InternalOCLstdlib.g:15173:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
+    // InternalOCLstdlib.g:15175:1: rule__MapLiteralPartCS__Group__1 : rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 ;
     public final void rule__MapLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15177:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
-            // InternalOCLstdlib.g:15178:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
+            // InternalOCLstdlib.g:15179:1: ( rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2 )
+            // InternalOCLstdlib.g:15180:2: rule__MapLiteralPartCS__Group__1__Impl rule__MapLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__MapLiteralPartCS__Group__1__Impl();
@@ -45033,17 +45033,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15185:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:15187:1: rule__MapLiteralPartCS__Group__1__Impl : ( '<-' ) ;
     public final void rule__MapLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15189:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:15190:1: ( '<-' )
+            // InternalOCLstdlib.g:15191:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:15192:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:15190:1: ( '<-' )
-            // InternalOCLstdlib.g:15191:1: '<-'
+            // InternalOCLstdlib.g:15192:1: ( '<-' )
+            // InternalOCLstdlib.g:15193:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());
@@ -45074,14 +45074,14 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2"
-    // InternalOCLstdlib.g:15204:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:15206:1: rule__MapLiteralPartCS__Group__2 : rule__MapLiteralPartCS__Group__2__Impl ;
     public final void rule__MapLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15208:1: ( rule__MapLiteralPartCS__Group__2__Impl )
-            // InternalOCLstdlib.g:15209:2: rule__MapLiteralPartCS__Group__2__Impl
+            // InternalOCLstdlib.g:15210:1: ( rule__MapLiteralPartCS__Group__2__Impl )
+            // InternalOCLstdlib.g:15211:2: rule__MapLiteralPartCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__Group__2__Impl();
@@ -45107,23 +45107,23 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__Group__2__Impl"
-    // InternalOCLstdlib.g:15215:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:15217:1: rule__MapLiteralPartCS__Group__2__Impl : ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) ;
     public final void rule__MapLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15219:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
-            // InternalOCLstdlib.g:15220:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalOCLstdlib.g:15221:1: ( ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) ) )
+            // InternalOCLstdlib.g:15222:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:15220:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
-            // InternalOCLstdlib.g:15221:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalOCLstdlib.g:15222:1: ( ( rule__MapLiteralPartCS__OwnedValueAssignment_2 ) )
+            // InternalOCLstdlib.g:15223:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueAssignment_2());
             }
-            // InternalOCLstdlib.g:15222:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
-            // InternalOCLstdlib.g:15222:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
+            // InternalOCLstdlib.g:15224:1: ( rule__MapLiteralPartCS__OwnedValueAssignment_2 )
+            // InternalOCLstdlib.g:15224:2: rule__MapLiteralPartCS__OwnedValueAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MapLiteralPartCS__OwnedValueAssignment_2();
@@ -45158,14 +45158,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:15238:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:15240:1: rule__TupleLiteralExpCS__Group__0 : rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 ;
     public final void rule__TupleLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15242:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:15243:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:15244:1: ( rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:15245:2: rule__TupleLiteralExpCS__Group__0__Impl rule__TupleLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__TupleLiteralExpCS__Group__0__Impl();
@@ -45196,17 +45196,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15250:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
+    // InternalOCLstdlib.g:15252:1: rule__TupleLiteralExpCS__Group__0__Impl : ( 'Tuple' ) ;
     public final void rule__TupleLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15254:1: ( ( 'Tuple' ) )
-            // InternalOCLstdlib.g:15255:1: ( 'Tuple' )
+            // InternalOCLstdlib.g:15256:1: ( ( 'Tuple' ) )
+            // InternalOCLstdlib.g:15257:1: ( 'Tuple' )
             {
-            // InternalOCLstdlib.g:15255:1: ( 'Tuple' )
-            // InternalOCLstdlib.g:15256:1: 'Tuple'
+            // InternalOCLstdlib.g:15257:1: ( 'Tuple' )
+            // InternalOCLstdlib.g:15258:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());
@@ -45237,14 +45237,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:15269:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
+    // InternalOCLstdlib.g:15271:1: rule__TupleLiteralExpCS__Group__1 : rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 ;
     public final void rule__TupleLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15273:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
-            // InternalOCLstdlib.g:15274:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
+            // InternalOCLstdlib.g:15275:1: ( rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2 )
+            // InternalOCLstdlib.g:15276:2: rule__TupleLiteralExpCS__Group__1__Impl rule__TupleLiteralExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TupleLiteralExpCS__Group__1__Impl();
@@ -45275,17 +45275,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15281:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:15283:1: rule__TupleLiteralExpCS__Group__1__Impl : ( '{' ) ;
     public final void rule__TupleLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15285:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:15286:1: ( '{' )
+            // InternalOCLstdlib.g:15287:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:15288:1: ( '{' )
             {
-            // InternalOCLstdlib.g:15286:1: ( '{' )
-            // InternalOCLstdlib.g:15287:1: '{'
+            // InternalOCLstdlib.g:15288:1: ( '{' )
+            // InternalOCLstdlib.g:15289:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());
@@ -45316,14 +45316,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2"
-    // InternalOCLstdlib.g:15300:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
+    // InternalOCLstdlib.g:15302:1: rule__TupleLiteralExpCS__Group__2 : rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 ;
     public final void rule__TupleLiteralExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15304:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
-            // InternalOCLstdlib.g:15305:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
+            // InternalOCLstdlib.g:15306:1: ( rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3 )
+            // InternalOCLstdlib.g:15307:2: rule__TupleLiteralExpCS__Group__2__Impl rule__TupleLiteralExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_72);
             rule__TupleLiteralExpCS__Group__2__Impl();
@@ -45354,23 +45354,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:15312:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
+    // InternalOCLstdlib.g:15314:1: rule__TupleLiteralExpCS__Group__2__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) ;
     public final void rule__TupleLiteralExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15316:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
-            // InternalOCLstdlib.g:15317:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalOCLstdlib.g:15318:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) ) )
+            // InternalOCLstdlib.g:15319:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
             {
-            // InternalOCLstdlib.g:15317:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
-            // InternalOCLstdlib.g:15318:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalOCLstdlib.g:15319:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 ) )
+            // InternalOCLstdlib.g:15320:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_2());
             }
-            // InternalOCLstdlib.g:15319:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
-            // InternalOCLstdlib.g:15319:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
+            // InternalOCLstdlib.g:15321:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_2 )
+            // InternalOCLstdlib.g:15321:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_2();
@@ -45405,14 +45405,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3"
-    // InternalOCLstdlib.g:15329:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
+    // InternalOCLstdlib.g:15331:1: rule__TupleLiteralExpCS__Group__3 : rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 ;
     public final void rule__TupleLiteralExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15333:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
-            // InternalOCLstdlib.g:15334:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
+            // InternalOCLstdlib.g:15335:1: ( rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4 )
+            // InternalOCLstdlib.g:15336:2: rule__TupleLiteralExpCS__Group__3__Impl rule__TupleLiteralExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_72);
             rule__TupleLiteralExpCS__Group__3__Impl();
@@ -45443,22 +45443,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:15341:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
+    // InternalOCLstdlib.g:15343:1: rule__TupleLiteralExpCS__Group__3__Impl : ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) ;
     public final void rule__TupleLiteralExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15345:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
-            // InternalOCLstdlib.g:15346:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalOCLstdlib.g:15347:1: ( ( ( rule__TupleLiteralExpCS__Group_3__0 )* ) )
+            // InternalOCLstdlib.g:15348:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
             {
-            // InternalOCLstdlib.g:15346:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
-            // InternalOCLstdlib.g:15347:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalOCLstdlib.g:15348:1: ( ( rule__TupleLiteralExpCS__Group_3__0 )* )
+            // InternalOCLstdlib.g:15349:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getGroup_3());
             }
-            // InternalOCLstdlib.g:15348:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
+            // InternalOCLstdlib.g:15350:1: ( rule__TupleLiteralExpCS__Group_3__0 )*
             loop131:
             do {
                 int alt131=2;
@@ -45471,7 +45471,7 @@
 
                 switch (alt131) {
             	case 1 :
-            	    // InternalOCLstdlib.g:15348:2: rule__TupleLiteralExpCS__Group_3__0
+            	    // InternalOCLstdlib.g:15350:2: rule__TupleLiteralExpCS__Group_3__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__TupleLiteralExpCS__Group_3__0();
@@ -45512,14 +45512,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4"
-    // InternalOCLstdlib.g:15358:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:15360:1: rule__TupleLiteralExpCS__Group__4 : rule__TupleLiteralExpCS__Group__4__Impl ;
     public final void rule__TupleLiteralExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15362:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
-            // InternalOCLstdlib.g:15363:2: rule__TupleLiteralExpCS__Group__4__Impl
+            // InternalOCLstdlib.g:15364:1: ( rule__TupleLiteralExpCS__Group__4__Impl )
+            // InternalOCLstdlib.g:15365:2: rule__TupleLiteralExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group__4__Impl();
@@ -45545,17 +45545,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group__4__Impl"
-    // InternalOCLstdlib.g:15369:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:15371:1: rule__TupleLiteralExpCS__Group__4__Impl : ( '}' ) ;
     public final void rule__TupleLiteralExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15373:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:15374:1: ( '}' )
+            // InternalOCLstdlib.g:15375:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:15376:1: ( '}' )
             {
-            // InternalOCLstdlib.g:15374:1: ( '}' )
-            // InternalOCLstdlib.g:15375:1: '}'
+            // InternalOCLstdlib.g:15376:1: ( '}' )
+            // InternalOCLstdlib.g:15377:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());
@@ -45586,14 +45586,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0"
-    // InternalOCLstdlib.g:15398:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
+    // InternalOCLstdlib.g:15400:1: rule__TupleLiteralExpCS__Group_3__0 : rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 ;
     public final void rule__TupleLiteralExpCS__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15402:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
-            // InternalOCLstdlib.g:15403:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
+            // InternalOCLstdlib.g:15404:1: ( rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1 )
+            // InternalOCLstdlib.g:15405:2: rule__TupleLiteralExpCS__Group_3__0__Impl rule__TupleLiteralExpCS__Group_3__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TupleLiteralExpCS__Group_3__0__Impl();
@@ -45624,17 +45624,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__0__Impl"
-    // InternalOCLstdlib.g:15410:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:15412:1: rule__TupleLiteralExpCS__Group_3__0__Impl : ( ',' ) ;
     public final void rule__TupleLiteralExpCS__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15414:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:15415:1: ( ',' )
+            // InternalOCLstdlib.g:15416:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:15417:1: ( ',' )
             {
-            // InternalOCLstdlib.g:15415:1: ( ',' )
-            // InternalOCLstdlib.g:15416:1: ','
+            // InternalOCLstdlib.g:15417:1: ( ',' )
+            // InternalOCLstdlib.g:15418:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());
@@ -45665,14 +45665,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1"
-    // InternalOCLstdlib.g:15429:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
+    // InternalOCLstdlib.g:15431:1: rule__TupleLiteralExpCS__Group_3__1 : rule__TupleLiteralExpCS__Group_3__1__Impl ;
     public final void rule__TupleLiteralExpCS__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15433:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
-            // InternalOCLstdlib.g:15434:2: rule__TupleLiteralExpCS__Group_3__1__Impl
+            // InternalOCLstdlib.g:15435:1: ( rule__TupleLiteralExpCS__Group_3__1__Impl )
+            // InternalOCLstdlib.g:15436:2: rule__TupleLiteralExpCS__Group_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__Group_3__1__Impl();
@@ -45698,23 +45698,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__Group_3__1__Impl"
-    // InternalOCLstdlib.g:15440:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
+    // InternalOCLstdlib.g:15442:1: rule__TupleLiteralExpCS__Group_3__1__Impl : ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) ;
     public final void rule__TupleLiteralExpCS__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15444:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
-            // InternalOCLstdlib.g:15445:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalOCLstdlib.g:15446:1: ( ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) ) )
+            // InternalOCLstdlib.g:15447:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
             {
-            // InternalOCLstdlib.g:15445:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
-            // InternalOCLstdlib.g:15446:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalOCLstdlib.g:15447:1: ( ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 ) )
+            // InternalOCLstdlib.g:15448:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsAssignment_3_1());
             }
-            // InternalOCLstdlib.g:15447:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
-            // InternalOCLstdlib.g:15447:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
+            // InternalOCLstdlib.g:15449:1: ( rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 )
+            // InternalOCLstdlib.g:15449:2: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1();
@@ -45749,14 +45749,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0"
-    // InternalOCLstdlib.g:15461:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
+    // InternalOCLstdlib.g:15463:1: rule__TupleLiteralPartCS__Group__0 : rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 ;
     public final void rule__TupleLiteralPartCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15465:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
-            // InternalOCLstdlib.g:15466:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
+            // InternalOCLstdlib.g:15467:1: ( rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1 )
+            // InternalOCLstdlib.g:15468:2: rule__TupleLiteralPartCS__Group__0__Impl rule__TupleLiteralPartCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_73);
             rule__TupleLiteralPartCS__Group__0__Impl();
@@ -45787,23 +45787,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15473:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:15475:1: rule__TupleLiteralPartCS__Group__0__Impl : ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15477:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:15478:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:15479:1: ( ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:15480:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:15478:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:15479:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:15480:1: ( ( rule__TupleLiteralPartCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:15481:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:15480:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:15480:2: rule__TupleLiteralPartCS__NameAssignment_0
+            // InternalOCLstdlib.g:15482:1: ( rule__TupleLiteralPartCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:15482:2: rule__TupleLiteralPartCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__NameAssignment_0();
@@ -45838,14 +45838,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1"
-    // InternalOCLstdlib.g:15490:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
+    // InternalOCLstdlib.g:15492:1: rule__TupleLiteralPartCS__Group__1 : rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 ;
     public final void rule__TupleLiteralPartCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15494:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
-            // InternalOCLstdlib.g:15495:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
+            // InternalOCLstdlib.g:15496:1: ( rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2 )
+            // InternalOCLstdlib.g:15497:2: rule__TupleLiteralPartCS__Group__1__Impl rule__TupleLiteralPartCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_73);
             rule__TupleLiteralPartCS__Group__1__Impl();
@@ -45876,22 +45876,22 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15502:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:15504:1: rule__TupleLiteralPartCS__Group__1__Impl : ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) ;
     public final void rule__TupleLiteralPartCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15506:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:15507:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:15508:1: ( ( ( rule__TupleLiteralPartCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:15509:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:15507:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:15508:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalOCLstdlib.g:15509:1: ( ( rule__TupleLiteralPartCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:15510:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:15509:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
+            // InternalOCLstdlib.g:15511:1: ( rule__TupleLiteralPartCS__Group_1__0 )?
             int alt132=2;
             int LA132_0 = input.LA(1);
 
@@ -45900,7 +45900,7 @@
             }
             switch (alt132) {
                 case 1 :
-                    // InternalOCLstdlib.g:15509:2: rule__TupleLiteralPartCS__Group_1__0
+                    // InternalOCLstdlib.g:15511:2: rule__TupleLiteralPartCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TupleLiteralPartCS__Group_1__0();
@@ -45938,14 +45938,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2"
-    // InternalOCLstdlib.g:15519:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
+    // InternalOCLstdlib.g:15521:1: rule__TupleLiteralPartCS__Group__2 : rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 ;
     public final void rule__TupleLiteralPartCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15523:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
-            // InternalOCLstdlib.g:15524:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
+            // InternalOCLstdlib.g:15525:1: ( rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3 )
+            // InternalOCLstdlib.g:15526:2: rule__TupleLiteralPartCS__Group__2__Impl rule__TupleLiteralPartCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__TupleLiteralPartCS__Group__2__Impl();
@@ -45976,17 +45976,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__2__Impl"
-    // InternalOCLstdlib.g:15531:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:15533:1: rule__TupleLiteralPartCS__Group__2__Impl : ( '=' ) ;
     public final void rule__TupleLiteralPartCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15535:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:15536:1: ( '=' )
+            // InternalOCLstdlib.g:15537:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:15538:1: ( '=' )
             {
-            // InternalOCLstdlib.g:15536:1: ( '=' )
-            // InternalOCLstdlib.g:15537:1: '='
+            // InternalOCLstdlib.g:15538:1: ( '=' )
+            // InternalOCLstdlib.g:15539:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());
@@ -46017,14 +46017,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3"
-    // InternalOCLstdlib.g:15550:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:15552:1: rule__TupleLiteralPartCS__Group__3 : rule__TupleLiteralPartCS__Group__3__Impl ;
     public final void rule__TupleLiteralPartCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15554:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
-            // InternalOCLstdlib.g:15555:2: rule__TupleLiteralPartCS__Group__3__Impl
+            // InternalOCLstdlib.g:15556:1: ( rule__TupleLiteralPartCS__Group__3__Impl )
+            // InternalOCLstdlib.g:15557:2: rule__TupleLiteralPartCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group__3__Impl();
@@ -46050,23 +46050,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group__3__Impl"
-    // InternalOCLstdlib.g:15561:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:15563:1: rule__TupleLiteralPartCS__Group__3__Impl : ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) ;
     public final void rule__TupleLiteralPartCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15565:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
-            // InternalOCLstdlib.g:15566:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalOCLstdlib.g:15567:1: ( ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) ) )
+            // InternalOCLstdlib.g:15568:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:15566:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
-            // InternalOCLstdlib.g:15567:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalOCLstdlib.g:15568:1: ( ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 ) )
+            // InternalOCLstdlib.g:15569:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionAssignment_3());
             }
-            // InternalOCLstdlib.g:15568:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
-            // InternalOCLstdlib.g:15568:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
+            // InternalOCLstdlib.g:15570:1: ( rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 )
+            // InternalOCLstdlib.g:15570:2: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3();
@@ -46101,14 +46101,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0"
-    // InternalOCLstdlib.g:15586:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
+    // InternalOCLstdlib.g:15588:1: rule__TupleLiteralPartCS__Group_1__0 : rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 ;
     public final void rule__TupleLiteralPartCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15590:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
-            // InternalOCLstdlib.g:15591:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
+            // InternalOCLstdlib.g:15592:1: ( rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1 )
+            // InternalOCLstdlib.g:15593:2: rule__TupleLiteralPartCS__Group_1__0__Impl rule__TupleLiteralPartCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__TupleLiteralPartCS__Group_1__0__Impl();
@@ -46139,17 +46139,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:15598:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:15600:1: rule__TupleLiteralPartCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__TupleLiteralPartCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15602:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:15603:1: ( ':' )
+            // InternalOCLstdlib.g:15604:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:15605:1: ( ':' )
             {
-            // InternalOCLstdlib.g:15603:1: ( ':' )
-            // InternalOCLstdlib.g:15604:1: ':'
+            // InternalOCLstdlib.g:15605:1: ( ':' )
+            // InternalOCLstdlib.g:15606:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());
@@ -46180,14 +46180,14 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1"
-    // InternalOCLstdlib.g:15617:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:15619:1: rule__TupleLiteralPartCS__Group_1__1 : rule__TupleLiteralPartCS__Group_1__1__Impl ;
     public final void rule__TupleLiteralPartCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15621:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:15622:2: rule__TupleLiteralPartCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:15623:1: ( rule__TupleLiteralPartCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:15624:2: rule__TupleLiteralPartCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__Group_1__1__Impl();
@@ -46213,23 +46213,23 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:15628:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:15630:1: rule__TupleLiteralPartCS__Group_1__1__Impl : ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__TupleLiteralPartCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15632:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:15633:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:15634:1: ( ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:15635:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:15633:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLstdlib.g:15634:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:15635:1: ( ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:15636:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLstdlib.g:15635:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLstdlib.g:15635:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
+            // InternalOCLstdlib.g:15637:1: ( rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:15637:2: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1();
@@ -46264,14 +46264,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:15649:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:15651:1: rule__UnlimitedNaturalLiteralExpCS__Group__0 : rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15653:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:15654:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:15655:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:15656:2: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl rule__UnlimitedNaturalLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_74);
             rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl();
@@ -46302,23 +46302,23 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15661:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:15663:1: rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15665:1: ( ( () ) )
-            // InternalOCLstdlib.g:15666:1: ( () )
+            // InternalOCLstdlib.g:15667:1: ( ( () ) )
+            // InternalOCLstdlib.g:15668:1: ( () )
             {
-            // InternalOCLstdlib.g:15666:1: ( () )
-            // InternalOCLstdlib.g:15667:1: ()
+            // InternalOCLstdlib.g:15668:1: ( () )
+            // InternalOCLstdlib.g:15669:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0());
             }
-            // InternalOCLstdlib.g:15668:1: ()
-            // InternalOCLstdlib.g:15670:1:
+            // InternalOCLstdlib.g:15670:1: ()
+            // InternalOCLstdlib.g:15672:1:
             {
             }
 
@@ -46343,14 +46343,14 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:15680:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:15682:1: rule__UnlimitedNaturalLiteralExpCS__Group__1 : rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15684:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
-            // InternalOCLstdlib.g:15685:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
+            // InternalOCLstdlib.g:15686:1: ( rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl )
+            // InternalOCLstdlib.g:15687:2: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl();
@@ -46376,17 +46376,17 @@
 
 
     // $ANTLR start "rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15691:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
+    // InternalOCLstdlib.g:15693:1: rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl : ( '*' ) ;
     public final void rule__UnlimitedNaturalLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15695:1: ( ( '*' ) )
-            // InternalOCLstdlib.g:15696:1: ( '*' )
+            // InternalOCLstdlib.g:15697:1: ( ( '*' ) )
+            // InternalOCLstdlib.g:15698:1: ( '*' )
             {
-            // InternalOCLstdlib.g:15696:1: ( '*' )
-            // InternalOCLstdlib.g:15697:1: '*'
+            // InternalOCLstdlib.g:15698:1: ( '*' )
+            // InternalOCLstdlib.g:15699:1: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());
@@ -46417,14 +46417,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:15714:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:15716:1: rule__InvalidLiteralExpCS__Group__0 : rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 ;
     public final void rule__InvalidLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15718:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:15719:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:15720:1: ( rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:15721:2: rule__InvalidLiteralExpCS__Group__0__Impl rule__InvalidLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_75);
             rule__InvalidLiteralExpCS__Group__0__Impl();
@@ -46455,23 +46455,23 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15726:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:15728:1: rule__InvalidLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__InvalidLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15730:1: ( ( () ) )
-            // InternalOCLstdlib.g:15731:1: ( () )
+            // InternalOCLstdlib.g:15732:1: ( ( () ) )
+            // InternalOCLstdlib.g:15733:1: ( () )
             {
-            // InternalOCLstdlib.g:15731:1: ( () )
-            // InternalOCLstdlib.g:15732:1: ()
+            // InternalOCLstdlib.g:15733:1: ( () )
+            // InternalOCLstdlib.g:15734:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0());
             }
-            // InternalOCLstdlib.g:15733:1: ()
-            // InternalOCLstdlib.g:15735:1:
+            // InternalOCLstdlib.g:15735:1: ()
+            // InternalOCLstdlib.g:15737:1:
             {
             }
 
@@ -46496,14 +46496,14 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:15745:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:15747:1: rule__InvalidLiteralExpCS__Group__1 : rule__InvalidLiteralExpCS__Group__1__Impl ;
     public final void rule__InvalidLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15749:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
-            // InternalOCLstdlib.g:15750:2: rule__InvalidLiteralExpCS__Group__1__Impl
+            // InternalOCLstdlib.g:15751:1: ( rule__InvalidLiteralExpCS__Group__1__Impl )
+            // InternalOCLstdlib.g:15752:2: rule__InvalidLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__InvalidLiteralExpCS__Group__1__Impl();
@@ -46529,17 +46529,17 @@
 
 
     // $ANTLR start "rule__InvalidLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15756:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
+    // InternalOCLstdlib.g:15758:1: rule__InvalidLiteralExpCS__Group__1__Impl : ( 'invalid' ) ;
     public final void rule__InvalidLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15760:1: ( ( 'invalid' ) )
-            // InternalOCLstdlib.g:15761:1: ( 'invalid' )
+            // InternalOCLstdlib.g:15762:1: ( ( 'invalid' ) )
+            // InternalOCLstdlib.g:15763:1: ( 'invalid' )
             {
-            // InternalOCLstdlib.g:15761:1: ( 'invalid' )
-            // InternalOCLstdlib.g:15762:1: 'invalid'
+            // InternalOCLstdlib.g:15763:1: ( 'invalid' )
+            // InternalOCLstdlib.g:15764:1: 'invalid'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());
@@ -46570,14 +46570,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0"
-    // InternalOCLstdlib.g:15779:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
+    // InternalOCLstdlib.g:15781:1: rule__NullLiteralExpCS__Group__0 : rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 ;
     public final void rule__NullLiteralExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15783:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
-            // InternalOCLstdlib.g:15784:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
+            // InternalOCLstdlib.g:15785:1: ( rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1 )
+            // InternalOCLstdlib.g:15786:2: rule__NullLiteralExpCS__Group__0__Impl rule__NullLiteralExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_76);
             rule__NullLiteralExpCS__Group__0__Impl();
@@ -46608,23 +46608,23 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15791:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:15793:1: rule__NullLiteralExpCS__Group__0__Impl : ( () ) ;
     public final void rule__NullLiteralExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15795:1: ( ( () ) )
-            // InternalOCLstdlib.g:15796:1: ( () )
+            // InternalOCLstdlib.g:15797:1: ( ( () ) )
+            // InternalOCLstdlib.g:15798:1: ( () )
             {
-            // InternalOCLstdlib.g:15796:1: ( () )
-            // InternalOCLstdlib.g:15797:1: ()
+            // InternalOCLstdlib.g:15798:1: ( () )
+            // InternalOCLstdlib.g:15799:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0());
             }
-            // InternalOCLstdlib.g:15798:1: ()
-            // InternalOCLstdlib.g:15800:1:
+            // InternalOCLstdlib.g:15800:1: ()
+            // InternalOCLstdlib.g:15802:1:
             {
             }
 
@@ -46649,14 +46649,14 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1"
-    // InternalOCLstdlib.g:15810:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:15812:1: rule__NullLiteralExpCS__Group__1 : rule__NullLiteralExpCS__Group__1__Impl ;
     public final void rule__NullLiteralExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15814:1: ( rule__NullLiteralExpCS__Group__1__Impl )
-            // InternalOCLstdlib.g:15815:2: rule__NullLiteralExpCS__Group__1__Impl
+            // InternalOCLstdlib.g:15816:1: ( rule__NullLiteralExpCS__Group__1__Impl )
+            // InternalOCLstdlib.g:15817:2: rule__NullLiteralExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NullLiteralExpCS__Group__1__Impl();
@@ -46682,17 +46682,17 @@
 
 
     // $ANTLR start "rule__NullLiteralExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15821:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
+    // InternalOCLstdlib.g:15823:1: rule__NullLiteralExpCS__Group__1__Impl : ( 'null' ) ;
     public final void rule__NullLiteralExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15825:1: ( ( 'null' ) )
-            // InternalOCLstdlib.g:15826:1: ( 'null' )
+            // InternalOCLstdlib.g:15827:1: ( ( 'null' ) )
+            // InternalOCLstdlib.g:15828:1: ( 'null' )
             {
-            // InternalOCLstdlib.g:15826:1: ( 'null' )
-            // InternalOCLstdlib.g:15827:1: 'null'
+            // InternalOCLstdlib.g:15828:1: ( 'null' )
+            // InternalOCLstdlib.g:15829:1: 'null'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());
@@ -46723,14 +46723,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0"
-    // InternalOCLstdlib.g:15844:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
+    // InternalOCLstdlib.g:15846:1: rule__TypeLiteralWithMultiplicityCS__Group__0 : rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15848:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
-            // InternalOCLstdlib.g:15849:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
+            // InternalOCLstdlib.g:15850:1: ( rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1 )
+            // InternalOCLstdlib.g:15851:2: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl rule__TypeLiteralWithMultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_60);
             rule__TypeLiteralWithMultiplicityCS__Group__0__Impl();
@@ -46761,17 +46761,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15856:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
+    // InternalOCLstdlib.g:15858:1: rule__TypeLiteralWithMultiplicityCS__Group__0__Impl : ( ruleTypeLiteralCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15860:1: ( ( ruleTypeLiteralCS ) )
-            // InternalOCLstdlib.g:15861:1: ( ruleTypeLiteralCS )
+            // InternalOCLstdlib.g:15862:1: ( ( ruleTypeLiteralCS ) )
+            // InternalOCLstdlib.g:15863:1: ( ruleTypeLiteralCS )
             {
-            // InternalOCLstdlib.g:15861:1: ( ruleTypeLiteralCS )
-            // InternalOCLstdlib.g:15862:1: ruleTypeLiteralCS
+            // InternalOCLstdlib.g:15863:1: ( ruleTypeLiteralCS )
+            // InternalOCLstdlib.g:15864:1: ruleTypeLiteralCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());
@@ -46806,14 +46806,14 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1"
-    // InternalOCLstdlib.g:15873:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:15875:1: rule__TypeLiteralWithMultiplicityCS__Group__1 : rule__TypeLiteralWithMultiplicityCS__Group__1__Impl ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15877:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
-            // InternalOCLstdlib.g:15878:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
+            // InternalOCLstdlib.g:15879:1: ( rule__TypeLiteralWithMultiplicityCS__Group__1__Impl )
+            // InternalOCLstdlib.g:15880:2: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeLiteralWithMultiplicityCS__Group__1__Impl();
@@ -46839,22 +46839,22 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15884:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalOCLstdlib.g:15886:1: rule__TypeLiteralWithMultiplicityCS__Group__1__Impl : ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15888:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalOCLstdlib.g:15889:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLstdlib.g:15890:1: ( ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalOCLstdlib.g:15891:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalOCLstdlib.g:15889:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalOCLstdlib.g:15890:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLstdlib.g:15891:1: ( ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLstdlib.g:15892:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalOCLstdlib.g:15891:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLstdlib.g:15893:1: ( rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 )?
             int alt133=2;
             int LA133_0 = input.LA(1);
 
@@ -46863,7 +46863,7 @@
             }
             switch (alt133) {
                 case 1 :
-                    // InternalOCLstdlib.g:15891:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
+                    // InternalOCLstdlib.g:15893:2: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1();
@@ -46901,14 +46901,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0"
-    // InternalOCLstdlib.g:15905:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
+    // InternalOCLstdlib.g:15907:1: rule__TypeNameExpCS__Group__0 : rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 ;
     public final void rule__TypeNameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15909:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
-            // InternalOCLstdlib.g:15910:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
+            // InternalOCLstdlib.g:15911:1: ( rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1 )
+            // InternalOCLstdlib.g:15912:2: rule__TypeNameExpCS__Group__0__Impl rule__TypeNameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__TypeNameExpCS__Group__0__Impl();
@@ -46939,23 +46939,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:15917:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:15919:1: rule__TypeNameExpCS__Group__0__Impl : ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__TypeNameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15921:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:15922:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLstdlib.g:15923:1: ( ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:15924:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:15922:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalOCLstdlib.g:15923:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLstdlib.g:15924:1: ( ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLstdlib.g:15925:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalOCLstdlib.g:15924:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
-            // InternalOCLstdlib.g:15924:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
+            // InternalOCLstdlib.g:15926:1: ( rule__TypeNameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLstdlib.g:15926:2: rule__TypeNameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPathNameAssignment_0();
@@ -46990,14 +46990,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1"
-    // InternalOCLstdlib.g:15934:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:15936:1: rule__TypeNameExpCS__Group__1 : rule__TypeNameExpCS__Group__1__Impl ;
     public final void rule__TypeNameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15938:1: ( rule__TypeNameExpCS__Group__1__Impl )
-            // InternalOCLstdlib.g:15939:2: rule__TypeNameExpCS__Group__1__Impl
+            // InternalOCLstdlib.g:15940:1: ( rule__TypeNameExpCS__Group__1__Impl )
+            // InternalOCLstdlib.g:15941:2: rule__TypeNameExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group__1__Impl();
@@ -47023,22 +47023,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:15945:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:15947:1: rule__TypeNameExpCS__Group__1__Impl : ( ( rule__TypeNameExpCS__Group_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15949:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:15950:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:15951:1: ( ( ( rule__TypeNameExpCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:15952:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:15950:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:15951:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalOCLstdlib.g:15952:1: ( ( rule__TypeNameExpCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:15953:1: ( rule__TypeNameExpCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:15952:1: ( rule__TypeNameExpCS__Group_1__0 )?
+            // InternalOCLstdlib.g:15954:1: ( rule__TypeNameExpCS__Group_1__0 )?
             int alt134=2;
             int LA134_0 = input.LA(1);
 
@@ -47047,7 +47047,7 @@
             }
             switch (alt134) {
                 case 1 :
-                    // InternalOCLstdlib.g:15952:2: rule__TypeNameExpCS__Group_1__0
+                    // InternalOCLstdlib.g:15954:2: rule__TypeNameExpCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1__0();
@@ -47085,14 +47085,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0"
-    // InternalOCLstdlib.g:15966:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
+    // InternalOCLstdlib.g:15968:1: rule__TypeNameExpCS__Group_1__0 : rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 ;
     public final void rule__TypeNameExpCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15970:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
-            // InternalOCLstdlib.g:15971:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
+            // InternalOCLstdlib.g:15972:1: ( rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1 )
+            // InternalOCLstdlib.g:15973:2: rule__TypeNameExpCS__Group_1__0__Impl rule__TypeNameExpCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__TypeNameExpCS__Group_1__0__Impl();
@@ -47123,23 +47123,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:15978:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
+    // InternalOCLstdlib.g:15980:1: rule__TypeNameExpCS__Group_1__0__Impl : ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) ;
     public final void rule__TypeNameExpCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15982:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
-            // InternalOCLstdlib.g:15983:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalOCLstdlib.g:15984:1: ( ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) ) )
+            // InternalOCLstdlib.g:15985:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
             {
-            // InternalOCLstdlib.g:15983:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
-            // InternalOCLstdlib.g:15984:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalOCLstdlib.g:15985:1: ( ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 ) )
+            // InternalOCLstdlib.g:15986:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_1_0());
             }
-            // InternalOCLstdlib.g:15985:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
-            // InternalOCLstdlib.g:15985:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
+            // InternalOCLstdlib.g:15987:1: ( rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 )
+            // InternalOCLstdlib.g:15987:2: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0();
@@ -47174,14 +47174,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1"
-    // InternalOCLstdlib.g:15995:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:15997:1: rule__TypeNameExpCS__Group_1__1 : rule__TypeNameExpCS__Group_1__1__Impl ;
     public final void rule__TypeNameExpCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:15999:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:16000:2: rule__TypeNameExpCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:16001:1: ( rule__TypeNameExpCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:16002:2: rule__TypeNameExpCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1__1__Impl();
@@ -47207,22 +47207,22 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:16006:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
+    // InternalOCLstdlib.g:16008:1: rule__TypeNameExpCS__Group_1__1__Impl : ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) ;
     public final void rule__TypeNameExpCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16010:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
-            // InternalOCLstdlib.g:16011:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:16012:1: ( ( ( rule__TypeNameExpCS__Group_1_1__0 )? ) )
+            // InternalOCLstdlib.g:16013:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
             {
-            // InternalOCLstdlib.g:16011:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
-            // InternalOCLstdlib.g:16012:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:16013:1: ( ( rule__TypeNameExpCS__Group_1_1__0 )? )
+            // InternalOCLstdlib.g:16014:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getGroup_1_1());
             }
-            // InternalOCLstdlib.g:16013:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
+            // InternalOCLstdlib.g:16015:1: ( rule__TypeNameExpCS__Group_1_1__0 )?
             int alt135=2;
             int LA135_0 = input.LA(1);
 
@@ -47231,7 +47231,7 @@
             }
             switch (alt135) {
                 case 1 :
-                    // InternalOCLstdlib.g:16013:2: rule__TypeNameExpCS__Group_1_1__0
+                    // InternalOCLstdlib.g:16015:2: rule__TypeNameExpCS__Group_1_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeNameExpCS__Group_1_1__0();
@@ -47269,14 +47269,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0"
-    // InternalOCLstdlib.g:16027:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
+    // InternalOCLstdlib.g:16029:1: rule__TypeNameExpCS__Group_1_1__0 : rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 ;
     public final void rule__TypeNameExpCS__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16031:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
-            // InternalOCLstdlib.g:16032:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
+            // InternalOCLstdlib.g:16033:1: ( rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1 )
+            // InternalOCLstdlib.g:16034:2: rule__TypeNameExpCS__Group_1_1__0__Impl rule__TypeNameExpCS__Group_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__TypeNameExpCS__Group_1_1__0__Impl();
@@ -47307,17 +47307,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__0__Impl"
-    // InternalOCLstdlib.g:16039:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:16041:1: rule__TypeNameExpCS__Group_1_1__0__Impl : ( '{' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16043:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:16044:1: ( '{' )
+            // InternalOCLstdlib.g:16045:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:16046:1: ( '{' )
             {
-            // InternalOCLstdlib.g:16044:1: ( '{' )
-            // InternalOCLstdlib.g:16045:1: '{'
+            // InternalOCLstdlib.g:16046:1: ( '{' )
+            // InternalOCLstdlib.g:16047:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());
@@ -47348,14 +47348,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1"
-    // InternalOCLstdlib.g:16058:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
+    // InternalOCLstdlib.g:16060:1: rule__TypeNameExpCS__Group_1_1__1 : rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 ;
     public final void rule__TypeNameExpCS__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16062:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
-            // InternalOCLstdlib.g:16063:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
+            // InternalOCLstdlib.g:16064:1: ( rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2 )
+            // InternalOCLstdlib.g:16065:2: rule__TypeNameExpCS__Group_1_1__1__Impl rule__TypeNameExpCS__Group_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_19);
             rule__TypeNameExpCS__Group_1_1__1__Impl();
@@ -47386,23 +47386,23 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__1__Impl"
-    // InternalOCLstdlib.g:16070:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:16072:1: rule__TypeNameExpCS__Group_1_1__1__Impl : ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) ;
     public final void rule__TypeNameExpCS__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16074:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
-            // InternalOCLstdlib.g:16075:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:16076:1: ( ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) ) )
+            // InternalOCLstdlib.g:16077:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:16075:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
-            // InternalOCLstdlib.g:16076:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalOCLstdlib.g:16077:1: ( ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 ) )
+            // InternalOCLstdlib.g:16078:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardAssignment_1_1_1());
             }
-            // InternalOCLstdlib.g:16077:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
-            // InternalOCLstdlib.g:16077:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
+            // InternalOCLstdlib.g:16079:1: ( rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 )
+            // InternalOCLstdlib.g:16079:2: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1();
@@ -47437,14 +47437,14 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2"
-    // InternalOCLstdlib.g:16087:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
+    // InternalOCLstdlib.g:16089:1: rule__TypeNameExpCS__Group_1_1__2 : rule__TypeNameExpCS__Group_1_1__2__Impl ;
     public final void rule__TypeNameExpCS__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16091:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
-            // InternalOCLstdlib.g:16092:2: rule__TypeNameExpCS__Group_1_1__2__Impl
+            // InternalOCLstdlib.g:16093:1: ( rule__TypeNameExpCS__Group_1_1__2__Impl )
+            // InternalOCLstdlib.g:16094:2: rule__TypeNameExpCS__Group_1_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeNameExpCS__Group_1_1__2__Impl();
@@ -47470,17 +47470,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__Group_1_1__2__Impl"
-    // InternalOCLstdlib.g:16098:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:16100:1: rule__TypeNameExpCS__Group_1_1__2__Impl : ( '}' ) ;
     public final void rule__TypeNameExpCS__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16102:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:16103:1: ( '}' )
+            // InternalOCLstdlib.g:16104:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:16105:1: ( '}' )
             {
-            // InternalOCLstdlib.g:16103:1: ( '}' )
-            // InternalOCLstdlib.g:16104:1: '}'
+            // InternalOCLstdlib.g:16105:1: ( '}' )
+            // InternalOCLstdlib.g:16106:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());
@@ -47511,14 +47511,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0"
-    // InternalOCLstdlib.g:16123:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
+    // InternalOCLstdlib.g:16125:1: rule__TypeExpCS__Group__0 : rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 ;
     public final void rule__TypeExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16127:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
-            // InternalOCLstdlib.g:16128:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
+            // InternalOCLstdlib.g:16129:1: ( rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1 )
+            // InternalOCLstdlib.g:16130:2: rule__TypeExpCS__Group__0__Impl rule__TypeExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_60);
             rule__TypeExpCS__Group__0__Impl();
@@ -47549,17 +47549,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:16135:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalOCLstdlib.g:16137:1: rule__TypeExpCS__Group__0__Impl : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__TypeExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16139:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalOCLstdlib.g:16140:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLstdlib.g:16141:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalOCLstdlib.g:16142:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalOCLstdlib.g:16140:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalOCLstdlib.g:16141:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalOCLstdlib.g:16142:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLstdlib.g:16143:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());
@@ -47594,14 +47594,14 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1"
-    // InternalOCLstdlib.g:16152:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:16154:1: rule__TypeExpCS__Group__1 : rule__TypeExpCS__Group__1__Impl ;
     public final void rule__TypeExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16156:1: ( rule__TypeExpCS__Group__1__Impl )
-            // InternalOCLstdlib.g:16157:2: rule__TypeExpCS__Group__1__Impl
+            // InternalOCLstdlib.g:16158:1: ( rule__TypeExpCS__Group__1__Impl )
+            // InternalOCLstdlib.g:16159:2: rule__TypeExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeExpCS__Group__1__Impl();
@@ -47627,22 +47627,22 @@
 
 
     // $ANTLR start "rule__TypeExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:16163:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
+    // InternalOCLstdlib.g:16165:1: rule__TypeExpCS__Group__1__Impl : ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) ;
     public final void rule__TypeExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16167:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
-            // InternalOCLstdlib.g:16168:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLstdlib.g:16169:1: ( ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? ) )
+            // InternalOCLstdlib.g:16170:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
             {
-            // InternalOCLstdlib.g:16168:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
-            // InternalOCLstdlib.g:16169:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLstdlib.g:16170:1: ( ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )? )
+            // InternalOCLstdlib.g:16171:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityAssignment_1());
             }
-            // InternalOCLstdlib.g:16170:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
+            // InternalOCLstdlib.g:16172:1: ( rule__TypeExpCS__OwnedMultiplicityAssignment_1 )?
             int alt136=2;
             int LA136_0 = input.LA(1);
 
@@ -47651,7 +47651,7 @@
             }
             switch (alt136) {
                 case 1 :
-                    // InternalOCLstdlib.g:16170:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
+                    // InternalOCLstdlib.g:16172:2: rule__TypeExpCS__OwnedMultiplicityAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeExpCS__OwnedMultiplicityAssignment_1();
@@ -47689,14 +47689,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0"
-    // InternalOCLstdlib.g:16184:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
+    // InternalOCLstdlib.g:16186:1: rule__ExpCS__Group_0__0 : rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 ;
     public final void rule__ExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16188:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
-            // InternalOCLstdlib.g:16189:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
+            // InternalOCLstdlib.g:16190:1: ( rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1 )
+            // InternalOCLstdlib.g:16191:2: rule__ExpCS__Group_0__0__Impl rule__ExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_77);
             rule__ExpCS__Group_0__0__Impl();
@@ -47727,17 +47727,17 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:16196:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalOCLstdlib.g:16198:1: rule__ExpCS__Group_0__0__Impl : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__ExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16200:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalOCLstdlib.g:16201:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLstdlib.g:16202:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalOCLstdlib.g:16203:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalOCLstdlib.g:16201:1: ( rulePrefixedPrimaryExpCS )
-            // InternalOCLstdlib.g:16202:1: rulePrefixedPrimaryExpCS
+            // InternalOCLstdlib.g:16203:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLstdlib.g:16204:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());
@@ -47772,14 +47772,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1"
-    // InternalOCLstdlib.g:16213:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
+    // InternalOCLstdlib.g:16215:1: rule__ExpCS__Group_0__1 : rule__ExpCS__Group_0__1__Impl ;
     public final void rule__ExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16217:1: ( rule__ExpCS__Group_0__1__Impl )
-            // InternalOCLstdlib.g:16218:2: rule__ExpCS__Group_0__1__Impl
+            // InternalOCLstdlib.g:16219:1: ( rule__ExpCS__Group_0__1__Impl )
+            // InternalOCLstdlib.g:16220:2: rule__ExpCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0__1__Impl();
@@ -47805,22 +47805,22 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:16224:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
+    // InternalOCLstdlib.g:16226:1: rule__ExpCS__Group_0__1__Impl : ( ( rule__ExpCS__Group_0_1__0 )? ) ;
     public final void rule__ExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16228:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
-            // InternalOCLstdlib.g:16229:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalOCLstdlib.g:16230:1: ( ( ( rule__ExpCS__Group_0_1__0 )? ) )
+            // InternalOCLstdlib.g:16231:1: ( ( rule__ExpCS__Group_0_1__0 )? )
             {
-            // InternalOCLstdlib.g:16229:1: ( ( rule__ExpCS__Group_0_1__0 )? )
-            // InternalOCLstdlib.g:16230:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalOCLstdlib.g:16231:1: ( ( rule__ExpCS__Group_0_1__0 )? )
+            // InternalOCLstdlib.g:16232:1: ( rule__ExpCS__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getGroup_0_1());
             }
-            // InternalOCLstdlib.g:16231:1: ( rule__ExpCS__Group_0_1__0 )?
+            // InternalOCLstdlib.g:16233:1: ( rule__ExpCS__Group_0_1__0 )?
             int alt137=2;
             int LA137_0 = input.LA(1);
 
@@ -47829,7 +47829,7 @@
             }
             switch (alt137) {
                 case 1 :
-                    // InternalOCLstdlib.g:16231:2: rule__ExpCS__Group_0_1__0
+                    // InternalOCLstdlib.g:16233:2: rule__ExpCS__Group_0_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__ExpCS__Group_0_1__0();
@@ -47867,14 +47867,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0"
-    // InternalOCLstdlib.g:16245:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
+    // InternalOCLstdlib.g:16247:1: rule__ExpCS__Group_0_1__0 : rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 ;
     public final void rule__ExpCS__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16249:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
-            // InternalOCLstdlib.g:16250:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
+            // InternalOCLstdlib.g:16251:1: ( rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1 )
+            // InternalOCLstdlib.g:16252:2: rule__ExpCS__Group_0_1__0__Impl rule__ExpCS__Group_0_1__1
             {
             pushFollow(FollowSets000.FOLLOW_77);
             rule__ExpCS__Group_0_1__0__Impl();
@@ -47905,23 +47905,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__0__Impl"
-    // InternalOCLstdlib.g:16257:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:16259:1: rule__ExpCS__Group_0_1__0__Impl : ( () ) ;
     public final void rule__ExpCS__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16261:1: ( ( () ) )
-            // InternalOCLstdlib.g:16262:1: ( () )
+            // InternalOCLstdlib.g:16263:1: ( ( () ) )
+            // InternalOCLstdlib.g:16264:1: ( () )
             {
-            // InternalOCLstdlib.g:16262:1: ( () )
-            // InternalOCLstdlib.g:16263:1: ()
+            // InternalOCLstdlib.g:16264:1: ( () )
+            // InternalOCLstdlib.g:16265:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0());
             }
-            // InternalOCLstdlib.g:16264:1: ()
-            // InternalOCLstdlib.g:16266:1:
+            // InternalOCLstdlib.g:16266:1: ()
+            // InternalOCLstdlib.g:16268:1:
             {
             }
 
@@ -47946,14 +47946,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1"
-    // InternalOCLstdlib.g:16276:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
+    // InternalOCLstdlib.g:16278:1: rule__ExpCS__Group_0_1__1 : rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 ;
     public final void rule__ExpCS__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16280:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
-            // InternalOCLstdlib.g:16281:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
+            // InternalOCLstdlib.g:16282:1: ( rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2 )
+            // InternalOCLstdlib.g:16283:2: rule__ExpCS__Group_0_1__1__Impl rule__ExpCS__Group_0_1__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__ExpCS__Group_0_1__1__Impl();
@@ -47984,23 +47984,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__1__Impl"
-    // InternalOCLstdlib.g:16288:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
+    // InternalOCLstdlib.g:16290:1: rule__ExpCS__Group_0_1__1__Impl : ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) ;
     public final void rule__ExpCS__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16292:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
-            // InternalOCLstdlib.g:16293:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalOCLstdlib.g:16294:1: ( ( ( rule__ExpCS__NameAssignment_0_1_1 ) ) )
+            // InternalOCLstdlib.g:16295:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
             {
-            // InternalOCLstdlib.g:16293:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
-            // InternalOCLstdlib.g:16294:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalOCLstdlib.g:16295:1: ( ( rule__ExpCS__NameAssignment_0_1_1 ) )
+            // InternalOCLstdlib.g:16296:1: ( rule__ExpCS__NameAssignment_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameAssignment_0_1_1());
             }
-            // InternalOCLstdlib.g:16295:1: ( rule__ExpCS__NameAssignment_0_1_1 )
-            // InternalOCLstdlib.g:16295:2: rule__ExpCS__NameAssignment_0_1_1
+            // InternalOCLstdlib.g:16297:1: ( rule__ExpCS__NameAssignment_0_1_1 )
+            // InternalOCLstdlib.g:16297:2: rule__ExpCS__NameAssignment_0_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__NameAssignment_0_1_1();
@@ -48035,14 +48035,14 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2"
-    // InternalOCLstdlib.g:16305:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
+    // InternalOCLstdlib.g:16307:1: rule__ExpCS__Group_0_1__2 : rule__ExpCS__Group_0_1__2__Impl ;
     public final void rule__ExpCS__Group_0_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16309:1: ( rule__ExpCS__Group_0_1__2__Impl )
-            // InternalOCLstdlib.g:16310:2: rule__ExpCS__Group_0_1__2__Impl
+            // InternalOCLstdlib.g:16311:1: ( rule__ExpCS__Group_0_1__2__Impl )
+            // InternalOCLstdlib.g:16312:2: rule__ExpCS__Group_0_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__Group_0_1__2__Impl();
@@ -48068,23 +48068,23 @@
 
 
     // $ANTLR start "rule__ExpCS__Group_0_1__2__Impl"
-    // InternalOCLstdlib.g:16316:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
+    // InternalOCLstdlib.g:16318:1: rule__ExpCS__Group_0_1__2__Impl : ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) ;
     public final void rule__ExpCS__Group_0_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16320:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
-            // InternalOCLstdlib.g:16321:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalOCLstdlib.g:16322:1: ( ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) ) )
+            // InternalOCLstdlib.g:16323:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
             {
-            // InternalOCLstdlib.g:16321:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
-            // InternalOCLstdlib.g:16322:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalOCLstdlib.g:16323:1: ( ( rule__ExpCS__OwnedRightAssignment_0_1_2 ) )
+            // InternalOCLstdlib.g:16324:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightAssignment_0_1_2());
             }
-            // InternalOCLstdlib.g:16323:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
-            // InternalOCLstdlib.g:16323:2: rule__ExpCS__OwnedRightAssignment_0_1_2
+            // InternalOCLstdlib.g:16325:1: ( rule__ExpCS__OwnedRightAssignment_0_1_2 )
+            // InternalOCLstdlib.g:16325:2: rule__ExpCS__OwnedRightAssignment_0_1_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ExpCS__OwnedRightAssignment_0_1_2();
@@ -48119,14 +48119,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0"
-    // InternalOCLstdlib.g:16339:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
+    // InternalOCLstdlib.g:16341:1: rule__PrefixedLetExpCS__Group_0__0 : rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 ;
     public final void rule__PrefixedLetExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16343:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
-            // InternalOCLstdlib.g:16344:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
+            // InternalOCLstdlib.g:16345:1: ( rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1 )
+            // InternalOCLstdlib.g:16346:2: rule__PrefixedLetExpCS__Group_0__0__Impl rule__PrefixedLetExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_78);
             rule__PrefixedLetExpCS__Group_0__0__Impl();
@@ -48157,23 +48157,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:16351:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:16353:1: rule__PrefixedLetExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedLetExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16355:1: ( ( () ) )
-            // InternalOCLstdlib.g:16356:1: ( () )
+            // InternalOCLstdlib.g:16357:1: ( ( () ) )
+            // InternalOCLstdlib.g:16358:1: ( () )
             {
-            // InternalOCLstdlib.g:16356:1: ( () )
-            // InternalOCLstdlib.g:16357:1: ()
+            // InternalOCLstdlib.g:16358:1: ( () )
+            // InternalOCLstdlib.g:16359:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalOCLstdlib.g:16358:1: ()
-            // InternalOCLstdlib.g:16360:1:
+            // InternalOCLstdlib.g:16360:1: ()
+            // InternalOCLstdlib.g:16362:1:
             {
             }
 
@@ -48198,14 +48198,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1"
-    // InternalOCLstdlib.g:16370:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
+    // InternalOCLstdlib.g:16372:1: rule__PrefixedLetExpCS__Group_0__1 : rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 ;
     public final void rule__PrefixedLetExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16374:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
-            // InternalOCLstdlib.g:16375:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
+            // InternalOCLstdlib.g:16376:1: ( rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2 )
+            // InternalOCLstdlib.g:16377:2: rule__PrefixedLetExpCS__Group_0__1__Impl rule__PrefixedLetExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PrefixedLetExpCS__Group_0__1__Impl();
@@ -48236,23 +48236,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:16382:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
+    // InternalOCLstdlib.g:16384:1: rule__PrefixedLetExpCS__Group_0__1__Impl : ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16386:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
-            // InternalOCLstdlib.g:16387:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalOCLstdlib.g:16388:1: ( ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) ) )
+            // InternalOCLstdlib.g:16389:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
             {
-            // InternalOCLstdlib.g:16387:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
-            // InternalOCLstdlib.g:16388:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalOCLstdlib.g:16389:1: ( ( rule__PrefixedLetExpCS__NameAssignment_0_1 ) )
+            // InternalOCLstdlib.g:16390:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalOCLstdlib.g:16389:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
-            // InternalOCLstdlib.g:16389:2: rule__PrefixedLetExpCS__NameAssignment_0_1
+            // InternalOCLstdlib.g:16391:1: ( rule__PrefixedLetExpCS__NameAssignment_0_1 )
+            // InternalOCLstdlib.g:16391:2: rule__PrefixedLetExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__NameAssignment_0_1();
@@ -48287,14 +48287,14 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2"
-    // InternalOCLstdlib.g:16399:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
+    // InternalOCLstdlib.g:16401:1: rule__PrefixedLetExpCS__Group_0__2 : rule__PrefixedLetExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedLetExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16403:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
-            // InternalOCLstdlib.g:16404:2: rule__PrefixedLetExpCS__Group_0__2__Impl
+            // InternalOCLstdlib.g:16405:1: ( rule__PrefixedLetExpCS__Group_0__2__Impl )
+            // InternalOCLstdlib.g:16406:2: rule__PrefixedLetExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__Group_0__2__Impl();
@@ -48320,23 +48320,23 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__Group_0__2__Impl"
-    // InternalOCLstdlib.g:16410:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalOCLstdlib.g:16412:1: rule__PrefixedLetExpCS__Group_0__2__Impl : ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedLetExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16414:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalOCLstdlib.g:16415:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLstdlib.g:16416:1: ( ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalOCLstdlib.g:16417:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalOCLstdlib.g:16415:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalOCLstdlib.g:16416:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLstdlib.g:16417:1: ( ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLstdlib.g:16418:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalOCLstdlib.g:16417:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
-            // InternalOCLstdlib.g:16417:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
+            // InternalOCLstdlib.g:16419:1: ( rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLstdlib.g:16419:2: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedLetExpCS__OwnedRightAssignment_0_2();
@@ -48371,14 +48371,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0"
-    // InternalOCLstdlib.g:16433:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
+    // InternalOCLstdlib.g:16435:1: rule__PrefixedPrimaryExpCS__Group_0__0 : rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16437:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
-            // InternalOCLstdlib.g:16438:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
+            // InternalOCLstdlib.g:16439:1: ( rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1 )
+            // InternalOCLstdlib.g:16440:2: rule__PrefixedPrimaryExpCS__Group_0__0__Impl rule__PrefixedPrimaryExpCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_78);
             rule__PrefixedPrimaryExpCS__Group_0__0__Impl();
@@ -48409,23 +48409,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:16445:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:16447:1: rule__PrefixedPrimaryExpCS__Group_0__0__Impl : ( () ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16449:1: ( ( () ) )
-            // InternalOCLstdlib.g:16450:1: ( () )
+            // InternalOCLstdlib.g:16451:1: ( ( () ) )
+            // InternalOCLstdlib.g:16452:1: ( () )
             {
-            // InternalOCLstdlib.g:16450:1: ( () )
-            // InternalOCLstdlib.g:16451:1: ()
+            // InternalOCLstdlib.g:16452:1: ( () )
+            // InternalOCLstdlib.g:16453:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0());
             }
-            // InternalOCLstdlib.g:16452:1: ()
-            // InternalOCLstdlib.g:16454:1:
+            // InternalOCLstdlib.g:16454:1: ()
+            // InternalOCLstdlib.g:16456:1:
             {
             }
 
@@ -48450,14 +48450,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1"
-    // InternalOCLstdlib.g:16464:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
+    // InternalOCLstdlib.g:16466:1: rule__PrefixedPrimaryExpCS__Group_0__1 : rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16468:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
-            // InternalOCLstdlib.g:16469:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
+            // InternalOCLstdlib.g:16470:1: ( rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2 )
+            // InternalOCLstdlib.g:16471:2: rule__PrefixedPrimaryExpCS__Group_0__1__Impl rule__PrefixedPrimaryExpCS__Group_0__2
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__PrefixedPrimaryExpCS__Group_0__1__Impl();
@@ -48488,23 +48488,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:16476:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
+    // InternalOCLstdlib.g:16478:1: rule__PrefixedPrimaryExpCS__Group_0__1__Impl : ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16480:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
-            // InternalOCLstdlib.g:16481:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalOCLstdlib.g:16482:1: ( ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) ) )
+            // InternalOCLstdlib.g:16483:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
             {
-            // InternalOCLstdlib.g:16481:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
-            // InternalOCLstdlib.g:16482:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalOCLstdlib.g:16483:1: ( ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 ) )
+            // InternalOCLstdlib.g:16484:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameAssignment_0_1());
             }
-            // InternalOCLstdlib.g:16483:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
-            // InternalOCLstdlib.g:16483:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
+            // InternalOCLstdlib.g:16485:1: ( rule__PrefixedPrimaryExpCS__NameAssignment_0_1 )
+            // InternalOCLstdlib.g:16485:2: rule__PrefixedPrimaryExpCS__NameAssignment_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__NameAssignment_0_1();
@@ -48539,14 +48539,14 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2"
-    // InternalOCLstdlib.g:16493:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
+    // InternalOCLstdlib.g:16495:1: rule__PrefixedPrimaryExpCS__Group_0__2 : rule__PrefixedPrimaryExpCS__Group_0__2__Impl ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16497:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
-            // InternalOCLstdlib.g:16498:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
+            // InternalOCLstdlib.g:16499:1: ( rule__PrefixedPrimaryExpCS__Group_0__2__Impl )
+            // InternalOCLstdlib.g:16500:2: rule__PrefixedPrimaryExpCS__Group_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__Group_0__2__Impl();
@@ -48572,23 +48572,23 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__Group_0__2__Impl"
-    // InternalOCLstdlib.g:16504:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
+    // InternalOCLstdlib.g:16506:1: rule__PrefixedPrimaryExpCS__Group_0__2__Impl : ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) ;
     public final void rule__PrefixedPrimaryExpCS__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16508:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
-            // InternalOCLstdlib.g:16509:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLstdlib.g:16510:1: ( ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) ) )
+            // InternalOCLstdlib.g:16511:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
             {
-            // InternalOCLstdlib.g:16509:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
-            // InternalOCLstdlib.g:16510:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLstdlib.g:16511:1: ( ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 ) )
+            // InternalOCLstdlib.g:16512:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightAssignment_0_2());
             }
-            // InternalOCLstdlib.g:16511:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
-            // InternalOCLstdlib.g:16511:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
+            // InternalOCLstdlib.g:16513:1: ( rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 )
+            // InternalOCLstdlib.g:16513:2: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2();
@@ -48623,14 +48623,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0"
-    // InternalOCLstdlib.g:16527:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
+    // InternalOCLstdlib.g:16529:1: rule__NameExpCS__Group__0 : rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 ;
     public final void rule__NameExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16531:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
-            // InternalOCLstdlib.g:16532:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
+            // InternalOCLstdlib.g:16533:1: ( rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1 )
+            // InternalOCLstdlib.g:16534:2: rule__NameExpCS__Group__0__Impl rule__NameExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__NameExpCS__Group__0__Impl();
@@ -48661,23 +48661,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:16539:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:16541:1: rule__NameExpCS__Group__0__Impl : ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) ;
     public final void rule__NameExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16543:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:16544:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLstdlib.g:16545:1: ( ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:16546:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:16544:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
-            // InternalOCLstdlib.g:16545:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLstdlib.g:16546:1: ( ( rule__NameExpCS__OwnedPathNameAssignment_0 ) )
+            // InternalOCLstdlib.g:16547:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNameAssignment_0());
             }
-            // InternalOCLstdlib.g:16546:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
-            // InternalOCLstdlib.g:16546:2: rule__NameExpCS__OwnedPathNameAssignment_0
+            // InternalOCLstdlib.g:16548:1: ( rule__NameExpCS__OwnedPathNameAssignment_0 )
+            // InternalOCLstdlib.g:16548:2: rule__NameExpCS__OwnedPathNameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__OwnedPathNameAssignment_0();
@@ -48712,14 +48712,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1"
-    // InternalOCLstdlib.g:16556:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
+    // InternalOCLstdlib.g:16558:1: rule__NameExpCS__Group__1 : rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 ;
     public final void rule__NameExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16560:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
-            // InternalOCLstdlib.g:16561:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
+            // InternalOCLstdlib.g:16562:1: ( rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2 )
+            // InternalOCLstdlib.g:16563:2: rule__NameExpCS__Group__1__Impl rule__NameExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__NameExpCS__Group__1__Impl();
@@ -48750,22 +48750,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:16568:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
+    // InternalOCLstdlib.g:16570:1: rule__NameExpCS__Group__1__Impl : ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) ;
     public final void rule__NameExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16572:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
-            // InternalOCLstdlib.g:16573:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalOCLstdlib.g:16574:1: ( ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* ) )
+            // InternalOCLstdlib.g:16575:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
             {
-            // InternalOCLstdlib.g:16573:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
-            // InternalOCLstdlib.g:16574:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalOCLstdlib.g:16575:1: ( ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )* )
+            // InternalOCLstdlib.g:16576:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesAssignment_1());
             }
-            // InternalOCLstdlib.g:16575:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
+            // InternalOCLstdlib.g:16577:1: ( rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 )*
             loop138:
             do {
                 int alt138=2;
@@ -48778,7 +48778,7 @@
 
                 switch (alt138) {
             	case 1 :
-            	    // InternalOCLstdlib.g:16575:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
+            	    // InternalOCLstdlib.g:16577:2: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_80);
             	    rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1();
@@ -48819,14 +48819,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2"
-    // InternalOCLstdlib.g:16585:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
+    // InternalOCLstdlib.g:16587:1: rule__NameExpCS__Group__2 : rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 ;
     public final void rule__NameExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16589:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
-            // InternalOCLstdlib.g:16590:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
+            // InternalOCLstdlib.g:16591:1: ( rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3 )
+            // InternalOCLstdlib.g:16592:2: rule__NameExpCS__Group__2__Impl rule__NameExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__NameExpCS__Group__2__Impl();
@@ -48857,22 +48857,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:16597:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
+    // InternalOCLstdlib.g:16599:1: rule__NameExpCS__Group__2__Impl : ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) ;
     public final void rule__NameExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16601:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
-            // InternalOCLstdlib.g:16602:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalOCLstdlib.g:16603:1: ( ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? ) )
+            // InternalOCLstdlib.g:16604:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
             {
-            // InternalOCLstdlib.g:16602:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
-            // InternalOCLstdlib.g:16603:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalOCLstdlib.g:16604:1: ( ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )? )
+            // InternalOCLstdlib.g:16605:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseAssignment_2());
             }
-            // InternalOCLstdlib.g:16604:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
+            // InternalOCLstdlib.g:16606:1: ( rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 )?
             int alt139=2;
             int LA139_0 = input.LA(1);
 
@@ -48881,7 +48881,7 @@
             }
             switch (alt139) {
                 case 1 :
-                    // InternalOCLstdlib.g:16604:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
+                    // InternalOCLstdlib.g:16606:2: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2();
@@ -48919,14 +48919,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3"
-    // InternalOCLstdlib.g:16614:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
+    // InternalOCLstdlib.g:16616:1: rule__NameExpCS__Group__3 : rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 ;
     public final void rule__NameExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16618:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
-            // InternalOCLstdlib.g:16619:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
+            // InternalOCLstdlib.g:16620:1: ( rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4 )
+            // InternalOCLstdlib.g:16621:2: rule__NameExpCS__Group__3__Impl rule__NameExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_79);
             rule__NameExpCS__Group__3__Impl();
@@ -48957,22 +48957,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:16626:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
+    // InternalOCLstdlib.g:16628:1: rule__NameExpCS__Group__3__Impl : ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) ;
     public final void rule__NameExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16630:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
-            // InternalOCLstdlib.g:16631:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalOCLstdlib.g:16632:1: ( ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? ) )
+            // InternalOCLstdlib.g:16633:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
             {
-            // InternalOCLstdlib.g:16631:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
-            // InternalOCLstdlib.g:16632:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalOCLstdlib.g:16633:1: ( ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )? )
+            // InternalOCLstdlib.g:16634:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseAssignment_3());
             }
-            // InternalOCLstdlib.g:16633:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
+            // InternalOCLstdlib.g:16635:1: ( rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 )?
             int alt140=2;
             int LA140_0 = input.LA(1);
 
@@ -48981,7 +48981,7 @@
             }
             switch (alt140) {
                 case 1 :
-                    // InternalOCLstdlib.g:16633:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
+                    // InternalOCLstdlib.g:16635:2: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3();
@@ -49019,14 +49019,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4"
-    // InternalOCLstdlib.g:16643:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:16645:1: rule__NameExpCS__Group__4 : rule__NameExpCS__Group__4__Impl ;
     public final void rule__NameExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16647:1: ( rule__NameExpCS__Group__4__Impl )
-            // InternalOCLstdlib.g:16648:2: rule__NameExpCS__Group__4__Impl
+            // InternalOCLstdlib.g:16649:1: ( rule__NameExpCS__Group__4__Impl )
+            // InternalOCLstdlib.g:16650:2: rule__NameExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group__4__Impl();
@@ -49052,22 +49052,22 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group__4__Impl"
-    // InternalOCLstdlib.g:16654:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
+    // InternalOCLstdlib.g:16656:1: rule__NameExpCS__Group__4__Impl : ( ( rule__NameExpCS__Group_4__0 )? ) ;
     public final void rule__NameExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16658:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
-            // InternalOCLstdlib.g:16659:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalOCLstdlib.g:16660:1: ( ( ( rule__NameExpCS__Group_4__0 )? ) )
+            // InternalOCLstdlib.g:16661:1: ( ( rule__NameExpCS__Group_4__0 )? )
             {
-            // InternalOCLstdlib.g:16659:1: ( ( rule__NameExpCS__Group_4__0 )? )
-            // InternalOCLstdlib.g:16660:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalOCLstdlib.g:16661:1: ( ( rule__NameExpCS__Group_4__0 )? )
+            // InternalOCLstdlib.g:16662:1: ( rule__NameExpCS__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getGroup_4());
             }
-            // InternalOCLstdlib.g:16661:1: ( rule__NameExpCS__Group_4__0 )?
+            // InternalOCLstdlib.g:16663:1: ( rule__NameExpCS__Group_4__0 )?
             int alt141=2;
             int LA141_0 = input.LA(1);
 
@@ -49076,7 +49076,7 @@
             }
             switch (alt141) {
                 case 1 :
-                    // InternalOCLstdlib.g:16661:2: rule__NameExpCS__Group_4__0
+                    // InternalOCLstdlib.g:16663:2: rule__NameExpCS__Group_4__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NameExpCS__Group_4__0();
@@ -49114,14 +49114,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0"
-    // InternalOCLstdlib.g:16681:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
+    // InternalOCLstdlib.g:16683:1: rule__NameExpCS__Group_4__0 : rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 ;
     public final void rule__NameExpCS__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16685:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
-            // InternalOCLstdlib.g:16686:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
+            // InternalOCLstdlib.g:16687:1: ( rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1 )
+            // InternalOCLstdlib.g:16688:2: rule__NameExpCS__Group_4__0__Impl rule__NameExpCS__Group_4__1
             {
             pushFollow(FollowSets000.FOLLOW_81);
             rule__NameExpCS__Group_4__0__Impl();
@@ -49152,23 +49152,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__0__Impl"
-    // InternalOCLstdlib.g:16693:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
+    // InternalOCLstdlib.g:16695:1: rule__NameExpCS__Group_4__0__Impl : ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) ;
     public final void rule__NameExpCS__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16697:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
-            // InternalOCLstdlib.g:16698:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalOCLstdlib.g:16699:1: ( ( ( rule__NameExpCS__IsPreAssignment_4_0 ) ) )
+            // InternalOCLstdlib.g:16700:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
             {
-            // InternalOCLstdlib.g:16698:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
-            // InternalOCLstdlib.g:16699:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalOCLstdlib.g:16700:1: ( ( rule__NameExpCS__IsPreAssignment_4_0 ) )
+            // InternalOCLstdlib.g:16701:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreAssignment_4_0());
             }
-            // InternalOCLstdlib.g:16700:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
-            // InternalOCLstdlib.g:16700:2: rule__NameExpCS__IsPreAssignment_4_0
+            // InternalOCLstdlib.g:16702:1: ( rule__NameExpCS__IsPreAssignment_4_0 )
+            // InternalOCLstdlib.g:16702:2: rule__NameExpCS__IsPreAssignment_4_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__IsPreAssignment_4_0();
@@ -49203,14 +49203,14 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1"
-    // InternalOCLstdlib.g:16710:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
+    // InternalOCLstdlib.g:16712:1: rule__NameExpCS__Group_4__1 : rule__NameExpCS__Group_4__1__Impl ;
     public final void rule__NameExpCS__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16714:1: ( rule__NameExpCS__Group_4__1__Impl )
-            // InternalOCLstdlib.g:16715:2: rule__NameExpCS__Group_4__1__Impl
+            // InternalOCLstdlib.g:16716:1: ( rule__NameExpCS__Group_4__1__Impl )
+            // InternalOCLstdlib.g:16717:2: rule__NameExpCS__Group_4__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NameExpCS__Group_4__1__Impl();
@@ -49236,17 +49236,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__Group_4__1__Impl"
-    // InternalOCLstdlib.g:16721:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
+    // InternalOCLstdlib.g:16723:1: rule__NameExpCS__Group_4__1__Impl : ( 'pre' ) ;
     public final void rule__NameExpCS__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16725:1: ( ( 'pre' ) )
-            // InternalOCLstdlib.g:16726:1: ( 'pre' )
+            // InternalOCLstdlib.g:16727:1: ( ( 'pre' ) )
+            // InternalOCLstdlib.g:16728:1: ( 'pre' )
             {
-            // InternalOCLstdlib.g:16726:1: ( 'pre' )
-            // InternalOCLstdlib.g:16727:1: 'pre'
+            // InternalOCLstdlib.g:16728:1: ( 'pre' )
+            // InternalOCLstdlib.g:16729:1: 'pre'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());
@@ -49277,14 +49277,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0"
-    // InternalOCLstdlib.g:16744:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
+    // InternalOCLstdlib.g:16746:1: rule__CurlyBracketedClauseCS__Group__0 : rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 ;
     public final void rule__CurlyBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16748:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
-            // InternalOCLstdlib.g:16749:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
+            // InternalOCLstdlib.g:16750:1: ( rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1 )
+            // InternalOCLstdlib.g:16751:2: rule__CurlyBracketedClauseCS__Group__0__Impl rule__CurlyBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_65);
             rule__CurlyBracketedClauseCS__Group__0__Impl();
@@ -49315,23 +49315,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__0__Impl"
-    // InternalOCLstdlib.g:16756:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:16758:1: rule__CurlyBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__CurlyBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16760:1: ( ( () ) )
-            // InternalOCLstdlib.g:16761:1: ( () )
+            // InternalOCLstdlib.g:16762:1: ( ( () ) )
+            // InternalOCLstdlib.g:16763:1: ( () )
             {
-            // InternalOCLstdlib.g:16761:1: ( () )
-            // InternalOCLstdlib.g:16762:1: ()
+            // InternalOCLstdlib.g:16763:1: ( () )
+            // InternalOCLstdlib.g:16764:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0());
             }
-            // InternalOCLstdlib.g:16763:1: ()
-            // InternalOCLstdlib.g:16765:1:
+            // InternalOCLstdlib.g:16765:1: ()
+            // InternalOCLstdlib.g:16767:1:
             {
             }
 
@@ -49356,14 +49356,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1"
-    // InternalOCLstdlib.g:16775:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
+    // InternalOCLstdlib.g:16777:1: rule__CurlyBracketedClauseCS__Group__1 : rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 ;
     public final void rule__CurlyBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16779:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
-            // InternalOCLstdlib.g:16780:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
+            // InternalOCLstdlib.g:16781:1: ( rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2 )
+            // InternalOCLstdlib.g:16782:2: rule__CurlyBracketedClauseCS__Group__1__Impl rule__CurlyBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_82);
             rule__CurlyBracketedClauseCS__Group__1__Impl();
@@ -49394,17 +49394,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__1__Impl"
-    // InternalOCLstdlib.g:16787:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
+    // InternalOCLstdlib.g:16789:1: rule__CurlyBracketedClauseCS__Group__1__Impl : ( '{' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16791:1: ( ( '{' ) )
-            // InternalOCLstdlib.g:16792:1: ( '{' )
+            // InternalOCLstdlib.g:16793:1: ( ( '{' ) )
+            // InternalOCLstdlib.g:16794:1: ( '{' )
             {
-            // InternalOCLstdlib.g:16792:1: ( '{' )
-            // InternalOCLstdlib.g:16793:1: '{'
+            // InternalOCLstdlib.g:16794:1: ( '{' )
+            // InternalOCLstdlib.g:16795:1: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());
@@ -49435,14 +49435,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2"
-    // InternalOCLstdlib.g:16806:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
+    // InternalOCLstdlib.g:16808:1: rule__CurlyBracketedClauseCS__Group__2 : rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 ;
     public final void rule__CurlyBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16810:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
-            // InternalOCLstdlib.g:16811:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
+            // InternalOCLstdlib.g:16812:1: ( rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3 )
+            // InternalOCLstdlib.g:16813:2: rule__CurlyBracketedClauseCS__Group__2__Impl rule__CurlyBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_82);
             rule__CurlyBracketedClauseCS__Group__2__Impl();
@@ -49473,22 +49473,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__2__Impl"
-    // InternalOCLstdlib.g:16818:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:16820:1: rule__CurlyBracketedClauseCS__Group__2__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__CurlyBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16822:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:16823:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:16824:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:16825:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:16823:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:16824:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalOCLstdlib.g:16825:1: ( ( rule__CurlyBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:16826:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:16825:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
+            // InternalOCLstdlib.g:16827:1: ( rule__CurlyBracketedClauseCS__Group_2__0 )?
             int alt142=2;
             int LA142_0 = input.LA(1);
 
@@ -49497,7 +49497,7 @@
             }
             switch (alt142) {
                 case 1 :
-                    // InternalOCLstdlib.g:16825:2: rule__CurlyBracketedClauseCS__Group_2__0
+                    // InternalOCLstdlib.g:16827:2: rule__CurlyBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CurlyBracketedClauseCS__Group_2__0();
@@ -49535,14 +49535,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3"
-    // InternalOCLstdlib.g:16835:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:16837:1: rule__CurlyBracketedClauseCS__Group__3 : rule__CurlyBracketedClauseCS__Group__3__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16839:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
-            // InternalOCLstdlib.g:16840:2: rule__CurlyBracketedClauseCS__Group__3__Impl
+            // InternalOCLstdlib.g:16841:1: ( rule__CurlyBracketedClauseCS__Group__3__Impl )
+            // InternalOCLstdlib.g:16842:2: rule__CurlyBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group__3__Impl();
@@ -49568,17 +49568,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group__3__Impl"
-    // InternalOCLstdlib.g:16846:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
+    // InternalOCLstdlib.g:16848:1: rule__CurlyBracketedClauseCS__Group__3__Impl : ( '}' ) ;
     public final void rule__CurlyBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16850:1: ( ( '}' ) )
-            // InternalOCLstdlib.g:16851:1: ( '}' )
+            // InternalOCLstdlib.g:16852:1: ( ( '}' ) )
+            // InternalOCLstdlib.g:16853:1: ( '}' )
             {
-            // InternalOCLstdlib.g:16851:1: ( '}' )
-            // InternalOCLstdlib.g:16852:1: '}'
+            // InternalOCLstdlib.g:16853:1: ( '}' )
+            // InternalOCLstdlib.g:16854:1: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());
@@ -49609,14 +49609,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0"
-    // InternalOCLstdlib.g:16873:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
+    // InternalOCLstdlib.g:16875:1: rule__CurlyBracketedClauseCS__Group_2__0 : rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16877:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
-            // InternalOCLstdlib.g:16878:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
+            // InternalOCLstdlib.g:16879:1: ( rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1 )
+            // InternalOCLstdlib.g:16880:2: rule__CurlyBracketedClauseCS__Group_2__0__Impl rule__CurlyBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_25);
             rule__CurlyBracketedClauseCS__Group_2__0__Impl();
@@ -49647,23 +49647,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:16885:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
+    // InternalOCLstdlib.g:16887:1: rule__CurlyBracketedClauseCS__Group_2__0__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16889:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
-            // InternalOCLstdlib.g:16890:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:16891:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) ) )
+            // InternalOCLstdlib.g:16892:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
             {
-            // InternalOCLstdlib.g:16890:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
-            // InternalOCLstdlib.g:16891:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:16892:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:16893:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_0());
             }
-            // InternalOCLstdlib.g:16892:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
-            // InternalOCLstdlib.g:16892:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
+            // InternalOCLstdlib.g:16894:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 )
+            // InternalOCLstdlib.g:16894:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0();
@@ -49698,14 +49698,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1"
-    // InternalOCLstdlib.g:16902:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:16904:1: rule__CurlyBracketedClauseCS__Group_2__1 : rule__CurlyBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16906:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:16907:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:16908:1: ( rule__CurlyBracketedClauseCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:16909:2: rule__CurlyBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2__1__Impl();
@@ -49731,22 +49731,22 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:16913:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
+    // InternalOCLstdlib.g:16915:1: rule__CurlyBracketedClauseCS__Group_2__1__Impl : ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16917:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
-            // InternalOCLstdlib.g:16918:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:16919:1: ( ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* ) )
+            // InternalOCLstdlib.g:16920:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
             {
-            // InternalOCLstdlib.g:16918:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
-            // InternalOCLstdlib.g:16919:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:16920:1: ( ( rule__CurlyBracketedClauseCS__Group_2_1__0 )* )
+            // InternalOCLstdlib.g:16921:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getGroup_2_1());
             }
-            // InternalOCLstdlib.g:16920:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
+            // InternalOCLstdlib.g:16922:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0 )*
             loop143:
             do {
                 int alt143=2;
@@ -49759,7 +49759,7 @@
 
                 switch (alt143) {
             	case 1 :
-            	    // InternalOCLstdlib.g:16920:2: rule__CurlyBracketedClauseCS__Group_2_1__0
+            	    // InternalOCLstdlib.g:16922:2: rule__CurlyBracketedClauseCS__Group_2_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__CurlyBracketedClauseCS__Group_2_1__0();
@@ -49800,14 +49800,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0"
-    // InternalOCLstdlib.g:16934:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
+    // InternalOCLstdlib.g:16936:1: rule__CurlyBracketedClauseCS__Group_2_1__0 : rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16938:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
-            // InternalOCLstdlib.g:16939:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
+            // InternalOCLstdlib.g:16940:1: ( rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1 )
+            // InternalOCLstdlib.g:16941:2: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl rule__CurlyBracketedClauseCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_13);
             rule__CurlyBracketedClauseCS__Group_2_1__0__Impl();
@@ -49838,17 +49838,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__0__Impl"
-    // InternalOCLstdlib.g:16946:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:16948:1: rule__CurlyBracketedClauseCS__Group_2_1__0__Impl : ( ',' ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16950:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:16951:1: ( ',' )
+            // InternalOCLstdlib.g:16952:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:16953:1: ( ',' )
             {
-            // InternalOCLstdlib.g:16951:1: ( ',' )
-            // InternalOCLstdlib.g:16952:1: ','
+            // InternalOCLstdlib.g:16953:1: ( ',' )
+            // InternalOCLstdlib.g:16954:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());
@@ -49879,14 +49879,14 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1"
-    // InternalOCLstdlib.g:16965:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
+    // InternalOCLstdlib.g:16967:1: rule__CurlyBracketedClauseCS__Group_2_1__1 : rule__CurlyBracketedClauseCS__Group_2_1__1__Impl ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16969:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
-            // InternalOCLstdlib.g:16970:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
+            // InternalOCLstdlib.g:16971:1: ( rule__CurlyBracketedClauseCS__Group_2_1__1__Impl )
+            // InternalOCLstdlib.g:16972:2: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__Group_2_1__1__Impl();
@@ -49912,23 +49912,23 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__Group_2_1__1__Impl"
-    // InternalOCLstdlib.g:16976:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:16978:1: rule__CurlyBracketedClauseCS__Group_2_1__1__Impl : ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) ;
     public final void rule__CurlyBracketedClauseCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:16980:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
-            // InternalOCLstdlib.g:16981:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:16982:1: ( ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) ) )
+            // InternalOCLstdlib.g:16983:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:16981:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
-            // InternalOCLstdlib.g:16982:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:16983:1: ( ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:16984:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsAssignment_2_1_1());
             }
-            // InternalOCLstdlib.g:16983:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
-            // InternalOCLstdlib.g:16983:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
+            // InternalOCLstdlib.g:16985:1: ( rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 )
+            // InternalOCLstdlib.g:16985:2: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1();
@@ -49963,14 +49963,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0"
-    // InternalOCLstdlib.g:16997:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
+    // InternalOCLstdlib.g:16999:1: rule__RoundBracketedClauseCS__Group__0 : rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 ;
     public final void rule__RoundBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17001:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
-            // InternalOCLstdlib.g:17002:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
+            // InternalOCLstdlib.g:17003:1: ( rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1 )
+            // InternalOCLstdlib.g:17004:2: rule__RoundBracketedClauseCS__Group__0__Impl rule__RoundBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_33);
             rule__RoundBracketedClauseCS__Group__0__Impl();
@@ -50001,23 +50001,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__0__Impl"
-    // InternalOCLstdlib.g:17009:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:17011:1: rule__RoundBracketedClauseCS__Group__0__Impl : ( () ) ;
     public final void rule__RoundBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17013:1: ( ( () ) )
-            // InternalOCLstdlib.g:17014:1: ( () )
+            // InternalOCLstdlib.g:17015:1: ( ( () ) )
+            // InternalOCLstdlib.g:17016:1: ( () )
             {
-            // InternalOCLstdlib.g:17014:1: ( () )
-            // InternalOCLstdlib.g:17015:1: ()
+            // InternalOCLstdlib.g:17016:1: ( () )
+            // InternalOCLstdlib.g:17017:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0());
             }
-            // InternalOCLstdlib.g:17016:1: ()
-            // InternalOCLstdlib.g:17018:1:
+            // InternalOCLstdlib.g:17018:1: ()
+            // InternalOCLstdlib.g:17020:1:
             {
             }
 
@@ -50042,14 +50042,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1"
-    // InternalOCLstdlib.g:17028:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
+    // InternalOCLstdlib.g:17030:1: rule__RoundBracketedClauseCS__Group__1 : rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 ;
     public final void rule__RoundBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17032:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
-            // InternalOCLstdlib.g:17033:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
+            // InternalOCLstdlib.g:17034:1: ( rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2 )
+            // InternalOCLstdlib.g:17035:2: rule__RoundBracketedClauseCS__Group__1__Impl rule__RoundBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_83);
             rule__RoundBracketedClauseCS__Group__1__Impl();
@@ -50080,17 +50080,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__1__Impl"
-    // InternalOCLstdlib.g:17040:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:17042:1: rule__RoundBracketedClauseCS__Group__1__Impl : ( '(' ) ;
     public final void rule__RoundBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17044:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:17045:1: ( '(' )
+            // InternalOCLstdlib.g:17046:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:17047:1: ( '(' )
             {
-            // InternalOCLstdlib.g:17045:1: ( '(' )
-            // InternalOCLstdlib.g:17046:1: '('
+            // InternalOCLstdlib.g:17047:1: ( '(' )
+            // InternalOCLstdlib.g:17048:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());
@@ -50121,14 +50121,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2"
-    // InternalOCLstdlib.g:17059:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
+    // InternalOCLstdlib.g:17061:1: rule__RoundBracketedClauseCS__Group__2 : rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 ;
     public final void rule__RoundBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17063:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
-            // InternalOCLstdlib.g:17064:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
+            // InternalOCLstdlib.g:17065:1: ( rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3 )
+            // InternalOCLstdlib.g:17066:2: rule__RoundBracketedClauseCS__Group__2__Impl rule__RoundBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_83);
             rule__RoundBracketedClauseCS__Group__2__Impl();
@@ -50159,22 +50159,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__2__Impl"
-    // InternalOCLstdlib.g:17071:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:17073:1: rule__RoundBracketedClauseCS__Group__2__Impl : ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) ;
     public final void rule__RoundBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17075:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:17076:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:17077:1: ( ( ( rule__RoundBracketedClauseCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:17078:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:17076:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:17077:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalOCLstdlib.g:17078:1: ( ( rule__RoundBracketedClauseCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:17079:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:17078:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
+            // InternalOCLstdlib.g:17080:1: ( rule__RoundBracketedClauseCS__Group_2__0 )?
             int alt144=2;
             int LA144_0 = input.LA(1);
 
@@ -50183,7 +50183,7 @@
             }
             switch (alt144) {
                 case 1 :
-                    // InternalOCLstdlib.g:17078:2: rule__RoundBracketedClauseCS__Group_2__0
+                    // InternalOCLstdlib.g:17080:2: rule__RoundBracketedClauseCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__RoundBracketedClauseCS__Group_2__0();
@@ -50221,14 +50221,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3"
-    // InternalOCLstdlib.g:17088:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:17090:1: rule__RoundBracketedClauseCS__Group__3 : rule__RoundBracketedClauseCS__Group__3__Impl ;
     public final void rule__RoundBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17092:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
-            // InternalOCLstdlib.g:17093:2: rule__RoundBracketedClauseCS__Group__3__Impl
+            // InternalOCLstdlib.g:17094:1: ( rule__RoundBracketedClauseCS__Group__3__Impl )
+            // InternalOCLstdlib.g:17095:2: rule__RoundBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group__3__Impl();
@@ -50254,17 +50254,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group__3__Impl"
-    // InternalOCLstdlib.g:17099:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:17101:1: rule__RoundBracketedClauseCS__Group__3__Impl : ( ')' ) ;
     public final void rule__RoundBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17103:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:17104:1: ( ')' )
+            // InternalOCLstdlib.g:17105:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:17106:1: ( ')' )
             {
-            // InternalOCLstdlib.g:17104:1: ( ')' )
-            // InternalOCLstdlib.g:17105:1: ')'
+            // InternalOCLstdlib.g:17106:1: ( ')' )
+            // InternalOCLstdlib.g:17107:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());
@@ -50295,14 +50295,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0"
-    // InternalOCLstdlib.g:17126:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
+    // InternalOCLstdlib.g:17128:1: rule__RoundBracketedClauseCS__Group_2__0 : rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 ;
     public final void rule__RoundBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17130:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
-            // InternalOCLstdlib.g:17131:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
+            // InternalOCLstdlib.g:17132:1: ( rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1 )
+            // InternalOCLstdlib.g:17133:2: rule__RoundBracketedClauseCS__Group_2__0__Impl rule__RoundBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_84);
             rule__RoundBracketedClauseCS__Group_2__0__Impl();
@@ -50333,23 +50333,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:17138:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
+    // InternalOCLstdlib.g:17140:1: rule__RoundBracketedClauseCS__Group_2__0__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17142:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
-            // InternalOCLstdlib.g:17143:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:17144:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) ) )
+            // InternalOCLstdlib.g:17145:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
             {
-            // InternalOCLstdlib.g:17143:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
-            // InternalOCLstdlib.g:17144:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalOCLstdlib.g:17145:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 ) )
+            // InternalOCLstdlib.g:17146:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_0());
             }
-            // InternalOCLstdlib.g:17145:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
-            // InternalOCLstdlib.g:17145:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
+            // InternalOCLstdlib.g:17147:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 )
+            // InternalOCLstdlib.g:17147:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0();
@@ -50384,14 +50384,14 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1"
-    // InternalOCLstdlib.g:17155:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:17157:1: rule__RoundBracketedClauseCS__Group_2__1 : rule__RoundBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__RoundBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17159:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:17160:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:17161:1: ( rule__RoundBracketedClauseCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:17162:2: rule__RoundBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__Group_2__1__Impl();
@@ -50417,22 +50417,22 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:17166:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
+    // InternalOCLstdlib.g:17168:1: rule__RoundBracketedClauseCS__Group_2__1__Impl : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) ;
     public final void rule__RoundBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17170:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
-            // InternalOCLstdlib.g:17171:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalOCLstdlib.g:17172:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* ) )
+            // InternalOCLstdlib.g:17173:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
             {
-            // InternalOCLstdlib.g:17171:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
-            // InternalOCLstdlib.g:17172:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalOCLstdlib.g:17173:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )* )
+            // InternalOCLstdlib.g:17174:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAssignment_2_1());
             }
-            // InternalOCLstdlib.g:17173:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
+            // InternalOCLstdlib.g:17175:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 )*
             loop145:
             do {
                 int alt145=2;
@@ -50445,7 +50445,7 @@
 
                 switch (alt145) {
             	case 1 :
-            	    // InternalOCLstdlib.g:17173:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
+            	    // InternalOCLstdlib.g:17175:2: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1
             	    {
             	    pushFollow(FollowSets000.FOLLOW_85);
             	    rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1();
@@ -50486,14 +50486,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0"
-    // InternalOCLstdlib.g:17187:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
+    // InternalOCLstdlib.g:17189:1: rule__SquareBracketedClauseCS__Group__0 : rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 ;
     public final void rule__SquareBracketedClauseCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17191:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
-            // InternalOCLstdlib.g:17192:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
+            // InternalOCLstdlib.g:17193:1: ( rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1 )
+            // InternalOCLstdlib.g:17194:2: rule__SquareBracketedClauseCS__Group__0__Impl rule__SquareBracketedClauseCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__SquareBracketedClauseCS__Group__0__Impl();
@@ -50524,17 +50524,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__0__Impl"
-    // InternalOCLstdlib.g:17199:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
+    // InternalOCLstdlib.g:17201:1: rule__SquareBracketedClauseCS__Group__0__Impl : ( '[' ) ;
     public final void rule__SquareBracketedClauseCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17203:1: ( ( '[' ) )
-            // InternalOCLstdlib.g:17204:1: ( '[' )
+            // InternalOCLstdlib.g:17205:1: ( ( '[' ) )
+            // InternalOCLstdlib.g:17206:1: ( '[' )
             {
-            // InternalOCLstdlib.g:17204:1: ( '[' )
-            // InternalOCLstdlib.g:17205:1: '['
+            // InternalOCLstdlib.g:17206:1: ( '[' )
+            // InternalOCLstdlib.g:17207:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());
@@ -50565,14 +50565,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1"
-    // InternalOCLstdlib.g:17218:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
+    // InternalOCLstdlib.g:17220:1: rule__SquareBracketedClauseCS__Group__1 : rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 ;
     public final void rule__SquareBracketedClauseCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17222:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
-            // InternalOCLstdlib.g:17223:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
+            // InternalOCLstdlib.g:17224:1: ( rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2 )
+            // InternalOCLstdlib.g:17225:2: rule__SquareBracketedClauseCS__Group__1__Impl rule__SquareBracketedClauseCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_86);
             rule__SquareBracketedClauseCS__Group__1__Impl();
@@ -50603,23 +50603,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__1__Impl"
-    // InternalOCLstdlib.g:17230:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:17232:1: rule__SquareBracketedClauseCS__Group__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17234:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
-            // InternalOCLstdlib.g:17235:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalOCLstdlib.g:17236:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) ) )
+            // InternalOCLstdlib.g:17237:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:17235:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
-            // InternalOCLstdlib.g:17236:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalOCLstdlib.g:17237:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 ) )
+            // InternalOCLstdlib.g:17238:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_1());
             }
-            // InternalOCLstdlib.g:17237:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
-            // InternalOCLstdlib.g:17237:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
+            // InternalOCLstdlib.g:17239:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 )
+            // InternalOCLstdlib.g:17239:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_1();
@@ -50654,14 +50654,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2"
-    // InternalOCLstdlib.g:17247:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
+    // InternalOCLstdlib.g:17249:1: rule__SquareBracketedClauseCS__Group__2 : rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 ;
     public final void rule__SquareBracketedClauseCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17251:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
-            // InternalOCLstdlib.g:17252:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
+            // InternalOCLstdlib.g:17253:1: ( rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3 )
+            // InternalOCLstdlib.g:17254:2: rule__SquareBracketedClauseCS__Group__2__Impl rule__SquareBracketedClauseCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_86);
             rule__SquareBracketedClauseCS__Group__2__Impl();
@@ -50692,22 +50692,22 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__2__Impl"
-    // InternalOCLstdlib.g:17259:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
+    // InternalOCLstdlib.g:17261:1: rule__SquareBracketedClauseCS__Group__2__Impl : ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) ;
     public final void rule__SquareBracketedClauseCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17263:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
-            // InternalOCLstdlib.g:17264:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalOCLstdlib.g:17265:1: ( ( ( rule__SquareBracketedClauseCS__Group_2__0 )* ) )
+            // InternalOCLstdlib.g:17266:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
             {
-            // InternalOCLstdlib.g:17264:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
-            // InternalOCLstdlib.g:17265:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalOCLstdlib.g:17266:1: ( ( rule__SquareBracketedClauseCS__Group_2__0 )* )
+            // InternalOCLstdlib.g:17267:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:17266:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
+            // InternalOCLstdlib.g:17268:1: ( rule__SquareBracketedClauseCS__Group_2__0 )*
             loop146:
             do {
                 int alt146=2;
@@ -50720,7 +50720,7 @@
 
                 switch (alt146) {
             	case 1 :
-            	    // InternalOCLstdlib.g:17266:2: rule__SquareBracketedClauseCS__Group_2__0
+            	    // InternalOCLstdlib.g:17268:2: rule__SquareBracketedClauseCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__SquareBracketedClauseCS__Group_2__0();
@@ -50761,14 +50761,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3"
-    // InternalOCLstdlib.g:17276:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:17278:1: rule__SquareBracketedClauseCS__Group__3 : rule__SquareBracketedClauseCS__Group__3__Impl ;
     public final void rule__SquareBracketedClauseCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17280:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
-            // InternalOCLstdlib.g:17281:2: rule__SquareBracketedClauseCS__Group__3__Impl
+            // InternalOCLstdlib.g:17282:1: ( rule__SquareBracketedClauseCS__Group__3__Impl )
+            // InternalOCLstdlib.g:17283:2: rule__SquareBracketedClauseCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group__3__Impl();
@@ -50794,17 +50794,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group__3__Impl"
-    // InternalOCLstdlib.g:17287:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
+    // InternalOCLstdlib.g:17289:1: rule__SquareBracketedClauseCS__Group__3__Impl : ( ']' ) ;
     public final void rule__SquareBracketedClauseCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17291:1: ( ( ']' ) )
-            // InternalOCLstdlib.g:17292:1: ( ']' )
+            // InternalOCLstdlib.g:17293:1: ( ( ']' ) )
+            // InternalOCLstdlib.g:17294:1: ( ']' )
             {
-            // InternalOCLstdlib.g:17292:1: ( ']' )
-            // InternalOCLstdlib.g:17293:1: ']'
+            // InternalOCLstdlib.g:17294:1: ( ']' )
+            // InternalOCLstdlib.g:17295:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());
@@ -50835,14 +50835,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0"
-    // InternalOCLstdlib.g:17314:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
+    // InternalOCLstdlib.g:17316:1: rule__SquareBracketedClauseCS__Group_2__0 : rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 ;
     public final void rule__SquareBracketedClauseCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17318:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
-            // InternalOCLstdlib.g:17319:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
+            // InternalOCLstdlib.g:17320:1: ( rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1 )
+            // InternalOCLstdlib.g:17321:2: rule__SquareBracketedClauseCS__Group_2__0__Impl rule__SquareBracketedClauseCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__SquareBracketedClauseCS__Group_2__0__Impl();
@@ -50873,17 +50873,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:17326:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:17328:1: rule__SquareBracketedClauseCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17330:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:17331:1: ( ',' )
+            // InternalOCLstdlib.g:17332:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:17333:1: ( ',' )
             {
-            // InternalOCLstdlib.g:17331:1: ( ',' )
-            // InternalOCLstdlib.g:17332:1: ','
+            // InternalOCLstdlib.g:17333:1: ( ',' )
+            // InternalOCLstdlib.g:17334:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());
@@ -50914,14 +50914,14 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1"
-    // InternalOCLstdlib.g:17345:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:17347:1: rule__SquareBracketedClauseCS__Group_2__1 : rule__SquareBracketedClauseCS__Group_2__1__Impl ;
     public final void rule__SquareBracketedClauseCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17349:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:17350:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:17351:1: ( rule__SquareBracketedClauseCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:17352:2: rule__SquareBracketedClauseCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__Group_2__1__Impl();
@@ -50947,23 +50947,23 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:17356:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:17358:1: rule__SquareBracketedClauseCS__Group_2__1__Impl : ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) ;
     public final void rule__SquareBracketedClauseCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17360:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:17361:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalOCLstdlib.g:17362:1: ( ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:17363:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:17361:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
-            // InternalOCLstdlib.g:17362:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalOCLstdlib.g:17363:1: ( ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 ) )
+            // InternalOCLstdlib.g:17364:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsAssignment_2_1());
             }
-            // InternalOCLstdlib.g:17363:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
-            // InternalOCLstdlib.g:17363:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
+            // InternalOCLstdlib.g:17365:1: ( rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 )
+            // InternalOCLstdlib.g:17365:2: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1();
@@ -50998,14 +50998,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0"
-    // InternalOCLstdlib.g:17377:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
+    // InternalOCLstdlib.g:17379:1: rule__NavigatingArgCS__Group_0__0 : rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 ;
     public final void rule__NavigatingArgCS__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17381:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
-            // InternalOCLstdlib.g:17382:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
+            // InternalOCLstdlib.g:17383:1: ( rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1 )
+            // InternalOCLstdlib.g:17384:2: rule__NavigatingArgCS__Group_0__0__Impl rule__NavigatingArgCS__Group_0__1
             {
             pushFollow(FollowSets000.FOLLOW_87);
             rule__NavigatingArgCS__Group_0__0__Impl();
@@ -51036,23 +51036,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__0__Impl"
-    // InternalOCLstdlib.g:17389:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
+    // InternalOCLstdlib.g:17391:1: rule__NavigatingArgCS__Group_0__0__Impl : ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) ;
     public final void rule__NavigatingArgCS__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17393:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
-            // InternalOCLstdlib.g:17394:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalOCLstdlib.g:17395:1: ( ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) ) )
+            // InternalOCLstdlib.g:17396:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
             {
-            // InternalOCLstdlib.g:17394:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
-            // InternalOCLstdlib.g:17395:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalOCLstdlib.g:17396:1: ( ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 ) )
+            // InternalOCLstdlib.g:17397:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionAssignment_0_0());
             }
-            // InternalOCLstdlib.g:17396:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
-            // InternalOCLstdlib.g:17396:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
+            // InternalOCLstdlib.g:17398:1: ( rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 )
+            // InternalOCLstdlib.g:17398:2: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0();
@@ -51087,14 +51087,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1"
-    // InternalOCLstdlib.g:17406:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
+    // InternalOCLstdlib.g:17408:1: rule__NavigatingArgCS__Group_0__1 : rule__NavigatingArgCS__Group_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17410:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
-            // InternalOCLstdlib.g:17411:2: rule__NavigatingArgCS__Group_0__1__Impl
+            // InternalOCLstdlib.g:17412:1: ( rule__NavigatingArgCS__Group_0__1__Impl )
+            // InternalOCLstdlib.g:17413:2: rule__NavigatingArgCS__Group_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0__1__Impl();
@@ -51120,22 +51120,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0__1__Impl"
-    // InternalOCLstdlib.g:17417:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
+    // InternalOCLstdlib.g:17419:1: rule__NavigatingArgCS__Group_0__1__Impl : ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) ;
     public final void rule__NavigatingArgCS__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17421:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
-            // InternalOCLstdlib.g:17422:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalOCLstdlib.g:17423:1: ( ( ( rule__NavigatingArgCS__Alternatives_0_1 )? ) )
+            // InternalOCLstdlib.g:17424:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
             {
-            // InternalOCLstdlib.g:17422:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
-            // InternalOCLstdlib.g:17423:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalOCLstdlib.g:17424:1: ( ( rule__NavigatingArgCS__Alternatives_0_1 )? )
+            // InternalOCLstdlib.g:17425:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getAlternatives_0_1());
             }
-            // InternalOCLstdlib.g:17424:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
+            // InternalOCLstdlib.g:17426:1: ( rule__NavigatingArgCS__Alternatives_0_1 )?
             int alt147=2;
             int LA147_0 = input.LA(1);
 
@@ -51144,7 +51144,7 @@
             }
             switch (alt147) {
                 case 1 :
-                    // InternalOCLstdlib.g:17424:2: rule__NavigatingArgCS__Alternatives_0_1
+                    // InternalOCLstdlib.g:17426:2: rule__NavigatingArgCS__Alternatives_0_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Alternatives_0_1();
@@ -51182,14 +51182,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0"
-    // InternalOCLstdlib.g:17438:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
+    // InternalOCLstdlib.g:17440:1: rule__NavigatingArgCS__Group_0_1_0__0 : rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17442:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
-            // InternalOCLstdlib.g:17443:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
+            // InternalOCLstdlib.g:17444:1: ( rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1 )
+            // InternalOCLstdlib.g:17445:2: rule__NavigatingArgCS__Group_0_1_0__0__Impl rule__NavigatingArgCS__Group_0_1_0__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__NavigatingArgCS__Group_0_1_0__0__Impl();
@@ -51220,17 +51220,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__0__Impl"
-    // InternalOCLstdlib.g:17450:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:17452:1: rule__NavigatingArgCS__Group_0_1_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17454:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:17455:1: ( '<-' )
+            // InternalOCLstdlib.g:17456:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:17457:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:17455:1: ( '<-' )
-            // InternalOCLstdlib.g:17456:1: '<-'
+            // InternalOCLstdlib.g:17457:1: ( '<-' )
+            // InternalOCLstdlib.g:17458:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());
@@ -51261,14 +51261,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1"
-    // InternalOCLstdlib.g:17469:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
+    // InternalOCLstdlib.g:17471:1: rule__NavigatingArgCS__Group_0_1_0__1 : rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17473:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
-            // InternalOCLstdlib.g:17474:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
+            // InternalOCLstdlib.g:17475:1: ( rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2 )
+            // InternalOCLstdlib.g:17476:2: rule__NavigatingArgCS__Group_0_1_0__1__Impl rule__NavigatingArgCS__Group_0_1_0__2
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__NavigatingArgCS__Group_0_1_0__1__Impl();
@@ -51299,23 +51299,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__1__Impl"
-    // InternalOCLstdlib.g:17481:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
+    // InternalOCLstdlib.g:17483:1: rule__NavigatingArgCS__Group_0_1_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17485:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
-            // InternalOCLstdlib.g:17486:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalOCLstdlib.g:17487:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) ) )
+            // InternalOCLstdlib.g:17488:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
             {
-            // InternalOCLstdlib.g:17486:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
-            // InternalOCLstdlib.g:17487:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalOCLstdlib.g:17488:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 ) )
+            // InternalOCLstdlib.g:17489:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_0_1());
             }
-            // InternalOCLstdlib.g:17488:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
-            // InternalOCLstdlib.g:17488:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
+            // InternalOCLstdlib.g:17490:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 )
+            // InternalOCLstdlib.g:17490:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1();
@@ -51350,14 +51350,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2"
-    // InternalOCLstdlib.g:17498:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
+    // InternalOCLstdlib.g:17500:1: rule__NavigatingArgCS__Group_0_1_0__2 : rule__NavigatingArgCS__Group_0_1_0__2__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17502:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
-            // InternalOCLstdlib.g:17503:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
+            // InternalOCLstdlib.g:17504:1: ( rule__NavigatingArgCS__Group_0_1_0__2__Impl )
+            // InternalOCLstdlib.g:17505:2: rule__NavigatingArgCS__Group_0_1_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0__2__Impl();
@@ -51383,22 +51383,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0__2__Impl"
-    // InternalOCLstdlib.g:17509:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
+    // InternalOCLstdlib.g:17511:1: rule__NavigatingArgCS__Group_0_1_0__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17513:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
-            // InternalOCLstdlib.g:17514:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalOCLstdlib.g:17515:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? ) )
+            // InternalOCLstdlib.g:17516:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
             {
-            // InternalOCLstdlib.g:17514:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
-            // InternalOCLstdlib.g:17515:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalOCLstdlib.g:17516:1: ( ( rule__NavigatingArgCS__Group_0_1_0_2__0 )? )
+            // InternalOCLstdlib.g:17517:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0_2());
             }
-            // InternalOCLstdlib.g:17516:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
+            // InternalOCLstdlib.g:17518:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0 )?
             int alt148=2;
             int LA148_0 = input.LA(1);
 
@@ -51407,7 +51407,7 @@
             }
             switch (alt148) {
                 case 1 :
-                    // InternalOCLstdlib.g:17516:2: rule__NavigatingArgCS__Group_0_1_0_2__0
+                    // InternalOCLstdlib.g:17518:2: rule__NavigatingArgCS__Group_0_1_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_0_2__0();
@@ -51445,14 +51445,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0"
-    // InternalOCLstdlib.g:17532:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
+    // InternalOCLstdlib.g:17534:1: rule__NavigatingArgCS__Group_0_1_0_2__0 : rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17536:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
-            // InternalOCLstdlib.g:17537:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
+            // InternalOCLstdlib.g:17538:1: ( rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1 )
+            // InternalOCLstdlib.g:17539:2: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl rule__NavigatingArgCS__Group_0_1_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingArgCS__Group_0_1_0_2__0__Impl();
@@ -51483,17 +51483,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__0__Impl"
-    // InternalOCLstdlib.g:17544:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:17546:1: rule__NavigatingArgCS__Group_0_1_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17548:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:17549:1: ( '=' )
+            // InternalOCLstdlib.g:17550:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:17551:1: ( '=' )
             {
-            // InternalOCLstdlib.g:17549:1: ( '=' )
-            // InternalOCLstdlib.g:17550:1: '='
+            // InternalOCLstdlib.g:17551:1: ( '=' )
+            // InternalOCLstdlib.g:17552:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());
@@ -51524,14 +51524,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1"
-    // InternalOCLstdlib.g:17563:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
+    // InternalOCLstdlib.g:17565:1: rule__NavigatingArgCS__Group_0_1_0_2__1 : rule__NavigatingArgCS__Group_0_1_0_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17567:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
-            // InternalOCLstdlib.g:17568:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
+            // InternalOCLstdlib.g:17569:1: ( rule__NavigatingArgCS__Group_0_1_0_2__1__Impl )
+            // InternalOCLstdlib.g:17570:2: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_0_2__1__Impl();
@@ -51557,23 +51557,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_0_2__1__Impl"
-    // InternalOCLstdlib.g:17574:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
+    // InternalOCLstdlib.g:17576:1: rule__NavigatingArgCS__Group_0_1_0_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17578:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
-            // InternalOCLstdlib.g:17579:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalOCLstdlib.g:17580:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) ) )
+            // InternalOCLstdlib.g:17581:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
             {
-            // InternalOCLstdlib.g:17579:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
-            // InternalOCLstdlib.g:17580:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalOCLstdlib.g:17581:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 ) )
+            // InternalOCLstdlib.g:17582:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_0_2_1());
             }
-            // InternalOCLstdlib.g:17581:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
-            // InternalOCLstdlib.g:17581:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
+            // InternalOCLstdlib.g:17583:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 )
+            // InternalOCLstdlib.g:17583:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1();
@@ -51608,14 +51608,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0"
-    // InternalOCLstdlib.g:17595:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
+    // InternalOCLstdlib.g:17597:1: rule__NavigatingArgCS__Group_0_1_1__0 : rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17599:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
-            // InternalOCLstdlib.g:17600:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
+            // InternalOCLstdlib.g:17601:1: ( rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1 )
+            // InternalOCLstdlib.g:17602:2: rule__NavigatingArgCS__Group_0_1_1__0__Impl rule__NavigatingArgCS__Group_0_1_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingArgCS__Group_0_1_1__0__Impl();
@@ -51646,17 +51646,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__0__Impl"
-    // InternalOCLstdlib.g:17607:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:17609:1: rule__NavigatingArgCS__Group_0_1_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17611:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:17612:1: ( ':' )
+            // InternalOCLstdlib.g:17613:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:17614:1: ( ':' )
             {
-            // InternalOCLstdlib.g:17612:1: ( ':' )
-            // InternalOCLstdlib.g:17613:1: ':'
+            // InternalOCLstdlib.g:17614:1: ( ':' )
+            // InternalOCLstdlib.g:17615:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());
@@ -51687,14 +51687,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1"
-    // InternalOCLstdlib.g:17626:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
+    // InternalOCLstdlib.g:17628:1: rule__NavigatingArgCS__Group_0_1_1__1 : rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17630:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
-            // InternalOCLstdlib.g:17631:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
+            // InternalOCLstdlib.g:17632:1: ( rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2 )
+            // InternalOCLstdlib.g:17633:2: rule__NavigatingArgCS__Group_0_1_1__1__Impl rule__NavigatingArgCS__Group_0_1_1__2
             {
             pushFollow(FollowSets000.FOLLOW_88);
             rule__NavigatingArgCS__Group_0_1_1__1__Impl();
@@ -51725,23 +51725,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__1__Impl"
-    // InternalOCLstdlib.g:17638:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
+    // InternalOCLstdlib.g:17640:1: rule__NavigatingArgCS__Group_0_1_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17642:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
-            // InternalOCLstdlib.g:17643:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalOCLstdlib.g:17644:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) ) )
+            // InternalOCLstdlib.g:17645:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
             {
-            // InternalOCLstdlib.g:17643:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
-            // InternalOCLstdlib.g:17644:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalOCLstdlib.g:17645:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 ) )
+            // InternalOCLstdlib.g:17646:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_1_1());
             }
-            // InternalOCLstdlib.g:17645:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
-            // InternalOCLstdlib.g:17645:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
+            // InternalOCLstdlib.g:17647:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 )
+            // InternalOCLstdlib.g:17647:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1();
@@ -51776,14 +51776,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2"
-    // InternalOCLstdlib.g:17655:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
+    // InternalOCLstdlib.g:17657:1: rule__NavigatingArgCS__Group_0_1_1__2 : rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17659:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
-            // InternalOCLstdlib.g:17660:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
+            // InternalOCLstdlib.g:17661:1: ( rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3 )
+            // InternalOCLstdlib.g:17662:2: rule__NavigatingArgCS__Group_0_1_1__2__Impl rule__NavigatingArgCS__Group_0_1_1__3
             {
             pushFollow(FollowSets000.FOLLOW_88);
             rule__NavigatingArgCS__Group_0_1_1__2__Impl();
@@ -51814,22 +51814,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__2__Impl"
-    // InternalOCLstdlib.g:17667:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
+    // InternalOCLstdlib.g:17669:1: rule__NavigatingArgCS__Group_0_1_1__2__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17671:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
-            // InternalOCLstdlib.g:17672:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalOCLstdlib.g:17673:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? ) )
+            // InternalOCLstdlib.g:17674:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
             {
-            // InternalOCLstdlib.g:17672:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
-            // InternalOCLstdlib.g:17673:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalOCLstdlib.g:17674:1: ( ( rule__NavigatingArgCS__Group_0_1_1_2__0 )? )
+            // InternalOCLstdlib.g:17675:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_2());
             }
-            // InternalOCLstdlib.g:17674:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
+            // InternalOCLstdlib.g:17676:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0 )?
             int alt149=2;
             int LA149_0 = input.LA(1);
 
@@ -51838,7 +51838,7 @@
             }
             switch (alt149) {
                 case 1 :
-                    // InternalOCLstdlib.g:17674:2: rule__NavigatingArgCS__Group_0_1_1_2__0
+                    // InternalOCLstdlib.g:17676:2: rule__NavigatingArgCS__Group_0_1_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_2__0();
@@ -51876,14 +51876,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3"
-    // InternalOCLstdlib.g:17684:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
+    // InternalOCLstdlib.g:17686:1: rule__NavigatingArgCS__Group_0_1_1__3 : rule__NavigatingArgCS__Group_0_1_1__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17688:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
-            // InternalOCLstdlib.g:17689:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
+            // InternalOCLstdlib.g:17690:1: ( rule__NavigatingArgCS__Group_0_1_1__3__Impl )
+            // InternalOCLstdlib.g:17691:2: rule__NavigatingArgCS__Group_0_1_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1__3__Impl();
@@ -51909,22 +51909,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1__3__Impl"
-    // InternalOCLstdlib.g:17695:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
+    // InternalOCLstdlib.g:17697:1: rule__NavigatingArgCS__Group_0_1_1__3__Impl : ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17699:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
-            // InternalOCLstdlib.g:17700:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalOCLstdlib.g:17701:1: ( ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? ) )
+            // InternalOCLstdlib.g:17702:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
             {
-            // InternalOCLstdlib.g:17700:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
-            // InternalOCLstdlib.g:17701:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalOCLstdlib.g:17702:1: ( ( rule__NavigatingArgCS__Group_0_1_1_3__0 )? )
+            // InternalOCLstdlib.g:17703:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1_3());
             }
-            // InternalOCLstdlib.g:17702:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
+            // InternalOCLstdlib.g:17704:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0 )?
             int alt150=2;
             int LA150_0 = input.LA(1);
 
@@ -51933,7 +51933,7 @@
             }
             switch (alt150) {
                 case 1 :
-                    // InternalOCLstdlib.g:17702:2: rule__NavigatingArgCS__Group_0_1_1_3__0
+                    // InternalOCLstdlib.g:17704:2: rule__NavigatingArgCS__Group_0_1_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_1_3__0();
@@ -51971,14 +51971,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0"
-    // InternalOCLstdlib.g:17720:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
+    // InternalOCLstdlib.g:17722:1: rule__NavigatingArgCS__Group_0_1_1_2__0 : rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17724:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
-            // InternalOCLstdlib.g:17725:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
+            // InternalOCLstdlib.g:17726:1: ( rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1 )
+            // InternalOCLstdlib.g:17727:2: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__NavigatingArgCS__Group_0_1_1_2__0__Impl();
@@ -52009,17 +52009,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__0__Impl"
-    // InternalOCLstdlib.g:17732:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:17734:1: rule__NavigatingArgCS__Group_0_1_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17736:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:17737:1: ( '<-' )
+            // InternalOCLstdlib.g:17738:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:17739:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:17737:1: ( '<-' )
-            // InternalOCLstdlib.g:17738:1: '<-'
+            // InternalOCLstdlib.g:17739:1: ( '<-' )
+            // InternalOCLstdlib.g:17740:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());
@@ -52050,14 +52050,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1"
-    // InternalOCLstdlib.g:17751:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
+    // InternalOCLstdlib.g:17753:1: rule__NavigatingArgCS__Group_0_1_1_2__1 : rule__NavigatingArgCS__Group_0_1_1_2__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17755:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
-            // InternalOCLstdlib.g:17756:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
+            // InternalOCLstdlib.g:17757:1: ( rule__NavigatingArgCS__Group_0_1_1_2__1__Impl )
+            // InternalOCLstdlib.g:17758:2: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_2__1__Impl();
@@ -52083,23 +52083,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_2__1__Impl"
-    // InternalOCLstdlib.g:17762:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
+    // InternalOCLstdlib.g:17764:1: rule__NavigatingArgCS__Group_0_1_1_2__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17766:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
-            // InternalOCLstdlib.g:17767:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalOCLstdlib.g:17768:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) ) )
+            // InternalOCLstdlib.g:17769:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
             {
-            // InternalOCLstdlib.g:17767:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
-            // InternalOCLstdlib.g:17768:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalOCLstdlib.g:17769:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 ) )
+            // InternalOCLstdlib.g:17770:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_1_2_1());
             }
-            // InternalOCLstdlib.g:17769:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
-            // InternalOCLstdlib.g:17769:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
+            // InternalOCLstdlib.g:17771:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 )
+            // InternalOCLstdlib.g:17771:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1();
@@ -52134,14 +52134,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0"
-    // InternalOCLstdlib.g:17783:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
+    // InternalOCLstdlib.g:17785:1: rule__NavigatingArgCS__Group_0_1_1_3__0 : rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17787:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
-            // InternalOCLstdlib.g:17788:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
+            // InternalOCLstdlib.g:17789:1: ( rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1 )
+            // InternalOCLstdlib.g:17790:2: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl rule__NavigatingArgCS__Group_0_1_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingArgCS__Group_0_1_1_3__0__Impl();
@@ -52172,17 +52172,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__0__Impl"
-    // InternalOCLstdlib.g:17795:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:17797:1: rule__NavigatingArgCS__Group_0_1_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17799:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:17800:1: ( '=' )
+            // InternalOCLstdlib.g:17801:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:17802:1: ( '=' )
             {
-            // InternalOCLstdlib.g:17800:1: ( '=' )
-            // InternalOCLstdlib.g:17801:1: '='
+            // InternalOCLstdlib.g:17802:1: ( '=' )
+            // InternalOCLstdlib.g:17803:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());
@@ -52213,14 +52213,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1"
-    // InternalOCLstdlib.g:17814:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
+    // InternalOCLstdlib.g:17816:1: rule__NavigatingArgCS__Group_0_1_1_3__1 : rule__NavigatingArgCS__Group_0_1_1_3__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17818:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
-            // InternalOCLstdlib.g:17819:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
+            // InternalOCLstdlib.g:17820:1: ( rule__NavigatingArgCS__Group_0_1_1_3__1__Impl )
+            // InternalOCLstdlib.g:17821:2: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_1_3__1__Impl();
@@ -52246,23 +52246,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_1_3__1__Impl"
-    // InternalOCLstdlib.g:17825:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
+    // InternalOCLstdlib.g:17827:1: rule__NavigatingArgCS__Group_0_1_1_3__1__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17829:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
-            // InternalOCLstdlib.g:17830:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalOCLstdlib.g:17831:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) ) )
+            // InternalOCLstdlib.g:17832:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
             {
-            // InternalOCLstdlib.g:17830:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
-            // InternalOCLstdlib.g:17831:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalOCLstdlib.g:17832:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 ) )
+            // InternalOCLstdlib.g:17833:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_1_3_1());
             }
-            // InternalOCLstdlib.g:17832:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
-            // InternalOCLstdlib.g:17832:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
+            // InternalOCLstdlib.g:17834:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 )
+            // InternalOCLstdlib.g:17834:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1();
@@ -52297,14 +52297,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0"
-    // InternalOCLstdlib.g:17846:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
+    // InternalOCLstdlib.g:17848:1: rule__NavigatingArgCS__Group_0_1_2__0 : rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17850:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
-            // InternalOCLstdlib.g:17851:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
+            // InternalOCLstdlib.g:17852:1: ( rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1 )
+            // InternalOCLstdlib.g:17853:2: rule__NavigatingArgCS__Group_0_1_2__0__Impl rule__NavigatingArgCS__Group_0_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_87);
             rule__NavigatingArgCS__Group_0_1_2__0__Impl();
@@ -52335,22 +52335,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__0__Impl"
-    // InternalOCLstdlib.g:17858:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
+    // InternalOCLstdlib.g:17860:1: rule__NavigatingArgCS__Group_0_1_2__0__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17862:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
-            // InternalOCLstdlib.g:17863:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalOCLstdlib.g:17864:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? ) )
+            // InternalOCLstdlib.g:17865:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
             {
-            // InternalOCLstdlib.g:17863:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
-            // InternalOCLstdlib.g:17864:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalOCLstdlib.g:17865:1: ( ( rule__NavigatingArgCS__Group_0_1_2_0__0 )? )
+            // InternalOCLstdlib.g:17866:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_0());
             }
-            // InternalOCLstdlib.g:17865:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
+            // InternalOCLstdlib.g:17867:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0 )?
             int alt151=2;
             int LA151_0 = input.LA(1);
 
@@ -52359,7 +52359,7 @@
             }
             switch (alt151) {
                 case 1 :
-                    // InternalOCLstdlib.g:17865:2: rule__NavigatingArgCS__Group_0_1_2_0__0
+                    // InternalOCLstdlib.g:17867:2: rule__NavigatingArgCS__Group_0_1_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_0__0();
@@ -52397,14 +52397,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1"
-    // InternalOCLstdlib.g:17875:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
+    // InternalOCLstdlib.g:17877:1: rule__NavigatingArgCS__Group_0_1_2__1 : rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17879:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
-            // InternalOCLstdlib.g:17880:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
+            // InternalOCLstdlib.g:17881:1: ( rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2 )
+            // InternalOCLstdlib.g:17882:2: rule__NavigatingArgCS__Group_0_1_2__1__Impl rule__NavigatingArgCS__Group_0_1_2__2
             {
             pushFollow(FollowSets000.FOLLOW_87);
             rule__NavigatingArgCS__Group_0_1_2__1__Impl();
@@ -52435,22 +52435,22 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__1__Impl"
-    // InternalOCLstdlib.g:17887:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
+    // InternalOCLstdlib.g:17889:1: rule__NavigatingArgCS__Group_0_1_2__1__Impl : ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17891:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
-            // InternalOCLstdlib.g:17892:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalOCLstdlib.g:17893:1: ( ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? ) )
+            // InternalOCLstdlib.g:17894:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
             {
-            // InternalOCLstdlib.g:17892:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
-            // InternalOCLstdlib.g:17893:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalOCLstdlib.g:17894:1: ( ( rule__NavigatingArgCS__Group_0_1_2_1__0 )? )
+            // InternalOCLstdlib.g:17895:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_2_1());
             }
-            // InternalOCLstdlib.g:17894:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
+            // InternalOCLstdlib.g:17896:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0 )?
             int alt152=2;
             int LA152_0 = input.LA(1);
 
@@ -52459,7 +52459,7 @@
             }
             switch (alt152) {
                 case 1 :
-                    // InternalOCLstdlib.g:17894:2: rule__NavigatingArgCS__Group_0_1_2_1__0
+                    // InternalOCLstdlib.g:17896:2: rule__NavigatingArgCS__Group_0_1_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingArgCS__Group_0_1_2_1__0();
@@ -52497,14 +52497,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2"
-    // InternalOCLstdlib.g:17904:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
+    // InternalOCLstdlib.g:17906:1: rule__NavigatingArgCS__Group_0_1_2__2 : rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17908:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
-            // InternalOCLstdlib.g:17909:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
+            // InternalOCLstdlib.g:17910:1: ( rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3 )
+            // InternalOCLstdlib.g:17911:2: rule__NavigatingArgCS__Group_0_1_2__2__Impl rule__NavigatingArgCS__Group_0_1_2__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingArgCS__Group_0_1_2__2__Impl();
@@ -52535,17 +52535,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__2__Impl"
-    // InternalOCLstdlib.g:17916:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
+    // InternalOCLstdlib.g:17918:1: rule__NavigatingArgCS__Group_0_1_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17920:1: ( ( 'in' ) )
-            // InternalOCLstdlib.g:17921:1: ( 'in' )
+            // InternalOCLstdlib.g:17922:1: ( ( 'in' ) )
+            // InternalOCLstdlib.g:17923:1: ( 'in' )
             {
-            // InternalOCLstdlib.g:17921:1: ( 'in' )
-            // InternalOCLstdlib.g:17922:1: 'in'
+            // InternalOCLstdlib.g:17923:1: ( 'in' )
+            // InternalOCLstdlib.g:17924:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());
@@ -52576,14 +52576,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3"
-    // InternalOCLstdlib.g:17935:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
+    // InternalOCLstdlib.g:17937:1: rule__NavigatingArgCS__Group_0_1_2__3 : rule__NavigatingArgCS__Group_0_1_2__3__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17939:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
-            // InternalOCLstdlib.g:17940:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
+            // InternalOCLstdlib.g:17941:1: ( rule__NavigatingArgCS__Group_0_1_2__3__Impl )
+            // InternalOCLstdlib.g:17942:2: rule__NavigatingArgCS__Group_0_1_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2__3__Impl();
@@ -52609,23 +52609,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2__3__Impl"
-    // InternalOCLstdlib.g:17946:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
+    // InternalOCLstdlib.g:17948:1: rule__NavigatingArgCS__Group_0_1_2__3__Impl : ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17950:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
-            // InternalOCLstdlib.g:17951:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalOCLstdlib.g:17952:1: ( ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) ) )
+            // InternalOCLstdlib.g:17953:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
             {
-            // InternalOCLstdlib.g:17951:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
-            // InternalOCLstdlib.g:17952:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalOCLstdlib.g:17953:1: ( ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 ) )
+            // InternalOCLstdlib.g:17954:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionAssignment_0_1_2_3());
             }
-            // InternalOCLstdlib.g:17953:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
-            // InternalOCLstdlib.g:17953:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
+            // InternalOCLstdlib.g:17955:1: ( rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 )
+            // InternalOCLstdlib.g:17955:2: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3();
@@ -52660,14 +52660,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0"
-    // InternalOCLstdlib.g:17971:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
+    // InternalOCLstdlib.g:17973:1: rule__NavigatingArgCS__Group_0_1_2_0__0 : rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17975:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
-            // InternalOCLstdlib.g:17976:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
+            // InternalOCLstdlib.g:17977:1: ( rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1 )
+            // InternalOCLstdlib.g:17978:2: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl rule__NavigatingArgCS__Group_0_1_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingArgCS__Group_0_1_2_0__0__Impl();
@@ -52698,17 +52698,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__0__Impl"
-    // InternalOCLstdlib.g:17983:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:17985:1: rule__NavigatingArgCS__Group_0_1_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:17987:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:17988:1: ( ':' )
+            // InternalOCLstdlib.g:17989:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:17990:1: ( ':' )
             {
-            // InternalOCLstdlib.g:17988:1: ( ':' )
-            // InternalOCLstdlib.g:17989:1: ':'
+            // InternalOCLstdlib.g:17990:1: ( ':' )
+            // InternalOCLstdlib.g:17991:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());
@@ -52739,14 +52739,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1"
-    // InternalOCLstdlib.g:18002:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
+    // InternalOCLstdlib.g:18004:1: rule__NavigatingArgCS__Group_0_1_2_0__1 : rule__NavigatingArgCS__Group_0_1_2_0__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18006:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
-            // InternalOCLstdlib.g:18007:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
+            // InternalOCLstdlib.g:18008:1: ( rule__NavigatingArgCS__Group_0_1_2_0__1__Impl )
+            // InternalOCLstdlib.g:18009:2: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_0__1__Impl();
@@ -52772,23 +52772,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_0__1__Impl"
-    // InternalOCLstdlib.g:18013:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
+    // InternalOCLstdlib.g:18015:1: rule__NavigatingArgCS__Group_0_1_2_0__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18017:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
-            // InternalOCLstdlib.g:18018:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalOCLstdlib.g:18019:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) ) )
+            // InternalOCLstdlib.g:18020:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
             {
-            // InternalOCLstdlib.g:18018:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
-            // InternalOCLstdlib.g:18019:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalOCLstdlib.g:18020:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 ) )
+            // InternalOCLstdlib.g:18021:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_0_1_2_0_1());
             }
-            // InternalOCLstdlib.g:18020:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
-            // InternalOCLstdlib.g:18020:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
+            // InternalOCLstdlib.g:18022:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 )
+            // InternalOCLstdlib.g:18022:2: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1();
@@ -52823,14 +52823,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0"
-    // InternalOCLstdlib.g:18034:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
+    // InternalOCLstdlib.g:18036:1: rule__NavigatingArgCS__Group_0_1_2_1__0 : rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18038:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
-            // InternalOCLstdlib.g:18039:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
+            // InternalOCLstdlib.g:18040:1: ( rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1 )
+            // InternalOCLstdlib.g:18041:2: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl rule__NavigatingArgCS__Group_0_1_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__NavigatingArgCS__Group_0_1_2_1__0__Impl();
@@ -52861,17 +52861,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__0__Impl"
-    // InternalOCLstdlib.g:18046:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:18048:1: rule__NavigatingArgCS__Group_0_1_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18050:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:18051:1: ( '<-' )
+            // InternalOCLstdlib.g:18052:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:18053:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:18051:1: ( '<-' )
-            // InternalOCLstdlib.g:18052:1: '<-'
+            // InternalOCLstdlib.g:18053:1: ( '<-' )
+            // InternalOCLstdlib.g:18054:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());
@@ -52902,14 +52902,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1"
-    // InternalOCLstdlib.g:18065:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
+    // InternalOCLstdlib.g:18067:1: rule__NavigatingArgCS__Group_0_1_2_1__1 : rule__NavigatingArgCS__Group_0_1_2_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18069:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
-            // InternalOCLstdlib.g:18070:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
+            // InternalOCLstdlib.g:18071:1: ( rule__NavigatingArgCS__Group_0_1_2_1__1__Impl )
+            // InternalOCLstdlib.g:18072:2: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_0_1_2_1__1__Impl();
@@ -52935,23 +52935,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_0_1_2_1__1__Impl"
-    // InternalOCLstdlib.g:18076:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:18078:1: rule__NavigatingArgCS__Group_0_1_2_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_0_1_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18080:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
-            // InternalOCLstdlib.g:18081:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalOCLstdlib.g:18082:1: ( ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) ) )
+            // InternalOCLstdlib.g:18083:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:18081:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
-            // InternalOCLstdlib.g:18082:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalOCLstdlib.g:18083:1: ( ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 ) )
+            // InternalOCLstdlib.g:18084:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorAssignment_0_1_2_1_1());
             }
-            // InternalOCLstdlib.g:18083:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
-            // InternalOCLstdlib.g:18083:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
+            // InternalOCLstdlib.g:18085:1: ( rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 )
+            // InternalOCLstdlib.g:18085:2: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1();
@@ -52986,14 +52986,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0"
-    // InternalOCLstdlib.g:18097:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
+    // InternalOCLstdlib.g:18099:1: rule__NavigatingArgCS__Group_1__0 : rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 ;
     public final void rule__NavigatingArgCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18101:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
-            // InternalOCLstdlib.g:18102:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
+            // InternalOCLstdlib.g:18103:1: ( rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1 )
+            // InternalOCLstdlib.g:18104:2: rule__NavigatingArgCS__Group_1__0__Impl rule__NavigatingArgCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingArgCS__Group_1__0__Impl();
@@ -53024,17 +53024,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:18109:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:18111:1: rule__NavigatingArgCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingArgCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18113:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:18114:1: ( ':' )
+            // InternalOCLstdlib.g:18115:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:18116:1: ( ':' )
             {
-            // InternalOCLstdlib.g:18114:1: ( ':' )
-            // InternalOCLstdlib.g:18115:1: ':'
+            // InternalOCLstdlib.g:18116:1: ( ':' )
+            // InternalOCLstdlib.g:18117:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());
@@ -53065,14 +53065,14 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1"
-    // InternalOCLstdlib.g:18128:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:18130:1: rule__NavigatingArgCS__Group_1__1 : rule__NavigatingArgCS__Group_1__1__Impl ;
     public final void rule__NavigatingArgCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18132:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:18133:2: rule__NavigatingArgCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:18134:1: ( rule__NavigatingArgCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:18135:2: rule__NavigatingArgCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__Group_1__1__Impl();
@@ -53098,23 +53098,23 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:18139:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:18141:1: rule__NavigatingArgCS__Group_1__1__Impl : ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__NavigatingArgCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18143:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:18144:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:18145:1: ( ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:18146:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:18144:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLstdlib.g:18145:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:18146:1: ( ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:18147:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLstdlib.g:18146:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLstdlib.g:18146:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
+            // InternalOCLstdlib.g:18148:1: ( rule__NavigatingArgCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:18148:2: rule__NavigatingArgCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingArgCS__OwnedTypeAssignment_1_1();
@@ -53149,14 +53149,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0"
-    // InternalOCLstdlib.g:18160:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
+    // InternalOCLstdlib.g:18162:1: rule__NavigatingBarArgCS__Group__0 : rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 ;
     public final void rule__NavigatingBarArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18164:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
-            // InternalOCLstdlib.g:18165:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
+            // InternalOCLstdlib.g:18166:1: ( rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1 )
+            // InternalOCLstdlib.g:18167:2: rule__NavigatingBarArgCS__Group__0__Impl rule__NavigatingBarArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingBarArgCS__Group__0__Impl();
@@ -53187,23 +53187,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__0__Impl"
-    // InternalOCLstdlib.g:18172:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:18174:1: rule__NavigatingBarArgCS__Group__0__Impl : ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18176:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
-            // InternalOCLstdlib.g:18177:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalOCLstdlib.g:18178:1: ( ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) ) )
+            // InternalOCLstdlib.g:18179:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:18177:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
-            // InternalOCLstdlib.g:18178:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalOCLstdlib.g:18179:1: ( ( rule__NavigatingBarArgCS__PrefixAssignment_0 ) )
+            // InternalOCLstdlib.g:18180:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalOCLstdlib.g:18179:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
-            // InternalOCLstdlib.g:18179:2: rule__NavigatingBarArgCS__PrefixAssignment_0
+            // InternalOCLstdlib.g:18181:1: ( rule__NavigatingBarArgCS__PrefixAssignment_0 )
+            // InternalOCLstdlib.g:18181:2: rule__NavigatingBarArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__PrefixAssignment_0();
@@ -53238,14 +53238,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1"
-    // InternalOCLstdlib.g:18189:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
+    // InternalOCLstdlib.g:18191:1: rule__NavigatingBarArgCS__Group__1 : rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 ;
     public final void rule__NavigatingBarArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18193:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
-            // InternalOCLstdlib.g:18194:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
+            // InternalOCLstdlib.g:18195:1: ( rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2 )
+            // InternalOCLstdlib.g:18196:2: rule__NavigatingBarArgCS__Group__1__Impl rule__NavigatingBarArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__NavigatingBarArgCS__Group__1__Impl();
@@ -53276,23 +53276,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__1__Impl"
-    // InternalOCLstdlib.g:18201:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:18203:1: rule__NavigatingBarArgCS__Group__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18205:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalOCLstdlib.g:18206:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:18207:1: ( ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:18208:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:18206:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalOCLstdlib.g:18207:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLstdlib.g:18208:1: ( ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:18209:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalOCLstdlib.g:18208:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalOCLstdlib.g:18208:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
+            // InternalOCLstdlib.g:18210:1: ( rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLstdlib.g:18210:2: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1();
@@ -53327,14 +53327,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2"
-    // InternalOCLstdlib.g:18218:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:18220:1: rule__NavigatingBarArgCS__Group__2 : rule__NavigatingBarArgCS__Group__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18222:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
-            // InternalOCLstdlib.g:18223:2: rule__NavigatingBarArgCS__Group__2__Impl
+            // InternalOCLstdlib.g:18224:1: ( rule__NavigatingBarArgCS__Group__2__Impl )
+            // InternalOCLstdlib.g:18225:2: rule__NavigatingBarArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group__2__Impl();
@@ -53360,22 +53360,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group__2__Impl"
-    // InternalOCLstdlib.g:18229:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:18231:1: rule__NavigatingBarArgCS__Group__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18233:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:18234:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:18235:1: ( ( ( rule__NavigatingBarArgCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:18236:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:18234:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:18235:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalOCLstdlib.g:18236:1: ( ( rule__NavigatingBarArgCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:18237:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:18236:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
+            // InternalOCLstdlib.g:18238:1: ( rule__NavigatingBarArgCS__Group_2__0 )?
             int alt153=2;
             int LA153_0 = input.LA(1);
 
@@ -53384,7 +53384,7 @@
             }
             switch (alt153) {
                 case 1 :
-                    // InternalOCLstdlib.g:18236:2: rule__NavigatingBarArgCS__Group_2__0
+                    // InternalOCLstdlib.g:18238:2: rule__NavigatingBarArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2__0();
@@ -53422,14 +53422,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0"
-    // InternalOCLstdlib.g:18252:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
+    // InternalOCLstdlib.g:18254:1: rule__NavigatingBarArgCS__Group_2__0 : rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18256:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
-            // InternalOCLstdlib.g:18257:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
+            // InternalOCLstdlib.g:18258:1: ( rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1 )
+            // InternalOCLstdlib.g:18259:2: rule__NavigatingBarArgCS__Group_2__0__Impl rule__NavigatingBarArgCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingBarArgCS__Group_2__0__Impl();
@@ -53460,17 +53460,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:18264:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:18266:1: rule__NavigatingBarArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingBarArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18268:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:18269:1: ( ':' )
+            // InternalOCLstdlib.g:18270:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:18271:1: ( ':' )
             {
-            // InternalOCLstdlib.g:18269:1: ( ':' )
-            // InternalOCLstdlib.g:18270:1: ':'
+            // InternalOCLstdlib.g:18271:1: ( ':' )
+            // InternalOCLstdlib.g:18272:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());
@@ -53501,14 +53501,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1"
-    // InternalOCLstdlib.g:18283:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
+    // InternalOCLstdlib.g:18285:1: rule__NavigatingBarArgCS__Group_2__1 : rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 ;
     public final void rule__NavigatingBarArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18287:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
-            // InternalOCLstdlib.g:18288:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
+            // InternalOCLstdlib.g:18289:1: ( rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2 )
+            // InternalOCLstdlib.g:18290:2: rule__NavigatingBarArgCS__Group_2__1__Impl rule__NavigatingBarArgCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__NavigatingBarArgCS__Group_2__1__Impl();
@@ -53539,23 +53539,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:18295:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:18297:1: rule__NavigatingBarArgCS__Group_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18299:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:18300:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLstdlib.g:18301:1: ( ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:18302:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:18300:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalOCLstdlib.g:18301:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLstdlib.g:18302:1: ( ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLstdlib.g:18303:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalOCLstdlib.g:18302:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
-            // InternalOCLstdlib.g:18302:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
+            // InternalOCLstdlib.g:18304:1: ( rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLstdlib.g:18304:2: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1();
@@ -53590,14 +53590,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2"
-    // InternalOCLstdlib.g:18312:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
+    // InternalOCLstdlib.g:18314:1: rule__NavigatingBarArgCS__Group_2__2 : rule__NavigatingBarArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18316:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
-            // InternalOCLstdlib.g:18317:2: rule__NavigatingBarArgCS__Group_2__2__Impl
+            // InternalOCLstdlib.g:18318:1: ( rule__NavigatingBarArgCS__Group_2__2__Impl )
+            // InternalOCLstdlib.g:18319:2: rule__NavigatingBarArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2__2__Impl();
@@ -53623,22 +53623,22 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2__2__Impl"
-    // InternalOCLstdlib.g:18323:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
+    // InternalOCLstdlib.g:18325:1: rule__NavigatingBarArgCS__Group_2__2__Impl : ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingBarArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18327:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
-            // InternalOCLstdlib.g:18328:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalOCLstdlib.g:18329:1: ( ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? ) )
+            // InternalOCLstdlib.g:18330:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
             {
-            // InternalOCLstdlib.g:18328:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
-            // InternalOCLstdlib.g:18329:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalOCLstdlib.g:18330:1: ( ( rule__NavigatingBarArgCS__Group_2_2__0 )? )
+            // InternalOCLstdlib.g:18331:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getGroup_2_2());
             }
-            // InternalOCLstdlib.g:18330:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
+            // InternalOCLstdlib.g:18332:1: ( rule__NavigatingBarArgCS__Group_2_2__0 )?
             int alt154=2;
             int LA154_0 = input.LA(1);
 
@@ -53647,7 +53647,7 @@
             }
             switch (alt154) {
                 case 1 :
-                    // InternalOCLstdlib.g:18330:2: rule__NavigatingBarArgCS__Group_2_2__0
+                    // InternalOCLstdlib.g:18332:2: rule__NavigatingBarArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingBarArgCS__Group_2_2__0();
@@ -53685,14 +53685,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0"
-    // InternalOCLstdlib.g:18346:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
+    // InternalOCLstdlib.g:18348:1: rule__NavigatingBarArgCS__Group_2_2__0 : rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18350:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
-            // InternalOCLstdlib.g:18351:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
+            // InternalOCLstdlib.g:18352:1: ( rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1 )
+            // InternalOCLstdlib.g:18353:2: rule__NavigatingBarArgCS__Group_2_2__0__Impl rule__NavigatingBarArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingBarArgCS__Group_2_2__0__Impl();
@@ -53723,17 +53723,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__0__Impl"
-    // InternalOCLstdlib.g:18358:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:18360:1: rule__NavigatingBarArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18362:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:18363:1: ( '=' )
+            // InternalOCLstdlib.g:18364:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:18365:1: ( '=' )
             {
-            // InternalOCLstdlib.g:18363:1: ( '=' )
-            // InternalOCLstdlib.g:18364:1: '='
+            // InternalOCLstdlib.g:18365:1: ( '=' )
+            // InternalOCLstdlib.g:18366:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -53764,14 +53764,14 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1"
-    // InternalOCLstdlib.g:18377:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
+    // InternalOCLstdlib.g:18379:1: rule__NavigatingBarArgCS__Group_2_2__1 : rule__NavigatingBarArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18381:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
-            // InternalOCLstdlib.g:18382:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
+            // InternalOCLstdlib.g:18383:1: ( rule__NavigatingBarArgCS__Group_2_2__1__Impl )
+            // InternalOCLstdlib.g:18384:2: rule__NavigatingBarArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__Group_2_2__1__Impl();
@@ -53797,23 +53797,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__Group_2_2__1__Impl"
-    // InternalOCLstdlib.g:18388:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalOCLstdlib.g:18390:1: rule__NavigatingBarArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingBarArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18392:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalOCLstdlib.g:18393:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:18394:1: ( ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalOCLstdlib.g:18395:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalOCLstdlib.g:18393:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalOCLstdlib.g:18394:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLstdlib.g:18395:1: ( ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:18396:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalOCLstdlib.g:18395:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalOCLstdlib.g:18395:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalOCLstdlib.g:18397:1: ( rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLstdlib.g:18397:2: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -53848,14 +53848,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0"
-    // InternalOCLstdlib.g:18409:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
+    // InternalOCLstdlib.g:18411:1: rule__NavigatingCommaArgCS__Group__0 : rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 ;
     public final void rule__NavigatingCommaArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18413:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
-            // InternalOCLstdlib.g:18414:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
+            // InternalOCLstdlib.g:18415:1: ( rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1 )
+            // InternalOCLstdlib.g:18416:2: rule__NavigatingCommaArgCS__Group__0__Impl rule__NavigatingCommaArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingCommaArgCS__Group__0__Impl();
@@ -53886,23 +53886,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__0__Impl"
-    // InternalOCLstdlib.g:18421:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:18423:1: rule__NavigatingCommaArgCS__Group__0__Impl : ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18425:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
-            // InternalOCLstdlib.g:18426:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalOCLstdlib.g:18427:1: ( ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) ) )
+            // InternalOCLstdlib.g:18428:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:18426:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
-            // InternalOCLstdlib.g:18427:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalOCLstdlib.g:18428:1: ( ( rule__NavigatingCommaArgCS__PrefixAssignment_0 ) )
+            // InternalOCLstdlib.g:18429:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalOCLstdlib.g:18428:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
-            // InternalOCLstdlib.g:18428:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
+            // InternalOCLstdlib.g:18430:1: ( rule__NavigatingCommaArgCS__PrefixAssignment_0 )
+            // InternalOCLstdlib.g:18430:2: rule__NavigatingCommaArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__PrefixAssignment_0();
@@ -53937,14 +53937,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1"
-    // InternalOCLstdlib.g:18438:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
+    // InternalOCLstdlib.g:18440:1: rule__NavigatingCommaArgCS__Group__1 : rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 ;
     public final void rule__NavigatingCommaArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18442:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
-            // InternalOCLstdlib.g:18443:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
+            // InternalOCLstdlib.g:18444:1: ( rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2 )
+            // InternalOCLstdlib.g:18445:2: rule__NavigatingCommaArgCS__Group__1__Impl rule__NavigatingCommaArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_87);
             rule__NavigatingCommaArgCS__Group__1__Impl();
@@ -53975,23 +53975,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__1__Impl"
-    // InternalOCLstdlib.g:18450:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:18452:1: rule__NavigatingCommaArgCS__Group__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18454:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalOCLstdlib.g:18455:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:18456:1: ( ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:18457:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:18455:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalOCLstdlib.g:18456:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLstdlib.g:18457:1: ( ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:18458:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalOCLstdlib.g:18457:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalOCLstdlib.g:18457:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
+            // InternalOCLstdlib.g:18459:1: ( rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLstdlib.g:18459:2: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1();
@@ -54026,14 +54026,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2"
-    // InternalOCLstdlib.g:18467:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:18469:1: rule__NavigatingCommaArgCS__Group__2 : rule__NavigatingCommaArgCS__Group__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18471:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
-            // InternalOCLstdlib.g:18472:2: rule__NavigatingCommaArgCS__Group__2__Impl
+            // InternalOCLstdlib.g:18473:1: ( rule__NavigatingCommaArgCS__Group__2__Impl )
+            // InternalOCLstdlib.g:18474:2: rule__NavigatingCommaArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group__2__Impl();
@@ -54059,22 +54059,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group__2__Impl"
-    // InternalOCLstdlib.g:18478:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
+    // InternalOCLstdlib.g:18480:1: rule__NavigatingCommaArgCS__Group__2__Impl : ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18482:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
-            // InternalOCLstdlib.g:18483:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalOCLstdlib.g:18484:1: ( ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? ) )
+            // InternalOCLstdlib.g:18485:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
             {
-            // InternalOCLstdlib.g:18483:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
-            // InternalOCLstdlib.g:18484:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalOCLstdlib.g:18485:1: ( ( rule__NavigatingCommaArgCS__Alternatives_2 )? )
+            // InternalOCLstdlib.g:18486:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getAlternatives_2());
             }
-            // InternalOCLstdlib.g:18485:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
+            // InternalOCLstdlib.g:18487:1: ( rule__NavigatingCommaArgCS__Alternatives_2 )?
             int alt155=2;
             int LA155_0 = input.LA(1);
 
@@ -54083,7 +54083,7 @@
             }
             switch (alt155) {
                 case 1 :
-                    // InternalOCLstdlib.g:18485:2: rule__NavigatingCommaArgCS__Alternatives_2
+                    // InternalOCLstdlib.g:18487:2: rule__NavigatingCommaArgCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Alternatives_2();
@@ -54121,14 +54121,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0"
-    // InternalOCLstdlib.g:18501:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
+    // InternalOCLstdlib.g:18503:1: rule__NavigatingCommaArgCS__Group_2_0__0 : rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18505:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
-            // InternalOCLstdlib.g:18506:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
+            // InternalOCLstdlib.g:18507:1: ( rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1 )
+            // InternalOCLstdlib.g:18508:2: rule__NavigatingCommaArgCS__Group_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__NavigatingCommaArgCS__Group_2_0__0__Impl();
@@ -54159,17 +54159,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__0__Impl"
-    // InternalOCLstdlib.g:18513:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:18515:1: rule__NavigatingCommaArgCS__Group_2_0__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18517:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:18518:1: ( '<-' )
+            // InternalOCLstdlib.g:18519:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:18520:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:18518:1: ( '<-' )
-            // InternalOCLstdlib.g:18519:1: '<-'
+            // InternalOCLstdlib.g:18520:1: ( '<-' )
+            // InternalOCLstdlib.g:18521:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());
@@ -54200,14 +54200,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1"
-    // InternalOCLstdlib.g:18532:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
+    // InternalOCLstdlib.g:18534:1: rule__NavigatingCommaArgCS__Group_2_0__1 : rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18536:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
-            // InternalOCLstdlib.g:18537:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
+            // InternalOCLstdlib.g:18538:1: ( rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2 )
+            // InternalOCLstdlib.g:18539:2: rule__NavigatingCommaArgCS__Group_2_0__1__Impl rule__NavigatingCommaArgCS__Group_2_0__2
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__NavigatingCommaArgCS__Group_2_0__1__Impl();
@@ -54238,23 +54238,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__1__Impl"
-    // InternalOCLstdlib.g:18544:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
+    // InternalOCLstdlib.g:18546:1: rule__NavigatingCommaArgCS__Group_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18548:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
-            // InternalOCLstdlib.g:18549:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalOCLstdlib.g:18550:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) ) )
+            // InternalOCLstdlib.g:18551:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
             {
-            // InternalOCLstdlib.g:18549:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
-            // InternalOCLstdlib.g:18550:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalOCLstdlib.g:18551:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 ) )
+            // InternalOCLstdlib.g:18552:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_0_1());
             }
-            // InternalOCLstdlib.g:18551:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
-            // InternalOCLstdlib.g:18551:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
+            // InternalOCLstdlib.g:18553:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 )
+            // InternalOCLstdlib.g:18553:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1();
@@ -54289,14 +54289,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2"
-    // InternalOCLstdlib.g:18561:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
+    // InternalOCLstdlib.g:18563:1: rule__NavigatingCommaArgCS__Group_2_0__2 : rule__NavigatingCommaArgCS__Group_2_0__2__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18565:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
-            // InternalOCLstdlib.g:18566:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
+            // InternalOCLstdlib.g:18567:1: ( rule__NavigatingCommaArgCS__Group_2_0__2__Impl )
+            // InternalOCLstdlib.g:18568:2: rule__NavigatingCommaArgCS__Group_2_0__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0__2__Impl();
@@ -54322,22 +54322,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0__2__Impl"
-    // InternalOCLstdlib.g:18572:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
+    // InternalOCLstdlib.g:18574:1: rule__NavigatingCommaArgCS__Group_2_0__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18576:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
-            // InternalOCLstdlib.g:18577:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalOCLstdlib.g:18578:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? ) )
+            // InternalOCLstdlib.g:18579:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
             {
-            // InternalOCLstdlib.g:18577:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
-            // InternalOCLstdlib.g:18578:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalOCLstdlib.g:18579:1: ( ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )? )
+            // InternalOCLstdlib.g:18580:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0_2());
             }
-            // InternalOCLstdlib.g:18579:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
+            // InternalOCLstdlib.g:18581:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0 )?
             int alt156=2;
             int LA156_0 = input.LA(1);
 
@@ -54346,7 +54346,7 @@
             }
             switch (alt156) {
                 case 1 :
-                    // InternalOCLstdlib.g:18579:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
+                    // InternalOCLstdlib.g:18581:2: rule__NavigatingCommaArgCS__Group_2_0_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_0_2__0();
@@ -54384,14 +54384,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0"
-    // InternalOCLstdlib.g:18595:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
+    // InternalOCLstdlib.g:18597:1: rule__NavigatingCommaArgCS__Group_2_0_2__0 : rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18599:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
-            // InternalOCLstdlib.g:18600:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
+            // InternalOCLstdlib.g:18601:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1 )
+            // InternalOCLstdlib.g:18602:2: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl rule__NavigatingCommaArgCS__Group_2_0_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl();
@@ -54422,17 +54422,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl"
-    // InternalOCLstdlib.g:18607:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:18609:1: rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18611:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:18612:1: ( '=' )
+            // InternalOCLstdlib.g:18613:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:18614:1: ( '=' )
             {
-            // InternalOCLstdlib.g:18612:1: ( '=' )
-            // InternalOCLstdlib.g:18613:1: '='
+            // InternalOCLstdlib.g:18614:1: ( '=' )
+            // InternalOCLstdlib.g:18615:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());
@@ -54463,14 +54463,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1"
-    // InternalOCLstdlib.g:18626:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
+    // InternalOCLstdlib.g:18628:1: rule__NavigatingCommaArgCS__Group_2_0_2__1 : rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18630:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
-            // InternalOCLstdlib.g:18631:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
+            // InternalOCLstdlib.g:18632:1: ( rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl )
+            // InternalOCLstdlib.g:18633:2: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl();
@@ -54496,23 +54496,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl"
-    // InternalOCLstdlib.g:18637:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
+    // InternalOCLstdlib.g:18639:1: rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_0_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18641:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
-            // InternalOCLstdlib.g:18642:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalOCLstdlib.g:18643:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) ) )
+            // InternalOCLstdlib.g:18644:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
             {
-            // InternalOCLstdlib.g:18642:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
-            // InternalOCLstdlib.g:18643:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalOCLstdlib.g:18644:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 ) )
+            // InternalOCLstdlib.g:18645:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_0_2_1());
             }
-            // InternalOCLstdlib.g:18644:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
-            // InternalOCLstdlib.g:18644:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
+            // InternalOCLstdlib.g:18646:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 )
+            // InternalOCLstdlib.g:18646:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1();
@@ -54547,14 +54547,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0"
-    // InternalOCLstdlib.g:18658:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
+    // InternalOCLstdlib.g:18660:1: rule__NavigatingCommaArgCS__Group_2_1__0 : rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18662:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
-            // InternalOCLstdlib.g:18663:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
+            // InternalOCLstdlib.g:18664:1: ( rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1 )
+            // InternalOCLstdlib.g:18665:2: rule__NavigatingCommaArgCS__Group_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingCommaArgCS__Group_2_1__0__Impl();
@@ -54585,17 +54585,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__0__Impl"
-    // InternalOCLstdlib.g:18670:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:18672:1: rule__NavigatingCommaArgCS__Group_2_1__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18674:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:18675:1: ( ':' )
+            // InternalOCLstdlib.g:18676:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:18677:1: ( ':' )
             {
-            // InternalOCLstdlib.g:18675:1: ( ':' )
-            // InternalOCLstdlib.g:18676:1: ':'
+            // InternalOCLstdlib.g:18677:1: ( ':' )
+            // InternalOCLstdlib.g:18678:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());
@@ -54626,14 +54626,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1"
-    // InternalOCLstdlib.g:18689:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
+    // InternalOCLstdlib.g:18691:1: rule__NavigatingCommaArgCS__Group_2_1__1 : rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18693:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
-            // InternalOCLstdlib.g:18694:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
+            // InternalOCLstdlib.g:18695:1: ( rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2 )
+            // InternalOCLstdlib.g:18696:2: rule__NavigatingCommaArgCS__Group_2_1__1__Impl rule__NavigatingCommaArgCS__Group_2_1__2
             {
             pushFollow(FollowSets000.FOLLOW_88);
             rule__NavigatingCommaArgCS__Group_2_1__1__Impl();
@@ -54664,23 +54664,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__1__Impl"
-    // InternalOCLstdlib.g:18701:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:18703:1: rule__NavigatingCommaArgCS__Group_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18705:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
-            // InternalOCLstdlib.g:18706:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:18707:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) ) )
+            // InternalOCLstdlib.g:18708:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:18706:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
-            // InternalOCLstdlib.g:18707:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalOCLstdlib.g:18708:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 ) )
+            // InternalOCLstdlib.g:18709:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_1_1());
             }
-            // InternalOCLstdlib.g:18708:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
-            // InternalOCLstdlib.g:18708:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
+            // InternalOCLstdlib.g:18710:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 )
+            // InternalOCLstdlib.g:18710:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1();
@@ -54715,14 +54715,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2"
-    // InternalOCLstdlib.g:18718:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
+    // InternalOCLstdlib.g:18720:1: rule__NavigatingCommaArgCS__Group_2_1__2 : rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18722:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
-            // InternalOCLstdlib.g:18723:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
+            // InternalOCLstdlib.g:18724:1: ( rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3 )
+            // InternalOCLstdlib.g:18725:2: rule__NavigatingCommaArgCS__Group_2_1__2__Impl rule__NavigatingCommaArgCS__Group_2_1__3
             {
             pushFollow(FollowSets000.FOLLOW_88);
             rule__NavigatingCommaArgCS__Group_2_1__2__Impl();
@@ -54753,22 +54753,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__2__Impl"
-    // InternalOCLstdlib.g:18730:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
+    // InternalOCLstdlib.g:18732:1: rule__NavigatingCommaArgCS__Group_2_1__2__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18734:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
-            // InternalOCLstdlib.g:18735:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalOCLstdlib.g:18736:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? ) )
+            // InternalOCLstdlib.g:18737:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
             {
-            // InternalOCLstdlib.g:18735:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
-            // InternalOCLstdlib.g:18736:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalOCLstdlib.g:18737:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )? )
+            // InternalOCLstdlib.g:18738:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_2());
             }
-            // InternalOCLstdlib.g:18737:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
+            // InternalOCLstdlib.g:18739:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0 )?
             int alt157=2;
             int LA157_0 = input.LA(1);
 
@@ -54777,7 +54777,7 @@
             }
             switch (alt157) {
                 case 1 :
-                    // InternalOCLstdlib.g:18737:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
+                    // InternalOCLstdlib.g:18739:2: rule__NavigatingCommaArgCS__Group_2_1_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_2__0();
@@ -54815,14 +54815,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3"
-    // InternalOCLstdlib.g:18747:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
+    // InternalOCLstdlib.g:18749:1: rule__NavigatingCommaArgCS__Group_2_1__3 : rule__NavigatingCommaArgCS__Group_2_1__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18751:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
-            // InternalOCLstdlib.g:18752:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
+            // InternalOCLstdlib.g:18753:1: ( rule__NavigatingCommaArgCS__Group_2_1__3__Impl )
+            // InternalOCLstdlib.g:18754:2: rule__NavigatingCommaArgCS__Group_2_1__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1__3__Impl();
@@ -54848,22 +54848,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1__3__Impl"
-    // InternalOCLstdlib.g:18758:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
+    // InternalOCLstdlib.g:18760:1: rule__NavigatingCommaArgCS__Group_2_1__3__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18762:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
-            // InternalOCLstdlib.g:18763:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalOCLstdlib.g:18764:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? ) )
+            // InternalOCLstdlib.g:18765:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
             {
-            // InternalOCLstdlib.g:18763:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
-            // InternalOCLstdlib.g:18764:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalOCLstdlib.g:18765:1: ( ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )? )
+            // InternalOCLstdlib.g:18766:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1_3());
             }
-            // InternalOCLstdlib.g:18765:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
+            // InternalOCLstdlib.g:18767:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0 )?
             int alt158=2;
             int LA158_0 = input.LA(1);
 
@@ -54872,7 +54872,7 @@
             }
             switch (alt158) {
                 case 1 :
-                    // InternalOCLstdlib.g:18765:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
+                    // InternalOCLstdlib.g:18767:2: rule__NavigatingCommaArgCS__Group_2_1_3__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_1_3__0();
@@ -54910,14 +54910,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0"
-    // InternalOCLstdlib.g:18783:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
+    // InternalOCLstdlib.g:18785:1: rule__NavigatingCommaArgCS__Group_2_1_2__0 : rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18787:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
-            // InternalOCLstdlib.g:18788:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
+            // InternalOCLstdlib.g:18789:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1 )
+            // InternalOCLstdlib.g:18790:2: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl rule__NavigatingCommaArgCS__Group_2_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl();
@@ -54948,17 +54948,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl"
-    // InternalOCLstdlib.g:18795:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:18797:1: rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18799:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:18800:1: ( '<-' )
+            // InternalOCLstdlib.g:18801:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:18802:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:18800:1: ( '<-' )
-            // InternalOCLstdlib.g:18801:1: '<-'
+            // InternalOCLstdlib.g:18802:1: ( '<-' )
+            // InternalOCLstdlib.g:18803:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());
@@ -54989,14 +54989,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1"
-    // InternalOCLstdlib.g:18814:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
+    // InternalOCLstdlib.g:18816:1: rule__NavigatingCommaArgCS__Group_2_1_2__1 : rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18818:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
-            // InternalOCLstdlib.g:18819:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
+            // InternalOCLstdlib.g:18820:1: ( rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl )
+            // InternalOCLstdlib.g:18821:2: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl();
@@ -55022,23 +55022,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl"
-    // InternalOCLstdlib.g:18825:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
+    // InternalOCLstdlib.g:18827:1: rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18829:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
-            // InternalOCLstdlib.g:18830:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalOCLstdlib.g:18831:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) ) )
+            // InternalOCLstdlib.g:18832:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
             {
-            // InternalOCLstdlib.g:18830:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
-            // InternalOCLstdlib.g:18831:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalOCLstdlib.g:18832:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 ) )
+            // InternalOCLstdlib.g:18833:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_1_2_1());
             }
-            // InternalOCLstdlib.g:18832:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
-            // InternalOCLstdlib.g:18832:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
+            // InternalOCLstdlib.g:18834:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 )
+            // InternalOCLstdlib.g:18834:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1();
@@ -55073,14 +55073,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0"
-    // InternalOCLstdlib.g:18846:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
+    // InternalOCLstdlib.g:18848:1: rule__NavigatingCommaArgCS__Group_2_1_3__0 : rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18850:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
-            // InternalOCLstdlib.g:18851:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
+            // InternalOCLstdlib.g:18852:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1 )
+            // InternalOCLstdlib.g:18853:2: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl rule__NavigatingCommaArgCS__Group_2_1_3__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl();
@@ -55111,17 +55111,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl"
-    // InternalOCLstdlib.g:18858:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:18860:1: rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl : ( '=' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18862:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:18863:1: ( '=' )
+            // InternalOCLstdlib.g:18864:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:18865:1: ( '=' )
             {
-            // InternalOCLstdlib.g:18863:1: ( '=' )
-            // InternalOCLstdlib.g:18864:1: '='
+            // InternalOCLstdlib.g:18865:1: ( '=' )
+            // InternalOCLstdlib.g:18866:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());
@@ -55152,14 +55152,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1"
-    // InternalOCLstdlib.g:18877:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
+    // InternalOCLstdlib.g:18879:1: rule__NavigatingCommaArgCS__Group_2_1_3__1 : rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18881:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
-            // InternalOCLstdlib.g:18882:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
+            // InternalOCLstdlib.g:18883:1: ( rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl )
+            // InternalOCLstdlib.g:18884:2: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl();
@@ -55185,23 +55185,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl"
-    // InternalOCLstdlib.g:18888:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
+    // InternalOCLstdlib.g:18890:1: rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18892:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
-            // InternalOCLstdlib.g:18893:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalOCLstdlib.g:18894:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) ) )
+            // InternalOCLstdlib.g:18895:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
             {
-            // InternalOCLstdlib.g:18893:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
-            // InternalOCLstdlib.g:18894:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalOCLstdlib.g:18895:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 ) )
+            // InternalOCLstdlib.g:18896:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_1_3_1());
             }
-            // InternalOCLstdlib.g:18895:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
-            // InternalOCLstdlib.g:18895:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
+            // InternalOCLstdlib.g:18897:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 )
+            // InternalOCLstdlib.g:18897:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1();
@@ -55236,14 +55236,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0"
-    // InternalOCLstdlib.g:18909:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
+    // InternalOCLstdlib.g:18911:1: rule__NavigatingCommaArgCS__Group_2_2__0 : rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18913:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
-            // InternalOCLstdlib.g:18914:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
+            // InternalOCLstdlib.g:18915:1: ( rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1 )
+            // InternalOCLstdlib.g:18916:2: rule__NavigatingCommaArgCS__Group_2_2__0__Impl rule__NavigatingCommaArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_87);
             rule__NavigatingCommaArgCS__Group_2_2__0__Impl();
@@ -55274,22 +55274,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__0__Impl"
-    // InternalOCLstdlib.g:18921:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
+    // InternalOCLstdlib.g:18923:1: rule__NavigatingCommaArgCS__Group_2_2__0__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18925:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
-            // InternalOCLstdlib.g:18926:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalOCLstdlib.g:18927:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? ) )
+            // InternalOCLstdlib.g:18928:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
             {
-            // InternalOCLstdlib.g:18926:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
-            // InternalOCLstdlib.g:18927:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalOCLstdlib.g:18928:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )? )
+            // InternalOCLstdlib.g:18929:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_0());
             }
-            // InternalOCLstdlib.g:18928:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
+            // InternalOCLstdlib.g:18930:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0 )?
             int alt159=2;
             int LA159_0 = input.LA(1);
 
@@ -55298,7 +55298,7 @@
             }
             switch (alt159) {
                 case 1 :
-                    // InternalOCLstdlib.g:18928:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
+                    // InternalOCLstdlib.g:18930:2: rule__NavigatingCommaArgCS__Group_2_2_0__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_0__0();
@@ -55336,14 +55336,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1"
-    // InternalOCLstdlib.g:18938:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
+    // InternalOCLstdlib.g:18940:1: rule__NavigatingCommaArgCS__Group_2_2__1 : rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18942:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
-            // InternalOCLstdlib.g:18943:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
+            // InternalOCLstdlib.g:18944:1: ( rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2 )
+            // InternalOCLstdlib.g:18945:2: rule__NavigatingCommaArgCS__Group_2_2__1__Impl rule__NavigatingCommaArgCS__Group_2_2__2
             {
             pushFollow(FollowSets000.FOLLOW_87);
             rule__NavigatingCommaArgCS__Group_2_2__1__Impl();
@@ -55374,22 +55374,22 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__1__Impl"
-    // InternalOCLstdlib.g:18950:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
+    // InternalOCLstdlib.g:18952:1: rule__NavigatingCommaArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18954:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
-            // InternalOCLstdlib.g:18955:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalOCLstdlib.g:18956:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? ) )
+            // InternalOCLstdlib.g:18957:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
             {
-            // InternalOCLstdlib.g:18955:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
-            // InternalOCLstdlib.g:18956:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalOCLstdlib.g:18957:1: ( ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )? )
+            // InternalOCLstdlib.g:18958:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_2_1());
             }
-            // InternalOCLstdlib.g:18957:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
+            // InternalOCLstdlib.g:18959:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0 )?
             int alt160=2;
             int LA160_0 = input.LA(1);
 
@@ -55398,7 +55398,7 @@
             }
             switch (alt160) {
                 case 1 :
-                    // InternalOCLstdlib.g:18957:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
+                    // InternalOCLstdlib.g:18959:2: rule__NavigatingCommaArgCS__Group_2_2_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingCommaArgCS__Group_2_2_1__0();
@@ -55436,14 +55436,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2"
-    // InternalOCLstdlib.g:18967:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
+    // InternalOCLstdlib.g:18969:1: rule__NavigatingCommaArgCS__Group_2_2__2 : rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18971:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
-            // InternalOCLstdlib.g:18972:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
+            // InternalOCLstdlib.g:18973:1: ( rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3 )
+            // InternalOCLstdlib.g:18974:2: rule__NavigatingCommaArgCS__Group_2_2__2__Impl rule__NavigatingCommaArgCS__Group_2_2__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingCommaArgCS__Group_2_2__2__Impl();
@@ -55474,17 +55474,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__2__Impl"
-    // InternalOCLstdlib.g:18979:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
+    // InternalOCLstdlib.g:18981:1: rule__NavigatingCommaArgCS__Group_2_2__2__Impl : ( 'in' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:18983:1: ( ( 'in' ) )
-            // InternalOCLstdlib.g:18984:1: ( 'in' )
+            // InternalOCLstdlib.g:18985:1: ( ( 'in' ) )
+            // InternalOCLstdlib.g:18986:1: ( 'in' )
             {
-            // InternalOCLstdlib.g:18984:1: ( 'in' )
-            // InternalOCLstdlib.g:18985:1: 'in'
+            // InternalOCLstdlib.g:18986:1: ( 'in' )
+            // InternalOCLstdlib.g:18987:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());
@@ -55515,14 +55515,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3"
-    // InternalOCLstdlib.g:18998:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
+    // InternalOCLstdlib.g:19000:1: rule__NavigatingCommaArgCS__Group_2_2__3 : rule__NavigatingCommaArgCS__Group_2_2__3__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19002:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
-            // InternalOCLstdlib.g:19003:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
+            // InternalOCLstdlib.g:19004:1: ( rule__NavigatingCommaArgCS__Group_2_2__3__Impl )
+            // InternalOCLstdlib.g:19005:2: rule__NavigatingCommaArgCS__Group_2_2__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2__3__Impl();
@@ -55548,23 +55548,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2__3__Impl"
-    // InternalOCLstdlib.g:19009:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
+    // InternalOCLstdlib.g:19011:1: rule__NavigatingCommaArgCS__Group_2_2__3__Impl : ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19013:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
-            // InternalOCLstdlib.g:19014:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalOCLstdlib.g:19015:1: ( ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) ) )
+            // InternalOCLstdlib.g:19016:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
             {
-            // InternalOCLstdlib.g:19014:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
-            // InternalOCLstdlib.g:19015:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalOCLstdlib.g:19016:1: ( ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 ) )
+            // InternalOCLstdlib.g:19017:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionAssignment_2_2_3());
             }
-            // InternalOCLstdlib.g:19016:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
-            // InternalOCLstdlib.g:19016:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
+            // InternalOCLstdlib.g:19018:1: ( rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 )
+            // InternalOCLstdlib.g:19018:2: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3();
@@ -55599,14 +55599,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0"
-    // InternalOCLstdlib.g:19034:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
+    // InternalOCLstdlib.g:19036:1: rule__NavigatingCommaArgCS__Group_2_2_0__0 : rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19038:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
-            // InternalOCLstdlib.g:19039:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
+            // InternalOCLstdlib.g:19040:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1 )
+            // InternalOCLstdlib.g:19041:2: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl rule__NavigatingCommaArgCS__Group_2_2_0__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl();
@@ -55637,17 +55637,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl"
-    // InternalOCLstdlib.g:19046:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:19048:1: rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl : ( ':' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19050:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:19051:1: ( ':' )
+            // InternalOCLstdlib.g:19052:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:19053:1: ( ':' )
             {
-            // InternalOCLstdlib.g:19051:1: ( ':' )
-            // InternalOCLstdlib.g:19052:1: ':'
+            // InternalOCLstdlib.g:19053:1: ( ':' )
+            // InternalOCLstdlib.g:19054:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());
@@ -55678,14 +55678,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1"
-    // InternalOCLstdlib.g:19065:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
+    // InternalOCLstdlib.g:19067:1: rule__NavigatingCommaArgCS__Group_2_2_0__1 : rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19069:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
-            // InternalOCLstdlib.g:19070:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
+            // InternalOCLstdlib.g:19071:1: ( rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl )
+            // InternalOCLstdlib.g:19072:2: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl();
@@ -55711,23 +55711,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl"
-    // InternalOCLstdlib.g:19076:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
+    // InternalOCLstdlib.g:19078:1: rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19080:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
-            // InternalOCLstdlib.g:19081:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalOCLstdlib.g:19082:1: ( ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) ) )
+            // InternalOCLstdlib.g:19083:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
             {
-            // InternalOCLstdlib.g:19081:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
-            // InternalOCLstdlib.g:19082:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalOCLstdlib.g:19083:1: ( ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 ) )
+            // InternalOCLstdlib.g:19084:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeAssignment_2_2_0_1());
             }
-            // InternalOCLstdlib.g:19083:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
-            // InternalOCLstdlib.g:19083:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
+            // InternalOCLstdlib.g:19085:1: ( rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 )
+            // InternalOCLstdlib.g:19085:2: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1();
@@ -55762,14 +55762,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0"
-    // InternalOCLstdlib.g:19097:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
+    // InternalOCLstdlib.g:19099:1: rule__NavigatingCommaArgCS__Group_2_2_1__0 : rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19101:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
-            // InternalOCLstdlib.g:19102:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
+            // InternalOCLstdlib.g:19103:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1 )
+            // InternalOCLstdlib.g:19104:2: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl rule__NavigatingCommaArgCS__Group_2_2_1__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl();
@@ -55800,17 +55800,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl"
-    // InternalOCLstdlib.g:19109:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
+    // InternalOCLstdlib.g:19111:1: rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl : ( '<-' ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19113:1: ( ( '<-' ) )
-            // InternalOCLstdlib.g:19114:1: ( '<-' )
+            // InternalOCLstdlib.g:19115:1: ( ( '<-' ) )
+            // InternalOCLstdlib.g:19116:1: ( '<-' )
             {
-            // InternalOCLstdlib.g:19114:1: ( '<-' )
-            // InternalOCLstdlib.g:19115:1: '<-'
+            // InternalOCLstdlib.g:19116:1: ( '<-' )
+            // InternalOCLstdlib.g:19117:1: '<-'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());
@@ -55841,14 +55841,14 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1"
-    // InternalOCLstdlib.g:19128:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
+    // InternalOCLstdlib.g:19130:1: rule__NavigatingCommaArgCS__Group_2_2_1__1 : rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19132:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
-            // InternalOCLstdlib.g:19133:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
+            // InternalOCLstdlib.g:19134:1: ( rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl )
+            // InternalOCLstdlib.g:19135:2: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl();
@@ -55874,23 +55874,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl"
-    // InternalOCLstdlib.g:19139:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
+    // InternalOCLstdlib.g:19141:1: rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl : ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) ;
     public final void rule__NavigatingCommaArgCS__Group_2_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19143:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
-            // InternalOCLstdlib.g:19144:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalOCLstdlib.g:19145:1: ( ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) ) )
+            // InternalOCLstdlib.g:19146:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
             {
-            // InternalOCLstdlib.g:19144:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
-            // InternalOCLstdlib.g:19145:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalOCLstdlib.g:19146:1: ( ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 ) )
+            // InternalOCLstdlib.g:19147:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorAssignment_2_2_1_1());
             }
-            // InternalOCLstdlib.g:19146:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
-            // InternalOCLstdlib.g:19146:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
+            // InternalOCLstdlib.g:19148:1: ( rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 )
+            // InternalOCLstdlib.g:19148:2: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1();
@@ -55925,14 +55925,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0"
-    // InternalOCLstdlib.g:19160:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
+    // InternalOCLstdlib.g:19162:1: rule__NavigatingSemiArgCS__Group__0 : rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 ;
     public final void rule__NavigatingSemiArgCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19164:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
-            // InternalOCLstdlib.g:19165:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
+            // InternalOCLstdlib.g:19166:1: ( rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1 )
+            // InternalOCLstdlib.g:19167:2: rule__NavigatingSemiArgCS__Group__0__Impl rule__NavigatingSemiArgCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingSemiArgCS__Group__0__Impl();
@@ -55963,23 +55963,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__0__Impl"
-    // InternalOCLstdlib.g:19172:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:19174:1: rule__NavigatingSemiArgCS__Group__0__Impl : ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19176:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
-            // InternalOCLstdlib.g:19177:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalOCLstdlib.g:19178:1: ( ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) ) )
+            // InternalOCLstdlib.g:19179:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:19177:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
-            // InternalOCLstdlib.g:19178:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalOCLstdlib.g:19179:1: ( ( rule__NavigatingSemiArgCS__PrefixAssignment_0 ) )
+            // InternalOCLstdlib.g:19180:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixAssignment_0());
             }
-            // InternalOCLstdlib.g:19179:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
-            // InternalOCLstdlib.g:19179:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
+            // InternalOCLstdlib.g:19181:1: ( rule__NavigatingSemiArgCS__PrefixAssignment_0 )
+            // InternalOCLstdlib.g:19181:2: rule__NavigatingSemiArgCS__PrefixAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__PrefixAssignment_0();
@@ -56014,14 +56014,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1"
-    // InternalOCLstdlib.g:19189:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
+    // InternalOCLstdlib.g:19191:1: rule__NavigatingSemiArgCS__Group__1 : rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 ;
     public final void rule__NavigatingSemiArgCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19193:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
-            // InternalOCLstdlib.g:19194:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
+            // InternalOCLstdlib.g:19195:1: ( rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2 )
+            // InternalOCLstdlib.g:19196:2: rule__NavigatingSemiArgCS__Group__1__Impl rule__NavigatingSemiArgCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__NavigatingSemiArgCS__Group__1__Impl();
@@ -56052,23 +56052,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__1__Impl"
-    // InternalOCLstdlib.g:19201:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:19203:1: rule__NavigatingSemiArgCS__Group__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19205:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
-            // InternalOCLstdlib.g:19206:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:19207:1: ( ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:19208:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:19206:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
-            // InternalOCLstdlib.g:19207:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLstdlib.g:19208:1: ( ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:19209:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionAssignment_1());
             }
-            // InternalOCLstdlib.g:19208:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
-            // InternalOCLstdlib.g:19208:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
+            // InternalOCLstdlib.g:19210:1: ( rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 )
+            // InternalOCLstdlib.g:19210:2: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1();
@@ -56103,14 +56103,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2"
-    // InternalOCLstdlib.g:19218:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:19220:1: rule__NavigatingSemiArgCS__Group__2 : rule__NavigatingSemiArgCS__Group__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19222:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
-            // InternalOCLstdlib.g:19223:2: rule__NavigatingSemiArgCS__Group__2__Impl
+            // InternalOCLstdlib.g:19224:1: ( rule__NavigatingSemiArgCS__Group__2__Impl )
+            // InternalOCLstdlib.g:19225:2: rule__NavigatingSemiArgCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group__2__Impl();
@@ -56136,22 +56136,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group__2__Impl"
-    // InternalOCLstdlib.g:19229:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:19231:1: rule__NavigatingSemiArgCS__Group__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19233:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:19234:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:19235:1: ( ( ( rule__NavigatingSemiArgCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:19236:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:19234:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:19235:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalOCLstdlib.g:19236:1: ( ( rule__NavigatingSemiArgCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:19237:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:19236:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
+            // InternalOCLstdlib.g:19238:1: ( rule__NavigatingSemiArgCS__Group_2__0 )?
             int alt161=2;
             int LA161_0 = input.LA(1);
 
@@ -56160,7 +56160,7 @@
             }
             switch (alt161) {
                 case 1 :
-                    // InternalOCLstdlib.g:19236:2: rule__NavigatingSemiArgCS__Group_2__0
+                    // InternalOCLstdlib.g:19238:2: rule__NavigatingSemiArgCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2__0();
@@ -56198,14 +56198,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0"
-    // InternalOCLstdlib.g:19252:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
+    // InternalOCLstdlib.g:19254:1: rule__NavigatingSemiArgCS__Group_2__0 : rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19256:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
-            // InternalOCLstdlib.g:19257:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
+            // InternalOCLstdlib.g:19258:1: ( rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1 )
+            // InternalOCLstdlib.g:19259:2: rule__NavigatingSemiArgCS__Group_2__0__Impl rule__NavigatingSemiArgCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingSemiArgCS__Group_2__0__Impl();
@@ -56236,17 +56236,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:19264:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:19266:1: rule__NavigatingSemiArgCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19268:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:19269:1: ( ':' )
+            // InternalOCLstdlib.g:19270:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:19271:1: ( ':' )
             {
-            // InternalOCLstdlib.g:19269:1: ( ':' )
-            // InternalOCLstdlib.g:19270:1: ':'
+            // InternalOCLstdlib.g:19271:1: ( ':' )
+            // InternalOCLstdlib.g:19272:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());
@@ -56277,14 +56277,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1"
-    // InternalOCLstdlib.g:19283:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
+    // InternalOCLstdlib.g:19285:1: rule__NavigatingSemiArgCS__Group_2__1 : rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 ;
     public final void rule__NavigatingSemiArgCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19287:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
-            // InternalOCLstdlib.g:19288:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
+            // InternalOCLstdlib.g:19289:1: ( rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2 )
+            // InternalOCLstdlib.g:19290:2: rule__NavigatingSemiArgCS__Group_2__1__Impl rule__NavigatingSemiArgCS__Group_2__2
             {
             pushFollow(FollowSets000.FOLLOW_26);
             rule__NavigatingSemiArgCS__Group_2__1__Impl();
@@ -56315,23 +56315,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:19295:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:19297:1: rule__NavigatingSemiArgCS__Group_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19299:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:19300:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLstdlib.g:19301:1: ( ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:19302:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:19300:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
-            // InternalOCLstdlib.g:19301:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLstdlib.g:19302:1: ( ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLstdlib.g:19303:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalOCLstdlib.g:19302:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
-            // InternalOCLstdlib.g:19302:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
+            // InternalOCLstdlib.g:19304:1: ( rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLstdlib.g:19304:2: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1();
@@ -56366,14 +56366,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2"
-    // InternalOCLstdlib.g:19312:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
+    // InternalOCLstdlib.g:19314:1: rule__NavigatingSemiArgCS__Group_2__2 : rule__NavigatingSemiArgCS__Group_2__2__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19316:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
-            // InternalOCLstdlib.g:19317:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
+            // InternalOCLstdlib.g:19318:1: ( rule__NavigatingSemiArgCS__Group_2__2__Impl )
+            // InternalOCLstdlib.g:19319:2: rule__NavigatingSemiArgCS__Group_2__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2__2__Impl();
@@ -56399,22 +56399,22 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2__2__Impl"
-    // InternalOCLstdlib.g:19323:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
+    // InternalOCLstdlib.g:19325:1: rule__NavigatingSemiArgCS__Group_2__2__Impl : ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) ;
     public final void rule__NavigatingSemiArgCS__Group_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19327:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
-            // InternalOCLstdlib.g:19328:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalOCLstdlib.g:19329:1: ( ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? ) )
+            // InternalOCLstdlib.g:19330:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
             {
-            // InternalOCLstdlib.g:19328:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
-            // InternalOCLstdlib.g:19329:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalOCLstdlib.g:19330:1: ( ( rule__NavigatingSemiArgCS__Group_2_2__0 )? )
+            // InternalOCLstdlib.g:19331:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getGroup_2_2());
             }
-            // InternalOCLstdlib.g:19330:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
+            // InternalOCLstdlib.g:19332:1: ( rule__NavigatingSemiArgCS__Group_2_2__0 )?
             int alt162=2;
             int LA162_0 = input.LA(1);
 
@@ -56423,7 +56423,7 @@
             }
             switch (alt162) {
                 case 1 :
-                    // InternalOCLstdlib.g:19330:2: rule__NavigatingSemiArgCS__Group_2_2__0
+                    // InternalOCLstdlib.g:19332:2: rule__NavigatingSemiArgCS__Group_2_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__NavigatingSemiArgCS__Group_2_2__0();
@@ -56461,14 +56461,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0"
-    // InternalOCLstdlib.g:19346:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
+    // InternalOCLstdlib.g:19348:1: rule__NavigatingSemiArgCS__Group_2_2__0 : rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19350:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
-            // InternalOCLstdlib.g:19351:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
+            // InternalOCLstdlib.g:19352:1: ( rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1 )
+            // InternalOCLstdlib.g:19353:2: rule__NavigatingSemiArgCS__Group_2_2__0__Impl rule__NavigatingSemiArgCS__Group_2_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NavigatingSemiArgCS__Group_2_2__0__Impl();
@@ -56499,17 +56499,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__0__Impl"
-    // InternalOCLstdlib.g:19358:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:19360:1: rule__NavigatingSemiArgCS__Group_2_2__0__Impl : ( '=' ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19362:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:19363:1: ( '=' )
+            // InternalOCLstdlib.g:19364:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:19365:1: ( '=' )
             {
-            // InternalOCLstdlib.g:19363:1: ( '=' )
-            // InternalOCLstdlib.g:19364:1: '='
+            // InternalOCLstdlib.g:19365:1: ( '=' )
+            // InternalOCLstdlib.g:19366:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());
@@ -56540,14 +56540,14 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1"
-    // InternalOCLstdlib.g:19377:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
+    // InternalOCLstdlib.g:19379:1: rule__NavigatingSemiArgCS__Group_2_2__1 : rule__NavigatingSemiArgCS__Group_2_2__1__Impl ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19381:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
-            // InternalOCLstdlib.g:19382:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
+            // InternalOCLstdlib.g:19383:1: ( rule__NavigatingSemiArgCS__Group_2_2__1__Impl )
+            // InternalOCLstdlib.g:19384:2: rule__NavigatingSemiArgCS__Group_2_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__Group_2_2__1__Impl();
@@ -56573,23 +56573,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__Group_2_2__1__Impl"
-    // InternalOCLstdlib.g:19388:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
+    // InternalOCLstdlib.g:19390:1: rule__NavigatingSemiArgCS__Group_2_2__1__Impl : ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) ;
     public final void rule__NavigatingSemiArgCS__Group_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19392:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
-            // InternalOCLstdlib.g:19393:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:19394:1: ( ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) ) )
+            // InternalOCLstdlib.g:19395:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
             {
-            // InternalOCLstdlib.g:19393:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
-            // InternalOCLstdlib.g:19394:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLstdlib.g:19395:1: ( ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 ) )
+            // InternalOCLstdlib.g:19396:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionAssignment_2_2_1());
             }
-            // InternalOCLstdlib.g:19395:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
-            // InternalOCLstdlib.g:19395:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
+            // InternalOCLstdlib.g:19397:1: ( rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 )
+            // InternalOCLstdlib.g:19397:2: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1();
@@ -56624,14 +56624,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0"
-    // InternalOCLstdlib.g:19409:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
+    // InternalOCLstdlib.g:19411:1: rule__CoIteratorVariableCS__Group__0 : rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 ;
     public final void rule__CoIteratorVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19413:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
-            // InternalOCLstdlib.g:19414:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
+            // InternalOCLstdlib.g:19415:1: ( rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1 )
+            // InternalOCLstdlib.g:19416:2: rule__CoIteratorVariableCS__Group__0__Impl rule__CoIteratorVariableCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_11);
             rule__CoIteratorVariableCS__Group__0__Impl();
@@ -56662,23 +56662,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__0__Impl"
-    // InternalOCLstdlib.g:19421:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:19423:1: rule__CoIteratorVariableCS__Group__0__Impl : ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) ;
     public final void rule__CoIteratorVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19425:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:19426:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:19427:1: ( ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:19428:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:19426:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:19427:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:19428:1: ( ( rule__CoIteratorVariableCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:19429:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:19428:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:19428:2: rule__CoIteratorVariableCS__NameAssignment_0
+            // InternalOCLstdlib.g:19430:1: ( rule__CoIteratorVariableCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:19430:2: rule__CoIteratorVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__NameAssignment_0();
@@ -56713,14 +56713,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1"
-    // InternalOCLstdlib.g:19438:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:19440:1: rule__CoIteratorVariableCS__Group__1 : rule__CoIteratorVariableCS__Group__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19442:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
-            // InternalOCLstdlib.g:19443:2: rule__CoIteratorVariableCS__Group__1__Impl
+            // InternalOCLstdlib.g:19444:1: ( rule__CoIteratorVariableCS__Group__1__Impl )
+            // InternalOCLstdlib.g:19445:2: rule__CoIteratorVariableCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group__1__Impl();
@@ -56746,22 +56746,22 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group__1__Impl"
-    // InternalOCLstdlib.g:19449:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:19451:1: rule__CoIteratorVariableCS__Group__1__Impl : ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) ;
     public final void rule__CoIteratorVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19453:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:19454:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:19455:1: ( ( ( rule__CoIteratorVariableCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:19456:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:19454:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:19455:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalOCLstdlib.g:19456:1: ( ( rule__CoIteratorVariableCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:19457:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:19456:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
+            // InternalOCLstdlib.g:19458:1: ( rule__CoIteratorVariableCS__Group_1__0 )?
             int alt163=2;
             int LA163_0 = input.LA(1);
 
@@ -56770,7 +56770,7 @@
             }
             switch (alt163) {
                 case 1 :
-                    // InternalOCLstdlib.g:19456:2: rule__CoIteratorVariableCS__Group_1__0
+                    // InternalOCLstdlib.g:19458:2: rule__CoIteratorVariableCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__CoIteratorVariableCS__Group_1__0();
@@ -56808,14 +56808,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0"
-    // InternalOCLstdlib.g:19470:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
+    // InternalOCLstdlib.g:19472:1: rule__CoIteratorVariableCS__Group_1__0 : rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 ;
     public final void rule__CoIteratorVariableCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19474:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
-            // InternalOCLstdlib.g:19475:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
+            // InternalOCLstdlib.g:19476:1: ( rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1 )
+            // InternalOCLstdlib.g:19477:2: rule__CoIteratorVariableCS__Group_1__0__Impl rule__CoIteratorVariableCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__CoIteratorVariableCS__Group_1__0__Impl();
@@ -56846,17 +56846,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:19482:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:19484:1: rule__CoIteratorVariableCS__Group_1__0__Impl : ( ':' ) ;
     public final void rule__CoIteratorVariableCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19486:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:19487:1: ( ':' )
+            // InternalOCLstdlib.g:19488:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:19489:1: ( ':' )
             {
-            // InternalOCLstdlib.g:19487:1: ( ':' )
-            // InternalOCLstdlib.g:19488:1: ':'
+            // InternalOCLstdlib.g:19489:1: ( ':' )
+            // InternalOCLstdlib.g:19490:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());
@@ -56887,14 +56887,14 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1"
-    // InternalOCLstdlib.g:19501:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:19503:1: rule__CoIteratorVariableCS__Group_1__1 : rule__CoIteratorVariableCS__Group_1__1__Impl ;
     public final void rule__CoIteratorVariableCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19505:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:19506:2: rule__CoIteratorVariableCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:19507:1: ( rule__CoIteratorVariableCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:19508:2: rule__CoIteratorVariableCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__Group_1__1__Impl();
@@ -56920,23 +56920,23 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:19512:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:19514:1: rule__CoIteratorVariableCS__Group_1__1__Impl : ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) ;
     public final void rule__CoIteratorVariableCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19516:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:19517:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:19518:1: ( ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:19519:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:19517:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
-            // InternalOCLstdlib.g:19518:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:19519:1: ( ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 ) )
+            // InternalOCLstdlib.g:19520:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeAssignment_1_1());
             }
-            // InternalOCLstdlib.g:19519:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
-            // InternalOCLstdlib.g:19519:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
+            // InternalOCLstdlib.g:19521:1: ( rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 )
+            // InternalOCLstdlib.g:19521:2: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1();
@@ -56971,14 +56971,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0"
-    // InternalOCLstdlib.g:19533:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
+    // InternalOCLstdlib.g:19535:1: rule__IfExpCS__Group__0 : rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 ;
     public final void rule__IfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19537:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
-            // InternalOCLstdlib.g:19538:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
+            // InternalOCLstdlib.g:19539:1: ( rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1 )
+            // InternalOCLstdlib.g:19540:2: rule__IfExpCS__Group__0__Impl rule__IfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_67);
             rule__IfExpCS__Group__0__Impl();
@@ -57009,17 +57009,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:19545:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
+    // InternalOCLstdlib.g:19547:1: rule__IfExpCS__Group__0__Impl : ( 'if' ) ;
     public final void rule__IfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19549:1: ( ( 'if' ) )
-            // InternalOCLstdlib.g:19550:1: ( 'if' )
+            // InternalOCLstdlib.g:19551:1: ( ( 'if' ) )
+            // InternalOCLstdlib.g:19552:1: ( 'if' )
             {
-            // InternalOCLstdlib.g:19550:1: ( 'if' )
-            // InternalOCLstdlib.g:19551:1: 'if'
+            // InternalOCLstdlib.g:19552:1: ( 'if' )
+            // InternalOCLstdlib.g:19553:1: 'if'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getIfKeyword_0());
@@ -57050,14 +57050,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1"
-    // InternalOCLstdlib.g:19564:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
+    // InternalOCLstdlib.g:19566:1: rule__IfExpCS__Group__1 : rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 ;
     public final void rule__IfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19568:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
-            // InternalOCLstdlib.g:19569:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
+            // InternalOCLstdlib.g:19570:1: ( rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2 )
+            // InternalOCLstdlib.g:19571:2: rule__IfExpCS__Group__1__Impl rule__IfExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_89);
             rule__IfExpCS__Group__1__Impl();
@@ -57088,23 +57088,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:19576:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:19578:1: rule__IfExpCS__Group__1__Impl : ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__IfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19580:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalOCLstdlib.g:19581:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLstdlib.g:19582:1: ( ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:19583:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:19581:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
-            // InternalOCLstdlib.g:19582:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLstdlib.g:19583:1: ( ( rule__IfExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLstdlib.g:19584:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalOCLstdlib.g:19583:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
-            // InternalOCLstdlib.g:19583:2: rule__IfExpCS__OwnedConditionAssignment_1
+            // InternalOCLstdlib.g:19585:1: ( rule__IfExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLstdlib.g:19585:2: rule__IfExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAssignment_1();
@@ -57139,14 +57139,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2"
-    // InternalOCLstdlib.g:19593:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
+    // InternalOCLstdlib.g:19595:1: rule__IfExpCS__Group__2 : rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 ;
     public final void rule__IfExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19597:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
-            // InternalOCLstdlib.g:19598:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
+            // InternalOCLstdlib.g:19599:1: ( rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3 )
+            // InternalOCLstdlib.g:19600:2: rule__IfExpCS__Group__2__Impl rule__IfExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__IfExpCS__Group__2__Impl();
@@ -57177,17 +57177,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:19605:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalOCLstdlib.g:19607:1: rule__IfExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__IfExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19609:1: ( ( 'then' ) )
-            // InternalOCLstdlib.g:19610:1: ( 'then' )
+            // InternalOCLstdlib.g:19611:1: ( ( 'then' ) )
+            // InternalOCLstdlib.g:19612:1: ( 'then' )
             {
-            // InternalOCLstdlib.g:19610:1: ( 'then' )
-            // InternalOCLstdlib.g:19611:1: 'then'
+            // InternalOCLstdlib.g:19612:1: ( 'then' )
+            // InternalOCLstdlib.g:19613:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getThenKeyword_2());
@@ -57218,14 +57218,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3"
-    // InternalOCLstdlib.g:19624:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
+    // InternalOCLstdlib.g:19626:1: rule__IfExpCS__Group__3 : rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 ;
     public final void rule__IfExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19628:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
-            // InternalOCLstdlib.g:19629:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
+            // InternalOCLstdlib.g:19630:1: ( rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4 )
+            // InternalOCLstdlib.g:19631:2: rule__IfExpCS__Group__3__Impl rule__IfExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_90);
             rule__IfExpCS__Group__3__Impl();
@@ -57256,23 +57256,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:19636:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:19638:1: rule__IfExpCS__Group__3__Impl : ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__IfExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19640:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalOCLstdlib.g:19641:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLstdlib.g:19642:1: ( ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalOCLstdlib.g:19643:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:19641:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalOCLstdlib.g:19642:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLstdlib.g:19643:1: ( ( rule__IfExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLstdlib.g:19644:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalOCLstdlib.g:19643:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalOCLstdlib.g:19643:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
+            // InternalOCLstdlib.g:19645:1: ( rule__IfExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLstdlib.g:19645:2: rule__IfExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedThenExpressionAssignment_3();
@@ -57307,14 +57307,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4"
-    // InternalOCLstdlib.g:19653:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
+    // InternalOCLstdlib.g:19655:1: rule__IfExpCS__Group__4 : rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 ;
     public final void rule__IfExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19657:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
-            // InternalOCLstdlib.g:19658:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
+            // InternalOCLstdlib.g:19659:1: ( rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5 )
+            // InternalOCLstdlib.g:19660:2: rule__IfExpCS__Group__4__Impl rule__IfExpCS__Group__5
             {
             pushFollow(FollowSets000.FOLLOW_90);
             rule__IfExpCS__Group__4__Impl();
@@ -57345,22 +57345,22 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__4__Impl"
-    // InternalOCLstdlib.g:19665:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
+    // InternalOCLstdlib.g:19667:1: rule__IfExpCS__Group__4__Impl : ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) ;
     public final void rule__IfExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19669:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
-            // InternalOCLstdlib.g:19670:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalOCLstdlib.g:19671:1: ( ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* ) )
+            // InternalOCLstdlib.g:19672:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
             {
-            // InternalOCLstdlib.g:19670:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
-            // InternalOCLstdlib.g:19671:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalOCLstdlib.g:19672:1: ( ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )* )
+            // InternalOCLstdlib.g:19673:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsAssignment_4());
             }
-            // InternalOCLstdlib.g:19672:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
+            // InternalOCLstdlib.g:19674:1: ( rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 )*
             loop164:
             do {
                 int alt164=2;
@@ -57373,7 +57373,7 @@
 
                 switch (alt164) {
             	case 1 :
-            	    // InternalOCLstdlib.g:19672:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
+            	    // InternalOCLstdlib.g:19674:2: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4
             	    {
             	    pushFollow(FollowSets000.FOLLOW_91);
             	    rule__IfExpCS__OwnedIfThenExpressionsAssignment_4();
@@ -57414,14 +57414,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5"
-    // InternalOCLstdlib.g:19682:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
+    // InternalOCLstdlib.g:19684:1: rule__IfExpCS__Group__5 : rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 ;
     public final void rule__IfExpCS__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19686:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
-            // InternalOCLstdlib.g:19687:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
+            // InternalOCLstdlib.g:19688:1: ( rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6 )
+            // InternalOCLstdlib.g:19689:2: rule__IfExpCS__Group__5__Impl rule__IfExpCS__Group__6
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__IfExpCS__Group__5__Impl();
@@ -57452,17 +57452,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__5__Impl"
-    // InternalOCLstdlib.g:19694:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
+    // InternalOCLstdlib.g:19696:1: rule__IfExpCS__Group__5__Impl : ( 'else' ) ;
     public final void rule__IfExpCS__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19698:1: ( ( 'else' ) )
-            // InternalOCLstdlib.g:19699:1: ( 'else' )
+            // InternalOCLstdlib.g:19700:1: ( ( 'else' ) )
+            // InternalOCLstdlib.g:19701:1: ( 'else' )
             {
-            // InternalOCLstdlib.g:19699:1: ( 'else' )
-            // InternalOCLstdlib.g:19700:1: 'else'
+            // InternalOCLstdlib.g:19701:1: ( 'else' )
+            // InternalOCLstdlib.g:19702:1: 'else'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getElseKeyword_5());
@@ -57493,14 +57493,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6"
-    // InternalOCLstdlib.g:19713:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
+    // InternalOCLstdlib.g:19715:1: rule__IfExpCS__Group__6 : rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 ;
     public final void rule__IfExpCS__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19717:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
-            // InternalOCLstdlib.g:19718:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
+            // InternalOCLstdlib.g:19719:1: ( rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7 )
+            // InternalOCLstdlib.g:19720:2: rule__IfExpCS__Group__6__Impl rule__IfExpCS__Group__7
             {
             pushFollow(FollowSets000.FOLLOW_92);
             rule__IfExpCS__Group__6__Impl();
@@ -57531,23 +57531,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__6__Impl"
-    // InternalOCLstdlib.g:19725:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
+    // InternalOCLstdlib.g:19727:1: rule__IfExpCS__Group__6__Impl : ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) ;
     public final void rule__IfExpCS__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19729:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
-            // InternalOCLstdlib.g:19730:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalOCLstdlib.g:19731:1: ( ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) ) )
+            // InternalOCLstdlib.g:19732:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
             {
-            // InternalOCLstdlib.g:19730:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
-            // InternalOCLstdlib.g:19731:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalOCLstdlib.g:19732:1: ( ( rule__IfExpCS__OwnedElseExpressionAssignment_6 ) )
+            // InternalOCLstdlib.g:19733:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionAssignment_6());
             }
-            // InternalOCLstdlib.g:19732:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
-            // InternalOCLstdlib.g:19732:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
+            // InternalOCLstdlib.g:19734:1: ( rule__IfExpCS__OwnedElseExpressionAssignment_6 )
+            // InternalOCLstdlib.g:19734:2: rule__IfExpCS__OwnedElseExpressionAssignment_6
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedElseExpressionAssignment_6();
@@ -57582,14 +57582,14 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7"
-    // InternalOCLstdlib.g:19742:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
+    // InternalOCLstdlib.g:19744:1: rule__IfExpCS__Group__7 : rule__IfExpCS__Group__7__Impl ;
     public final void rule__IfExpCS__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19746:1: ( rule__IfExpCS__Group__7__Impl )
-            // InternalOCLstdlib.g:19747:2: rule__IfExpCS__Group__7__Impl
+            // InternalOCLstdlib.g:19748:1: ( rule__IfExpCS__Group__7__Impl )
+            // InternalOCLstdlib.g:19749:2: rule__IfExpCS__Group__7__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__Group__7__Impl();
@@ -57615,17 +57615,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__Group__7__Impl"
-    // InternalOCLstdlib.g:19753:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
+    // InternalOCLstdlib.g:19755:1: rule__IfExpCS__Group__7__Impl : ( 'endif' ) ;
     public final void rule__IfExpCS__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19757:1: ( ( 'endif' ) )
-            // InternalOCLstdlib.g:19758:1: ( 'endif' )
+            // InternalOCLstdlib.g:19759:1: ( ( 'endif' ) )
+            // InternalOCLstdlib.g:19760:1: ( 'endif' )
             {
-            // InternalOCLstdlib.g:19758:1: ( 'endif' )
-            // InternalOCLstdlib.g:19759:1: 'endif'
+            // InternalOCLstdlib.g:19760:1: ( 'endif' )
+            // InternalOCLstdlib.g:19761:1: 'endif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getEndifKeyword_7());
@@ -57656,14 +57656,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0"
-    // InternalOCLstdlib.g:19788:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
+    // InternalOCLstdlib.g:19790:1: rule__ElseIfThenExpCS__Group__0 : rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 ;
     public final void rule__ElseIfThenExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19792:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
-            // InternalOCLstdlib.g:19793:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
+            // InternalOCLstdlib.g:19794:1: ( rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1 )
+            // InternalOCLstdlib.g:19795:2: rule__ElseIfThenExpCS__Group__0__Impl rule__ElseIfThenExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__ElseIfThenExpCS__Group__0__Impl();
@@ -57694,17 +57694,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:19800:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
+    // InternalOCLstdlib.g:19802:1: rule__ElseIfThenExpCS__Group__0__Impl : ( 'elseif' ) ;
     public final void rule__ElseIfThenExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19804:1: ( ( 'elseif' ) )
-            // InternalOCLstdlib.g:19805:1: ( 'elseif' )
+            // InternalOCLstdlib.g:19806:1: ( ( 'elseif' ) )
+            // InternalOCLstdlib.g:19807:1: ( 'elseif' )
             {
-            // InternalOCLstdlib.g:19805:1: ( 'elseif' )
-            // InternalOCLstdlib.g:19806:1: 'elseif'
+            // InternalOCLstdlib.g:19807:1: ( 'elseif' )
+            // InternalOCLstdlib.g:19808:1: 'elseif'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());
@@ -57735,14 +57735,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1"
-    // InternalOCLstdlib.g:19819:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
+    // InternalOCLstdlib.g:19821:1: rule__ElseIfThenExpCS__Group__1 : rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 ;
     public final void rule__ElseIfThenExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19823:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
-            // InternalOCLstdlib.g:19824:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
+            // InternalOCLstdlib.g:19825:1: ( rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2 )
+            // InternalOCLstdlib.g:19826:2: rule__ElseIfThenExpCS__Group__1__Impl rule__ElseIfThenExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_89);
             rule__ElseIfThenExpCS__Group__1__Impl();
@@ -57773,23 +57773,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:19831:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:19833:1: rule__ElseIfThenExpCS__Group__1__Impl : ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19835:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
-            // InternalOCLstdlib.g:19836:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLstdlib.g:19837:1: ( ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:19838:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:19836:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
-            // InternalOCLstdlib.g:19837:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLstdlib.g:19838:1: ( ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 ) )
+            // InternalOCLstdlib.g:19839:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionAssignment_1());
             }
-            // InternalOCLstdlib.g:19838:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
-            // InternalOCLstdlib.g:19838:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
+            // InternalOCLstdlib.g:19840:1: ( rule__ElseIfThenExpCS__OwnedConditionAssignment_1 )
+            // InternalOCLstdlib.g:19840:2: rule__ElseIfThenExpCS__OwnedConditionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedConditionAssignment_1();
@@ -57824,14 +57824,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2"
-    // InternalOCLstdlib.g:19848:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
+    // InternalOCLstdlib.g:19850:1: rule__ElseIfThenExpCS__Group__2 : rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 ;
     public final void rule__ElseIfThenExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19852:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
-            // InternalOCLstdlib.g:19853:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
+            // InternalOCLstdlib.g:19854:1: ( rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3 )
+            // InternalOCLstdlib.g:19855:2: rule__ElseIfThenExpCS__Group__2__Impl rule__ElseIfThenExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__ElseIfThenExpCS__Group__2__Impl();
@@ -57862,17 +57862,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:19860:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
+    // InternalOCLstdlib.g:19862:1: rule__ElseIfThenExpCS__Group__2__Impl : ( 'then' ) ;
     public final void rule__ElseIfThenExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19864:1: ( ( 'then' ) )
-            // InternalOCLstdlib.g:19865:1: ( 'then' )
+            // InternalOCLstdlib.g:19866:1: ( ( 'then' ) )
+            // InternalOCLstdlib.g:19867:1: ( 'then' )
             {
-            // InternalOCLstdlib.g:19865:1: ( 'then' )
-            // InternalOCLstdlib.g:19866:1: 'then'
+            // InternalOCLstdlib.g:19867:1: ( 'then' )
+            // InternalOCLstdlib.g:19868:1: 'then'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());
@@ -57903,14 +57903,14 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3"
-    // InternalOCLstdlib.g:19879:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:19881:1: rule__ElseIfThenExpCS__Group__3 : rule__ElseIfThenExpCS__Group__3__Impl ;
     public final void rule__ElseIfThenExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19883:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
-            // InternalOCLstdlib.g:19884:2: rule__ElseIfThenExpCS__Group__3__Impl
+            // InternalOCLstdlib.g:19885:1: ( rule__ElseIfThenExpCS__Group__3__Impl )
+            // InternalOCLstdlib.g:19886:2: rule__ElseIfThenExpCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__Group__3__Impl();
@@ -57936,23 +57936,23 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:19890:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
+    // InternalOCLstdlib.g:19892:1: rule__ElseIfThenExpCS__Group__3__Impl : ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) ;
     public final void rule__ElseIfThenExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19894:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
-            // InternalOCLstdlib.g:19895:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLstdlib.g:19896:1: ( ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) ) )
+            // InternalOCLstdlib.g:19897:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
             {
-            // InternalOCLstdlib.g:19895:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
-            // InternalOCLstdlib.g:19896:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLstdlib.g:19897:1: ( ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 ) )
+            // InternalOCLstdlib.g:19898:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionAssignment_3());
             }
-            // InternalOCLstdlib.g:19897:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
-            // InternalOCLstdlib.g:19897:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
+            // InternalOCLstdlib.g:19899:1: ( rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 )
+            // InternalOCLstdlib.g:19899:2: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3();
@@ -57987,14 +57987,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0"
-    // InternalOCLstdlib.g:19915:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
+    // InternalOCLstdlib.g:19917:1: rule__LetExpCS__Group__0 : rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 ;
     public final void rule__LetExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19919:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
-            // InternalOCLstdlib.g:19920:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
+            // InternalOCLstdlib.g:19921:1: ( rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1 )
+            // InternalOCLstdlib.g:19922:2: rule__LetExpCS__Group__0__Impl rule__LetExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LetExpCS__Group__0__Impl();
@@ -58025,17 +58025,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:19927:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
+    // InternalOCLstdlib.g:19929:1: rule__LetExpCS__Group__0__Impl : ( 'let' ) ;
     public final void rule__LetExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19931:1: ( ( 'let' ) )
-            // InternalOCLstdlib.g:19932:1: ( 'let' )
+            // InternalOCLstdlib.g:19933:1: ( ( 'let' ) )
+            // InternalOCLstdlib.g:19934:1: ( 'let' )
             {
-            // InternalOCLstdlib.g:19932:1: ( 'let' )
-            // InternalOCLstdlib.g:19933:1: 'let'
+            // InternalOCLstdlib.g:19934:1: ( 'let' )
+            // InternalOCLstdlib.g:19935:1: 'let'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getLetKeyword_0());
@@ -58066,14 +58066,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1"
-    // InternalOCLstdlib.g:19946:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
+    // InternalOCLstdlib.g:19948:1: rule__LetExpCS__Group__1 : rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 ;
     public final void rule__LetExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19950:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
-            // InternalOCLstdlib.g:19951:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
+            // InternalOCLstdlib.g:19952:1: ( rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2 )
+            // InternalOCLstdlib.g:19953:2: rule__LetExpCS__Group__1__Impl rule__LetExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__LetExpCS__Group__1__Impl();
@@ -58104,23 +58104,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:19958:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:19960:1: rule__LetExpCS__Group__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) ;
     public final void rule__LetExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19962:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
-            // InternalOCLstdlib.g:19963:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalOCLstdlib.g:19964:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) ) )
+            // InternalOCLstdlib.g:19965:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:19963:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
-            // InternalOCLstdlib.g:19964:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalOCLstdlib.g:19965:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_1 ) )
+            // InternalOCLstdlib.g:19966:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_1());
             }
-            // InternalOCLstdlib.g:19965:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
-            // InternalOCLstdlib.g:19965:2: rule__LetExpCS__OwnedVariablesAssignment_1
+            // InternalOCLstdlib.g:19967:1: ( rule__LetExpCS__OwnedVariablesAssignment_1 )
+            // InternalOCLstdlib.g:19967:2: rule__LetExpCS__OwnedVariablesAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_1();
@@ -58155,14 +58155,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2"
-    // InternalOCLstdlib.g:19975:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
+    // InternalOCLstdlib.g:19977:1: rule__LetExpCS__Group__2 : rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 ;
     public final void rule__LetExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19979:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
-            // InternalOCLstdlib.g:19980:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
+            // InternalOCLstdlib.g:19981:1: ( rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3 )
+            // InternalOCLstdlib.g:19982:2: rule__LetExpCS__Group__2__Impl rule__LetExpCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_93);
             rule__LetExpCS__Group__2__Impl();
@@ -58193,22 +58193,22 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:19987:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
+    // InternalOCLstdlib.g:19989:1: rule__LetExpCS__Group__2__Impl : ( ( rule__LetExpCS__Group_2__0 )* ) ;
     public final void rule__LetExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:19991:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
-            // InternalOCLstdlib.g:19992:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalOCLstdlib.g:19993:1: ( ( ( rule__LetExpCS__Group_2__0 )* ) )
+            // InternalOCLstdlib.g:19994:1: ( ( rule__LetExpCS__Group_2__0 )* )
             {
-            // InternalOCLstdlib.g:19992:1: ( ( rule__LetExpCS__Group_2__0 )* )
-            // InternalOCLstdlib.g:19993:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalOCLstdlib.g:19994:1: ( ( rule__LetExpCS__Group_2__0 )* )
+            // InternalOCLstdlib.g:19995:1: ( rule__LetExpCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:19994:1: ( rule__LetExpCS__Group_2__0 )*
+            // InternalOCLstdlib.g:19996:1: ( rule__LetExpCS__Group_2__0 )*
             loop165:
             do {
                 int alt165=2;
@@ -58221,7 +58221,7 @@
 
                 switch (alt165) {
             	case 1 :
-            	    // InternalOCLstdlib.g:19994:2: rule__LetExpCS__Group_2__0
+            	    // InternalOCLstdlib.g:19996:2: rule__LetExpCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__LetExpCS__Group_2__0();
@@ -58262,14 +58262,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3"
-    // InternalOCLstdlib.g:20004:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
+    // InternalOCLstdlib.g:20006:1: rule__LetExpCS__Group__3 : rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 ;
     public final void rule__LetExpCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20008:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
-            // InternalOCLstdlib.g:20009:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
+            // InternalOCLstdlib.g:20010:1: ( rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4 )
+            // InternalOCLstdlib.g:20011:2: rule__LetExpCS__Group__3__Impl rule__LetExpCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__LetExpCS__Group__3__Impl();
@@ -58300,17 +58300,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__3__Impl"
-    // InternalOCLstdlib.g:20016:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
+    // InternalOCLstdlib.g:20018:1: rule__LetExpCS__Group__3__Impl : ( 'in' ) ;
     public final void rule__LetExpCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20020:1: ( ( 'in' ) )
-            // InternalOCLstdlib.g:20021:1: ( 'in' )
+            // InternalOCLstdlib.g:20022:1: ( ( 'in' ) )
+            // InternalOCLstdlib.g:20023:1: ( 'in' )
             {
-            // InternalOCLstdlib.g:20021:1: ( 'in' )
-            // InternalOCLstdlib.g:20022:1: 'in'
+            // InternalOCLstdlib.g:20023:1: ( 'in' )
+            // InternalOCLstdlib.g:20024:1: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getInKeyword_3());
@@ -58341,14 +58341,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4"
-    // InternalOCLstdlib.g:20035:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:20037:1: rule__LetExpCS__Group__4 : rule__LetExpCS__Group__4__Impl ;
     public final void rule__LetExpCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20039:1: ( rule__LetExpCS__Group__4__Impl )
-            // InternalOCLstdlib.g:20040:2: rule__LetExpCS__Group__4__Impl
+            // InternalOCLstdlib.g:20041:1: ( rule__LetExpCS__Group__4__Impl )
+            // InternalOCLstdlib.g:20042:2: rule__LetExpCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group__4__Impl();
@@ -58374,23 +58374,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group__4__Impl"
-    // InternalOCLstdlib.g:20046:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
+    // InternalOCLstdlib.g:20048:1: rule__LetExpCS__Group__4__Impl : ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) ;
     public final void rule__LetExpCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20050:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
-            // InternalOCLstdlib.g:20051:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalOCLstdlib.g:20052:1: ( ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) ) )
+            // InternalOCLstdlib.g:20053:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
             {
-            // InternalOCLstdlib.g:20051:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
-            // InternalOCLstdlib.g:20052:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalOCLstdlib.g:20053:1: ( ( rule__LetExpCS__OwnedInExpressionAssignment_4 ) )
+            // InternalOCLstdlib.g:20054:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionAssignment_4());
             }
-            // InternalOCLstdlib.g:20053:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
-            // InternalOCLstdlib.g:20053:2: rule__LetExpCS__OwnedInExpressionAssignment_4
+            // InternalOCLstdlib.g:20055:1: ( rule__LetExpCS__OwnedInExpressionAssignment_4 )
+            // InternalOCLstdlib.g:20055:2: rule__LetExpCS__OwnedInExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedInExpressionAssignment_4();
@@ -58425,14 +58425,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0"
-    // InternalOCLstdlib.g:20073:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
+    // InternalOCLstdlib.g:20075:1: rule__LetExpCS__Group_2__0 : rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 ;
     public final void rule__LetExpCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20077:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
-            // InternalOCLstdlib.g:20078:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
+            // InternalOCLstdlib.g:20079:1: ( rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1 )
+            // InternalOCLstdlib.g:20080:2: rule__LetExpCS__Group_2__0__Impl rule__LetExpCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__LetExpCS__Group_2__0__Impl();
@@ -58463,17 +58463,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:20085:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:20087:1: rule__LetExpCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__LetExpCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20089:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:20090:1: ( ',' )
+            // InternalOCLstdlib.g:20091:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:20092:1: ( ',' )
             {
-            // InternalOCLstdlib.g:20090:1: ( ',' )
-            // InternalOCLstdlib.g:20091:1: ','
+            // InternalOCLstdlib.g:20092:1: ( ',' )
+            // InternalOCLstdlib.g:20093:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());
@@ -58504,14 +58504,14 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1"
-    // InternalOCLstdlib.g:20104:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:20106:1: rule__LetExpCS__Group_2__1 : rule__LetExpCS__Group_2__1__Impl ;
     public final void rule__LetExpCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20108:1: ( rule__LetExpCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:20109:2: rule__LetExpCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:20110:1: ( rule__LetExpCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:20111:2: rule__LetExpCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__Group_2__1__Impl();
@@ -58537,23 +58537,23 @@
 
 
     // $ANTLR start "rule__LetExpCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:20115:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:20117:1: rule__LetExpCS__Group_2__1__Impl : ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) ;
     public final void rule__LetExpCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20119:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:20120:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalOCLstdlib.g:20121:1: ( ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:20122:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:20120:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
-            // InternalOCLstdlib.g:20121:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalOCLstdlib.g:20122:1: ( ( rule__LetExpCS__OwnedVariablesAssignment_2_1 ) )
+            // InternalOCLstdlib.g:20123:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesAssignment_2_1());
             }
-            // InternalOCLstdlib.g:20122:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
-            // InternalOCLstdlib.g:20122:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
+            // InternalOCLstdlib.g:20124:1: ( rule__LetExpCS__OwnedVariablesAssignment_2_1 )
+            // InternalOCLstdlib.g:20124:2: rule__LetExpCS__OwnedVariablesAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetExpCS__OwnedVariablesAssignment_2_1();
@@ -58588,14 +58588,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0"
-    // InternalOCLstdlib.g:20136:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
+    // InternalOCLstdlib.g:20138:1: rule__LetVariableCS__Group__0 : rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 ;
     public final void rule__LetVariableCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20140:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
-            // InternalOCLstdlib.g:20141:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
+            // InternalOCLstdlib.g:20142:1: ( rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1 )
+            // InternalOCLstdlib.g:20143:2: rule__LetVariableCS__Group__0__Impl rule__LetVariableCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_94);
             rule__LetVariableCS__Group__0__Impl();
@@ -58626,23 +58626,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20148:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:20150:1: rule__LetVariableCS__Group__0__Impl : ( ( rule__LetVariableCS__NameAssignment_0 ) ) ;
     public final void rule__LetVariableCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20152:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:20153:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:20154:1: ( ( ( rule__LetVariableCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:20155:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:20153:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:20154:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:20155:1: ( ( rule__LetVariableCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:20156:1: ( rule__LetVariableCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:20155:1: ( rule__LetVariableCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:20155:2: rule__LetVariableCS__NameAssignment_0
+            // InternalOCLstdlib.g:20157:1: ( rule__LetVariableCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:20157:2: rule__LetVariableCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__NameAssignment_0();
@@ -58677,14 +58677,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1"
-    // InternalOCLstdlib.g:20165:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
+    // InternalOCLstdlib.g:20167:1: rule__LetVariableCS__Group__1 : rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 ;
     public final void rule__LetVariableCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20169:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
-            // InternalOCLstdlib.g:20170:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
+            // InternalOCLstdlib.g:20171:1: ( rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2 )
+            // InternalOCLstdlib.g:20172:2: rule__LetVariableCS__Group__1__Impl rule__LetVariableCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_94);
             rule__LetVariableCS__Group__1__Impl();
@@ -58715,22 +58715,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20177:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
+    // InternalOCLstdlib.g:20179:1: rule__LetVariableCS__Group__1__Impl : ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) ;
     public final void rule__LetVariableCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20181:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
-            // InternalOCLstdlib.g:20182:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalOCLstdlib.g:20183:1: ( ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? ) )
+            // InternalOCLstdlib.g:20184:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
             {
-            // InternalOCLstdlib.g:20182:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
-            // InternalOCLstdlib.g:20183:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalOCLstdlib.g:20184:1: ( ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )? )
+            // InternalOCLstdlib.g:20185:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseAssignment_1());
             }
-            // InternalOCLstdlib.g:20184:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
+            // InternalOCLstdlib.g:20186:1: ( rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 )?
             int alt166=2;
             int LA166_0 = input.LA(1);
 
@@ -58739,7 +58739,7 @@
             }
             switch (alt166) {
                 case 1 :
-                    // InternalOCLstdlib.g:20184:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
+                    // InternalOCLstdlib.g:20186:2: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1();
@@ -58777,14 +58777,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2"
-    // InternalOCLstdlib.g:20194:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
+    // InternalOCLstdlib.g:20196:1: rule__LetVariableCS__Group__2 : rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 ;
     public final void rule__LetVariableCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20198:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
-            // InternalOCLstdlib.g:20199:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
+            // InternalOCLstdlib.g:20200:1: ( rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3 )
+            // InternalOCLstdlib.g:20201:2: rule__LetVariableCS__Group__2__Impl rule__LetVariableCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_94);
             rule__LetVariableCS__Group__2__Impl();
@@ -58815,22 +58815,22 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__2__Impl"
-    // InternalOCLstdlib.g:20206:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:20208:1: rule__LetVariableCS__Group__2__Impl : ( ( rule__LetVariableCS__Group_2__0 )? ) ;
     public final void rule__LetVariableCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20210:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:20211:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:20212:1: ( ( ( rule__LetVariableCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:20213:1: ( ( rule__LetVariableCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:20211:1: ( ( rule__LetVariableCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:20212:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalOCLstdlib.g:20213:1: ( ( rule__LetVariableCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:20214:1: ( rule__LetVariableCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:20213:1: ( rule__LetVariableCS__Group_2__0 )?
+            // InternalOCLstdlib.g:20215:1: ( rule__LetVariableCS__Group_2__0 )?
             int alt167=2;
             int LA167_0 = input.LA(1);
 
@@ -58839,7 +58839,7 @@
             }
             switch (alt167) {
                 case 1 :
-                    // InternalOCLstdlib.g:20213:2: rule__LetVariableCS__Group_2__0
+                    // InternalOCLstdlib.g:20215:2: rule__LetVariableCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__LetVariableCS__Group_2__0();
@@ -58877,14 +58877,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3"
-    // InternalOCLstdlib.g:20223:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
+    // InternalOCLstdlib.g:20225:1: rule__LetVariableCS__Group__3 : rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 ;
     public final void rule__LetVariableCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20227:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
-            // InternalOCLstdlib.g:20228:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
+            // InternalOCLstdlib.g:20229:1: ( rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4 )
+            // InternalOCLstdlib.g:20230:2: rule__LetVariableCS__Group__3__Impl rule__LetVariableCS__Group__4
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__LetVariableCS__Group__3__Impl();
@@ -58915,17 +58915,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__3__Impl"
-    // InternalOCLstdlib.g:20235:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
+    // InternalOCLstdlib.g:20237:1: rule__LetVariableCS__Group__3__Impl : ( '=' ) ;
     public final void rule__LetVariableCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20239:1: ( ( '=' ) )
-            // InternalOCLstdlib.g:20240:1: ( '=' )
+            // InternalOCLstdlib.g:20241:1: ( ( '=' ) )
+            // InternalOCLstdlib.g:20242:1: ( '=' )
             {
-            // InternalOCLstdlib.g:20240:1: ( '=' )
-            // InternalOCLstdlib.g:20241:1: '='
+            // InternalOCLstdlib.g:20242:1: ( '=' )
+            // InternalOCLstdlib.g:20243:1: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());
@@ -58956,14 +58956,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4"
-    // InternalOCLstdlib.g:20254:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
+    // InternalOCLstdlib.g:20256:1: rule__LetVariableCS__Group__4 : rule__LetVariableCS__Group__4__Impl ;
     public final void rule__LetVariableCS__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20258:1: ( rule__LetVariableCS__Group__4__Impl )
-            // InternalOCLstdlib.g:20259:2: rule__LetVariableCS__Group__4__Impl
+            // InternalOCLstdlib.g:20260:1: ( rule__LetVariableCS__Group__4__Impl )
+            // InternalOCLstdlib.g:20261:2: rule__LetVariableCS__Group__4__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group__4__Impl();
@@ -58989,23 +58989,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group__4__Impl"
-    // InternalOCLstdlib.g:20265:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
+    // InternalOCLstdlib.g:20267:1: rule__LetVariableCS__Group__4__Impl : ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) ;
     public final void rule__LetVariableCS__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20269:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
-            // InternalOCLstdlib.g:20270:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalOCLstdlib.g:20271:1: ( ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) ) )
+            // InternalOCLstdlib.g:20272:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
             {
-            // InternalOCLstdlib.g:20270:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
-            // InternalOCLstdlib.g:20271:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalOCLstdlib.g:20272:1: ( ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 ) )
+            // InternalOCLstdlib.g:20273:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionAssignment_4());
             }
-            // InternalOCLstdlib.g:20272:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
-            // InternalOCLstdlib.g:20272:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
+            // InternalOCLstdlib.g:20274:1: ( rule__LetVariableCS__OwnedInitExpressionAssignment_4 )
+            // InternalOCLstdlib.g:20274:2: rule__LetVariableCS__OwnedInitExpressionAssignment_4
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedInitExpressionAssignment_4();
@@ -59040,14 +59040,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0"
-    // InternalOCLstdlib.g:20292:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
+    // InternalOCLstdlib.g:20294:1: rule__LetVariableCS__Group_2__0 : rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 ;
     public final void rule__LetVariableCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20296:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
-            // InternalOCLstdlib.g:20297:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
+            // InternalOCLstdlib.g:20298:1: ( rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1 )
+            // InternalOCLstdlib.g:20299:2: rule__LetVariableCS__Group_2__0__Impl rule__LetVariableCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__LetVariableCS__Group_2__0__Impl();
@@ -59078,17 +59078,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:20304:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
+    // InternalOCLstdlib.g:20306:1: rule__LetVariableCS__Group_2__0__Impl : ( ':' ) ;
     public final void rule__LetVariableCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20308:1: ( ( ':' ) )
-            // InternalOCLstdlib.g:20309:1: ( ':' )
+            // InternalOCLstdlib.g:20310:1: ( ( ':' ) )
+            // InternalOCLstdlib.g:20311:1: ( ':' )
             {
-            // InternalOCLstdlib.g:20309:1: ( ':' )
-            // InternalOCLstdlib.g:20310:1: ':'
+            // InternalOCLstdlib.g:20311:1: ( ':' )
+            // InternalOCLstdlib.g:20312:1: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());
@@ -59119,14 +59119,14 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1"
-    // InternalOCLstdlib.g:20323:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:20325:1: rule__LetVariableCS__Group_2__1 : rule__LetVariableCS__Group_2__1__Impl ;
     public final void rule__LetVariableCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20327:1: ( rule__LetVariableCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:20328:2: rule__LetVariableCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:20329:1: ( rule__LetVariableCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:20330:2: rule__LetVariableCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__Group_2__1__Impl();
@@ -59152,23 +59152,23 @@
 
 
     // $ANTLR start "rule__LetVariableCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:20334:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:20336:1: rule__LetVariableCS__Group_2__1__Impl : ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) ;
     public final void rule__LetVariableCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20338:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:20339:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLstdlib.g:20340:1: ( ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:20341:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:20339:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
-            // InternalOCLstdlib.g:20340:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLstdlib.g:20341:1: ( ( rule__LetVariableCS__OwnedTypeAssignment_2_1 ) )
+            // InternalOCLstdlib.g:20342:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeAssignment_2_1());
             }
-            // InternalOCLstdlib.g:20341:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
-            // InternalOCLstdlib.g:20341:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
+            // InternalOCLstdlib.g:20343:1: ( rule__LetVariableCS__OwnedTypeAssignment_2_1 )
+            // InternalOCLstdlib.g:20343:2: rule__LetVariableCS__OwnedTypeAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__LetVariableCS__OwnedTypeAssignment_2_1();
@@ -59203,14 +59203,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0"
-    // InternalOCLstdlib.g:20355:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
+    // InternalOCLstdlib.g:20357:1: rule__NestedExpCS__Group__0 : rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 ;
     public final void rule__NestedExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20359:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
-            // InternalOCLstdlib.g:20360:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
+            // InternalOCLstdlib.g:20361:1: ( rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1 )
+            // InternalOCLstdlib.g:20362:2: rule__NestedExpCS__Group__0__Impl rule__NestedExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_32);
             rule__NestedExpCS__Group__0__Impl();
@@ -59241,17 +59241,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20367:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:20369:1: rule__NestedExpCS__Group__0__Impl : ( '(' ) ;
     public final void rule__NestedExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20371:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:20372:1: ( '(' )
+            // InternalOCLstdlib.g:20373:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:20374:1: ( '(' )
             {
-            // InternalOCLstdlib.g:20372:1: ( '(' )
-            // InternalOCLstdlib.g:20373:1: '('
+            // InternalOCLstdlib.g:20374:1: ( '(' )
+            // InternalOCLstdlib.g:20375:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());
@@ -59282,14 +59282,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1"
-    // InternalOCLstdlib.g:20386:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
+    // InternalOCLstdlib.g:20388:1: rule__NestedExpCS__Group__1 : rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 ;
     public final void rule__NestedExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20390:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
-            // InternalOCLstdlib.g:20391:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
+            // InternalOCLstdlib.g:20392:1: ( rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2 )
+            // InternalOCLstdlib.g:20393:2: rule__NestedExpCS__Group__1__Impl rule__NestedExpCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_34);
             rule__NestedExpCS__Group__1__Impl();
@@ -59320,23 +59320,23 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20398:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:20400:1: rule__NestedExpCS__Group__1__Impl : ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) ;
     public final void rule__NestedExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20402:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
-            // InternalOCLstdlib.g:20403:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:20404:1: ( ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) ) )
+            // InternalOCLstdlib.g:20405:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:20403:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
-            // InternalOCLstdlib.g:20404:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalOCLstdlib.g:20405:1: ( ( rule__NestedExpCS__OwnedExpressionAssignment_1 ) )
+            // InternalOCLstdlib.g:20406:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionAssignment_1());
             }
-            // InternalOCLstdlib.g:20405:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
-            // InternalOCLstdlib.g:20405:2: rule__NestedExpCS__OwnedExpressionAssignment_1
+            // InternalOCLstdlib.g:20407:1: ( rule__NestedExpCS__OwnedExpressionAssignment_1 )
+            // InternalOCLstdlib.g:20407:2: rule__NestedExpCS__OwnedExpressionAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__OwnedExpressionAssignment_1();
@@ -59371,14 +59371,14 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2"
-    // InternalOCLstdlib.g:20415:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:20417:1: rule__NestedExpCS__Group__2 : rule__NestedExpCS__Group__2__Impl ;
     public final void rule__NestedExpCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20419:1: ( rule__NestedExpCS__Group__2__Impl )
-            // InternalOCLstdlib.g:20420:2: rule__NestedExpCS__Group__2__Impl
+            // InternalOCLstdlib.g:20421:1: ( rule__NestedExpCS__Group__2__Impl )
+            // InternalOCLstdlib.g:20422:2: rule__NestedExpCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__NestedExpCS__Group__2__Impl();
@@ -59404,17 +59404,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__Group__2__Impl"
-    // InternalOCLstdlib.g:20426:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:20428:1: rule__NestedExpCS__Group__2__Impl : ( ')' ) ;
     public final void rule__NestedExpCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20430:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:20431:1: ( ')' )
+            // InternalOCLstdlib.g:20432:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:20433:1: ( ')' )
             {
-            // InternalOCLstdlib.g:20431:1: ( ')' )
-            // InternalOCLstdlib.g:20432:1: ')'
+            // InternalOCLstdlib.g:20433:1: ( ')' )
+            // InternalOCLstdlib.g:20434:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());
@@ -59445,14 +59445,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0"
-    // InternalOCLstdlib.g:20451:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
+    // InternalOCLstdlib.g:20453:1: rule__SelfExpCS__Group__0 : rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 ;
     public final void rule__SelfExpCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20455:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
-            // InternalOCLstdlib.g:20456:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
+            // InternalOCLstdlib.g:20457:1: ( rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1 )
+            // InternalOCLstdlib.g:20458:2: rule__SelfExpCS__Group__0__Impl rule__SelfExpCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_95);
             rule__SelfExpCS__Group__0__Impl();
@@ -59483,23 +59483,23 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20463:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:20465:1: rule__SelfExpCS__Group__0__Impl : ( () ) ;
     public final void rule__SelfExpCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20467:1: ( ( () ) )
-            // InternalOCLstdlib.g:20468:1: ( () )
+            // InternalOCLstdlib.g:20469:1: ( ( () ) )
+            // InternalOCLstdlib.g:20470:1: ( () )
             {
-            // InternalOCLstdlib.g:20468:1: ( () )
-            // InternalOCLstdlib.g:20469:1: ()
+            // InternalOCLstdlib.g:20470:1: ( () )
+            // InternalOCLstdlib.g:20471:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0());
             }
-            // InternalOCLstdlib.g:20470:1: ()
-            // InternalOCLstdlib.g:20472:1:
+            // InternalOCLstdlib.g:20472:1: ()
+            // InternalOCLstdlib.g:20474:1:
             {
             }
 
@@ -59524,14 +59524,14 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1"
-    // InternalOCLstdlib.g:20482:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:20484:1: rule__SelfExpCS__Group__1 : rule__SelfExpCS__Group__1__Impl ;
     public final void rule__SelfExpCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20486:1: ( rule__SelfExpCS__Group__1__Impl )
-            // InternalOCLstdlib.g:20487:2: rule__SelfExpCS__Group__1__Impl
+            // InternalOCLstdlib.g:20488:1: ( rule__SelfExpCS__Group__1__Impl )
+            // InternalOCLstdlib.g:20489:2: rule__SelfExpCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__SelfExpCS__Group__1__Impl();
@@ -59557,17 +59557,17 @@
 
 
     // $ANTLR start "rule__SelfExpCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20493:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
+    // InternalOCLstdlib.g:20495:1: rule__SelfExpCS__Group__1__Impl : ( 'self' ) ;
     public final void rule__SelfExpCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20497:1: ( ( 'self' ) )
-            // InternalOCLstdlib.g:20498:1: ( 'self' )
+            // InternalOCLstdlib.g:20499:1: ( ( 'self' ) )
+            // InternalOCLstdlib.g:20500:1: ( 'self' )
             {
-            // InternalOCLstdlib.g:20498:1: ( 'self' )
-            // InternalOCLstdlib.g:20499:1: 'self'
+            // InternalOCLstdlib.g:20500:1: ( 'self' )
+            // InternalOCLstdlib.g:20501:1: 'self'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());
@@ -59598,14 +59598,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0"
-    // InternalOCLstdlib.g:20516:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
+    // InternalOCLstdlib.g:20518:1: rule__MultiplicityBoundsCS__Group__0 : rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 ;
     public final void rule__MultiplicityBoundsCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20520:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
-            // InternalOCLstdlib.g:20521:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
+            // InternalOCLstdlib.g:20522:1: ( rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1 )
+            // InternalOCLstdlib.g:20523:2: rule__MultiplicityBoundsCS__Group__0__Impl rule__MultiplicityBoundsCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_68);
             rule__MultiplicityBoundsCS__Group__0__Impl();
@@ -59636,23 +59636,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20528:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:20530:1: rule__MultiplicityBoundsCS__Group__0__Impl : ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20532:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
-            // InternalOCLstdlib.g:20533:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalOCLstdlib.g:20534:1: ( ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) ) )
+            // InternalOCLstdlib.g:20535:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:20533:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
-            // InternalOCLstdlib.g:20534:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalOCLstdlib.g:20535:1: ( ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 ) )
+            // InternalOCLstdlib.g:20536:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundAssignment_0());
             }
-            // InternalOCLstdlib.g:20535:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
-            // InternalOCLstdlib.g:20535:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
+            // InternalOCLstdlib.g:20537:1: ( rule__MultiplicityBoundsCS__LowerBoundAssignment_0 )
+            // InternalOCLstdlib.g:20537:2: rule__MultiplicityBoundsCS__LowerBoundAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__LowerBoundAssignment_0();
@@ -59687,14 +59687,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1"
-    // InternalOCLstdlib.g:20545:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:20547:1: rule__MultiplicityBoundsCS__Group__1 : rule__MultiplicityBoundsCS__Group__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20549:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
-            // InternalOCLstdlib.g:20550:2: rule__MultiplicityBoundsCS__Group__1__Impl
+            // InternalOCLstdlib.g:20551:1: ( rule__MultiplicityBoundsCS__Group__1__Impl )
+            // InternalOCLstdlib.g:20552:2: rule__MultiplicityBoundsCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group__1__Impl();
@@ -59720,22 +59720,22 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20556:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:20558:1: rule__MultiplicityBoundsCS__Group__1__Impl : ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) ;
     public final void rule__MultiplicityBoundsCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20560:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:20561:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:20562:1: ( ( ( rule__MultiplicityBoundsCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:20563:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:20561:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:20562:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalOCLstdlib.g:20563:1: ( ( rule__MultiplicityBoundsCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:20564:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:20563:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
+            // InternalOCLstdlib.g:20565:1: ( rule__MultiplicityBoundsCS__Group_1__0 )?
             int alt168=2;
             int LA168_0 = input.LA(1);
 
@@ -59744,7 +59744,7 @@
             }
             switch (alt168) {
                 case 1 :
-                    // InternalOCLstdlib.g:20563:2: rule__MultiplicityBoundsCS__Group_1__0
+                    // InternalOCLstdlib.g:20565:2: rule__MultiplicityBoundsCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityBoundsCS__Group_1__0();
@@ -59782,14 +59782,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0"
-    // InternalOCLstdlib.g:20577:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
+    // InternalOCLstdlib.g:20579:1: rule__MultiplicityBoundsCS__Group_1__0 : rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 ;
     public final void rule__MultiplicityBoundsCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20581:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
-            // InternalOCLstdlib.g:20582:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
+            // InternalOCLstdlib.g:20583:1: ( rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1 )
+            // InternalOCLstdlib.g:20584:2: rule__MultiplicityBoundsCS__Group_1__0__Impl rule__MultiplicityBoundsCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_96);
             rule__MultiplicityBoundsCS__Group_1__0__Impl();
@@ -59820,17 +59820,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:20589:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
+    // InternalOCLstdlib.g:20591:1: rule__MultiplicityBoundsCS__Group_1__0__Impl : ( '..' ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20593:1: ( ( '..' ) )
-            // InternalOCLstdlib.g:20594:1: ( '..' )
+            // InternalOCLstdlib.g:20595:1: ( ( '..' ) )
+            // InternalOCLstdlib.g:20596:1: ( '..' )
             {
-            // InternalOCLstdlib.g:20594:1: ( '..' )
-            // InternalOCLstdlib.g:20595:1: '..'
+            // InternalOCLstdlib.g:20596:1: ( '..' )
+            // InternalOCLstdlib.g:20597:1: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());
@@ -59861,14 +59861,14 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1"
-    // InternalOCLstdlib.g:20608:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:20610:1: rule__MultiplicityBoundsCS__Group_1__1 : rule__MultiplicityBoundsCS__Group_1__1__Impl ;
     public final void rule__MultiplicityBoundsCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20612:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:20613:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:20614:1: ( rule__MultiplicityBoundsCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:20615:2: rule__MultiplicityBoundsCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__Group_1__1__Impl();
@@ -59894,23 +59894,23 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:20619:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:20621:1: rule__MultiplicityBoundsCS__Group_1__1__Impl : ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) ;
     public final void rule__MultiplicityBoundsCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20623:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:20624:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalOCLstdlib.g:20625:1: ( ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:20626:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:20624:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
-            // InternalOCLstdlib.g:20625:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalOCLstdlib.g:20626:1: ( ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 ) )
+            // InternalOCLstdlib.g:20627:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundAssignment_1_1());
             }
-            // InternalOCLstdlib.g:20626:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
-            // InternalOCLstdlib.g:20626:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
+            // InternalOCLstdlib.g:20628:1: ( rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 )
+            // InternalOCLstdlib.g:20628:2: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1();
@@ -59945,14 +59945,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0"
-    // InternalOCLstdlib.g:20640:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
+    // InternalOCLstdlib.g:20642:1: rule__MultiplicityCS__Group__0 : rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 ;
     public final void rule__MultiplicityCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20644:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
-            // InternalOCLstdlib.g:20645:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
+            // InternalOCLstdlib.g:20646:1: ( rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1 )
+            // InternalOCLstdlib.g:20647:2: rule__MultiplicityCS__Group__0__Impl rule__MultiplicityCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_97);
             rule__MultiplicityCS__Group__0__Impl();
@@ -59983,17 +59983,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20652:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
+    // InternalOCLstdlib.g:20654:1: rule__MultiplicityCS__Group__0__Impl : ( '[' ) ;
     public final void rule__MultiplicityCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20656:1: ( ( '[' ) )
-            // InternalOCLstdlib.g:20657:1: ( '[' )
+            // InternalOCLstdlib.g:20658:1: ( ( '[' ) )
+            // InternalOCLstdlib.g:20659:1: ( '[' )
             {
-            // InternalOCLstdlib.g:20657:1: ( '[' )
-            // InternalOCLstdlib.g:20658:1: '['
+            // InternalOCLstdlib.g:20659:1: ( '[' )
+            // InternalOCLstdlib.g:20660:1: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());
@@ -60024,14 +60024,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1"
-    // InternalOCLstdlib.g:20671:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
+    // InternalOCLstdlib.g:20673:1: rule__MultiplicityCS__Group__1 : rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 ;
     public final void rule__MultiplicityCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20675:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
-            // InternalOCLstdlib.g:20676:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
+            // InternalOCLstdlib.g:20677:1: ( rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2 )
+            // InternalOCLstdlib.g:20678:2: rule__MultiplicityCS__Group__1__Impl rule__MultiplicityCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_98);
             rule__MultiplicityCS__Group__1__Impl();
@@ -60062,23 +60062,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20683:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
+    // InternalOCLstdlib.g:20685:1: rule__MultiplicityCS__Group__1__Impl : ( ( rule__MultiplicityCS__Alternatives_1 ) ) ;
     public final void rule__MultiplicityCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20687:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
-            // InternalOCLstdlib.g:20688:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalOCLstdlib.g:20689:1: ( ( ( rule__MultiplicityCS__Alternatives_1 ) ) )
+            // InternalOCLstdlib.g:20690:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
             {
-            // InternalOCLstdlib.g:20688:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
-            // InternalOCLstdlib.g:20689:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalOCLstdlib.g:20690:1: ( ( rule__MultiplicityCS__Alternatives_1 ) )
+            // InternalOCLstdlib.g:20691:1: ( rule__MultiplicityCS__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_1());
             }
-            // InternalOCLstdlib.g:20690:1: ( rule__MultiplicityCS__Alternatives_1 )
-            // InternalOCLstdlib.g:20690:2: rule__MultiplicityCS__Alternatives_1
+            // InternalOCLstdlib.g:20692:1: ( rule__MultiplicityCS__Alternatives_1 )
+            // InternalOCLstdlib.g:20692:2: rule__MultiplicityCS__Alternatives_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Alternatives_1();
@@ -60113,14 +60113,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2"
-    // InternalOCLstdlib.g:20700:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
+    // InternalOCLstdlib.g:20702:1: rule__MultiplicityCS__Group__2 : rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 ;
     public final void rule__MultiplicityCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20704:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
-            // InternalOCLstdlib.g:20705:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
+            // InternalOCLstdlib.g:20706:1: ( rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3 )
+            // InternalOCLstdlib.g:20707:2: rule__MultiplicityCS__Group__2__Impl rule__MultiplicityCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_98);
             rule__MultiplicityCS__Group__2__Impl();
@@ -60151,22 +60151,22 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__2__Impl"
-    // InternalOCLstdlib.g:20712:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
+    // InternalOCLstdlib.g:20714:1: rule__MultiplicityCS__Group__2__Impl : ( ( rule__MultiplicityCS__Alternatives_2 )? ) ;
     public final void rule__MultiplicityCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20716:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
-            // InternalOCLstdlib.g:20717:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalOCLstdlib.g:20718:1: ( ( ( rule__MultiplicityCS__Alternatives_2 )? ) )
+            // InternalOCLstdlib.g:20719:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
             {
-            // InternalOCLstdlib.g:20717:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
-            // InternalOCLstdlib.g:20718:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalOCLstdlib.g:20719:1: ( ( rule__MultiplicityCS__Alternatives_2 )? )
+            // InternalOCLstdlib.g:20720:1: ( rule__MultiplicityCS__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getAlternatives_2());
             }
-            // InternalOCLstdlib.g:20719:1: ( rule__MultiplicityCS__Alternatives_2 )?
+            // InternalOCLstdlib.g:20721:1: ( rule__MultiplicityCS__Alternatives_2 )?
             int alt169=2;
             int LA169_0 = input.LA(1);
 
@@ -60175,7 +60175,7 @@
             }
             switch (alt169) {
                 case 1 :
-                    // InternalOCLstdlib.g:20719:2: rule__MultiplicityCS__Alternatives_2
+                    // InternalOCLstdlib.g:20721:2: rule__MultiplicityCS__Alternatives_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__MultiplicityCS__Alternatives_2();
@@ -60213,14 +60213,14 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3"
-    // InternalOCLstdlib.g:20729:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:20731:1: rule__MultiplicityCS__Group__3 : rule__MultiplicityCS__Group__3__Impl ;
     public final void rule__MultiplicityCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20733:1: ( rule__MultiplicityCS__Group__3__Impl )
-            // InternalOCLstdlib.g:20734:2: rule__MultiplicityCS__Group__3__Impl
+            // InternalOCLstdlib.g:20735:1: ( rule__MultiplicityCS__Group__3__Impl )
+            // InternalOCLstdlib.g:20736:2: rule__MultiplicityCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityCS__Group__3__Impl();
@@ -60246,17 +60246,17 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__Group__3__Impl"
-    // InternalOCLstdlib.g:20740:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
+    // InternalOCLstdlib.g:20742:1: rule__MultiplicityCS__Group__3__Impl : ( ']' ) ;
     public final void rule__MultiplicityCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20744:1: ( ( ']' ) )
-            // InternalOCLstdlib.g:20745:1: ( ']' )
+            // InternalOCLstdlib.g:20746:1: ( ( ']' ) )
+            // InternalOCLstdlib.g:20747:1: ( ']' )
             {
-            // InternalOCLstdlib.g:20745:1: ( ']' )
-            // InternalOCLstdlib.g:20746:1: ']'
+            // InternalOCLstdlib.g:20747:1: ( ']' )
+            // InternalOCLstdlib.g:20748:1: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());
@@ -60287,14 +60287,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0"
-    // InternalOCLstdlib.g:20767:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
+    // InternalOCLstdlib.g:20769:1: rule__PathNameCS__Group__0 : rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 ;
     public final void rule__PathNameCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20771:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
-            // InternalOCLstdlib.g:20772:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
+            // InternalOCLstdlib.g:20773:1: ( rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1 )
+            // InternalOCLstdlib.g:20774:2: rule__PathNameCS__Group__0__Impl rule__PathNameCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_8);
             rule__PathNameCS__Group__0__Impl();
@@ -60325,23 +60325,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20779:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:20781:1: rule__PathNameCS__Group__0__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) ;
     public final void rule__PathNameCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20783:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
-            // InternalOCLstdlib.g:20784:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLstdlib.g:20785:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) ) )
+            // InternalOCLstdlib.g:20786:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:20784:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
-            // InternalOCLstdlib.g:20785:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLstdlib.g:20786:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_0 ) )
+            // InternalOCLstdlib.g:20787:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_0());
             }
-            // InternalOCLstdlib.g:20786:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
-            // InternalOCLstdlib.g:20786:2: rule__PathNameCS__OwnedPathElementsAssignment_0
+            // InternalOCLstdlib.g:20788:1: ( rule__PathNameCS__OwnedPathElementsAssignment_0 )
+            // InternalOCLstdlib.g:20788:2: rule__PathNameCS__OwnedPathElementsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_0();
@@ -60376,14 +60376,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1"
-    // InternalOCLstdlib.g:20796:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:20798:1: rule__PathNameCS__Group__1 : rule__PathNameCS__Group__1__Impl ;
     public final void rule__PathNameCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20800:1: ( rule__PathNameCS__Group__1__Impl )
-            // InternalOCLstdlib.g:20801:2: rule__PathNameCS__Group__1__Impl
+            // InternalOCLstdlib.g:20802:1: ( rule__PathNameCS__Group__1__Impl )
+            // InternalOCLstdlib.g:20803:2: rule__PathNameCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group__1__Impl();
@@ -60409,22 +60409,22 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20807:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
+    // InternalOCLstdlib.g:20809:1: rule__PathNameCS__Group__1__Impl : ( ( rule__PathNameCS__Group_1__0 )* ) ;
     public final void rule__PathNameCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20811:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
-            // InternalOCLstdlib.g:20812:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:20813:1: ( ( ( rule__PathNameCS__Group_1__0 )* ) )
+            // InternalOCLstdlib.g:20814:1: ( ( rule__PathNameCS__Group_1__0 )* )
             {
-            // InternalOCLstdlib.g:20812:1: ( ( rule__PathNameCS__Group_1__0 )* )
-            // InternalOCLstdlib.g:20813:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalOCLstdlib.g:20814:1: ( ( rule__PathNameCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:20815:1: ( rule__PathNameCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:20814:1: ( rule__PathNameCS__Group_1__0 )*
+            // InternalOCLstdlib.g:20816:1: ( rule__PathNameCS__Group_1__0 )*
             loop170:
             do {
                 int alt170=2;
@@ -60437,7 +60437,7 @@
 
                 switch (alt170) {
             	case 1 :
-            	    // InternalOCLstdlib.g:20814:2: rule__PathNameCS__Group_1__0
+            	    // InternalOCLstdlib.g:20816:2: rule__PathNameCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_9);
             	    rule__PathNameCS__Group_1__0();
@@ -60478,14 +60478,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0"
-    // InternalOCLstdlib.g:20828:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
+    // InternalOCLstdlib.g:20830:1: rule__PathNameCS__Group_1__0 : rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 ;
     public final void rule__PathNameCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20832:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
-            // InternalOCLstdlib.g:20833:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
+            // InternalOCLstdlib.g:20834:1: ( rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1 )
+            // InternalOCLstdlib.g:20835:2: rule__PathNameCS__Group_1__0__Impl rule__PathNameCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_63);
             rule__PathNameCS__Group_1__0__Impl();
@@ -60516,17 +60516,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:20840:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
+    // InternalOCLstdlib.g:20842:1: rule__PathNameCS__Group_1__0__Impl : ( '::' ) ;
     public final void rule__PathNameCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20844:1: ( ( '::' ) )
-            // InternalOCLstdlib.g:20845:1: ( '::' )
+            // InternalOCLstdlib.g:20846:1: ( ( '::' ) )
+            // InternalOCLstdlib.g:20847:1: ( '::' )
             {
-            // InternalOCLstdlib.g:20845:1: ( '::' )
-            // InternalOCLstdlib.g:20846:1: '::'
+            // InternalOCLstdlib.g:20847:1: ( '::' )
+            // InternalOCLstdlib.g:20848:1: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());
@@ -60557,14 +60557,14 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1"
-    // InternalOCLstdlib.g:20859:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:20861:1: rule__PathNameCS__Group_1__1 : rule__PathNameCS__Group_1__1__Impl ;
     public final void rule__PathNameCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20863:1: ( rule__PathNameCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:20864:2: rule__PathNameCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:20865:1: ( rule__PathNameCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:20866:2: rule__PathNameCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__Group_1__1__Impl();
@@ -60590,23 +60590,23 @@
 
 
     // $ANTLR start "rule__PathNameCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:20870:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:20872:1: rule__PathNameCS__Group_1__1__Impl : ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) ;
     public final void rule__PathNameCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20874:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:20875:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:20876:1: ( ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:20877:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:20875:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
-            // InternalOCLstdlib.g:20876:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLstdlib.g:20877:1: ( ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:20878:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsAssignment_1_1());
             }
-            // InternalOCLstdlib.g:20877:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
-            // InternalOCLstdlib.g:20877:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
+            // InternalOCLstdlib.g:20879:1: ( rule__PathNameCS__OwnedPathElementsAssignment_1_1 )
+            // InternalOCLstdlib.g:20879:2: rule__PathNameCS__OwnedPathElementsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__PathNameCS__OwnedPathElementsAssignment_1_1();
@@ -60641,14 +60641,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0"
-    // InternalOCLstdlib.g:20891:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
+    // InternalOCLstdlib.g:20895:1: rule__TemplateBindingCS__Group__0 : rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 ;
     public final void rule__TemplateBindingCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20895:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
-            // InternalOCLstdlib.g:20896:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
+            // InternalOCLstdlib.g:20899:1: ( rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1 )
+            // InternalOCLstdlib.g:20900:2: rule__TemplateBindingCS__Group__0__Impl rule__TemplateBindingCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_99);
             rule__TemplateBindingCS__Group__0__Impl();
@@ -60679,23 +60679,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__0__Impl"
-    // InternalOCLstdlib.g:20903:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:20907:1: rule__TemplateBindingCS__Group__0__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) ;
     public final void rule__TemplateBindingCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20907:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
-            // InternalOCLstdlib.g:20908:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalOCLstdlib.g:20911:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) ) )
+            // InternalOCLstdlib.g:20912:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:20908:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
-            // InternalOCLstdlib.g:20909:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalOCLstdlib.g:20912:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 ) )
+            // InternalOCLstdlib.g:20913:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_0());
             }
-            // InternalOCLstdlib.g:20910:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
-            // InternalOCLstdlib.g:20910:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
+            // InternalOCLstdlib.g:20914:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 )
+            // InternalOCLstdlib.g:20914:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0();
@@ -60730,14 +60730,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1"
-    // InternalOCLstdlib.g:20920:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
+    // InternalOCLstdlib.g:20924:1: rule__TemplateBindingCS__Group__1 : rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 ;
     public final void rule__TemplateBindingCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20924:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
-            // InternalOCLstdlib.g:20925:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
+            // InternalOCLstdlib.g:20928:1: ( rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2 )
+            // InternalOCLstdlib.g:20929:2: rule__TemplateBindingCS__Group__1__Impl rule__TemplateBindingCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_99);
             rule__TemplateBindingCS__Group__1__Impl();
@@ -60768,22 +60768,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__1__Impl"
-    // InternalOCLstdlib.g:20932:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
+    // InternalOCLstdlib.g:20936:1: rule__TemplateBindingCS__Group__1__Impl : ( ( rule__TemplateBindingCS__Group_1__0 )* ) ;
     public final void rule__TemplateBindingCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20936:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
-            // InternalOCLstdlib.g:20937:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:20940:1: ( ( ( rule__TemplateBindingCS__Group_1__0 )* ) )
+            // InternalOCLstdlib.g:20941:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
             {
-            // InternalOCLstdlib.g:20937:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
-            // InternalOCLstdlib.g:20938:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalOCLstdlib.g:20941:1: ( ( rule__TemplateBindingCS__Group_1__0 )* )
+            // InternalOCLstdlib.g:20942:1: ( rule__TemplateBindingCS__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:20939:1: ( rule__TemplateBindingCS__Group_1__0 )*
+            // InternalOCLstdlib.g:20943:1: ( rule__TemplateBindingCS__Group_1__0 )*
             loop171:
             do {
                 int alt171=2;
@@ -60796,7 +60796,7 @@
 
                 switch (alt171) {
             	case 1 :
-            	    // InternalOCLstdlib.g:20939:2: rule__TemplateBindingCS__Group_1__0
+            	    // InternalOCLstdlib.g:20943:2: rule__TemplateBindingCS__Group_1__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__TemplateBindingCS__Group_1__0();
@@ -60837,14 +60837,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2"
-    // InternalOCLstdlib.g:20949:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:20953:1: rule__TemplateBindingCS__Group__2 : rule__TemplateBindingCS__Group__2__Impl ;
     public final void rule__TemplateBindingCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20953:1: ( rule__TemplateBindingCS__Group__2__Impl )
-            // InternalOCLstdlib.g:20954:2: rule__TemplateBindingCS__Group__2__Impl
+            // InternalOCLstdlib.g:20957:1: ( rule__TemplateBindingCS__Group__2__Impl )
+            // InternalOCLstdlib.g:20958:2: rule__TemplateBindingCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group__2__Impl();
@@ -60870,22 +60870,22 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group__2__Impl"
-    // InternalOCLstdlib.g:20960:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
+    // InternalOCLstdlib.g:20964:1: rule__TemplateBindingCS__Group__2__Impl : ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) ;
     public final void rule__TemplateBindingCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20964:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
-            // InternalOCLstdlib.g:20965:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalOCLstdlib.g:20968:1: ( ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? ) )
+            // InternalOCLstdlib.g:20969:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
             {
-            // InternalOCLstdlib.g:20965:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
-            // InternalOCLstdlib.g:20966:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalOCLstdlib.g:20969:1: ( ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )? )
+            // InternalOCLstdlib.g:20970:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityAssignment_2());
             }
-            // InternalOCLstdlib.g:20967:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
+            // InternalOCLstdlib.g:20971:1: ( rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 )?
             int alt172=2;
             int LA172_0 = input.LA(1);
 
@@ -60894,7 +60894,7 @@
             }
             switch (alt172) {
                 case 1 :
-                    // InternalOCLstdlib.g:20967:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
+                    // InternalOCLstdlib.g:20971:2: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TemplateBindingCS__OwnedMultiplicityAssignment_2();
@@ -60932,14 +60932,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0"
-    // InternalOCLstdlib.g:20983:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
+    // InternalOCLstdlib.g:20987:1: rule__TemplateBindingCS__Group_1__0 : rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 ;
     public final void rule__TemplateBindingCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20987:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
-            // InternalOCLstdlib.g:20988:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
+            // InternalOCLstdlib.g:20991:1: ( rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1 )
+            // InternalOCLstdlib.g:20992:2: rule__TemplateBindingCS__Group_1__0__Impl rule__TemplateBindingCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_62);
             rule__TemplateBindingCS__Group_1__0__Impl();
@@ -60970,17 +60970,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:20995:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:20999:1: rule__TemplateBindingCS__Group_1__0__Impl : ( ',' ) ;
     public final void rule__TemplateBindingCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:20999:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:21000:1: ( ',' )
+            // InternalOCLstdlib.g:21003:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:21004:1: ( ',' )
             {
-            // InternalOCLstdlib.g:21000:1: ( ',' )
-            // InternalOCLstdlib.g:21001:1: ','
+            // InternalOCLstdlib.g:21004:1: ( ',' )
+            // InternalOCLstdlib.g:21005:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
@@ -61011,14 +61011,14 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1"
-    // InternalOCLstdlib.g:21014:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
+    // InternalOCLstdlib.g:21018:1: rule__TemplateBindingCS__Group_1__1 : rule__TemplateBindingCS__Group_1__1__Impl ;
     public final void rule__TemplateBindingCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21018:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
-            // InternalOCLstdlib.g:21019:2: rule__TemplateBindingCS__Group_1__1__Impl
+            // InternalOCLstdlib.g:21022:1: ( rule__TemplateBindingCS__Group_1__1__Impl )
+            // InternalOCLstdlib.g:21023:2: rule__TemplateBindingCS__Group_1__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__Group_1__1__Impl();
@@ -61044,23 +61044,23 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:21025:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:21029:1: rule__TemplateBindingCS__Group_1__1__Impl : ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) ;
     public final void rule__TemplateBindingCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21029:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:21030:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:21033:1: ( ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:21034:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:21030:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
-            // InternalOCLstdlib.g:21031:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalOCLstdlib.g:21034:1: ( ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:21035:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsAssignment_1_1());
             }
-            // InternalOCLstdlib.g:21032:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
-            // InternalOCLstdlib.g:21032:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
+            // InternalOCLstdlib.g:21036:1: ( rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 )
+            // InternalOCLstdlib.g:21036:2: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1();
@@ -61095,14 +61095,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__0"
-    // InternalOCLstdlib.g:21046:1: rule__TemplateSignatureCS__Group__0 : rule__TemplateSignatureCS__Group__0__Impl rule__TemplateSignatureCS__Group__1 ;
+    // InternalOCLstdlib.g:21050:1: rule__TemplateSignatureCS__Group__0 : rule__TemplateSignatureCS__Group__0__Impl rule__TemplateSignatureCS__Group__1 ;
     public final void rule__TemplateSignatureCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21050:1: ( rule__TemplateSignatureCS__Group__0__Impl rule__TemplateSignatureCS__Group__1 )
-            // InternalOCLstdlib.g:21051:2: rule__TemplateSignatureCS__Group__0__Impl rule__TemplateSignatureCS__Group__1
+            // InternalOCLstdlib.g:21054:1: ( rule__TemplateSignatureCS__Group__0__Impl rule__TemplateSignatureCS__Group__1 )
+            // InternalOCLstdlib.g:21055:2: rule__TemplateSignatureCS__Group__0__Impl rule__TemplateSignatureCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TemplateSignatureCS__Group__0__Impl();
@@ -61133,17 +61133,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__0__Impl"
-    // InternalOCLstdlib.g:21058:1: rule__TemplateSignatureCS__Group__0__Impl : ( '(' ) ;
+    // InternalOCLstdlib.g:21062:1: rule__TemplateSignatureCS__Group__0__Impl : ( '(' ) ;
     public final void rule__TemplateSignatureCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21062:1: ( ( '(' ) )
-            // InternalOCLstdlib.g:21063:1: ( '(' )
+            // InternalOCLstdlib.g:21066:1: ( ( '(' ) )
+            // InternalOCLstdlib.g:21067:1: ( '(' )
             {
-            // InternalOCLstdlib.g:21063:1: ( '(' )
-            // InternalOCLstdlib.g:21064:1: '('
+            // InternalOCLstdlib.g:21067:1: ( '(' )
+            // InternalOCLstdlib.g:21068:1: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0());
@@ -61174,14 +61174,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__1"
-    // InternalOCLstdlib.g:21077:1: rule__TemplateSignatureCS__Group__1 : rule__TemplateSignatureCS__Group__1__Impl rule__TemplateSignatureCS__Group__2 ;
+    // InternalOCLstdlib.g:21081:1: rule__TemplateSignatureCS__Group__1 : rule__TemplateSignatureCS__Group__1__Impl rule__TemplateSignatureCS__Group__2 ;
     public final void rule__TemplateSignatureCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21081:1: ( rule__TemplateSignatureCS__Group__1__Impl rule__TemplateSignatureCS__Group__2 )
-            // InternalOCLstdlib.g:21082:2: rule__TemplateSignatureCS__Group__1__Impl rule__TemplateSignatureCS__Group__2
+            // InternalOCLstdlib.g:21085:1: ( rule__TemplateSignatureCS__Group__1__Impl rule__TemplateSignatureCS__Group__2 )
+            // InternalOCLstdlib.g:21086:2: rule__TemplateSignatureCS__Group__1__Impl rule__TemplateSignatureCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__TemplateSignatureCS__Group__1__Impl();
@@ -61212,23 +61212,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__1__Impl"
-    // InternalOCLstdlib.g:21089:1: rule__TemplateSignatureCS__Group__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) ) ;
+    // InternalOCLstdlib.g:21093:1: rule__TemplateSignatureCS__Group__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21093:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) ) )
-            // InternalOCLstdlib.g:21094:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) )
+            // InternalOCLstdlib.g:21097:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) ) )
+            // InternalOCLstdlib.g:21098:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) )
             {
-            // InternalOCLstdlib.g:21094:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) )
-            // InternalOCLstdlib.g:21095:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 )
+            // InternalOCLstdlib.g:21098:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 ) )
+            // InternalOCLstdlib.g:21099:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_1());
             }
-            // InternalOCLstdlib.g:21096:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 )
-            // InternalOCLstdlib.g:21096:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1
+            // InternalOCLstdlib.g:21100:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_1 )
+            // InternalOCLstdlib.g:21100:2: rule__TemplateSignatureCS__OwnedParametersAssignment_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_1();
@@ -61263,14 +61263,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__2"
-    // InternalOCLstdlib.g:21106:1: rule__TemplateSignatureCS__Group__2 : rule__TemplateSignatureCS__Group__2__Impl rule__TemplateSignatureCS__Group__3 ;
+    // InternalOCLstdlib.g:21110:1: rule__TemplateSignatureCS__Group__2 : rule__TemplateSignatureCS__Group__2__Impl rule__TemplateSignatureCS__Group__3 ;
     public final void rule__TemplateSignatureCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21110:1: ( rule__TemplateSignatureCS__Group__2__Impl rule__TemplateSignatureCS__Group__3 )
-            // InternalOCLstdlib.g:21111:2: rule__TemplateSignatureCS__Group__2__Impl rule__TemplateSignatureCS__Group__3
+            // InternalOCLstdlib.g:21114:1: ( rule__TemplateSignatureCS__Group__2__Impl rule__TemplateSignatureCS__Group__3 )
+            // InternalOCLstdlib.g:21115:2: rule__TemplateSignatureCS__Group__2__Impl rule__TemplateSignatureCS__Group__3
             {
             pushFollow(FollowSets000.FOLLOW_16);
             rule__TemplateSignatureCS__Group__2__Impl();
@@ -61301,22 +61301,22 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__2__Impl"
-    // InternalOCLstdlib.g:21118:1: rule__TemplateSignatureCS__Group__2__Impl : ( ( rule__TemplateSignatureCS__Group_2__0 )* ) ;
+    // InternalOCLstdlib.g:21122:1: rule__TemplateSignatureCS__Group__2__Impl : ( ( rule__TemplateSignatureCS__Group_2__0 )* ) ;
     public final void rule__TemplateSignatureCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21122:1: ( ( ( rule__TemplateSignatureCS__Group_2__0 )* ) )
-            // InternalOCLstdlib.g:21123:1: ( ( rule__TemplateSignatureCS__Group_2__0 )* )
+            // InternalOCLstdlib.g:21126:1: ( ( ( rule__TemplateSignatureCS__Group_2__0 )* ) )
+            // InternalOCLstdlib.g:21127:1: ( ( rule__TemplateSignatureCS__Group_2__0 )* )
             {
-            // InternalOCLstdlib.g:21123:1: ( ( rule__TemplateSignatureCS__Group_2__0 )* )
-            // InternalOCLstdlib.g:21124:1: ( rule__TemplateSignatureCS__Group_2__0 )*
+            // InternalOCLstdlib.g:21127:1: ( ( rule__TemplateSignatureCS__Group_2__0 )* )
+            // InternalOCLstdlib.g:21128:1: ( rule__TemplateSignatureCS__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:21125:1: ( rule__TemplateSignatureCS__Group_2__0 )*
+            // InternalOCLstdlib.g:21129:1: ( rule__TemplateSignatureCS__Group_2__0 )*
             loop173:
             do {
                 int alt173=2;
@@ -61329,7 +61329,7 @@
 
                 switch (alt173) {
             	case 1 :
-            	    // InternalOCLstdlib.g:21125:2: rule__TemplateSignatureCS__Group_2__0
+            	    // InternalOCLstdlib.g:21129:2: rule__TemplateSignatureCS__Group_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_17);
             	    rule__TemplateSignatureCS__Group_2__0();
@@ -61370,14 +61370,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__3"
-    // InternalOCLstdlib.g:21135:1: rule__TemplateSignatureCS__Group__3 : rule__TemplateSignatureCS__Group__3__Impl ;
+    // InternalOCLstdlib.g:21139:1: rule__TemplateSignatureCS__Group__3 : rule__TemplateSignatureCS__Group__3__Impl ;
     public final void rule__TemplateSignatureCS__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21139:1: ( rule__TemplateSignatureCS__Group__3__Impl )
-            // InternalOCLstdlib.g:21140:2: rule__TemplateSignatureCS__Group__3__Impl
+            // InternalOCLstdlib.g:21143:1: ( rule__TemplateSignatureCS__Group__3__Impl )
+            // InternalOCLstdlib.g:21144:2: rule__TemplateSignatureCS__Group__3__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group__3__Impl();
@@ -61403,17 +61403,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group__3__Impl"
-    // InternalOCLstdlib.g:21146:1: rule__TemplateSignatureCS__Group__3__Impl : ( ')' ) ;
+    // InternalOCLstdlib.g:21150:1: rule__TemplateSignatureCS__Group__3__Impl : ( ')' ) ;
     public final void rule__TemplateSignatureCS__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21150:1: ( ( ')' ) )
-            // InternalOCLstdlib.g:21151:1: ( ')' )
+            // InternalOCLstdlib.g:21154:1: ( ( ')' ) )
+            // InternalOCLstdlib.g:21155:1: ( ')' )
             {
-            // InternalOCLstdlib.g:21151:1: ( ')' )
-            // InternalOCLstdlib.g:21152:1: ')'
+            // InternalOCLstdlib.g:21155:1: ( ')' )
+            // InternalOCLstdlib.g:21156:1: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_3());
@@ -61444,14 +61444,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_2__0"
-    // InternalOCLstdlib.g:21173:1: rule__TemplateSignatureCS__Group_2__0 : rule__TemplateSignatureCS__Group_2__0__Impl rule__TemplateSignatureCS__Group_2__1 ;
+    // InternalOCLstdlib.g:21177:1: rule__TemplateSignatureCS__Group_2__0 : rule__TemplateSignatureCS__Group_2__0__Impl rule__TemplateSignatureCS__Group_2__1 ;
     public final void rule__TemplateSignatureCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21177:1: ( rule__TemplateSignatureCS__Group_2__0__Impl rule__TemplateSignatureCS__Group_2__1 )
-            // InternalOCLstdlib.g:21178:2: rule__TemplateSignatureCS__Group_2__0__Impl rule__TemplateSignatureCS__Group_2__1
+            // InternalOCLstdlib.g:21181:1: ( rule__TemplateSignatureCS__Group_2__0__Impl rule__TemplateSignatureCS__Group_2__1 )
+            // InternalOCLstdlib.g:21182:2: rule__TemplateSignatureCS__Group_2__0__Impl rule__TemplateSignatureCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_39);
             rule__TemplateSignatureCS__Group_2__0__Impl();
@@ -61482,17 +61482,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:21185:1: rule__TemplateSignatureCS__Group_2__0__Impl : ( ',' ) ;
+    // InternalOCLstdlib.g:21189:1: rule__TemplateSignatureCS__Group_2__0__Impl : ( ',' ) ;
     public final void rule__TemplateSignatureCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21189:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:21190:1: ( ',' )
+            // InternalOCLstdlib.g:21193:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:21194:1: ( ',' )
             {
-            // InternalOCLstdlib.g:21190:1: ( ',' )
-            // InternalOCLstdlib.g:21191:1: ','
+            // InternalOCLstdlib.g:21194:1: ( ',' )
+            // InternalOCLstdlib.g:21195:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_2_0());
@@ -61523,14 +61523,14 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_2__1"
-    // InternalOCLstdlib.g:21204:1: rule__TemplateSignatureCS__Group_2__1 : rule__TemplateSignatureCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:21208:1: rule__TemplateSignatureCS__Group_2__1 : rule__TemplateSignatureCS__Group_2__1__Impl ;
     public final void rule__TemplateSignatureCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21208:1: ( rule__TemplateSignatureCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:21209:2: rule__TemplateSignatureCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:21212:1: ( rule__TemplateSignatureCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:21213:2: rule__TemplateSignatureCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__Group_2__1__Impl();
@@ -61556,23 +61556,23 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:21215:1: rule__TemplateSignatureCS__Group_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:21219:1: rule__TemplateSignatureCS__Group_2__1__Impl : ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) ) ;
     public final void rule__TemplateSignatureCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21219:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:21220:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) )
+            // InternalOCLstdlib.g:21223:1: ( ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:21224:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:21220:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) )
-            // InternalOCLstdlib.g:21221:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 )
+            // InternalOCLstdlib.g:21224:1: ( ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 ) )
+            // InternalOCLstdlib.g:21225:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersAssignment_2_1());
             }
-            // InternalOCLstdlib.g:21222:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 )
-            // InternalOCLstdlib.g:21222:2: rule__TemplateSignatureCS__OwnedParametersAssignment_2_1
+            // InternalOCLstdlib.g:21226:1: ( rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 )
+            // InternalOCLstdlib.g:21226:2: rule__TemplateSignatureCS__OwnedParametersAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TemplateSignatureCS__OwnedParametersAssignment_2_1();
@@ -61607,14 +61607,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0"
-    // InternalOCLstdlib.g:21236:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
+    // InternalOCLstdlib.g:21240:1: rule__TypeParameterCS__Group__0 : rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 ;
     public final void rule__TypeParameterCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21240:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
-            // InternalOCLstdlib.g:21241:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
+            // InternalOCLstdlib.g:21244:1: ( rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1 )
+            // InternalOCLstdlib.g:21245:2: rule__TypeParameterCS__Group__0__Impl rule__TypeParameterCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_100);
             rule__TypeParameterCS__Group__0__Impl();
@@ -61645,23 +61645,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__0__Impl"
-    // InternalOCLstdlib.g:21248:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
+    // InternalOCLstdlib.g:21252:1: rule__TypeParameterCS__Group__0__Impl : ( ( rule__TypeParameterCS__NameAssignment_0 ) ) ;
     public final void rule__TypeParameterCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21252:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
-            // InternalOCLstdlib.g:21253:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:21256:1: ( ( ( rule__TypeParameterCS__NameAssignment_0 ) ) )
+            // InternalOCLstdlib.g:21257:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
             {
-            // InternalOCLstdlib.g:21253:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
-            // InternalOCLstdlib.g:21254:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:21257:1: ( ( rule__TypeParameterCS__NameAssignment_0 ) )
+            // InternalOCLstdlib.g:21258:1: ( rule__TypeParameterCS__NameAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameAssignment_0());
             }
-            // InternalOCLstdlib.g:21255:1: ( rule__TypeParameterCS__NameAssignment_0 )
-            // InternalOCLstdlib.g:21255:2: rule__TypeParameterCS__NameAssignment_0
+            // InternalOCLstdlib.g:21259:1: ( rule__TypeParameterCS__NameAssignment_0 )
+            // InternalOCLstdlib.g:21259:2: rule__TypeParameterCS__NameAssignment_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__NameAssignment_0();
@@ -61696,14 +61696,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1"
-    // InternalOCLstdlib.g:21265:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
+    // InternalOCLstdlib.g:21269:1: rule__TypeParameterCS__Group__1 : rule__TypeParameterCS__Group__1__Impl ;
     public final void rule__TypeParameterCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21269:1: ( rule__TypeParameterCS__Group__1__Impl )
-            // InternalOCLstdlib.g:21270:2: rule__TypeParameterCS__Group__1__Impl
+            // InternalOCLstdlib.g:21273:1: ( rule__TypeParameterCS__Group__1__Impl )
+            // InternalOCLstdlib.g:21274:2: rule__TypeParameterCS__Group__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group__1__Impl();
@@ -61729,22 +61729,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group__1__Impl"
-    // InternalOCLstdlib.g:21276:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
+    // InternalOCLstdlib.g:21280:1: rule__TypeParameterCS__Group__1__Impl : ( ( rule__TypeParameterCS__Group_1__0 )? ) ;
     public final void rule__TypeParameterCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21280:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
-            // InternalOCLstdlib.g:21281:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:21284:1: ( ( ( rule__TypeParameterCS__Group_1__0 )? ) )
+            // InternalOCLstdlib.g:21285:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
             {
-            // InternalOCLstdlib.g:21281:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
-            // InternalOCLstdlib.g:21282:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalOCLstdlib.g:21285:1: ( ( rule__TypeParameterCS__Group_1__0 )? )
+            // InternalOCLstdlib.g:21286:1: ( rule__TypeParameterCS__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1());
             }
-            // InternalOCLstdlib.g:21283:1: ( rule__TypeParameterCS__Group_1__0 )?
+            // InternalOCLstdlib.g:21287:1: ( rule__TypeParameterCS__Group_1__0 )?
             int alt174=2;
             int LA174_0 = input.LA(1);
 
@@ -61753,7 +61753,7 @@
             }
             switch (alt174) {
                 case 1 :
-                    // InternalOCLstdlib.g:21283:2: rule__TypeParameterCS__Group_1__0
+                    // InternalOCLstdlib.g:21287:2: rule__TypeParameterCS__Group_1__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__TypeParameterCS__Group_1__0();
@@ -61791,14 +61791,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0"
-    // InternalOCLstdlib.g:21297:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
+    // InternalOCLstdlib.g:21301:1: rule__TypeParameterCS__Group_1__0 : rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 ;
     public final void rule__TypeParameterCS__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21301:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
-            // InternalOCLstdlib.g:21302:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
+            // InternalOCLstdlib.g:21305:1: ( rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1 )
+            // InternalOCLstdlib.g:21306:2: rule__TypeParameterCS__Group_1__0__Impl rule__TypeParameterCS__Group_1__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TypeParameterCS__Group_1__0__Impl();
@@ -61829,17 +61829,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__0__Impl"
-    // InternalOCLstdlib.g:21309:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
+    // InternalOCLstdlib.g:21313:1: rule__TypeParameterCS__Group_1__0__Impl : ( 'extends' ) ;
     public final void rule__TypeParameterCS__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21313:1: ( ( 'extends' ) )
-            // InternalOCLstdlib.g:21314:1: ( 'extends' )
+            // InternalOCLstdlib.g:21317:1: ( ( 'extends' ) )
+            // InternalOCLstdlib.g:21318:1: ( 'extends' )
             {
-            // InternalOCLstdlib.g:21314:1: ( 'extends' )
-            // InternalOCLstdlib.g:21315:1: 'extends'
+            // InternalOCLstdlib.g:21318:1: ( 'extends' )
+            // InternalOCLstdlib.g:21319:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
@@ -61870,14 +61870,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1"
-    // InternalOCLstdlib.g:21328:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
+    // InternalOCLstdlib.g:21332:1: rule__TypeParameterCS__Group_1__1 : rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 ;
     public final void rule__TypeParameterCS__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21332:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
-            // InternalOCLstdlib.g:21333:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
+            // InternalOCLstdlib.g:21336:1: ( rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2 )
+            // InternalOCLstdlib.g:21337:2: rule__TypeParameterCS__Group_1__1__Impl rule__TypeParameterCS__Group_1__2
             {
             pushFollow(FollowSets000.FOLLOW_101);
             rule__TypeParameterCS__Group_1__1__Impl();
@@ -61908,23 +61908,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__1__Impl"
-    // InternalOCLstdlib.g:21340:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
+    // InternalOCLstdlib.g:21344:1: rule__TypeParameterCS__Group_1__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21344:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
-            // InternalOCLstdlib.g:21345:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:21348:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) ) )
+            // InternalOCLstdlib.g:21349:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
             {
-            // InternalOCLstdlib.g:21345:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
-            // InternalOCLstdlib.g:21346:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalOCLstdlib.g:21349:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 ) )
+            // InternalOCLstdlib.g:21350:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_1());
             }
-            // InternalOCLstdlib.g:21347:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
-            // InternalOCLstdlib.g:21347:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
+            // InternalOCLstdlib.g:21351:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_1 )
+            // InternalOCLstdlib.g:21351:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_1();
@@ -61959,14 +61959,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2"
-    // InternalOCLstdlib.g:21357:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
+    // InternalOCLstdlib.g:21361:1: rule__TypeParameterCS__Group_1__2 : rule__TypeParameterCS__Group_1__2__Impl ;
     public final void rule__TypeParameterCS__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21361:1: ( rule__TypeParameterCS__Group_1__2__Impl )
-            // InternalOCLstdlib.g:21362:2: rule__TypeParameterCS__Group_1__2__Impl
+            // InternalOCLstdlib.g:21365:1: ( rule__TypeParameterCS__Group_1__2__Impl )
+            // InternalOCLstdlib.g:21366:2: rule__TypeParameterCS__Group_1__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1__2__Impl();
@@ -61992,22 +61992,22 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1__2__Impl"
-    // InternalOCLstdlib.g:21368:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
+    // InternalOCLstdlib.g:21372:1: rule__TypeParameterCS__Group_1__2__Impl : ( ( rule__TypeParameterCS__Group_1_2__0 )* ) ;
     public final void rule__TypeParameterCS__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21372:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
-            // InternalOCLstdlib.g:21373:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalOCLstdlib.g:21376:1: ( ( ( rule__TypeParameterCS__Group_1_2__0 )* ) )
+            // InternalOCLstdlib.g:21377:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
             {
-            // InternalOCLstdlib.g:21373:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
-            // InternalOCLstdlib.g:21374:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalOCLstdlib.g:21377:1: ( ( rule__TypeParameterCS__Group_1_2__0 )* )
+            // InternalOCLstdlib.g:21378:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getGroup_1_2());
             }
-            // InternalOCLstdlib.g:21375:1: ( rule__TypeParameterCS__Group_1_2__0 )*
+            // InternalOCLstdlib.g:21379:1: ( rule__TypeParameterCS__Group_1_2__0 )*
             loop175:
             do {
                 int alt175=2;
@@ -62020,7 +62020,7 @@
 
                 switch (alt175) {
             	case 1 :
-            	    // InternalOCLstdlib.g:21375:2: rule__TypeParameterCS__Group_1_2__0
+            	    // InternalOCLstdlib.g:21379:2: rule__TypeParameterCS__Group_1_2__0
             	    {
             	    pushFollow(FollowSets000.FOLLOW_102);
             	    rule__TypeParameterCS__Group_1_2__0();
@@ -62061,14 +62061,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0"
-    // InternalOCLstdlib.g:21391:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
+    // InternalOCLstdlib.g:21395:1: rule__TypeParameterCS__Group_1_2__0 : rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 ;
     public final void rule__TypeParameterCS__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21395:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
-            // InternalOCLstdlib.g:21396:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
+            // InternalOCLstdlib.g:21399:1: ( rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1 )
+            // InternalOCLstdlib.g:21400:2: rule__TypeParameterCS__Group_1_2__0__Impl rule__TypeParameterCS__Group_1_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__TypeParameterCS__Group_1_2__0__Impl();
@@ -62099,17 +62099,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__0__Impl"
-    // InternalOCLstdlib.g:21403:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
+    // InternalOCLstdlib.g:21407:1: rule__TypeParameterCS__Group_1_2__0__Impl : ( '&&' ) ;
     public final void rule__TypeParameterCS__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21407:1: ( ( '&&' ) )
-            // InternalOCLstdlib.g:21408:1: ( '&&' )
+            // InternalOCLstdlib.g:21411:1: ( ( '&&' ) )
+            // InternalOCLstdlib.g:21412:1: ( '&&' )
             {
-            // InternalOCLstdlib.g:21408:1: ( '&&' )
-            // InternalOCLstdlib.g:21409:1: '&&'
+            // InternalOCLstdlib.g:21412:1: ( '&&' )
+            // InternalOCLstdlib.g:21413:1: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
@@ -62140,14 +62140,14 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1"
-    // InternalOCLstdlib.g:21422:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
+    // InternalOCLstdlib.g:21426:1: rule__TypeParameterCS__Group_1_2__1 : rule__TypeParameterCS__Group_1_2__1__Impl ;
     public final void rule__TypeParameterCS__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21426:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
-            // InternalOCLstdlib.g:21427:2: rule__TypeParameterCS__Group_1_2__1__Impl
+            // InternalOCLstdlib.g:21430:1: ( rule__TypeParameterCS__Group_1_2__1__Impl )
+            // InternalOCLstdlib.g:21431:2: rule__TypeParameterCS__Group_1_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__Group_1_2__1__Impl();
@@ -62173,23 +62173,23 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__Group_1_2__1__Impl"
-    // InternalOCLstdlib.g:21433:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
+    // InternalOCLstdlib.g:21437:1: rule__TypeParameterCS__Group_1_2__1__Impl : ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) ;
     public final void rule__TypeParameterCS__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21437:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
-            // InternalOCLstdlib.g:21438:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalOCLstdlib.g:21441:1: ( ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) ) )
+            // InternalOCLstdlib.g:21442:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
             {
-            // InternalOCLstdlib.g:21438:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
-            // InternalOCLstdlib.g:21439:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalOCLstdlib.g:21442:1: ( ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 ) )
+            // InternalOCLstdlib.g:21443:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsAssignment_1_2_1());
             }
-            // InternalOCLstdlib.g:21440:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
-            // InternalOCLstdlib.g:21440:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
+            // InternalOCLstdlib.g:21444:1: ( rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 )
+            // InternalOCLstdlib.g:21444:2: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1();
@@ -62224,14 +62224,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0"
-    // InternalOCLstdlib.g:21454:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
+    // InternalOCLstdlib.g:21458:1: rule__WildcardTypeRefCS__Group__0 : rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 ;
     public final void rule__WildcardTypeRefCS__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21458:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
-            // InternalOCLstdlib.g:21459:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
+            // InternalOCLstdlib.g:21462:1: ( rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1 )
+            // InternalOCLstdlib.g:21463:2: rule__WildcardTypeRefCS__Group__0__Impl rule__WildcardTypeRefCS__Group__1
             {
             pushFollow(FollowSets000.FOLLOW_62);
             rule__WildcardTypeRefCS__Group__0__Impl();
@@ -62262,23 +62262,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__0__Impl"
-    // InternalOCLstdlib.g:21466:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
+    // InternalOCLstdlib.g:21470:1: rule__WildcardTypeRefCS__Group__0__Impl : ( () ) ;
     public final void rule__WildcardTypeRefCS__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21470:1: ( ( () ) )
-            // InternalOCLstdlib.g:21471:1: ( () )
+            // InternalOCLstdlib.g:21474:1: ( ( () ) )
+            // InternalOCLstdlib.g:21475:1: ( () )
             {
-            // InternalOCLstdlib.g:21471:1: ( () )
-            // InternalOCLstdlib.g:21472:1: ()
+            // InternalOCLstdlib.g:21475:1: ( () )
+            // InternalOCLstdlib.g:21476:1: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0());
             }
-            // InternalOCLstdlib.g:21473:1: ()
-            // InternalOCLstdlib.g:21475:1:
+            // InternalOCLstdlib.g:21477:1: ()
+            // InternalOCLstdlib.g:21479:1:
             {
             }
 
@@ -62303,14 +62303,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1"
-    // InternalOCLstdlib.g:21485:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
+    // InternalOCLstdlib.g:21489:1: rule__WildcardTypeRefCS__Group__1 : rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 ;
     public final void rule__WildcardTypeRefCS__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21489:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
-            // InternalOCLstdlib.g:21490:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
+            // InternalOCLstdlib.g:21493:1: ( rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2 )
+            // InternalOCLstdlib.g:21494:2: rule__WildcardTypeRefCS__Group__1__Impl rule__WildcardTypeRefCS__Group__2
             {
             pushFollow(FollowSets000.FOLLOW_100);
             rule__WildcardTypeRefCS__Group__1__Impl();
@@ -62341,17 +62341,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__1__Impl"
-    // InternalOCLstdlib.g:21497:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
+    // InternalOCLstdlib.g:21501:1: rule__WildcardTypeRefCS__Group__1__Impl : ( '?' ) ;
     public final void rule__WildcardTypeRefCS__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21501:1: ( ( '?' ) )
-            // InternalOCLstdlib.g:21502:1: ( '?' )
+            // InternalOCLstdlib.g:21505:1: ( ( '?' ) )
+            // InternalOCLstdlib.g:21506:1: ( '?' )
             {
-            // InternalOCLstdlib.g:21502:1: ( '?' )
-            // InternalOCLstdlib.g:21503:1: '?'
+            // InternalOCLstdlib.g:21506:1: ( '?' )
+            // InternalOCLstdlib.g:21507:1: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
@@ -62382,14 +62382,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2"
-    // InternalOCLstdlib.g:21516:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
+    // InternalOCLstdlib.g:21520:1: rule__WildcardTypeRefCS__Group__2 : rule__WildcardTypeRefCS__Group__2__Impl ;
     public final void rule__WildcardTypeRefCS__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21520:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
-            // InternalOCLstdlib.g:21521:2: rule__WildcardTypeRefCS__Group__2__Impl
+            // InternalOCLstdlib.g:21524:1: ( rule__WildcardTypeRefCS__Group__2__Impl )
+            // InternalOCLstdlib.g:21525:2: rule__WildcardTypeRefCS__Group__2__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group__2__Impl();
@@ -62415,22 +62415,22 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group__2__Impl"
-    // InternalOCLstdlib.g:21527:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
+    // InternalOCLstdlib.g:21531:1: rule__WildcardTypeRefCS__Group__2__Impl : ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) ;
     public final void rule__WildcardTypeRefCS__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21531:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
-            // InternalOCLstdlib.g:21532:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:21535:1: ( ( ( rule__WildcardTypeRefCS__Group_2__0 )? ) )
+            // InternalOCLstdlib.g:21536:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
             {
-            // InternalOCLstdlib.g:21532:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
-            // InternalOCLstdlib.g:21533:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalOCLstdlib.g:21536:1: ( ( rule__WildcardTypeRefCS__Group_2__0 )? )
+            // InternalOCLstdlib.g:21537:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getGroup_2());
             }
-            // InternalOCLstdlib.g:21534:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
+            // InternalOCLstdlib.g:21538:1: ( rule__WildcardTypeRefCS__Group_2__0 )?
             int alt176=2;
             int LA176_0 = input.LA(1);
 
@@ -62439,7 +62439,7 @@
             }
             switch (alt176) {
                 case 1 :
-                    // InternalOCLstdlib.g:21534:2: rule__WildcardTypeRefCS__Group_2__0
+                    // InternalOCLstdlib.g:21538:2: rule__WildcardTypeRefCS__Group_2__0
                     {
                     pushFollow(FollowSets000.FOLLOW_2);
                     rule__WildcardTypeRefCS__Group_2__0();
@@ -62477,14 +62477,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0"
-    // InternalOCLstdlib.g:21550:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
+    // InternalOCLstdlib.g:21554:1: rule__WildcardTypeRefCS__Group_2__0 : rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 ;
     public final void rule__WildcardTypeRefCS__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21554:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
-            // InternalOCLstdlib.g:21555:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
+            // InternalOCLstdlib.g:21558:1: ( rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1 )
+            // InternalOCLstdlib.g:21559:2: rule__WildcardTypeRefCS__Group_2__0__Impl rule__WildcardTypeRefCS__Group_2__1
             {
             pushFollow(FollowSets000.FOLLOW_12);
             rule__WildcardTypeRefCS__Group_2__0__Impl();
@@ -62515,17 +62515,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__0__Impl"
-    // InternalOCLstdlib.g:21562:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
+    // InternalOCLstdlib.g:21566:1: rule__WildcardTypeRefCS__Group_2__0__Impl : ( 'extends' ) ;
     public final void rule__WildcardTypeRefCS__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21566:1: ( ( 'extends' ) )
-            // InternalOCLstdlib.g:21567:1: ( 'extends' )
+            // InternalOCLstdlib.g:21570:1: ( ( 'extends' ) )
+            // InternalOCLstdlib.g:21571:1: ( 'extends' )
             {
-            // InternalOCLstdlib.g:21567:1: ( 'extends' )
-            // InternalOCLstdlib.g:21568:1: 'extends'
+            // InternalOCLstdlib.g:21571:1: ( 'extends' )
+            // InternalOCLstdlib.g:21572:1: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
@@ -62556,14 +62556,14 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1"
-    // InternalOCLstdlib.g:21581:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
+    // InternalOCLstdlib.g:21585:1: rule__WildcardTypeRefCS__Group_2__1 : rule__WildcardTypeRefCS__Group_2__1__Impl ;
     public final void rule__WildcardTypeRefCS__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21585:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
-            // InternalOCLstdlib.g:21586:2: rule__WildcardTypeRefCS__Group_2__1__Impl
+            // InternalOCLstdlib.g:21589:1: ( rule__WildcardTypeRefCS__Group_2__1__Impl )
+            // InternalOCLstdlib.g:21590:2: rule__WildcardTypeRefCS__Group_2__1__Impl
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__Group_2__1__Impl();
@@ -62589,23 +62589,23 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__Group_2__1__Impl"
-    // InternalOCLstdlib.g:21592:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
+    // InternalOCLstdlib.g:21596:1: rule__WildcardTypeRefCS__Group_2__1__Impl : ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) ;
     public final void rule__WildcardTypeRefCS__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21596:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
-            // InternalOCLstdlib.g:21597:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalOCLstdlib.g:21600:1: ( ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) ) )
+            // InternalOCLstdlib.g:21601:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
             {
-            // InternalOCLstdlib.g:21597:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
-            // InternalOCLstdlib.g:21598:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalOCLstdlib.g:21601:1: ( ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 ) )
+            // InternalOCLstdlib.g:21602:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsAssignment_2_1());
             }
-            // InternalOCLstdlib.g:21599:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
-            // InternalOCLstdlib.g:21599:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
+            // InternalOCLstdlib.g:21603:1: ( rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 )
+            // InternalOCLstdlib.g:21603:2: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1();
@@ -62640,17 +62640,17 @@
 
 
     // $ANTLR start "rule__Library__OwnedImportsAssignment_0_0"
-    // InternalOCLstdlib.g:21614:1: rule__Library__OwnedImportsAssignment_0_0 : ( ruleImportCS ) ;
+    // InternalOCLstdlib.g:21618:1: rule__Library__OwnedImportsAssignment_0_0 : ( ruleImportCS ) ;
     public final void rule__Library__OwnedImportsAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21618:1: ( ( ruleImportCS ) )
-            // InternalOCLstdlib.g:21619:1: ( ruleImportCS )
+            // InternalOCLstdlib.g:21622:1: ( ( ruleImportCS ) )
+            // InternalOCLstdlib.g:21623:1: ( ruleImportCS )
             {
-            // InternalOCLstdlib.g:21619:1: ( ruleImportCS )
-            // InternalOCLstdlib.g:21620:1: ruleImportCS
+            // InternalOCLstdlib.g:21623:1: ( ruleImportCS )
+            // InternalOCLstdlib.g:21624:1: ruleImportCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibraryAccess().getOwnedImportsImportCSParserRuleCall_0_0_0());
@@ -62685,17 +62685,17 @@
 
 
     // $ANTLR start "rule__Library__OwnedPackagesAssignment_1"
-    // InternalOCLstdlib.g:21629:1: rule__Library__OwnedPackagesAssignment_1 : ( ruleLibPackageCS ) ;
+    // InternalOCLstdlib.g:21633:1: rule__Library__OwnedPackagesAssignment_1 : ( ruleLibPackageCS ) ;
     public final void rule__Library__OwnedPackagesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21633:1: ( ( ruleLibPackageCS ) )
-            // InternalOCLstdlib.g:21634:1: ( ruleLibPackageCS )
+            // InternalOCLstdlib.g:21637:1: ( ( ruleLibPackageCS ) )
+            // InternalOCLstdlib.g:21638:1: ( ruleLibPackageCS )
             {
-            // InternalOCLstdlib.g:21634:1: ( ruleLibPackageCS )
-            // InternalOCLstdlib.g:21635:1: ruleLibPackageCS
+            // InternalOCLstdlib.g:21638:1: ( ruleLibPackageCS )
+            // InternalOCLstdlib.g:21639:1: ruleLibPackageCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibraryAccess().getOwnedPackagesLibPackageCSParserRuleCall_1_0());
@@ -62730,17 +62730,17 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__OwnedPathElementsAssignment_0"
-    // InternalOCLstdlib.g:21644:1: rule__LibPathNameCS__OwnedPathElementsAssignment_0 : ( ruleLibPathElementCS ) ;
+    // InternalOCLstdlib.g:21648:1: rule__LibPathNameCS__OwnedPathElementsAssignment_0 : ( ruleLibPathElementCS ) ;
     public final void rule__LibPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21648:1: ( ( ruleLibPathElementCS ) )
-            // InternalOCLstdlib.g:21649:1: ( ruleLibPathElementCS )
+            // InternalOCLstdlib.g:21652:1: ( ( ruleLibPathElementCS ) )
+            // InternalOCLstdlib.g:21653:1: ( ruleLibPathElementCS )
             {
-            // InternalOCLstdlib.g:21649:1: ( ruleLibPathElementCS )
-            // InternalOCLstdlib.g:21650:1: ruleLibPathElementCS
+            // InternalOCLstdlib.g:21653:1: ( ruleLibPathElementCS )
+            // InternalOCLstdlib.g:21654:1: ruleLibPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathNameCSAccess().getOwnedPathElementsLibPathElementCSParserRuleCall_0_0());
@@ -62775,17 +62775,17 @@
 
 
     // $ANTLR start "rule__LibPathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalOCLstdlib.g:21659:1: rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleLibPathElementCS ) ;
+    // InternalOCLstdlib.g:21663:1: rule__LibPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleLibPathElementCS ) ;
     public final void rule__LibPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21663:1: ( ( ruleLibPathElementCS ) )
-            // InternalOCLstdlib.g:21664:1: ( ruleLibPathElementCS )
+            // InternalOCLstdlib.g:21667:1: ( ( ruleLibPathElementCS ) )
+            // InternalOCLstdlib.g:21668:1: ( ruleLibPathElementCS )
             {
-            // InternalOCLstdlib.g:21664:1: ( ruleLibPathElementCS )
-            // InternalOCLstdlib.g:21665:1: ruleLibPathElementCS
+            // InternalOCLstdlib.g:21668:1: ( ruleLibPathElementCS )
+            // InternalOCLstdlib.g:21669:1: ruleLibPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathNameCSAccess().getOwnedPathElementsLibPathElementCSParserRuleCall_1_1_0());
@@ -62820,23 +62820,23 @@
 
 
     // $ANTLR start "rule__LibPathElementCS__ReferredElementAssignment"
-    // InternalOCLstdlib.g:21674:1: rule__LibPathElementCS__ReferredElementAssignment : ( ( ruleName ) ) ;
+    // InternalOCLstdlib.g:21678:1: rule__LibPathElementCS__ReferredElementAssignment : ( ( ruleName ) ) ;
     public final void rule__LibPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21678:1: ( ( ( ruleName ) ) )
-            // InternalOCLstdlib.g:21679:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:21682:1: ( ( ( ruleName ) ) )
+            // InternalOCLstdlib.g:21683:1: ( ( ruleName ) )
             {
-            // InternalOCLstdlib.g:21679:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:21680:1: ( ruleName )
+            // InternalOCLstdlib.g:21683:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:21684:1: ( ruleName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalOCLstdlib.g:21681:1: ( ruleName )
-            // InternalOCLstdlib.g:21682:1: ruleName
+            // InternalOCLstdlib.g:21685:1: ( ruleName )
+            // InternalOCLstdlib.g:21686:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPathElementCSAccess().getReferredElementNamedElementNameParserRuleCall_0_1());
@@ -62877,17 +62877,17 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__NameAssignment_0"
-    // InternalOCLstdlib.g:21693:1: rule__AccumulatorCS__NameAssignment_0 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:21697:1: rule__AccumulatorCS__NameAssignment_0 : ( ruleIdentifier ) ;
     public final void rule__AccumulatorCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21697:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:21698:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:21701:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:21702:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:21698:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:21699:1: ruleIdentifier
+            // InternalOCLstdlib.g:21702:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:21703:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAccumulatorCSAccess().getNameIdentifierParserRuleCall_0_0());
@@ -62922,17 +62922,17 @@
 
 
     // $ANTLR start "rule__AccumulatorCS__OwnedTypeAssignment_2"
-    // InternalOCLstdlib.g:21708:1: rule__AccumulatorCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:21712:1: rule__AccumulatorCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__AccumulatorCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21712:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:21713:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:21716:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:21717:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:21713:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:21714:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:21717:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:21718:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAccumulatorCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_2_0());
@@ -62967,23 +62967,23 @@
 
 
     // $ANTLR start "rule__AnnotationCS__NameAssignment_1"
-    // InternalOCLstdlib.g:21723:1: rule__AnnotationCS__NameAssignment_1 : ( ( rule__AnnotationCS__NameAlternatives_1_0 ) ) ;
+    // InternalOCLstdlib.g:21727:1: rule__AnnotationCS__NameAssignment_1 : ( ( rule__AnnotationCS__NameAlternatives_1_0 ) ) ;
     public final void rule__AnnotationCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21727:1: ( ( ( rule__AnnotationCS__NameAlternatives_1_0 ) ) )
-            // InternalOCLstdlib.g:21728:1: ( ( rule__AnnotationCS__NameAlternatives_1_0 ) )
+            // InternalOCLstdlib.g:21731:1: ( ( ( rule__AnnotationCS__NameAlternatives_1_0 ) ) )
+            // InternalOCLstdlib.g:21732:1: ( ( rule__AnnotationCS__NameAlternatives_1_0 ) )
             {
-            // InternalOCLstdlib.g:21728:1: ( ( rule__AnnotationCS__NameAlternatives_1_0 ) )
-            // InternalOCLstdlib.g:21729:1: ( rule__AnnotationCS__NameAlternatives_1_0 )
+            // InternalOCLstdlib.g:21732:1: ( ( rule__AnnotationCS__NameAlternatives_1_0 ) )
+            // InternalOCLstdlib.g:21733:1: ( rule__AnnotationCS__NameAlternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getNameAlternatives_1_0());
             }
-            // InternalOCLstdlib.g:21730:1: ( rule__AnnotationCS__NameAlternatives_1_0 )
-            // InternalOCLstdlib.g:21730:2: rule__AnnotationCS__NameAlternatives_1_0
+            // InternalOCLstdlib.g:21734:1: ( rule__AnnotationCS__NameAlternatives_1_0 )
+            // InternalOCLstdlib.g:21734:2: rule__AnnotationCS__NameAlternatives_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__AnnotationCS__NameAlternatives_1_0();
@@ -63018,17 +63018,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedDetailsAssignment_2_1"
-    // InternalOCLstdlib.g:21739:1: rule__AnnotationCS__OwnedDetailsAssignment_2_1 : ( ruleDetailCS ) ;
+    // InternalOCLstdlib.g:21743:1: rule__AnnotationCS__OwnedDetailsAssignment_2_1 : ( ruleDetailCS ) ;
     public final void rule__AnnotationCS__OwnedDetailsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21743:1: ( ( ruleDetailCS ) )
-            // InternalOCLstdlib.g:21744:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:21747:1: ( ( ruleDetailCS ) )
+            // InternalOCLstdlib.g:21748:1: ( ruleDetailCS )
             {
-            // InternalOCLstdlib.g:21744:1: ( ruleDetailCS )
-            // InternalOCLstdlib.g:21745:1: ruleDetailCS
+            // InternalOCLstdlib.g:21748:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:21749:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_1_0());
@@ -63063,17 +63063,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedDetailsAssignment_2_2_1"
-    // InternalOCLstdlib.g:21754:1: rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 : ( ruleDetailCS ) ;
+    // InternalOCLstdlib.g:21758:1: rule__AnnotationCS__OwnedDetailsAssignment_2_2_1 : ( ruleDetailCS ) ;
     public final void rule__AnnotationCS__OwnedDetailsAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21758:1: ( ( ruleDetailCS ) )
-            // InternalOCLstdlib.g:21759:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:21762:1: ( ( ruleDetailCS ) )
+            // InternalOCLstdlib.g:21763:1: ( ruleDetailCS )
             {
-            // InternalOCLstdlib.g:21759:1: ( ruleDetailCS )
-            // InternalOCLstdlib.g:21760:1: ruleDetailCS
+            // InternalOCLstdlib.g:21763:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:21764:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedDetailsDetailCSParserRuleCall_2_2_1_0());
@@ -63108,17 +63108,17 @@
 
 
     // $ANTLR start "rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1"
-    // InternalOCLstdlib.g:21769:1: rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:21773:1: rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1 : ( ruleAnnotationElementCS ) ;
     public final void rule__AnnotationCS__OwnedAnnotationsAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21773:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:21774:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:21777:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:21778:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:21774:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:21775:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:21778:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:21779:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getAnnotationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_3_0_1_0());
@@ -63153,23 +63153,23 @@
 
 
     // $ANTLR start "rule__LibClassCS__IsAbstractAssignment_0"
-    // InternalOCLstdlib.g:21784:1: rule__LibClassCS__IsAbstractAssignment_0 : ( ( 'abstract' ) ) ;
+    // InternalOCLstdlib.g:21788:1: rule__LibClassCS__IsAbstractAssignment_0 : ( ( 'abstract' ) ) ;
     public final void rule__LibClassCS__IsAbstractAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21788:1: ( ( ( 'abstract' ) ) )
-            // InternalOCLstdlib.g:21789:1: ( ( 'abstract' ) )
+            // InternalOCLstdlib.g:21792:1: ( ( ( 'abstract' ) ) )
+            // InternalOCLstdlib.g:21793:1: ( ( 'abstract' ) )
             {
-            // InternalOCLstdlib.g:21789:1: ( ( 'abstract' ) )
-            // InternalOCLstdlib.g:21790:1: ( 'abstract' )
+            // InternalOCLstdlib.g:21793:1: ( ( 'abstract' ) )
+            // InternalOCLstdlib.g:21794:1: ( 'abstract' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getIsAbstractAbstractKeyword_0_0());
             }
-            // InternalOCLstdlib.g:21791:1: ( 'abstract' )
-            // InternalOCLstdlib.g:21792:1: 'abstract'
+            // InternalOCLstdlib.g:21795:1: ( 'abstract' )
+            // InternalOCLstdlib.g:21796:1: 'abstract'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getIsAbstractAbstractKeyword_0_0());
@@ -63206,17 +63206,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__NameAssignment_2"
-    // InternalOCLstdlib.g:21807:1: rule__LibClassCS__NameAssignment_2 : ( ruleAnyName ) ;
+    // InternalOCLstdlib.g:21811:1: rule__LibClassCS__NameAssignment_2 : ( ruleAnyName ) ;
     public final void rule__LibClassCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21811:1: ( ( ruleAnyName ) )
-            // InternalOCLstdlib.g:21812:1: ( ruleAnyName )
+            // InternalOCLstdlib.g:21815:1: ( ( ruleAnyName ) )
+            // InternalOCLstdlib.g:21816:1: ( ruleAnyName )
             {
-            // InternalOCLstdlib.g:21812:1: ( ruleAnyName )
-            // InternalOCLstdlib.g:21813:1: ruleAnyName
+            // InternalOCLstdlib.g:21816:1: ( ruleAnyName )
+            // InternalOCLstdlib.g:21817:1: ruleAnyName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getNameAnyNameParserRuleCall_2_0());
@@ -63251,17 +63251,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedSignatureAssignment_3"
-    // InternalOCLstdlib.g:21822:1: rule__LibClassCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLstdlib.g:21826:1: rule__LibClassCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
     public final void rule__LibClassCS__OwnedSignatureAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21826:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLstdlib.g:21827:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:21830:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLstdlib.g:21831:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLstdlib.g:21827:1: ( ruleTemplateSignatureCS )
-            // InternalOCLstdlib.g:21828:1: ruleTemplateSignatureCS
+            // InternalOCLstdlib.g:21831:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:21832:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
@@ -63296,23 +63296,23 @@
 
 
     // $ANTLR start "rule__LibClassCS__MetaclassNameAssignment_4_1"
-    // InternalOCLstdlib.g:21837:1: rule__LibClassCS__MetaclassNameAssignment_4_1 : ( ( ruleAnyName ) ) ;
+    // InternalOCLstdlib.g:21841:1: rule__LibClassCS__MetaclassNameAssignment_4_1 : ( ( ruleAnyName ) ) ;
     public final void rule__LibClassCS__MetaclassNameAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21841:1: ( ( ( ruleAnyName ) ) )
-            // InternalOCLstdlib.g:21842:1: ( ( ruleAnyName ) )
+            // InternalOCLstdlib.g:21845:1: ( ( ( ruleAnyName ) ) )
+            // InternalOCLstdlib.g:21846:1: ( ( ruleAnyName ) )
             {
-            // InternalOCLstdlib.g:21842:1: ( ( ruleAnyName ) )
-            // InternalOCLstdlib.g:21843:1: ( ruleAnyName )
+            // InternalOCLstdlib.g:21846:1: ( ( ruleAnyName ) )
+            // InternalOCLstdlib.g:21847:1: ( ruleAnyName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getMetaclassNameMetaclassNameCSCrossReference_4_1_0());
             }
-            // InternalOCLstdlib.g:21844:1: ( ruleAnyName )
-            // InternalOCLstdlib.g:21845:1: ruleAnyName
+            // InternalOCLstdlib.g:21848:1: ( ruleAnyName )
+            // InternalOCLstdlib.g:21849:1: ruleAnyName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getMetaclassNameMetaclassNameCSAnyNameParserRuleCall_4_1_0_1());
@@ -63353,17 +63353,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedSuperTypesAssignment_5_1"
-    // InternalOCLstdlib.g:21856:1: rule__LibClassCS__OwnedSuperTypesAssignment_5_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLstdlib.g:21860:1: rule__LibClassCS__OwnedSuperTypesAssignment_5_1 : ( ruleTypedRefCS ) ;
     public final void rule__LibClassCS__OwnedSuperTypesAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21860:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLstdlib.g:21861:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:21864:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLstdlib.g:21865:1: ( ruleTypedRefCS )
             {
-            // InternalOCLstdlib.g:21861:1: ( ruleTypedRefCS )
-            // InternalOCLstdlib.g:21862:1: ruleTypedRefCS
+            // InternalOCLstdlib.g:21865:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:21866:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_5_1_0());
@@ -63398,17 +63398,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1"
-    // InternalOCLstdlib.g:21871:1: rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLstdlib.g:21875:1: rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__LibClassCS__OwnedSuperTypesAssignment_5_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21875:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLstdlib.g:21876:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:21879:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLstdlib.g:21880:1: ( ruleTypedRefCS )
             {
-            // InternalOCLstdlib.g:21876:1: ( ruleTypedRefCS )
-            // InternalOCLstdlib.g:21877:1: ruleTypedRefCS
+            // InternalOCLstdlib.g:21880:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:21881:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_5_2_1_0());
@@ -63443,17 +63443,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedOperationsAssignment_7_0"
-    // InternalOCLstdlib.g:21886:1: rule__LibClassCS__OwnedOperationsAssignment_7_0 : ( ruleOperationCS ) ;
+    // InternalOCLstdlib.g:21890:1: rule__LibClassCS__OwnedOperationsAssignment_7_0 : ( ruleOperationCS ) ;
     public final void rule__LibClassCS__OwnedOperationsAssignment_7_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21890:1: ( ( ruleOperationCS ) )
-            // InternalOCLstdlib.g:21891:1: ( ruleOperationCS )
+            // InternalOCLstdlib.g:21894:1: ( ( ruleOperationCS ) )
+            // InternalOCLstdlib.g:21895:1: ( ruleOperationCS )
             {
-            // InternalOCLstdlib.g:21891:1: ( ruleOperationCS )
-            // InternalOCLstdlib.g:21892:1: ruleOperationCS
+            // InternalOCLstdlib.g:21895:1: ( ruleOperationCS )
+            // InternalOCLstdlib.g:21896:1: ruleOperationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_0());
@@ -63488,17 +63488,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedPropertiesAssignment_7_1"
-    // InternalOCLstdlib.g:21901:1: rule__LibClassCS__OwnedPropertiesAssignment_7_1 : ( ruleLibPropertyCS ) ;
+    // InternalOCLstdlib.g:21905:1: rule__LibClassCS__OwnedPropertiesAssignment_7_1 : ( ruleLibPropertyCS ) ;
     public final void rule__LibClassCS__OwnedPropertiesAssignment_7_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21905:1: ( ( ruleLibPropertyCS ) )
-            // InternalOCLstdlib.g:21906:1: ( ruleLibPropertyCS )
+            // InternalOCLstdlib.g:21909:1: ( ( ruleLibPropertyCS ) )
+            // InternalOCLstdlib.g:21910:1: ( ruleLibPropertyCS )
             {
-            // InternalOCLstdlib.g:21906:1: ( ruleLibPropertyCS )
-            // InternalOCLstdlib.g:21907:1: ruleLibPropertyCS
+            // InternalOCLstdlib.g:21910:1: ( ruleLibPropertyCS )
+            // InternalOCLstdlib.g:21911:1: ruleLibPropertyCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedPropertiesLibPropertyCSParserRuleCall_7_1_0());
@@ -63533,17 +63533,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedConstraintsAssignment_7_2"
-    // InternalOCLstdlib.g:21916:1: rule__LibClassCS__OwnedConstraintsAssignment_7_2 : ( ruleInvCS ) ;
+    // InternalOCLstdlib.g:21920:1: rule__LibClassCS__OwnedConstraintsAssignment_7_2 : ( ruleInvCS ) ;
     public final void rule__LibClassCS__OwnedConstraintsAssignment_7_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21920:1: ( ( ruleInvCS ) )
-            // InternalOCLstdlib.g:21921:1: ( ruleInvCS )
+            // InternalOCLstdlib.g:21924:1: ( ( ruleInvCS ) )
+            // InternalOCLstdlib.g:21925:1: ( ruleInvCS )
             {
-            // InternalOCLstdlib.g:21921:1: ( ruleInvCS )
-            // InternalOCLstdlib.g:21922:1: ruleInvCS
+            // InternalOCLstdlib.g:21925:1: ( ruleInvCS )
+            // InternalOCLstdlib.g:21926:1: ruleInvCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedConstraintsInvCSParserRuleCall_7_2_0());
@@ -63578,17 +63578,17 @@
 
 
     // $ANTLR start "rule__LibClassCS__OwnedAnnotationsAssignment_7_3"
-    // InternalOCLstdlib.g:21931:1: rule__LibClassCS__OwnedAnnotationsAssignment_7_3 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:21935:1: rule__LibClassCS__OwnedAnnotationsAssignment_7_3 : ( ruleAnnotationElementCS ) ;
     public final void rule__LibClassCS__OwnedAnnotationsAssignment_7_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21935:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:21936:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:21939:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:21940:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:21936:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:21937:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:21940:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:21941:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibClassCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_3_0());
@@ -63623,23 +63623,23 @@
 
 
     // $ANTLR start "rule__DetailCS__NameAssignment_0"
-    // InternalOCLstdlib.g:21946:1: rule__DetailCS__NameAssignment_0 : ( ( rule__DetailCS__NameAlternatives_0_0 ) ) ;
+    // InternalOCLstdlib.g:21950:1: rule__DetailCS__NameAssignment_0 : ( ( rule__DetailCS__NameAlternatives_0_0 ) ) ;
     public final void rule__DetailCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21950:1: ( ( ( rule__DetailCS__NameAlternatives_0_0 ) ) )
-            // InternalOCLstdlib.g:21951:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
+            // InternalOCLstdlib.g:21954:1: ( ( ( rule__DetailCS__NameAlternatives_0_0 ) ) )
+            // InternalOCLstdlib.g:21955:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
             {
-            // InternalOCLstdlib.g:21951:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
-            // InternalOCLstdlib.g:21952:1: ( rule__DetailCS__NameAlternatives_0_0 )
+            // InternalOCLstdlib.g:21955:1: ( ( rule__DetailCS__NameAlternatives_0_0 ) )
+            // InternalOCLstdlib.g:21956:1: ( rule__DetailCS__NameAlternatives_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getNameAlternatives_0_0());
             }
-            // InternalOCLstdlib.g:21953:1: ( rule__DetailCS__NameAlternatives_0_0 )
-            // InternalOCLstdlib.g:21953:2: rule__DetailCS__NameAlternatives_0_0
+            // InternalOCLstdlib.g:21957:1: ( rule__DetailCS__NameAlternatives_0_0 )
+            // InternalOCLstdlib.g:21957:2: rule__DetailCS__NameAlternatives_0_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__NameAlternatives_0_0();
@@ -63674,23 +63674,23 @@
 
 
     // $ANTLR start "rule__DetailCS__ValuesAssignment_2"
-    // InternalOCLstdlib.g:21962:1: rule__DetailCS__ValuesAssignment_2 : ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) ;
+    // InternalOCLstdlib.g:21966:1: rule__DetailCS__ValuesAssignment_2 : ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) ;
     public final void rule__DetailCS__ValuesAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21966:1: ( ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) )
-            // InternalOCLstdlib.g:21967:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
+            // InternalOCLstdlib.g:21970:1: ( ( ( rule__DetailCS__ValuesAlternatives_2_0 ) ) )
+            // InternalOCLstdlib.g:21971:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
             {
-            // InternalOCLstdlib.g:21967:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
-            // InternalOCLstdlib.g:21968:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
+            // InternalOCLstdlib.g:21971:1: ( ( rule__DetailCS__ValuesAlternatives_2_0 ) )
+            // InternalOCLstdlib.g:21972:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDetailCSAccess().getValuesAlternatives_2_0());
             }
-            // InternalOCLstdlib.g:21969:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
-            // InternalOCLstdlib.g:21969:2: rule__DetailCS__ValuesAlternatives_2_0
+            // InternalOCLstdlib.g:21973:1: ( rule__DetailCS__ValuesAlternatives_2_0 )
+            // InternalOCLstdlib.g:21973:2: rule__DetailCS__ValuesAlternatives_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__DetailCS__ValuesAlternatives_2_0();
@@ -63725,17 +63725,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__ValueAssignment_2"
-    // InternalOCLstdlib.g:21978:1: rule__DocumentationCS__ValueAssignment_2 : ( RULE_SINGLE_QUOTED_STRING ) ;
+    // InternalOCLstdlib.g:21982:1: rule__DocumentationCS__ValueAssignment_2 : ( RULE_SINGLE_QUOTED_STRING ) ;
     public final void rule__DocumentationCS__ValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21982:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:21983:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:21986:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:21987:1: ( RULE_SINGLE_QUOTED_STRING )
             {
-            // InternalOCLstdlib.g:21983:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:21984:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:21987:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:21988:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getValueSINGLE_QUOTED_STRINGTerminalRuleCall_2_0());
@@ -63766,17 +63766,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__OwnedDetailsAssignment_3_1"
-    // InternalOCLstdlib.g:21993:1: rule__DocumentationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
+    // InternalOCLstdlib.g:21997:1: rule__DocumentationCS__OwnedDetailsAssignment_3_1 : ( ruleDetailCS ) ;
     public final void rule__DocumentationCS__OwnedDetailsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:21997:1: ( ( ruleDetailCS ) )
-            // InternalOCLstdlib.g:21998:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:22001:1: ( ( ruleDetailCS ) )
+            // InternalOCLstdlib.g:22002:1: ( ruleDetailCS )
             {
-            // InternalOCLstdlib.g:21998:1: ( ruleDetailCS )
-            // InternalOCLstdlib.g:21999:1: ruleDetailCS
+            // InternalOCLstdlib.g:22002:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:22003:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_1_0());
@@ -63811,17 +63811,17 @@
 
 
     // $ANTLR start "rule__DocumentationCS__OwnedDetailsAssignment_3_2_1"
-    // InternalOCLstdlib.g:22008:1: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
+    // InternalOCLstdlib.g:22012:1: rule__DocumentationCS__OwnedDetailsAssignment_3_2_1 : ( ruleDetailCS ) ;
     public final void rule__DocumentationCS__OwnedDetailsAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22012:1: ( ( ruleDetailCS ) )
-            // InternalOCLstdlib.g:22013:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:22016:1: ( ( ruleDetailCS ) )
+            // InternalOCLstdlib.g:22017:1: ( ruleDetailCS )
             {
-            // InternalOCLstdlib.g:22013:1: ( ruleDetailCS )
-            // InternalOCLstdlib.g:22014:1: ruleDetailCS
+            // InternalOCLstdlib.g:22017:1: ( ruleDetailCS )
+            // InternalOCLstdlib.g:22018:1: ruleDetailCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDocumentationCSAccess().getOwnedDetailsDetailCSParserRuleCall_3_2_1_0());
@@ -63856,17 +63856,17 @@
 
 
     // $ANTLR start "rule__ImportCS__NameAssignment_1_0"
-    // InternalOCLstdlib.g:22023:1: rule__ImportCS__NameAssignment_1_0 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:22027:1: rule__ImportCS__NameAssignment_1_0 : ( ruleIdentifier ) ;
     public final void rule__ImportCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22027:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:22028:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:22031:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:22032:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:22028:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:22029:1: ruleIdentifier
+            // InternalOCLstdlib.g:22032:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:22033:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getNameIdentifierParserRuleCall_1_0_0());
@@ -63901,17 +63901,17 @@
 
 
     // $ANTLR start "rule__ImportCS__OwnedPathNameAssignment_2"
-    // InternalOCLstdlib.g:22038:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
+    // InternalOCLstdlib.g:22042:1: rule__ImportCS__OwnedPathNameAssignment_2 : ( ruleURIPathNameCS ) ;
     public final void rule__ImportCS__OwnedPathNameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22042:1: ( ( ruleURIPathNameCS ) )
-            // InternalOCLstdlib.g:22043:1: ( ruleURIPathNameCS )
+            // InternalOCLstdlib.g:22046:1: ( ( ruleURIPathNameCS ) )
+            // InternalOCLstdlib.g:22047:1: ( ruleURIPathNameCS )
             {
-            // InternalOCLstdlib.g:22043:1: ( ruleURIPathNameCS )
-            // InternalOCLstdlib.g:22044:1: ruleURIPathNameCS
+            // InternalOCLstdlib.g:22047:1: ( ruleURIPathNameCS )
+            // InternalOCLstdlib.g:22048:1: ruleURIPathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());
@@ -63946,23 +63946,23 @@
 
 
     // $ANTLR start "rule__ImportCS__IsAllAssignment_3"
-    // InternalOCLstdlib.g:22053:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
+    // InternalOCLstdlib.g:22057:1: rule__ImportCS__IsAllAssignment_3 : ( ( '::*' ) ) ;
     public final void rule__ImportCS__IsAllAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22057:1: ( ( ( '::*' ) ) )
-            // InternalOCLstdlib.g:22058:1: ( ( '::*' ) )
+            // InternalOCLstdlib.g:22061:1: ( ( ( '::*' ) ) )
+            // InternalOCLstdlib.g:22062:1: ( ( '::*' ) )
             {
-            // InternalOCLstdlib.g:22058:1: ( ( '::*' ) )
-            // InternalOCLstdlib.g:22059:1: ( '::*' )
+            // InternalOCLstdlib.g:22062:1: ( ( '::*' ) )
+            // InternalOCLstdlib.g:22063:1: ( '::*' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
             }
-            // InternalOCLstdlib.g:22060:1: ( '::*' )
-            // InternalOCLstdlib.g:22061:1: '::*'
+            // InternalOCLstdlib.g:22064:1: ( '::*' )
+            // InternalOCLstdlib.g:22065:1: '::*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getImportCSAccess().getIsAllColonColonAsteriskKeyword_3_0());
@@ -63999,23 +63999,23 @@
 
 
     // $ANTLR start "rule__InvCS__StereotypeAssignment_0"
-    // InternalOCLstdlib.g:22076:1: rule__InvCS__StereotypeAssignment_0 : ( ( 'inv' ) ) ;
+    // InternalOCLstdlib.g:22080:1: rule__InvCS__StereotypeAssignment_0 : ( ( 'inv' ) ) ;
     public final void rule__InvCS__StereotypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22080:1: ( ( ( 'inv' ) ) )
-            // InternalOCLstdlib.g:22081:1: ( ( 'inv' ) )
+            // InternalOCLstdlib.g:22084:1: ( ( ( 'inv' ) ) )
+            // InternalOCLstdlib.g:22085:1: ( ( 'inv' ) )
             {
-            // InternalOCLstdlib.g:22081:1: ( ( 'inv' ) )
-            // InternalOCLstdlib.g:22082:1: ( 'inv' )
+            // InternalOCLstdlib.g:22085:1: ( ( 'inv' ) )
+            // InternalOCLstdlib.g:22086:1: ( 'inv' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getStereotypeInvKeyword_0_0());
             }
-            // InternalOCLstdlib.g:22083:1: ( 'inv' )
-            // InternalOCLstdlib.g:22084:1: 'inv'
+            // InternalOCLstdlib.g:22087:1: ( 'inv' )
+            // InternalOCLstdlib.g:22088:1: 'inv'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getStereotypeInvKeyword_0_0());
@@ -64052,17 +64052,17 @@
 
 
     // $ANTLR start "rule__InvCS__NameAssignment_1_0"
-    // InternalOCLstdlib.g:22099:1: rule__InvCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:22103:1: rule__InvCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
     public final void rule__InvCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22103:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:22104:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:22107:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:22108:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:22104:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:22105:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:22108:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:22109:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
@@ -64097,17 +64097,17 @@
 
 
     // $ANTLR start "rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1"
-    // InternalOCLstdlib.g:22114:1: rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:22118:1: rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__InvCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22118:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:22119:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:22122:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:22123:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:22119:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:22120:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:22123:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:22124:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
@@ -64142,17 +64142,17 @@
 
 
     // $ANTLR start "rule__InvCS__OwnedSpecificationAssignment_3"
-    // InternalOCLstdlib.g:22129:1: rule__InvCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:22133:1: rule__InvCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
     public final void rule__InvCS__OwnedSpecificationAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22133:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:22134:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:22137:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:22138:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:22134:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:22135:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:22138:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:22139:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getInvCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
@@ -64187,17 +64187,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__NameAssignment_1"
-    // InternalOCLstdlib.g:22144:1: rule__LibCoercionCS__NameAssignment_1 : ( ruleName ) ;
+    // InternalOCLstdlib.g:22148:1: rule__LibCoercionCS__NameAssignment_1 : ( ruleName ) ;
     public final void rule__LibCoercionCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22148:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:22149:1: ( ruleName )
+            // InternalOCLstdlib.g:22152:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22153:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:22149:1: ( ruleName )
-            // InternalOCLstdlib.g:22150:1: ruleName
+            // InternalOCLstdlib.g:22153:1: ( ruleName )
+            // InternalOCLstdlib.g:22154:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getNameNameParserRuleCall_1_0());
@@ -64232,17 +64232,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__OwnedTypeAssignment_5"
-    // InternalOCLstdlib.g:22159:1: rule__LibCoercionCS__OwnedTypeAssignment_5 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22163:1: rule__LibCoercionCS__OwnedTypeAssignment_5 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LibCoercionCS__OwnedTypeAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22163:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22164:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22167:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22168:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22164:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22165:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22168:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22169:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_5_0());
@@ -64277,23 +64277,23 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__ImplementationAssignment_6_1"
-    // InternalOCLstdlib.g:22174:1: rule__LibCoercionCS__ImplementationAssignment_6_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
+    // InternalOCLstdlib.g:22178:1: rule__LibCoercionCS__ImplementationAssignment_6_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
     public final void rule__LibCoercionCS__ImplementationAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22178:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
-            // InternalOCLstdlib.g:22179:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:22182:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
+            // InternalOCLstdlib.g:22183:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
             {
-            // InternalOCLstdlib.g:22179:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:22180:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:22183:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:22184:1: ( RULE_SINGLE_QUOTED_STRING )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getImplementationJavaClassCSCrossReference_6_1_0());
             }
-            // InternalOCLstdlib.g:22181:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:22182:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:22185:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:22186:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getImplementationJavaClassCSSINGLE_QUOTED_STRINGTerminalRuleCall_6_1_0_1());
@@ -64330,17 +64330,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0"
-    // InternalOCLstdlib.g:22193:1: rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:22197:1: rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__LibCoercionCS__OwnedAnnotationsAssignment_7_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22197:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:22198:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22201:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:22202:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:22198:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:22199:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:22202:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22203:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0_0());
@@ -64375,17 +64375,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1"
-    // InternalOCLstdlib.g:22208:1: rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 : ( rulePostCS ) ;
+    // InternalOCLstdlib.g:22212:1: rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1 : ( rulePostCS ) ;
     public final void rule__LibCoercionCS__OwnedPreconditionsAssignment_7_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22212:1: ( ( rulePostCS ) )
-            // InternalOCLstdlib.g:22213:1: ( rulePostCS )
+            // InternalOCLstdlib.g:22216:1: ( ( rulePostCS ) )
+            // InternalOCLstdlib.g:22217:1: ( rulePostCS )
             {
-            // InternalOCLstdlib.g:22213:1: ( rulePostCS )
-            // InternalOCLstdlib.g:22214:1: rulePostCS
+            // InternalOCLstdlib.g:22217:1: ( rulePostCS )
+            // InternalOCLstdlib.g:22218:1: rulePostCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getOwnedPreconditionsPostCSParserRuleCall_7_0_1_1_0());
@@ -64420,17 +64420,17 @@
 
 
     // $ANTLR start "rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2"
-    // InternalOCLstdlib.g:22223:1: rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 : ( rulePreCS ) ;
+    // InternalOCLstdlib.g:22227:1: rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2 : ( rulePreCS ) ;
     public final void rule__LibCoercionCS__OwnedPostconditionsAssignment_7_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22227:1: ( ( rulePreCS ) )
-            // InternalOCLstdlib.g:22228:1: ( rulePreCS )
+            // InternalOCLstdlib.g:22231:1: ( ( rulePreCS ) )
+            // InternalOCLstdlib.g:22232:1: ( rulePreCS )
             {
-            // InternalOCLstdlib.g:22228:1: ( rulePreCS )
-            // InternalOCLstdlib.g:22229:1: rulePreCS
+            // InternalOCLstdlib.g:22232:1: ( rulePreCS )
+            // InternalOCLstdlib.g:22233:1: rulePreCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibCoercionCSAccess().getOwnedPostconditionsPreCSParserRuleCall_7_0_1_2_0());
@@ -64465,17 +64465,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__NameAssignment_1"
-    // InternalOCLstdlib.g:22238:1: rule__LibIterationCS__NameAssignment_1 : ( ruleName ) ;
+    // InternalOCLstdlib.g:22242:1: rule__LibIterationCS__NameAssignment_1 : ( ruleName ) ;
     public final void rule__LibIterationCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22242:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:22243:1: ( ruleName )
+            // InternalOCLstdlib.g:22246:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22247:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:22243:1: ( ruleName )
-            // InternalOCLstdlib.g:22244:1: ruleName
+            // InternalOCLstdlib.g:22247:1: ( ruleName )
+            // InternalOCLstdlib.g:22248:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getNameNameParserRuleCall_1_0());
@@ -64510,17 +64510,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedSignatureAssignment_2"
-    // InternalOCLstdlib.g:22253:1: rule__LibIterationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLstdlib.g:22257:1: rule__LibIterationCS__OwnedSignatureAssignment_2 : ( ruleTemplateSignatureCS ) ;
     public final void rule__LibIterationCS__OwnedSignatureAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22257:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLstdlib.g:22258:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:22261:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLstdlib.g:22262:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLstdlib.g:22258:1: ( ruleTemplateSignatureCS )
-            // InternalOCLstdlib.g:22259:1: ruleTemplateSignatureCS
+            // InternalOCLstdlib.g:22262:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:22263:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());
@@ -64555,17 +64555,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedIteratorsAssignment_4"
-    // InternalOCLstdlib.g:22268:1: rule__LibIterationCS__OwnedIteratorsAssignment_4 : ( ruleIteratorCS ) ;
+    // InternalOCLstdlib.g:22272:1: rule__LibIterationCS__OwnedIteratorsAssignment_4 : ( ruleIteratorCS ) ;
     public final void rule__LibIterationCS__OwnedIteratorsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22272:1: ( ( ruleIteratorCS ) )
-            // InternalOCLstdlib.g:22273:1: ( ruleIteratorCS )
+            // InternalOCLstdlib.g:22276:1: ( ( ruleIteratorCS ) )
+            // InternalOCLstdlib.g:22277:1: ( ruleIteratorCS )
             {
-            // InternalOCLstdlib.g:22273:1: ( ruleIteratorCS )
-            // InternalOCLstdlib.g:22274:1: ruleIteratorCS
+            // InternalOCLstdlib.g:22277:1: ( ruleIteratorCS )
+            // InternalOCLstdlib.g:22278:1: ruleIteratorCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedIteratorsIteratorCSParserRuleCall_4_0());
@@ -64600,17 +64600,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedIteratorsAssignment_5_1"
-    // InternalOCLstdlib.g:22283:1: rule__LibIterationCS__OwnedIteratorsAssignment_5_1 : ( ruleIteratorCS ) ;
+    // InternalOCLstdlib.g:22287:1: rule__LibIterationCS__OwnedIteratorsAssignment_5_1 : ( ruleIteratorCS ) ;
     public final void rule__LibIterationCS__OwnedIteratorsAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22287:1: ( ( ruleIteratorCS ) )
-            // InternalOCLstdlib.g:22288:1: ( ruleIteratorCS )
+            // InternalOCLstdlib.g:22291:1: ( ( ruleIteratorCS ) )
+            // InternalOCLstdlib.g:22292:1: ( ruleIteratorCS )
             {
-            // InternalOCLstdlib.g:22288:1: ( ruleIteratorCS )
-            // InternalOCLstdlib.g:22289:1: ruleIteratorCS
+            // InternalOCLstdlib.g:22292:1: ( ruleIteratorCS )
+            // InternalOCLstdlib.g:22293:1: ruleIteratorCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedIteratorsIteratorCSParserRuleCall_5_1_0());
@@ -64645,17 +64645,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1"
-    // InternalOCLstdlib.g:22298:1: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 : ( ruleAccumulatorCS ) ;
+    // InternalOCLstdlib.g:22302:1: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1 : ( ruleAccumulatorCS ) ;
     public final void rule__LibIterationCS__OwnedAccumulatorsAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22302:1: ( ( ruleAccumulatorCS ) )
-            // InternalOCLstdlib.g:22303:1: ( ruleAccumulatorCS )
+            // InternalOCLstdlib.g:22306:1: ( ( ruleAccumulatorCS ) )
+            // InternalOCLstdlib.g:22307:1: ( ruleAccumulatorCS )
             {
-            // InternalOCLstdlib.g:22303:1: ( ruleAccumulatorCS )
-            // InternalOCLstdlib.g:22304:1: ruleAccumulatorCS
+            // InternalOCLstdlib.g:22307:1: ( ruleAccumulatorCS )
+            // InternalOCLstdlib.g:22308:1: ruleAccumulatorCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedAccumulatorsAccumulatorCSParserRuleCall_6_1_0());
@@ -64690,17 +64690,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1"
-    // InternalOCLstdlib.g:22313:1: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 : ( ruleAccumulatorCS ) ;
+    // InternalOCLstdlib.g:22317:1: rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1 : ( ruleAccumulatorCS ) ;
     public final void rule__LibIterationCS__OwnedAccumulatorsAssignment_6_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22317:1: ( ( ruleAccumulatorCS ) )
-            // InternalOCLstdlib.g:22318:1: ( ruleAccumulatorCS )
+            // InternalOCLstdlib.g:22321:1: ( ( ruleAccumulatorCS ) )
+            // InternalOCLstdlib.g:22322:1: ( ruleAccumulatorCS )
             {
-            // InternalOCLstdlib.g:22318:1: ( ruleAccumulatorCS )
-            // InternalOCLstdlib.g:22319:1: ruleAccumulatorCS
+            // InternalOCLstdlib.g:22322:1: ( ruleAccumulatorCS )
+            // InternalOCLstdlib.g:22323:1: ruleAccumulatorCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedAccumulatorsAccumulatorCSParserRuleCall_6_2_1_0());
@@ -64735,17 +64735,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedParametersAssignment_7_1"
-    // InternalOCLstdlib.g:22328:1: rule__LibIterationCS__OwnedParametersAssignment_7_1 : ( ruleParameterCS ) ;
+    // InternalOCLstdlib.g:22332:1: rule__LibIterationCS__OwnedParametersAssignment_7_1 : ( ruleParameterCS ) ;
     public final void rule__LibIterationCS__OwnedParametersAssignment_7_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22332:1: ( ( ruleParameterCS ) )
-            // InternalOCLstdlib.g:22333:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22336:1: ( ( ruleParameterCS ) )
+            // InternalOCLstdlib.g:22337:1: ( ruleParameterCS )
             {
-            // InternalOCLstdlib.g:22333:1: ( ruleParameterCS )
-            // InternalOCLstdlib.g:22334:1: ruleParameterCS
+            // InternalOCLstdlib.g:22337:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22338:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedParametersParameterCSParserRuleCall_7_1_0());
@@ -64780,17 +64780,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedParametersAssignment_7_2_1"
-    // InternalOCLstdlib.g:22343:1: rule__LibIterationCS__OwnedParametersAssignment_7_2_1 : ( ruleParameterCS ) ;
+    // InternalOCLstdlib.g:22347:1: rule__LibIterationCS__OwnedParametersAssignment_7_2_1 : ( ruleParameterCS ) ;
     public final void rule__LibIterationCS__OwnedParametersAssignment_7_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22347:1: ( ( ruleParameterCS ) )
-            // InternalOCLstdlib.g:22348:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22351:1: ( ( ruleParameterCS ) )
+            // InternalOCLstdlib.g:22352:1: ( ruleParameterCS )
             {
-            // InternalOCLstdlib.g:22348:1: ( ruleParameterCS )
-            // InternalOCLstdlib.g:22349:1: ruleParameterCS
+            // InternalOCLstdlib.g:22352:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22353:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedParametersParameterCSParserRuleCall_7_2_1_0());
@@ -64825,17 +64825,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedTypeAssignment_10"
-    // InternalOCLstdlib.g:22358:1: rule__LibIterationCS__OwnedTypeAssignment_10 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22362:1: rule__LibIterationCS__OwnedTypeAssignment_10 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LibIterationCS__OwnedTypeAssignment_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22362:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22363:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22366:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22367:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22363:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22364:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22367:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22368:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_10_0());
@@ -64870,23 +64870,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__IsInvalidatingAssignment_11"
-    // InternalOCLstdlib.g:22373:1: rule__LibIterationCS__IsInvalidatingAssignment_11 : ( ( 'invalidating' ) ) ;
+    // InternalOCLstdlib.g:22377:1: rule__LibIterationCS__IsInvalidatingAssignment_11 : ( ( 'invalidating' ) ) ;
     public final void rule__LibIterationCS__IsInvalidatingAssignment_11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22377:1: ( ( ( 'invalidating' ) ) )
-            // InternalOCLstdlib.g:22378:1: ( ( 'invalidating' ) )
+            // InternalOCLstdlib.g:22381:1: ( ( ( 'invalidating' ) ) )
+            // InternalOCLstdlib.g:22382:1: ( ( 'invalidating' ) )
             {
-            // InternalOCLstdlib.g:22378:1: ( ( 'invalidating' ) )
-            // InternalOCLstdlib.g:22379:1: ( 'invalidating' )
+            // InternalOCLstdlib.g:22382:1: ( ( 'invalidating' ) )
+            // InternalOCLstdlib.g:22383:1: ( 'invalidating' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIsInvalidatingInvalidatingKeyword_11_0());
             }
-            // InternalOCLstdlib.g:22380:1: ( 'invalidating' )
-            // InternalOCLstdlib.g:22381:1: 'invalidating'
+            // InternalOCLstdlib.g:22384:1: ( 'invalidating' )
+            // InternalOCLstdlib.g:22385:1: 'invalidating'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIsInvalidatingInvalidatingKeyword_11_0());
@@ -64923,23 +64923,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__IsValidatingAssignment_12"
-    // InternalOCLstdlib.g:22396:1: rule__LibIterationCS__IsValidatingAssignment_12 : ( ( 'validating' ) ) ;
+    // InternalOCLstdlib.g:22400:1: rule__LibIterationCS__IsValidatingAssignment_12 : ( ( 'validating' ) ) ;
     public final void rule__LibIterationCS__IsValidatingAssignment_12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22400:1: ( ( ( 'validating' ) ) )
-            // InternalOCLstdlib.g:22401:1: ( ( 'validating' ) )
+            // InternalOCLstdlib.g:22404:1: ( ( ( 'validating' ) ) )
+            // InternalOCLstdlib.g:22405:1: ( ( 'validating' ) )
             {
-            // InternalOCLstdlib.g:22401:1: ( ( 'validating' ) )
-            // InternalOCLstdlib.g:22402:1: ( 'validating' )
+            // InternalOCLstdlib.g:22405:1: ( ( 'validating' ) )
+            // InternalOCLstdlib.g:22406:1: ( 'validating' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIsValidatingValidatingKeyword_12_0());
             }
-            // InternalOCLstdlib.g:22403:1: ( 'validating' )
-            // InternalOCLstdlib.g:22404:1: 'validating'
+            // InternalOCLstdlib.g:22407:1: ( 'validating' )
+            // InternalOCLstdlib.g:22408:1: 'validating'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getIsValidatingValidatingKeyword_12_0());
@@ -64976,23 +64976,23 @@
 
 
     // $ANTLR start "rule__LibIterationCS__ImplementationAssignment_13_1"
-    // InternalOCLstdlib.g:22419:1: rule__LibIterationCS__ImplementationAssignment_13_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
+    // InternalOCLstdlib.g:22423:1: rule__LibIterationCS__ImplementationAssignment_13_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
     public final void rule__LibIterationCS__ImplementationAssignment_13_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22423:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
-            // InternalOCLstdlib.g:22424:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:22427:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
+            // InternalOCLstdlib.g:22428:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
             {
-            // InternalOCLstdlib.g:22424:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:22425:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:22428:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:22429:1: ( RULE_SINGLE_QUOTED_STRING )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getImplementationJavaClassCSCrossReference_13_1_0());
             }
-            // InternalOCLstdlib.g:22426:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:22427:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:22430:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:22431:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getImplementationJavaClassCSSINGLE_QUOTED_STRINGTerminalRuleCall_13_1_0_1());
@@ -65029,17 +65029,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0"
-    // InternalOCLstdlib.g:22438:1: rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:22442:1: rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__LibIterationCS__OwnedAnnotationsAssignment_14_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22442:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:22443:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22446:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:22447:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:22443:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:22444:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:22447:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22448:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_14_0_1_0_0());
@@ -65074,17 +65074,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1"
-    // InternalOCLstdlib.g:22453:1: rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 : ( rulePostCS ) ;
+    // InternalOCLstdlib.g:22457:1: rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1 : ( rulePostCS ) ;
     public final void rule__LibIterationCS__OwnedPreconditionsAssignment_14_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22457:1: ( ( rulePostCS ) )
-            // InternalOCLstdlib.g:22458:1: ( rulePostCS )
+            // InternalOCLstdlib.g:22461:1: ( ( rulePostCS ) )
+            // InternalOCLstdlib.g:22462:1: ( rulePostCS )
             {
-            // InternalOCLstdlib.g:22458:1: ( rulePostCS )
-            // InternalOCLstdlib.g:22459:1: rulePostCS
+            // InternalOCLstdlib.g:22462:1: ( rulePostCS )
+            // InternalOCLstdlib.g:22463:1: rulePostCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedPreconditionsPostCSParserRuleCall_14_0_1_1_0());
@@ -65119,17 +65119,17 @@
 
 
     // $ANTLR start "rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2"
-    // InternalOCLstdlib.g:22468:1: rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 : ( rulePreCS ) ;
+    // InternalOCLstdlib.g:22472:1: rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2 : ( rulePreCS ) ;
     public final void rule__LibIterationCS__OwnedPostconditionsAssignment_14_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22472:1: ( ( rulePreCS ) )
-            // InternalOCLstdlib.g:22473:1: ( rulePreCS )
+            // InternalOCLstdlib.g:22476:1: ( ( rulePreCS ) )
+            // InternalOCLstdlib.g:22477:1: ( rulePreCS )
             {
-            // InternalOCLstdlib.g:22473:1: ( rulePreCS )
-            // InternalOCLstdlib.g:22474:1: rulePreCS
+            // InternalOCLstdlib.g:22477:1: ( rulePreCS )
+            // InternalOCLstdlib.g:22478:1: rulePreCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibIterationCSAccess().getOwnedPostconditionsPreCSParserRuleCall_14_0_1_2_0());
@@ -65164,17 +65164,17 @@
 
 
     // $ANTLR start "rule__IteratorCS__NameAssignment_0"
-    // InternalOCLstdlib.g:22483:1: rule__IteratorCS__NameAssignment_0 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:22487:1: rule__IteratorCS__NameAssignment_0 : ( ruleIdentifier ) ;
     public final void rule__IteratorCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22487:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:22488:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:22491:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:22492:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:22488:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:22489:1: ruleIdentifier
+            // InternalOCLstdlib.g:22492:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:22493:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIteratorCSAccess().getNameIdentifierParserRuleCall_0_0());
@@ -65209,17 +65209,17 @@
 
 
     // $ANTLR start "rule__IteratorCS__OwnedTypeAssignment_2"
-    // InternalOCLstdlib.g:22498:1: rule__IteratorCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22502:1: rule__IteratorCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__IteratorCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22502:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22503:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22506:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22507:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22503:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22504:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22507:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22508:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIteratorCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_2_0());
@@ -65254,23 +65254,23 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__NameAssignment_0"
-    // InternalOCLstdlib.g:22513:1: rule__LambdaTypeCS__NameAssignment_0 : ( ( 'Lambda' ) ) ;
+    // InternalOCLstdlib.g:22517:1: rule__LambdaTypeCS__NameAssignment_0 : ( ( 'Lambda' ) ) ;
     public final void rule__LambdaTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22517:1: ( ( ( 'Lambda' ) ) )
-            // InternalOCLstdlib.g:22518:1: ( ( 'Lambda' ) )
+            // InternalOCLstdlib.g:22521:1: ( ( ( 'Lambda' ) ) )
+            // InternalOCLstdlib.g:22522:1: ( ( 'Lambda' ) )
             {
-            // InternalOCLstdlib.g:22518:1: ( ( 'Lambda' ) )
-            // InternalOCLstdlib.g:22519:1: ( 'Lambda' )
+            // InternalOCLstdlib.g:22522:1: ( ( 'Lambda' ) )
+            // InternalOCLstdlib.g:22523:1: ( 'Lambda' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getNameLambdaKeyword_0_0());
             }
-            // InternalOCLstdlib.g:22520:1: ( 'Lambda' )
-            // InternalOCLstdlib.g:22521:1: 'Lambda'
+            // InternalOCLstdlib.g:22524:1: ( 'Lambda' )
+            // InternalOCLstdlib.g:22525:1: 'Lambda'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getNameLambdaKeyword_0_0());
@@ -65307,17 +65307,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__OwnedSignatureAssignment_1"
-    // InternalOCLstdlib.g:22536:1: rule__LambdaTypeCS__OwnedSignatureAssignment_1 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLstdlib.g:22540:1: rule__LambdaTypeCS__OwnedSignatureAssignment_1 : ( ruleTemplateSignatureCS ) ;
     public final void rule__LambdaTypeCS__OwnedSignatureAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22540:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLstdlib.g:22541:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:22544:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLstdlib.g:22545:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLstdlib.g:22541:1: ( ruleTemplateSignatureCS )
-            // InternalOCLstdlib.g:22542:1: ruleTemplateSignatureCS
+            // InternalOCLstdlib.g:22545:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:22546:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_1_0());
@@ -65352,17 +65352,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__OwnedContextTypeAssignment_2"
-    // InternalOCLstdlib.g:22551:1: rule__LambdaTypeCS__OwnedContextTypeAssignment_2 : ( ruleLambdaContextTypeRefCS ) ;
+    // InternalOCLstdlib.g:22555:1: rule__LambdaTypeCS__OwnedContextTypeAssignment_2 : ( ruleLambdaContextTypeRefCS ) ;
     public final void rule__LambdaTypeCS__OwnedContextTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22555:1: ( ( ruleLambdaContextTypeRefCS ) )
-            // InternalOCLstdlib.g:22556:1: ( ruleLambdaContextTypeRefCS )
+            // InternalOCLstdlib.g:22559:1: ( ( ruleLambdaContextTypeRefCS ) )
+            // InternalOCLstdlib.g:22560:1: ( ruleLambdaContextTypeRefCS )
             {
-            // InternalOCLstdlib.g:22556:1: ( ruleLambdaContextTypeRefCS )
-            // InternalOCLstdlib.g:22557:1: ruleLambdaContextTypeRefCS
+            // InternalOCLstdlib.g:22560:1: ( ruleLambdaContextTypeRefCS )
+            // InternalOCLstdlib.g:22561:1: ruleLambdaContextTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedContextTypeLambdaContextTypeRefCSParserRuleCall_2_0());
@@ -65397,17 +65397,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0"
-    // InternalOCLstdlib.g:22566:1: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22570:1: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22570:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22571:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22574:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22575:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22571:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22572:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22575:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22576:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedParameterTypesTypedMultiplicityRefCSParserRuleCall_4_0_0());
@@ -65442,17 +65442,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1"
-    // InternalOCLstdlib.g:22581:1: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22585:1: rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LambdaTypeCS__OwnedParameterTypesAssignment_4_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22585:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22586:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22589:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22590:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22586:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22587:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22590:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22591:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedParameterTypesTypedMultiplicityRefCSParserRuleCall_4_1_1_0());
@@ -65487,17 +65487,17 @@
 
 
     // $ANTLR start "rule__LambdaTypeCS__OwnedResultTypeAssignment_7"
-    // InternalOCLstdlib.g:22596:1: rule__LambdaTypeCS__OwnedResultTypeAssignment_7 : ( ruleTypedRefCS ) ;
+    // InternalOCLstdlib.g:22600:1: rule__LambdaTypeCS__OwnedResultTypeAssignment_7 : ( ruleTypedRefCS ) ;
     public final void rule__LambdaTypeCS__OwnedResultTypeAssignment_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22600:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLstdlib.g:22601:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:22604:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLstdlib.g:22605:1: ( ruleTypedRefCS )
             {
-            // InternalOCLstdlib.g:22601:1: ( ruleTypedRefCS )
-            // InternalOCLstdlib.g:22602:1: ruleTypedRefCS
+            // InternalOCLstdlib.g:22605:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:22606:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaTypeCSAccess().getOwnedResultTypeTypedRefCSParserRuleCall_7_0());
@@ -65532,17 +65532,17 @@
 
 
     // $ANTLR start "rule__LambdaContextTypeRefCS__OwnedPathNameAssignment"
-    // InternalOCLstdlib.g:22611:1: rule__LambdaContextTypeRefCS__OwnedPathNameAssignment : ( ruleLibPathNameCS ) ;
+    // InternalOCLstdlib.g:22615:1: rule__LambdaContextTypeRefCS__OwnedPathNameAssignment : ( ruleLibPathNameCS ) ;
     public final void rule__LambdaContextTypeRefCS__OwnedPathNameAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22615:1: ( ( ruleLibPathNameCS ) )
-            // InternalOCLstdlib.g:22616:1: ( ruleLibPathNameCS )
+            // InternalOCLstdlib.g:22619:1: ( ( ruleLibPathNameCS ) )
+            // InternalOCLstdlib.g:22620:1: ( ruleLibPathNameCS )
             {
-            // InternalOCLstdlib.g:22616:1: ( ruleLibPathNameCS )
-            // InternalOCLstdlib.g:22617:1: ruleLibPathNameCS
+            // InternalOCLstdlib.g:22620:1: ( ruleLibPathNameCS )
+            // InternalOCLstdlib.g:22621:1: ruleLibPathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaContextTypeRefCSAccess().getOwnedPathNameLibPathNameCSParserRuleCall_0());
@@ -65577,23 +65577,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__IsStaticAssignment_0"
-    // InternalOCLstdlib.g:22626:1: rule__LibOperationCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
+    // InternalOCLstdlib.g:22630:1: rule__LibOperationCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
     public final void rule__LibOperationCS__IsStaticAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22630:1: ( ( ( 'static' ) ) )
-            // InternalOCLstdlib.g:22631:1: ( ( 'static' ) )
+            // InternalOCLstdlib.g:22634:1: ( ( ( 'static' ) ) )
+            // InternalOCLstdlib.g:22635:1: ( ( 'static' ) )
             {
-            // InternalOCLstdlib.g:22631:1: ( ( 'static' ) )
-            // InternalOCLstdlib.g:22632:1: ( 'static' )
+            // InternalOCLstdlib.g:22635:1: ( ( 'static' ) )
+            // InternalOCLstdlib.g:22636:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsStaticStaticKeyword_0_0());
             }
-            // InternalOCLstdlib.g:22633:1: ( 'static' )
-            // InternalOCLstdlib.g:22634:1: 'static'
+            // InternalOCLstdlib.g:22637:1: ( 'static' )
+            // InternalOCLstdlib.g:22638:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsStaticStaticKeyword_0_0());
@@ -65630,17 +65630,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__NameAssignment_2"
-    // InternalOCLstdlib.g:22649:1: rule__LibOperationCS__NameAssignment_2 : ( ruleName ) ;
+    // InternalOCLstdlib.g:22653:1: rule__LibOperationCS__NameAssignment_2 : ( ruleName ) ;
     public final void rule__LibOperationCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22653:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:22654:1: ( ruleName )
+            // InternalOCLstdlib.g:22657:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22658:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:22654:1: ( ruleName )
-            // InternalOCLstdlib.g:22655:1: ruleName
+            // InternalOCLstdlib.g:22658:1: ( ruleName )
+            // InternalOCLstdlib.g:22659:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getNameNameParserRuleCall_2_0());
@@ -65675,17 +65675,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedSignatureAssignment_3"
-    // InternalOCLstdlib.g:22664:1: rule__LibOperationCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
+    // InternalOCLstdlib.g:22668:1: rule__LibOperationCS__OwnedSignatureAssignment_3 : ( ruleTemplateSignatureCS ) ;
     public final void rule__LibOperationCS__OwnedSignatureAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22668:1: ( ( ruleTemplateSignatureCS ) )
-            // InternalOCLstdlib.g:22669:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:22672:1: ( ( ruleTemplateSignatureCS ) )
+            // InternalOCLstdlib.g:22673:1: ( ruleTemplateSignatureCS )
             {
-            // InternalOCLstdlib.g:22669:1: ( ruleTemplateSignatureCS )
-            // InternalOCLstdlib.g:22670:1: ruleTemplateSignatureCS
+            // InternalOCLstdlib.g:22673:1: ( ruleTemplateSignatureCS )
+            // InternalOCLstdlib.g:22674:1: ruleTemplateSignatureCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());
@@ -65720,17 +65720,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedParametersAssignment_5_0"
-    // InternalOCLstdlib.g:22679:1: rule__LibOperationCS__OwnedParametersAssignment_5_0 : ( ruleParameterCS ) ;
+    // InternalOCLstdlib.g:22683:1: rule__LibOperationCS__OwnedParametersAssignment_5_0 : ( ruleParameterCS ) ;
     public final void rule__LibOperationCS__OwnedParametersAssignment_5_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22683:1: ( ( ruleParameterCS ) )
-            // InternalOCLstdlib.g:22684:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22687:1: ( ( ruleParameterCS ) )
+            // InternalOCLstdlib.g:22688:1: ( ruleParameterCS )
             {
-            // InternalOCLstdlib.g:22684:1: ( ruleParameterCS )
-            // InternalOCLstdlib.g:22685:1: ruleParameterCS
+            // InternalOCLstdlib.g:22688:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22689:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());
@@ -65765,17 +65765,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedParametersAssignment_5_1_1"
-    // InternalOCLstdlib.g:22694:1: rule__LibOperationCS__OwnedParametersAssignment_5_1_1 : ( ruleParameterCS ) ;
+    // InternalOCLstdlib.g:22698:1: rule__LibOperationCS__OwnedParametersAssignment_5_1_1 : ( ruleParameterCS ) ;
     public final void rule__LibOperationCS__OwnedParametersAssignment_5_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22698:1: ( ( ruleParameterCS ) )
-            // InternalOCLstdlib.g:22699:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22702:1: ( ( ruleParameterCS ) )
+            // InternalOCLstdlib.g:22703:1: ( ruleParameterCS )
             {
-            // InternalOCLstdlib.g:22699:1: ( ruleParameterCS )
-            // InternalOCLstdlib.g:22700:1: ruleParameterCS
+            // InternalOCLstdlib.g:22703:1: ( ruleParameterCS )
+            // InternalOCLstdlib.g:22704:1: ruleParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());
@@ -65810,17 +65810,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedTypeAssignment_8"
-    // InternalOCLstdlib.g:22709:1: rule__LibOperationCS__OwnedTypeAssignment_8 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22713:1: rule__LibOperationCS__OwnedTypeAssignment_8 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LibOperationCS__OwnedTypeAssignment_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22713:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22714:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22717:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22718:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22714:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22715:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22718:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22719:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_8_0());
@@ -65855,23 +65855,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__IsValidatingAssignment_9"
-    // InternalOCLstdlib.g:22724:1: rule__LibOperationCS__IsValidatingAssignment_9 : ( ( 'validating' ) ) ;
+    // InternalOCLstdlib.g:22728:1: rule__LibOperationCS__IsValidatingAssignment_9 : ( ( 'validating' ) ) ;
     public final void rule__LibOperationCS__IsValidatingAssignment_9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22728:1: ( ( ( 'validating' ) ) )
-            // InternalOCLstdlib.g:22729:1: ( ( 'validating' ) )
+            // InternalOCLstdlib.g:22732:1: ( ( ( 'validating' ) ) )
+            // InternalOCLstdlib.g:22733:1: ( ( 'validating' ) )
             {
-            // InternalOCLstdlib.g:22729:1: ( ( 'validating' ) )
-            // InternalOCLstdlib.g:22730:1: ( 'validating' )
+            // InternalOCLstdlib.g:22733:1: ( ( 'validating' ) )
+            // InternalOCLstdlib.g:22734:1: ( 'validating' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsValidatingValidatingKeyword_9_0());
             }
-            // InternalOCLstdlib.g:22731:1: ( 'validating' )
-            // InternalOCLstdlib.g:22732:1: 'validating'
+            // InternalOCLstdlib.g:22735:1: ( 'validating' )
+            // InternalOCLstdlib.g:22736:1: 'validating'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsValidatingValidatingKeyword_9_0());
@@ -65908,23 +65908,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__IsInvalidatingAssignment_10"
-    // InternalOCLstdlib.g:22747:1: rule__LibOperationCS__IsInvalidatingAssignment_10 : ( ( 'invalidating' ) ) ;
+    // InternalOCLstdlib.g:22751:1: rule__LibOperationCS__IsInvalidatingAssignment_10 : ( ( 'invalidating' ) ) ;
     public final void rule__LibOperationCS__IsInvalidatingAssignment_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22751:1: ( ( ( 'invalidating' ) ) )
-            // InternalOCLstdlib.g:22752:1: ( ( 'invalidating' ) )
+            // InternalOCLstdlib.g:22755:1: ( ( ( 'invalidating' ) ) )
+            // InternalOCLstdlib.g:22756:1: ( ( 'invalidating' ) )
             {
-            // InternalOCLstdlib.g:22752:1: ( ( 'invalidating' ) )
-            // InternalOCLstdlib.g:22753:1: ( 'invalidating' )
+            // InternalOCLstdlib.g:22756:1: ( ( 'invalidating' ) )
+            // InternalOCLstdlib.g:22757:1: ( 'invalidating' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsInvalidatingInvalidatingKeyword_10_0());
             }
-            // InternalOCLstdlib.g:22754:1: ( 'invalidating' )
-            // InternalOCLstdlib.g:22755:1: 'invalidating'
+            // InternalOCLstdlib.g:22758:1: ( 'invalidating' )
+            // InternalOCLstdlib.g:22759:1: 'invalidating'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getIsInvalidatingInvalidatingKeyword_10_0());
@@ -65961,23 +65961,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__PrecedenceAssignment_11_2"
-    // InternalOCLstdlib.g:22770:1: rule__LibOperationCS__PrecedenceAssignment_11_2 : ( ( ruleName ) ) ;
+    // InternalOCLstdlib.g:22774:1: rule__LibOperationCS__PrecedenceAssignment_11_2 : ( ( ruleName ) ) ;
     public final void rule__LibOperationCS__PrecedenceAssignment_11_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22774:1: ( ( ( ruleName ) ) )
-            // InternalOCLstdlib.g:22775:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22778:1: ( ( ( ruleName ) ) )
+            // InternalOCLstdlib.g:22779:1: ( ( ruleName ) )
             {
-            // InternalOCLstdlib.g:22775:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:22776:1: ( ruleName )
+            // InternalOCLstdlib.g:22779:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22780:1: ( ruleName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getPrecedencePrecedenceCrossReference_11_2_0());
             }
-            // InternalOCLstdlib.g:22777:1: ( ruleName )
-            // InternalOCLstdlib.g:22778:1: ruleName
+            // InternalOCLstdlib.g:22781:1: ( ruleName )
+            // InternalOCLstdlib.g:22782:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getPrecedencePrecedenceNameParserRuleCall_11_2_0_1());
@@ -66018,23 +66018,23 @@
 
 
     // $ANTLR start "rule__LibOperationCS__ImplementationAssignment_12_1"
-    // InternalOCLstdlib.g:22789:1: rule__LibOperationCS__ImplementationAssignment_12_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
+    // InternalOCLstdlib.g:22793:1: rule__LibOperationCS__ImplementationAssignment_12_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
     public final void rule__LibOperationCS__ImplementationAssignment_12_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22793:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
-            // InternalOCLstdlib.g:22794:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:22797:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
+            // InternalOCLstdlib.g:22798:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
             {
-            // InternalOCLstdlib.g:22794:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:22795:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:22798:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:22799:1: ( RULE_SINGLE_QUOTED_STRING )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getImplementationJavaClassCSCrossReference_12_1_0());
             }
-            // InternalOCLstdlib.g:22796:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:22797:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:22800:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:22801:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getImplementationJavaClassCSSINGLE_QUOTED_STRINGTerminalRuleCall_12_1_0_1());
@@ -66071,17 +66071,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0"
-    // InternalOCLstdlib.g:22808:1: rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:22812:1: rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0 : ( ruleAnnotationElementCS ) ;
     public final void rule__LibOperationCS__OwnedAnnotationsAssignment_13_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22812:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:22813:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22816:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:22817:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:22813:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:22814:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:22817:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22818:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_13_0_1_0_0());
@@ -66116,17 +66116,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3"
-    // InternalOCLstdlib.g:22823:1: rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:22827:1: rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3 : ( ruleSpecificationCS ) ;
     public final void rule__LibOperationCS__OwnedBodyExpressionsAssignment_13_0_1_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22827:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:22828:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:22831:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:22832:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:22828:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:22829:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:22832:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:22833:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_13_0_1_1_3_0());
@@ -66161,17 +66161,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2"
-    // InternalOCLstdlib.g:22838:1: rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 : ( rulePostCS ) ;
+    // InternalOCLstdlib.g:22842:1: rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2 : ( rulePostCS ) ;
     public final void rule__LibOperationCS__OwnedPostconditionsAssignment_13_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22842:1: ( ( rulePostCS ) )
-            // InternalOCLstdlib.g:22843:1: ( rulePostCS )
+            // InternalOCLstdlib.g:22846:1: ( ( rulePostCS ) )
+            // InternalOCLstdlib.g:22847:1: ( rulePostCS )
             {
-            // InternalOCLstdlib.g:22843:1: ( rulePostCS )
-            // InternalOCLstdlib.g:22844:1: rulePostCS
+            // InternalOCLstdlib.g:22847:1: ( rulePostCS )
+            // InternalOCLstdlib.g:22848:1: rulePostCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedPostconditionsPostCSParserRuleCall_13_0_1_2_0());
@@ -66206,17 +66206,17 @@
 
 
     // $ANTLR start "rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3"
-    // InternalOCLstdlib.g:22853:1: rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 : ( rulePreCS ) ;
+    // InternalOCLstdlib.g:22857:1: rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3 : ( rulePreCS ) ;
     public final void rule__LibOperationCS__OwnedPreconditionsAssignment_13_0_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22857:1: ( ( rulePreCS ) )
-            // InternalOCLstdlib.g:22858:1: ( rulePreCS )
+            // InternalOCLstdlib.g:22861:1: ( ( rulePreCS ) )
+            // InternalOCLstdlib.g:22862:1: ( rulePreCS )
             {
-            // InternalOCLstdlib.g:22858:1: ( rulePreCS )
-            // InternalOCLstdlib.g:22859:1: rulePreCS
+            // InternalOCLstdlib.g:22862:1: ( rulePreCS )
+            // InternalOCLstdlib.g:22863:1: rulePreCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOperationCSAccess().getOwnedPreconditionsPreCSParserRuleCall_13_0_1_3_0());
@@ -66251,17 +66251,17 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__NameAssignment_1"
-    // InternalOCLstdlib.g:22868:1: rule__LibOppositeCS__NameAssignment_1 : ( ruleName ) ;
+    // InternalOCLstdlib.g:22872:1: rule__LibOppositeCS__NameAssignment_1 : ( ruleName ) ;
     public final void rule__LibOppositeCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22872:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:22873:1: ( ruleName )
+            // InternalOCLstdlib.g:22876:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22877:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:22873:1: ( ruleName )
-            // InternalOCLstdlib.g:22874:1: ruleName
+            // InternalOCLstdlib.g:22877:1: ( ruleName )
+            // InternalOCLstdlib.g:22878:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOppositeCSAccess().getNameNameParserRuleCall_1_0());
@@ -66296,17 +66296,17 @@
 
 
     // $ANTLR start "rule__LibOppositeCS__OwnedTypeAssignment_3"
-    // InternalOCLstdlib.g:22883:1: rule__LibOppositeCS__OwnedTypeAssignment_3 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:22887:1: rule__LibOppositeCS__OwnedTypeAssignment_3 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LibOppositeCS__OwnedTypeAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22887:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:22888:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22891:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:22892:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:22888:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:22889:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:22892:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:22893:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibOppositeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_0());
@@ -66341,17 +66341,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__NameAssignment_1"
-    // InternalOCLstdlib.g:22898:1: rule__LibPackageCS__NameAssignment_1 : ( ruleName ) ;
+    // InternalOCLstdlib.g:22902:1: rule__LibPackageCS__NameAssignment_1 : ( ruleName ) ;
     public final void rule__LibPackageCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22902:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:22903:1: ( ruleName )
+            // InternalOCLstdlib.g:22906:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:22907:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:22903:1: ( ruleName )
-            // InternalOCLstdlib.g:22904:1: ruleName
+            // InternalOCLstdlib.g:22907:1: ( ruleName )
+            // InternalOCLstdlib.g:22908:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getNameNameParserRuleCall_1_0());
@@ -66386,17 +66386,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__NsPrefixAssignment_2_1"
-    // InternalOCLstdlib.g:22913:1: rule__LibPackageCS__NsPrefixAssignment_2_1 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:22917:1: rule__LibPackageCS__NsPrefixAssignment_2_1 : ( ruleIdentifier ) ;
     public final void rule__LibPackageCS__NsPrefixAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22917:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:22918:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:22921:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:22922:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:22918:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:22919:1: ruleIdentifier
+            // InternalOCLstdlib.g:22922:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:22923:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getNsPrefixIdentifierParserRuleCall_2_1_0());
@@ -66431,17 +66431,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__NsURIAssignment_2_3"
-    // InternalOCLstdlib.g:22928:1: rule__LibPackageCS__NsURIAssignment_2_3 : ( ruleURI ) ;
+    // InternalOCLstdlib.g:22932:1: rule__LibPackageCS__NsURIAssignment_2_3 : ( ruleURI ) ;
     public final void rule__LibPackageCS__NsURIAssignment_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22932:1: ( ( ruleURI ) )
-            // InternalOCLstdlib.g:22933:1: ( ruleURI )
+            // InternalOCLstdlib.g:22936:1: ( ( ruleURI ) )
+            // InternalOCLstdlib.g:22937:1: ( ruleURI )
             {
-            // InternalOCLstdlib.g:22933:1: ( ruleURI )
-            // InternalOCLstdlib.g:22934:1: ruleURI
+            // InternalOCLstdlib.g:22937:1: ( ruleURI )
+            // InternalOCLstdlib.g:22938:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getNsURIURIParserRuleCall_2_3_0());
@@ -66476,17 +66476,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__OwnedPackagesAssignment_4_0"
-    // InternalOCLstdlib.g:22943:1: rule__LibPackageCS__OwnedPackagesAssignment_4_0 : ( rulePackageCS ) ;
+    // InternalOCLstdlib.g:22947:1: rule__LibPackageCS__OwnedPackagesAssignment_4_0 : ( rulePackageCS ) ;
     public final void rule__LibPackageCS__OwnedPackagesAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22947:1: ( ( rulePackageCS ) )
-            // InternalOCLstdlib.g:22948:1: ( rulePackageCS )
+            // InternalOCLstdlib.g:22951:1: ( ( rulePackageCS ) )
+            // InternalOCLstdlib.g:22952:1: ( rulePackageCS )
             {
-            // InternalOCLstdlib.g:22948:1: ( rulePackageCS )
-            // InternalOCLstdlib.g:22949:1: rulePackageCS
+            // InternalOCLstdlib.g:22952:1: ( rulePackageCS )
+            // InternalOCLstdlib.g:22953:1: rulePackageCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getOwnedPackagesPackageCSParserRuleCall_4_0_0());
@@ -66521,17 +66521,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1"
-    // InternalOCLstdlib.g:22958:1: rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 : ( rulePrecedenceCS ) ;
+    // InternalOCLstdlib.g:22962:1: rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1 : ( rulePrecedenceCS ) ;
     public final void rule__LibPackageCS__OwnedPrecedencesAssignment_4_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22962:1: ( ( rulePrecedenceCS ) )
-            // InternalOCLstdlib.g:22963:1: ( rulePrecedenceCS )
+            // InternalOCLstdlib.g:22966:1: ( ( rulePrecedenceCS ) )
+            // InternalOCLstdlib.g:22967:1: ( rulePrecedenceCS )
             {
-            // InternalOCLstdlib.g:22963:1: ( rulePrecedenceCS )
-            // InternalOCLstdlib.g:22964:1: rulePrecedenceCS
+            // InternalOCLstdlib.g:22967:1: ( rulePrecedenceCS )
+            // InternalOCLstdlib.g:22968:1: rulePrecedenceCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getOwnedPrecedencesPrecedenceCSParserRuleCall_4_1_1_0());
@@ -66566,17 +66566,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__OwnedClassesAssignment_4_2"
-    // InternalOCLstdlib.g:22973:1: rule__LibPackageCS__OwnedClassesAssignment_4_2 : ( ruleClassCS ) ;
+    // InternalOCLstdlib.g:22977:1: rule__LibPackageCS__OwnedClassesAssignment_4_2 : ( ruleClassCS ) ;
     public final void rule__LibPackageCS__OwnedClassesAssignment_4_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22977:1: ( ( ruleClassCS ) )
-            // InternalOCLstdlib.g:22978:1: ( ruleClassCS )
+            // InternalOCLstdlib.g:22981:1: ( ( ruleClassCS ) )
+            // InternalOCLstdlib.g:22982:1: ( ruleClassCS )
             {
-            // InternalOCLstdlib.g:22978:1: ( ruleClassCS )
-            // InternalOCLstdlib.g:22979:1: ruleClassCS
+            // InternalOCLstdlib.g:22982:1: ( ruleClassCS )
+            // InternalOCLstdlib.g:22983:1: ruleClassCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getOwnedClassesClassCSParserRuleCall_4_2_0());
@@ -66611,17 +66611,17 @@
 
 
     // $ANTLR start "rule__LibPackageCS__OwnedAnnotationsAssignment_4_3"
-    // InternalOCLstdlib.g:22988:1: rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:22992:1: rule__LibPackageCS__OwnedAnnotationsAssignment_4_3 : ( ruleAnnotationElementCS ) ;
     public final void rule__LibPackageCS__OwnedAnnotationsAssignment_4_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:22992:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:22993:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22996:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:22997:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:22993:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:22994:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:22997:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:22998:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPackageCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_3_0());
@@ -66656,17 +66656,17 @@
 
 
     // $ANTLR start "rule__PackageCS__NameAssignment_1"
-    // InternalOCLstdlib.g:23003:1: rule__PackageCS__NameAssignment_1 : ( ruleName ) ;
+    // InternalOCLstdlib.g:23007:1: rule__PackageCS__NameAssignment_1 : ( ruleName ) ;
     public final void rule__PackageCS__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23007:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:23008:1: ( ruleName )
+            // InternalOCLstdlib.g:23011:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:23012:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:23008:1: ( ruleName )
-            // InternalOCLstdlib.g:23009:1: ruleName
+            // InternalOCLstdlib.g:23012:1: ( ruleName )
+            // InternalOCLstdlib.g:23013:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNameNameParserRuleCall_1_0());
@@ -66701,17 +66701,17 @@
 
 
     // $ANTLR start "rule__PackageCS__NsPrefixAssignment_2_1"
-    // InternalOCLstdlib.g:23018:1: rule__PackageCS__NsPrefixAssignment_2_1 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:23022:1: rule__PackageCS__NsPrefixAssignment_2_1 : ( ruleIdentifier ) ;
     public final void rule__PackageCS__NsPrefixAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23022:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:23023:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23026:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:23027:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:23023:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:23024:1: ruleIdentifier
+            // InternalOCLstdlib.g:23027:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23028:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsPrefixIdentifierParserRuleCall_2_1_0());
@@ -66746,17 +66746,17 @@
 
 
     // $ANTLR start "rule__PackageCS__NsURIAssignment_2_3"
-    // InternalOCLstdlib.g:23033:1: rule__PackageCS__NsURIAssignment_2_3 : ( ruleURI ) ;
+    // InternalOCLstdlib.g:23037:1: rule__PackageCS__NsURIAssignment_2_3 : ( ruleURI ) ;
     public final void rule__PackageCS__NsURIAssignment_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23037:1: ( ( ruleURI ) )
-            // InternalOCLstdlib.g:23038:1: ( ruleURI )
+            // InternalOCLstdlib.g:23041:1: ( ( ruleURI ) )
+            // InternalOCLstdlib.g:23042:1: ( ruleURI )
             {
-            // InternalOCLstdlib.g:23038:1: ( ruleURI )
-            // InternalOCLstdlib.g:23039:1: ruleURI
+            // InternalOCLstdlib.g:23042:1: ( ruleURI )
+            // InternalOCLstdlib.g:23043:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getNsURIURIParserRuleCall_2_3_0());
@@ -66791,17 +66791,17 @@
 
 
     // $ANTLR start "rule__PackageCS__OwnedPackagesAssignment_4_0"
-    // InternalOCLstdlib.g:23048:1: rule__PackageCS__OwnedPackagesAssignment_4_0 : ( rulePackageCS ) ;
+    // InternalOCLstdlib.g:23052:1: rule__PackageCS__OwnedPackagesAssignment_4_0 : ( rulePackageCS ) ;
     public final void rule__PackageCS__OwnedPackagesAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23052:1: ( ( rulePackageCS ) )
-            // InternalOCLstdlib.g:23053:1: ( rulePackageCS )
+            // InternalOCLstdlib.g:23056:1: ( ( rulePackageCS ) )
+            // InternalOCLstdlib.g:23057:1: ( rulePackageCS )
             {
-            // InternalOCLstdlib.g:23053:1: ( rulePackageCS )
-            // InternalOCLstdlib.g:23054:1: rulePackageCS
+            // InternalOCLstdlib.g:23057:1: ( rulePackageCS )
+            // InternalOCLstdlib.g:23058:1: rulePackageCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getOwnedPackagesPackageCSParserRuleCall_4_0_0());
@@ -66836,17 +66836,17 @@
 
 
     // $ANTLR start "rule__PackageCS__OwnedClassesAssignment_4_1"
-    // InternalOCLstdlib.g:23063:1: rule__PackageCS__OwnedClassesAssignment_4_1 : ( ruleClassCS ) ;
+    // InternalOCLstdlib.g:23067:1: rule__PackageCS__OwnedClassesAssignment_4_1 : ( ruleClassCS ) ;
     public final void rule__PackageCS__OwnedClassesAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23067:1: ( ( ruleClassCS ) )
-            // InternalOCLstdlib.g:23068:1: ( ruleClassCS )
+            // InternalOCLstdlib.g:23071:1: ( ( ruleClassCS ) )
+            // InternalOCLstdlib.g:23072:1: ( ruleClassCS )
             {
-            // InternalOCLstdlib.g:23068:1: ( ruleClassCS )
-            // InternalOCLstdlib.g:23069:1: ruleClassCS
+            // InternalOCLstdlib.g:23072:1: ( ruleClassCS )
+            // InternalOCLstdlib.g:23073:1: ruleClassCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getOwnedClassesClassCSParserRuleCall_4_1_0());
@@ -66881,17 +66881,17 @@
 
 
     // $ANTLR start "rule__PackageCS__OwnedAnnotationsAssignment_4_2"
-    // InternalOCLstdlib.g:23078:1: rule__PackageCS__OwnedAnnotationsAssignment_4_2 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:23082:1: rule__PackageCS__OwnedAnnotationsAssignment_4_2 : ( ruleAnnotationElementCS ) ;
     public final void rule__PackageCS__OwnedAnnotationsAssignment_4_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23082:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:23083:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:23086:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:23087:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:23083:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:23084:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:23087:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:23088:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPackageCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_4_2_0());
@@ -66926,17 +66926,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__NameAssignment_0"
-    // InternalOCLstdlib.g:23093:1: rule__ParameterCS__NameAssignment_0 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:23097:1: rule__ParameterCS__NameAssignment_0 : ( ruleIdentifier ) ;
     public final void rule__ParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23097:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:23098:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23101:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:23102:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:23098:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:23099:1: ruleIdentifier
+            // InternalOCLstdlib.g:23102:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23103:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getNameIdentifierParserRuleCall_0_0());
@@ -66971,17 +66971,17 @@
 
 
     // $ANTLR start "rule__ParameterCS__OwnedTypeAssignment_2"
-    // InternalOCLstdlib.g:23108:1: rule__ParameterCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:23112:1: rule__ParameterCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__ParameterCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23112:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:23113:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:23116:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:23117:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:23113:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:23114:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:23117:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:23118:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_2_0());
@@ -67016,23 +67016,23 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__IsStaticAssignment_0"
-    // InternalOCLstdlib.g:23123:1: rule__LibPropertyCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
+    // InternalOCLstdlib.g:23127:1: rule__LibPropertyCS__IsStaticAssignment_0 : ( ( 'static' ) ) ;
     public final void rule__LibPropertyCS__IsStaticAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23127:1: ( ( ( 'static' ) ) )
-            // InternalOCLstdlib.g:23128:1: ( ( 'static' ) )
+            // InternalOCLstdlib.g:23131:1: ( ( ( 'static' ) ) )
+            // InternalOCLstdlib.g:23132:1: ( ( 'static' ) )
             {
-            // InternalOCLstdlib.g:23128:1: ( ( 'static' ) )
-            // InternalOCLstdlib.g:23129:1: ( 'static' )
+            // InternalOCLstdlib.g:23132:1: ( ( 'static' ) )
+            // InternalOCLstdlib.g:23133:1: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getIsStaticStaticKeyword_0_0());
             }
-            // InternalOCLstdlib.g:23130:1: ( 'static' )
-            // InternalOCLstdlib.g:23131:1: 'static'
+            // InternalOCLstdlib.g:23134:1: ( 'static' )
+            // InternalOCLstdlib.g:23135:1: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getIsStaticStaticKeyword_0_0());
@@ -67069,17 +67069,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__NameAssignment_2"
-    // InternalOCLstdlib.g:23146:1: rule__LibPropertyCS__NameAssignment_2 : ( ruleName ) ;
+    // InternalOCLstdlib.g:23150:1: rule__LibPropertyCS__NameAssignment_2 : ( ruleName ) ;
     public final void rule__LibPropertyCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23150:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:23151:1: ( ruleName )
+            // InternalOCLstdlib.g:23154:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:23155:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:23151:1: ( ruleName )
-            // InternalOCLstdlib.g:23152:1: ruleName
+            // InternalOCLstdlib.g:23155:1: ( ruleName )
+            // InternalOCLstdlib.g:23156:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getNameNameParserRuleCall_2_0());
@@ -67114,17 +67114,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__OwnedTypeAssignment_4"
-    // InternalOCLstdlib.g:23161:1: rule__LibPropertyCS__OwnedTypeAssignment_4 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:23165:1: rule__LibPropertyCS__OwnedTypeAssignment_4 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__LibPropertyCS__OwnedTypeAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23165:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:23166:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:23169:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:23170:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:23166:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:23167:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:23170:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:23171:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_0());
@@ -67159,17 +67159,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__OwnedOppositeAssignment_5"
-    // InternalOCLstdlib.g:23176:1: rule__LibPropertyCS__OwnedOppositeAssignment_5 : ( ruleLibOppositeCS ) ;
+    // InternalOCLstdlib.g:23180:1: rule__LibPropertyCS__OwnedOppositeAssignment_5 : ( ruleLibOppositeCS ) ;
     public final void rule__LibPropertyCS__OwnedOppositeAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23180:1: ( ( ruleLibOppositeCS ) )
-            // InternalOCLstdlib.g:23181:1: ( ruleLibOppositeCS )
+            // InternalOCLstdlib.g:23184:1: ( ( ruleLibOppositeCS ) )
+            // InternalOCLstdlib.g:23185:1: ( ruleLibOppositeCS )
             {
-            // InternalOCLstdlib.g:23181:1: ( ruleLibOppositeCS )
-            // InternalOCLstdlib.g:23182:1: ruleLibOppositeCS
+            // InternalOCLstdlib.g:23185:1: ( ruleLibOppositeCS )
+            // InternalOCLstdlib.g:23186:1: ruleLibOppositeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getOwnedOppositeLibOppositeCSParserRuleCall_5_0());
@@ -67204,23 +67204,23 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__ImplementationAssignment_6_1"
-    // InternalOCLstdlib.g:23191:1: rule__LibPropertyCS__ImplementationAssignment_6_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
+    // InternalOCLstdlib.g:23195:1: rule__LibPropertyCS__ImplementationAssignment_6_1 : ( ( RULE_SINGLE_QUOTED_STRING ) ) ;
     public final void rule__LibPropertyCS__ImplementationAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23195:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
-            // InternalOCLstdlib.g:23196:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:23199:1: ( ( ( RULE_SINGLE_QUOTED_STRING ) ) )
+            // InternalOCLstdlib.g:23200:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
             {
-            // InternalOCLstdlib.g:23196:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
-            // InternalOCLstdlib.g:23197:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:23200:1: ( ( RULE_SINGLE_QUOTED_STRING ) )
+            // InternalOCLstdlib.g:23201:1: ( RULE_SINGLE_QUOTED_STRING )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getImplementationJavaClassCSCrossReference_6_1_0());
             }
-            // InternalOCLstdlib.g:23198:1: ( RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:23199:1: RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:23202:1: ( RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:23203:1: RULE_SINGLE_QUOTED_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getImplementationJavaClassCSSINGLE_QUOTED_STRINGTerminalRuleCall_6_1_0_1());
@@ -67257,17 +67257,17 @@
 
 
     // $ANTLR start "rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1"
-    // InternalOCLstdlib.g:23210:1: rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 : ( ruleAnnotationElementCS ) ;
+    // InternalOCLstdlib.g:23214:1: rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1 : ( ruleAnnotationElementCS ) ;
     public final void rule__LibPropertyCS__OwnedAnnotationsAssignment_7_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23214:1: ( ( ruleAnnotationElementCS ) )
-            // InternalOCLstdlib.g:23215:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:23218:1: ( ( ruleAnnotationElementCS ) )
+            // InternalOCLstdlib.g:23219:1: ( ruleAnnotationElementCS )
             {
-            // InternalOCLstdlib.g:23215:1: ( ruleAnnotationElementCS )
-            // InternalOCLstdlib.g:23216:1: ruleAnnotationElementCS
+            // InternalOCLstdlib.g:23219:1: ( ruleAnnotationElementCS )
+            // InternalOCLstdlib.g:23220:1: ruleAnnotationElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLibPropertyCSAccess().getOwnedAnnotationsAnnotationElementCSParserRuleCall_7_0_1_0());
@@ -67302,23 +67302,23 @@
 
 
     // $ANTLR start "rule__PostCS__StereotypeAssignment_0"
-    // InternalOCLstdlib.g:23225:1: rule__PostCS__StereotypeAssignment_0 : ( ( 'post' ) ) ;
+    // InternalOCLstdlib.g:23229:1: rule__PostCS__StereotypeAssignment_0 : ( ( 'post' ) ) ;
     public final void rule__PostCS__StereotypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23229:1: ( ( ( 'post' ) ) )
-            // InternalOCLstdlib.g:23230:1: ( ( 'post' ) )
+            // InternalOCLstdlib.g:23233:1: ( ( ( 'post' ) ) )
+            // InternalOCLstdlib.g:23234:1: ( ( 'post' ) )
             {
-            // InternalOCLstdlib.g:23230:1: ( ( 'post' ) )
-            // InternalOCLstdlib.g:23231:1: ( 'post' )
+            // InternalOCLstdlib.g:23234:1: ( ( 'post' ) )
+            // InternalOCLstdlib.g:23235:1: ( 'post' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getStereotypePostKeyword_0_0());
             }
-            // InternalOCLstdlib.g:23232:1: ( 'post' )
-            // InternalOCLstdlib.g:23233:1: 'post'
+            // InternalOCLstdlib.g:23236:1: ( 'post' )
+            // InternalOCLstdlib.g:23237:1: 'post'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getStereotypePostKeyword_0_0());
@@ -67355,17 +67355,17 @@
 
 
     // $ANTLR start "rule__PostCS__NameAssignment_1_0"
-    // InternalOCLstdlib.g:23248:1: rule__PostCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:23252:1: rule__PostCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PostCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23252:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:23253:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23256:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23257:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:23253:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:23254:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:23257:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23258:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
@@ -67400,17 +67400,17 @@
 
 
     // $ANTLR start "rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1"
-    // InternalOCLstdlib.g:23263:1: rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:23267:1: rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__PostCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23267:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:23268:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23271:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:23272:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:23268:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:23269:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:23272:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23273:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
@@ -67445,17 +67445,17 @@
 
 
     // $ANTLR start "rule__PostCS__OwnedSpecificationAssignment_3"
-    // InternalOCLstdlib.g:23278:1: rule__PostCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:23282:1: rule__PostCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
     public final void rule__PostCS__OwnedSpecificationAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23282:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:23283:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23286:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:23287:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:23283:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:23284:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:23287:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23288:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPostCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
@@ -67490,23 +67490,23 @@
 
 
     // $ANTLR start "rule__PreCS__StereotypeAssignment_0"
-    // InternalOCLstdlib.g:23293:1: rule__PreCS__StereotypeAssignment_0 : ( ( 'pre' ) ) ;
+    // InternalOCLstdlib.g:23297:1: rule__PreCS__StereotypeAssignment_0 : ( ( 'pre' ) ) ;
     public final void rule__PreCS__StereotypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23297:1: ( ( ( 'pre' ) ) )
-            // InternalOCLstdlib.g:23298:1: ( ( 'pre' ) )
+            // InternalOCLstdlib.g:23301:1: ( ( ( 'pre' ) ) )
+            // InternalOCLstdlib.g:23302:1: ( ( 'pre' ) )
             {
-            // InternalOCLstdlib.g:23298:1: ( ( 'pre' ) )
-            // InternalOCLstdlib.g:23299:1: ( 'pre' )
+            // InternalOCLstdlib.g:23302:1: ( ( 'pre' ) )
+            // InternalOCLstdlib.g:23303:1: ( 'pre' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getStereotypePreKeyword_0_0());
             }
-            // InternalOCLstdlib.g:23300:1: ( 'pre' )
-            // InternalOCLstdlib.g:23301:1: 'pre'
+            // InternalOCLstdlib.g:23304:1: ( 'pre' )
+            // InternalOCLstdlib.g:23305:1: 'pre'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getStereotypePreKeyword_0_0());
@@ -67543,17 +67543,17 @@
 
 
     // $ANTLR start "rule__PreCS__NameAssignment_1_0"
-    // InternalOCLstdlib.g:23316:1: rule__PreCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:23320:1: rule__PreCS__NameAssignment_1_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PreCS__NameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23320:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:23321:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23324:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23325:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:23321:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:23322:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:23325:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23326:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());
@@ -67588,17 +67588,17 @@
 
 
     // $ANTLR start "rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1"
-    // InternalOCLstdlib.g:23331:1: rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:23335:1: rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1 : ( ruleSpecificationCS ) ;
     public final void rule__PreCS__OwnedMessageSpecificationAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23335:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:23336:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23339:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:23340:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:23336:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:23337:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:23340:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23341:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getOwnedMessageSpecificationSpecificationCSParserRuleCall_1_1_1_0());
@@ -67633,17 +67633,17 @@
 
 
     // $ANTLR start "rule__PreCS__OwnedSpecificationAssignment_3"
-    // InternalOCLstdlib.g:23346:1: rule__PreCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
+    // InternalOCLstdlib.g:23350:1: rule__PreCS__OwnedSpecificationAssignment_3 : ( ruleSpecificationCS ) ;
     public final void rule__PreCS__OwnedSpecificationAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23350:1: ( ( ruleSpecificationCS ) )
-            // InternalOCLstdlib.g:23351:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23354:1: ( ( ruleSpecificationCS ) )
+            // InternalOCLstdlib.g:23355:1: ( ruleSpecificationCS )
             {
-            // InternalOCLstdlib.g:23351:1: ( ruleSpecificationCS )
-            // InternalOCLstdlib.g:23352:1: ruleSpecificationCS
+            // InternalOCLstdlib.g:23355:1: ( ruleSpecificationCS )
+            // InternalOCLstdlib.g:23356:1: ruleSpecificationCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPreCSAccess().getOwnedSpecificationSpecificationCSParserRuleCall_3_0());
@@ -67678,23 +67678,23 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__IsRightAssociativeAssignment_0_1"
-    // InternalOCLstdlib.g:23361:1: rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 : ( ( 'right' ) ) ;
+    // InternalOCLstdlib.g:23365:1: rule__PrecedenceCS__IsRightAssociativeAssignment_0_1 : ( ( 'right' ) ) ;
     public final void rule__PrecedenceCS__IsRightAssociativeAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23365:1: ( ( ( 'right' ) ) )
-            // InternalOCLstdlib.g:23366:1: ( ( 'right' ) )
+            // InternalOCLstdlib.g:23369:1: ( ( ( 'right' ) ) )
+            // InternalOCLstdlib.g:23370:1: ( ( 'right' ) )
             {
-            // InternalOCLstdlib.g:23366:1: ( ( 'right' ) )
-            // InternalOCLstdlib.g:23367:1: ( 'right' )
+            // InternalOCLstdlib.g:23370:1: ( ( 'right' ) )
+            // InternalOCLstdlib.g:23371:1: ( 'right' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrecedenceCSAccess().getIsRightAssociativeRightKeyword_0_1_0());
             }
-            // InternalOCLstdlib.g:23368:1: ( 'right' )
-            // InternalOCLstdlib.g:23369:1: 'right'
+            // InternalOCLstdlib.g:23372:1: ( 'right' )
+            // InternalOCLstdlib.g:23373:1: 'right'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrecedenceCSAccess().getIsRightAssociativeRightKeyword_0_1_0());
@@ -67731,17 +67731,17 @@
 
 
     // $ANTLR start "rule__PrecedenceCS__NameAssignment_2"
-    // InternalOCLstdlib.g:23384:1: rule__PrecedenceCS__NameAssignment_2 : ( ruleName ) ;
+    // InternalOCLstdlib.g:23388:1: rule__PrecedenceCS__NameAssignment_2 : ( ruleName ) ;
     public final void rule__PrecedenceCS__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23388:1: ( ( ruleName ) )
-            // InternalOCLstdlib.g:23389:1: ( ruleName )
+            // InternalOCLstdlib.g:23392:1: ( ( ruleName ) )
+            // InternalOCLstdlib.g:23393:1: ( ruleName )
             {
-            // InternalOCLstdlib.g:23389:1: ( ruleName )
-            // InternalOCLstdlib.g:23390:1: ruleName
+            // InternalOCLstdlib.g:23393:1: ( ruleName )
+            // InternalOCLstdlib.g:23394:1: ruleName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrecedenceCSAccess().getNameNameParserRuleCall_2_0());
@@ -67776,17 +67776,17 @@
 
 
     // $ANTLR start "rule__SpecificationCS__OwnedExpressionAssignment"
-    // InternalOCLstdlib.g:23399:1: rule__SpecificationCS__OwnedExpressionAssignment : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:23403:1: rule__SpecificationCS__OwnedExpressionAssignment : ( ruleExpCS ) ;
     public final void rule__SpecificationCS__OwnedExpressionAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23403:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:23404:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:23407:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:23408:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:23404:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:23405:1: ruleExpCS
+            // InternalOCLstdlib.g:23408:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:23409:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0());
@@ -67821,17 +67821,17 @@
 
 
     // $ANTLR start "rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1"
-    // InternalOCLstdlib.g:23414:1: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalOCLstdlib.g:23418:1: rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypedMultiplicityRefCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23418:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLstdlib.g:23419:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:23422:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLstdlib.g:23423:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLstdlib.g:23419:1: ( ruleMultiplicityCS )
-            // InternalOCLstdlib.g:23420:1: ruleMultiplicityCS
+            // InternalOCLstdlib.g:23423:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:23424:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -67866,23 +67866,23 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__IsTypeofAssignment_0_0"
-    // InternalOCLstdlib.g:23429:1: rule__TypedTypeRefCS__IsTypeofAssignment_0_0 : ( ( 'typeof' ) ) ;
+    // InternalOCLstdlib.g:23433:1: rule__TypedTypeRefCS__IsTypeofAssignment_0_0 : ( ( 'typeof' ) ) ;
     public final void rule__TypedTypeRefCS__IsTypeofAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23433:1: ( ( ( 'typeof' ) ) )
-            // InternalOCLstdlib.g:23434:1: ( ( 'typeof' ) )
+            // InternalOCLstdlib.g:23437:1: ( ( ( 'typeof' ) ) )
+            // InternalOCLstdlib.g:23438:1: ( ( 'typeof' ) )
             {
-            // InternalOCLstdlib.g:23434:1: ( ( 'typeof' ) )
-            // InternalOCLstdlib.g:23435:1: ( 'typeof' )
+            // InternalOCLstdlib.g:23438:1: ( ( 'typeof' ) )
+            // InternalOCLstdlib.g:23439:1: ( 'typeof' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getIsTypeofTypeofKeyword_0_0_0());
             }
-            // InternalOCLstdlib.g:23436:1: ( 'typeof' )
-            // InternalOCLstdlib.g:23437:1: 'typeof'
+            // InternalOCLstdlib.g:23440:1: ( 'typeof' )
+            // InternalOCLstdlib.g:23441:1: 'typeof'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getIsTypeofTypeofKeyword_0_0_0());
@@ -67919,17 +67919,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2"
-    // InternalOCLstdlib.g:23452:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 : ( ruleLibPathNameCS ) ;
+    // InternalOCLstdlib.g:23456:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2 : ( ruleLibPathNameCS ) ;
     public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23456:1: ( ( ruleLibPathNameCS ) )
-            // InternalOCLstdlib.g:23457:1: ( ruleLibPathNameCS )
+            // InternalOCLstdlib.g:23460:1: ( ( ruleLibPathNameCS ) )
+            // InternalOCLstdlib.g:23461:1: ( ruleLibPathNameCS )
             {
-            // InternalOCLstdlib.g:23457:1: ( ruleLibPathNameCS )
-            // InternalOCLstdlib.g:23458:1: ruleLibPathNameCS
+            // InternalOCLstdlib.g:23461:1: ( ruleLibPathNameCS )
+            // InternalOCLstdlib.g:23462:1: ruleLibPathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameLibPathNameCSParserRuleCall_0_2_0());
@@ -67964,17 +67964,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0"
-    // InternalOCLstdlib.g:23467:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 : ( ruleLibPathNameCS ) ;
+    // InternalOCLstdlib.g:23471:1: rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0 : ( ruleLibPathNameCS ) ;
     public final void rule__TypedTypeRefCS__OwnedPathNameAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23471:1: ( ( ruleLibPathNameCS ) )
-            // InternalOCLstdlib.g:23472:1: ( ruleLibPathNameCS )
+            // InternalOCLstdlib.g:23475:1: ( ( ruleLibPathNameCS ) )
+            // InternalOCLstdlib.g:23476:1: ( ruleLibPathNameCS )
             {
-            // InternalOCLstdlib.g:23472:1: ( ruleLibPathNameCS )
-            // InternalOCLstdlib.g:23473:1: ruleLibPathNameCS
+            // InternalOCLstdlib.g:23476:1: ( ruleLibPathNameCS )
+            // InternalOCLstdlib.g:23477:1: ruleLibPathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNameLibPathNameCSParserRuleCall_1_0_0());
@@ -68009,17 +68009,17 @@
 
 
     // $ANTLR start "rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1"
-    // InternalOCLstdlib.g:23482:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 : ( ruleTemplateBindingCS ) ;
+    // InternalOCLstdlib.g:23486:1: rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1 : ( ruleTemplateBindingCS ) ;
     public final void rule__TypedTypeRefCS__OwnedBindingAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23486:1: ( ( ruleTemplateBindingCS ) )
-            // InternalOCLstdlib.g:23487:1: ( ruleTemplateBindingCS )
+            // InternalOCLstdlib.g:23490:1: ( ( ruleTemplateBindingCS ) )
+            // InternalOCLstdlib.g:23491:1: ( ruleTemplateBindingCS )
             {
-            // InternalOCLstdlib.g:23487:1: ( ruleTemplateBindingCS )
-            // InternalOCLstdlib.g:23488:1: ruleTemplateBindingCS
+            // InternalOCLstdlib.g:23491:1: ( ruleTemplateBindingCS )
+            // InternalOCLstdlib.g:23492:1: ruleTemplateBindingCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypedTypeRefCSAccess().getOwnedBindingTemplateBindingCSParserRuleCall_1_1_1_0());
@@ -68054,17 +68054,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__NameAssignment_0"
-    // InternalOCLstdlib.g:23497:1: rule__TuplePartCS__NameAssignment_0 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:23501:1: rule__TuplePartCS__NameAssignment_0 : ( ruleIdentifier ) ;
     public final void rule__TuplePartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23501:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:23502:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23505:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:23506:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:23502:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:23503:1: ruleIdentifier
+            // InternalOCLstdlib.g:23506:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23507:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getNameIdentifierParserRuleCall_0_0());
@@ -68099,17 +68099,17 @@
 
 
     // $ANTLR start "rule__TuplePartCS__OwnedTypeAssignment_2"
-    // InternalOCLstdlib.g:23512:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
+    // InternalOCLstdlib.g:23516:1: rule__TuplePartCS__OwnedTypeAssignment_2 : ( ruleTypedMultiplicityRefCS ) ;
     public final void rule__TuplePartCS__OwnedTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23516:1: ( ( ruleTypedMultiplicityRefCS ) )
-            // InternalOCLstdlib.g:23517:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:23520:1: ( ( ruleTypedMultiplicityRefCS ) )
+            // InternalOCLstdlib.g:23521:1: ( ruleTypedMultiplicityRefCS )
             {
-            // InternalOCLstdlib.g:23517:1: ( ruleTypedMultiplicityRefCS )
-            // InternalOCLstdlib.g:23518:1: ruleTypedMultiplicityRefCS
+            // InternalOCLstdlib.g:23521:1: ( ruleTypedMultiplicityRefCS )
+            // InternalOCLstdlib.g:23522:1: ruleTypedMultiplicityRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_2_0());
@@ -68144,17 +68144,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_0"
-    // InternalOCLstdlib.g:23528:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
+    // InternalOCLstdlib.g:23532:1: rule__URIPathNameCS__OwnedPathElementsAssignment_0 : ( ruleURIFirstPathElementCS ) ;
     public final void rule__URIPathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23532:1: ( ( ruleURIFirstPathElementCS ) )
-            // InternalOCLstdlib.g:23533:1: ( ruleURIFirstPathElementCS )
+            // InternalOCLstdlib.g:23536:1: ( ( ruleURIFirstPathElementCS ) )
+            // InternalOCLstdlib.g:23537:1: ( ruleURIFirstPathElementCS )
             {
-            // InternalOCLstdlib.g:23533:1: ( ruleURIFirstPathElementCS )
-            // InternalOCLstdlib.g:23534:1: ruleURIFirstPathElementCS
+            // InternalOCLstdlib.g:23537:1: ( ruleURIFirstPathElementCS )
+            // InternalOCLstdlib.g:23538:1: ruleURIFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());
@@ -68189,17 +68189,17 @@
 
 
     // $ANTLR start "rule__URIPathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalOCLstdlib.g:23543:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalOCLstdlib.g:23547:1: rule__URIPathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__URIPathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23547:1: ( ( ruleNextPathElementCS ) )
-            // InternalOCLstdlib.g:23548:1: ( ruleNextPathElementCS )
+            // InternalOCLstdlib.g:23551:1: ( ( ruleNextPathElementCS ) )
+            // InternalOCLstdlib.g:23552:1: ( ruleNextPathElementCS )
             {
-            // InternalOCLstdlib.g:23548:1: ( ruleNextPathElementCS )
-            // InternalOCLstdlib.g:23549:1: ruleNextPathElementCS
+            // InternalOCLstdlib.g:23552:1: ( ruleNextPathElementCS )
+            // InternalOCLstdlib.g:23553:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -68234,23 +68234,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_0"
-    // InternalOCLstdlib.g:23558:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLstdlib.g:23562:1: rule__URIFirstPathElementCS__ReferredElementAssignment_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23562:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLstdlib.g:23563:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23566:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLstdlib.g:23567:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLstdlib.g:23563:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:23564:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23567:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23568:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());
             }
-            // InternalOCLstdlib.g:23565:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:23566:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:23569:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23570:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_0_1());
@@ -68291,23 +68291,23 @@
 
 
     // $ANTLR start "rule__URIFirstPathElementCS__ReferredElementAssignment_1_1"
-    // InternalOCLstdlib.g:23577:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
+    // InternalOCLstdlib.g:23581:1: rule__URIFirstPathElementCS__ReferredElementAssignment_1_1 : ( ( ruleURI ) ) ;
     public final void rule__URIFirstPathElementCS__ReferredElementAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23581:1: ( ( ( ruleURI ) ) )
-            // InternalOCLstdlib.g:23582:1: ( ( ruleURI ) )
+            // InternalOCLstdlib.g:23585:1: ( ( ( ruleURI ) ) )
+            // InternalOCLstdlib.g:23586:1: ( ( ruleURI ) )
             {
-            // InternalOCLstdlib.g:23582:1: ( ( ruleURI ) )
-            // InternalOCLstdlib.g:23583:1: ( ruleURI )
+            // InternalOCLstdlib.g:23586:1: ( ( ruleURI ) )
+            // InternalOCLstdlib.g:23587:1: ( ruleURI )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());
             }
-            // InternalOCLstdlib.g:23584:1: ( ruleURI )
-            // InternalOCLstdlib.g:23585:1: ruleURI
+            // InternalOCLstdlib.g:23588:1: ( ruleURI )
+            // InternalOCLstdlib.g:23589:1: ruleURI
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceURIParserRuleCall_1_1_0_1());
@@ -68348,17 +68348,17 @@
 
 
     // $ANTLR start "rule__PrimitiveTypeCS__NameAssignment"
-    // InternalOCLstdlib.g:23597:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
+    // InternalOCLstdlib.g:23601:1: rule__PrimitiveTypeCS__NameAssignment : ( rulePrimitiveTypeIdentifier ) ;
     public final void rule__PrimitiveTypeCS__NameAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23601:1: ( ( rulePrimitiveTypeIdentifier ) )
-            // InternalOCLstdlib.g:23602:1: ( rulePrimitiveTypeIdentifier )
+            // InternalOCLstdlib.g:23605:1: ( ( rulePrimitiveTypeIdentifier ) )
+            // InternalOCLstdlib.g:23606:1: ( rulePrimitiveTypeIdentifier )
             {
-            // InternalOCLstdlib.g:23602:1: ( rulePrimitiveTypeIdentifier )
-            // InternalOCLstdlib.g:23603:1: rulePrimitiveTypeIdentifier
+            // InternalOCLstdlib.g:23606:1: ( rulePrimitiveTypeIdentifier )
+            // InternalOCLstdlib.g:23607:1: rulePrimitiveTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());
@@ -68393,17 +68393,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__NameAssignment_0"
-    // InternalOCLstdlib.g:23612:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
+    // InternalOCLstdlib.g:23616:1: rule__CollectionTypeCS__NameAssignment_0 : ( ruleCollectionTypeIdentifier ) ;
     public final void rule__CollectionTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23616:1: ( ( ruleCollectionTypeIdentifier ) )
-            // InternalOCLstdlib.g:23617:1: ( ruleCollectionTypeIdentifier )
+            // InternalOCLstdlib.g:23620:1: ( ( ruleCollectionTypeIdentifier ) )
+            // InternalOCLstdlib.g:23621:1: ( ruleCollectionTypeIdentifier )
             {
-            // InternalOCLstdlib.g:23617:1: ( ruleCollectionTypeIdentifier )
-            // InternalOCLstdlib.g:23618:1: ruleCollectionTypeIdentifier
+            // InternalOCLstdlib.g:23621:1: ( ruleCollectionTypeIdentifier )
+            // InternalOCLstdlib.g:23622:1: ruleCollectionTypeIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());
@@ -68438,17 +68438,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedTypeAssignment_1_1"
-    // InternalOCLstdlib.g:23627:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
+    // InternalOCLstdlib.g:23631:1: rule__CollectionTypeCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpWithoutMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23631:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
-            // InternalOCLstdlib.g:23632:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLstdlib.g:23635:1: ( ( ruleTypeExpWithoutMultiplicityCS ) )
+            // InternalOCLstdlib.g:23636:1: ( ruleTypeExpWithoutMultiplicityCS )
             {
-            // InternalOCLstdlib.g:23632:1: ( ruleTypeExpWithoutMultiplicityCS )
-            // InternalOCLstdlib.g:23633:1: ruleTypeExpWithoutMultiplicityCS
+            // InternalOCLstdlib.g:23636:1: ( ruleTypeExpWithoutMultiplicityCS )
+            // InternalOCLstdlib.g:23637:1: ruleTypeExpWithoutMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());
@@ -68483,17 +68483,17 @@
 
 
     // $ANTLR start "rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2"
-    // InternalOCLstdlib.g:23642:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
+    // InternalOCLstdlib.g:23646:1: rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2 : ( ruleMultiplicityCS ) ;
     public final void rule__CollectionTypeCS__OwnedCollectionMultiplicityAssignment_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23646:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLstdlib.g:23647:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:23650:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLstdlib.g:23651:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLstdlib.g:23647:1: ( ruleMultiplicityCS )
-            // InternalOCLstdlib.g:23648:1: ruleMultiplicityCS
+            // InternalOCLstdlib.g:23651:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:23652:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());
@@ -68528,23 +68528,23 @@
 
 
     // $ANTLR start "rule__MapTypeCS__NameAssignment_0"
-    // InternalOCLstdlib.g:23657:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
+    // InternalOCLstdlib.g:23661:1: rule__MapTypeCS__NameAssignment_0 : ( ( 'Map' ) ) ;
     public final void rule__MapTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23661:1: ( ( ( 'Map' ) ) )
-            // InternalOCLstdlib.g:23662:1: ( ( 'Map' ) )
+            // InternalOCLstdlib.g:23665:1: ( ( ( 'Map' ) ) )
+            // InternalOCLstdlib.g:23666:1: ( ( 'Map' ) )
             {
-            // InternalOCLstdlib.g:23662:1: ( ( 'Map' ) )
-            // InternalOCLstdlib.g:23663:1: ( 'Map' )
+            // InternalOCLstdlib.g:23666:1: ( ( 'Map' ) )
+            // InternalOCLstdlib.g:23667:1: ( 'Map' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
             }
-            // InternalOCLstdlib.g:23664:1: ( 'Map' )
-            // InternalOCLstdlib.g:23665:1: 'Map'
+            // InternalOCLstdlib.g:23668:1: ( 'Map' )
+            // InternalOCLstdlib.g:23669:1: 'Map'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());
@@ -68581,17 +68581,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedKeyTypeAssignment_1_1"
-    // InternalOCLstdlib.g:23680:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:23684:1: rule__MapTypeCS__OwnedKeyTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedKeyTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23684:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:23685:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:23688:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:23689:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:23685:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:23686:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:23689:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:23690:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());
@@ -68626,17 +68626,17 @@
 
 
     // $ANTLR start "rule__MapTypeCS__OwnedValueTypeAssignment_1_3"
-    // InternalOCLstdlib.g:23695:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:23699:1: rule__MapTypeCS__OwnedValueTypeAssignment_1_3 : ( ruleTypeExpCS ) ;
     public final void rule__MapTypeCS__OwnedValueTypeAssignment_1_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23699:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:23700:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:23703:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:23704:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:23700:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:23701:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:23704:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:23705:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());
@@ -68671,23 +68671,23 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__NameAssignment_0"
-    // InternalOCLstdlib.g:23710:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
+    // InternalOCLstdlib.g:23714:1: rule__TupleTypeCS__NameAssignment_0 : ( ( 'Tuple' ) ) ;
     public final void rule__TupleTypeCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23714:1: ( ( ( 'Tuple' ) ) )
-            // InternalOCLstdlib.g:23715:1: ( ( 'Tuple' ) )
+            // InternalOCLstdlib.g:23718:1: ( ( ( 'Tuple' ) ) )
+            // InternalOCLstdlib.g:23719:1: ( ( 'Tuple' ) )
             {
-            // InternalOCLstdlib.g:23715:1: ( ( 'Tuple' ) )
-            // InternalOCLstdlib.g:23716:1: ( 'Tuple' )
+            // InternalOCLstdlib.g:23719:1: ( ( 'Tuple' ) )
+            // InternalOCLstdlib.g:23720:1: ( 'Tuple' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
             }
-            // InternalOCLstdlib.g:23717:1: ( 'Tuple' )
-            // InternalOCLstdlib.g:23718:1: 'Tuple'
+            // InternalOCLstdlib.g:23721:1: ( 'Tuple' )
+            // InternalOCLstdlib.g:23722:1: 'Tuple'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());
@@ -68724,17 +68724,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_0"
-    // InternalOCLstdlib.g:23733:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
+    // InternalOCLstdlib.g:23737:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_0 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23737:1: ( ( ruleTuplePartCS ) )
-            // InternalOCLstdlib.g:23738:1: ( ruleTuplePartCS )
+            // InternalOCLstdlib.g:23741:1: ( ( ruleTuplePartCS ) )
+            // InternalOCLstdlib.g:23742:1: ( ruleTuplePartCS )
             {
-            // InternalOCLstdlib.g:23738:1: ( ruleTuplePartCS )
-            // InternalOCLstdlib.g:23739:1: ruleTuplePartCS
+            // InternalOCLstdlib.g:23742:1: ( ruleTuplePartCS )
+            // InternalOCLstdlib.g:23743:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());
@@ -68769,17 +68769,17 @@
 
 
     // $ANTLR start "rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1"
-    // InternalOCLstdlib.g:23748:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
+    // InternalOCLstdlib.g:23752:1: rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1 : ( ruleTuplePartCS ) ;
     public final void rule__TupleTypeCS__OwnedPartsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23752:1: ( ( ruleTuplePartCS ) )
-            // InternalOCLstdlib.g:23753:1: ( ruleTuplePartCS )
+            // InternalOCLstdlib.g:23756:1: ( ( ruleTuplePartCS ) )
+            // InternalOCLstdlib.g:23757:1: ( ruleTuplePartCS )
             {
-            // InternalOCLstdlib.g:23753:1: ( ruleTuplePartCS )
-            // InternalOCLstdlib.g:23754:1: ruleTuplePartCS
+            // InternalOCLstdlib.g:23757:1: ( ruleTuplePartCS )
+            // InternalOCLstdlib.g:23758:1: ruleTuplePartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());
@@ -68814,17 +68814,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalOCLstdlib.g:23763:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalOCLstdlib.g:23767:1: rule__CollectionLiteralExpCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23767:1: ( ( ruleCollectionTypeCS ) )
-            // InternalOCLstdlib.g:23768:1: ( ruleCollectionTypeCS )
+            // InternalOCLstdlib.g:23771:1: ( ( ruleCollectionTypeCS ) )
+            // InternalOCLstdlib.g:23772:1: ( ruleCollectionTypeCS )
             {
-            // InternalOCLstdlib.g:23768:1: ( ruleCollectionTypeCS )
-            // InternalOCLstdlib.g:23769:1: ruleCollectionTypeCS
+            // InternalOCLstdlib.g:23772:1: ( ruleCollectionTypeCS )
+            // InternalOCLstdlib.g:23773:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -68859,17 +68859,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalOCLstdlib.g:23778:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalOCLstdlib.g:23782:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23782:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalOCLstdlib.g:23783:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLstdlib.g:23786:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalOCLstdlib.g:23787:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalOCLstdlib.g:23783:1: ( ruleCollectionLiteralPartCS )
-            // InternalOCLstdlib.g:23784:1: ruleCollectionLiteralPartCS
+            // InternalOCLstdlib.g:23787:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLstdlib.g:23788:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());
@@ -68904,17 +68904,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLstdlib.g:23793:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
+    // InternalOCLstdlib.g:23797:1: rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleCollectionLiteralPartCS ) ;
     public final void rule__CollectionLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23797:1: ( ( ruleCollectionLiteralPartCS ) )
-            // InternalOCLstdlib.g:23798:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLstdlib.g:23801:1: ( ( ruleCollectionLiteralPartCS ) )
+            // InternalOCLstdlib.g:23802:1: ( ruleCollectionLiteralPartCS )
             {
-            // InternalOCLstdlib.g:23798:1: ( ruleCollectionLiteralPartCS )
-            // InternalOCLstdlib.g:23799:1: ruleCollectionLiteralPartCS
+            // InternalOCLstdlib.g:23802:1: ( ruleCollectionLiteralPartCS )
+            // InternalOCLstdlib.g:23803:1: ruleCollectionLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());
@@ -68949,17 +68949,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0"
-    // InternalOCLstdlib.g:23808:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:23812:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23812:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:23813:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:23816:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:23817:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:23813:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:23814:1: ruleExpCS
+            // InternalOCLstdlib.g:23817:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:23818:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());
@@ -68994,17 +68994,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1"
-    // InternalOCLstdlib.g:23823:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:23827:1: rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1 : ( ruleExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedLastExpressionAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23827:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:23828:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:23831:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:23832:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:23828:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:23829:1: ruleExpCS
+            // InternalOCLstdlib.g:23832:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:23833:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());
@@ -69039,17 +69039,17 @@
 
 
     // $ANTLR start "rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1"
-    // InternalOCLstdlib.g:23838:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
+    // InternalOCLstdlib.g:23842:1: rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23842:1: ( ( rulePatternExpCS ) )
-            // InternalOCLstdlib.g:23843:1: ( rulePatternExpCS )
+            // InternalOCLstdlib.g:23846:1: ( ( rulePatternExpCS ) )
+            // InternalOCLstdlib.g:23847:1: ( rulePatternExpCS )
             {
-            // InternalOCLstdlib.g:23843:1: ( rulePatternExpCS )
-            // InternalOCLstdlib.g:23844:1: rulePatternExpCS
+            // InternalOCLstdlib.g:23847:1: ( rulePatternExpCS )
+            // InternalOCLstdlib.g:23848:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());
@@ -69084,17 +69084,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedTypeAssignment_0"
-    // InternalOCLstdlib.g:23853:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
+    // InternalOCLstdlib.g:23857:1: rule__CollectionPatternCS__OwnedTypeAssignment_0 : ( ruleCollectionTypeCS ) ;
     public final void rule__CollectionPatternCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23857:1: ( ( ruleCollectionTypeCS ) )
-            // InternalOCLstdlib.g:23858:1: ( ruleCollectionTypeCS )
+            // InternalOCLstdlib.g:23861:1: ( ( ruleCollectionTypeCS ) )
+            // InternalOCLstdlib.g:23862:1: ( ruleCollectionTypeCS )
             {
-            // InternalOCLstdlib.g:23858:1: ( ruleCollectionTypeCS )
-            // InternalOCLstdlib.g:23859:1: ruleCollectionTypeCS
+            // InternalOCLstdlib.g:23862:1: ( ruleCollectionTypeCS )
+            // InternalOCLstdlib.g:23863:1: ruleCollectionTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());
@@ -69129,17 +69129,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_0"
-    // InternalOCLstdlib.g:23868:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
+    // InternalOCLstdlib.g:23872:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_0 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23872:1: ( ( rulePatternExpCS ) )
-            // InternalOCLstdlib.g:23873:1: ( rulePatternExpCS )
+            // InternalOCLstdlib.g:23876:1: ( ( rulePatternExpCS ) )
+            // InternalOCLstdlib.g:23877:1: ( rulePatternExpCS )
             {
-            // InternalOCLstdlib.g:23873:1: ( rulePatternExpCS )
-            // InternalOCLstdlib.g:23874:1: rulePatternExpCS
+            // InternalOCLstdlib.g:23877:1: ( rulePatternExpCS )
+            // InternalOCLstdlib.g:23878:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());
@@ -69174,17 +69174,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLstdlib.g:23883:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
+    // InternalOCLstdlib.g:23887:1: rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1 : ( rulePatternExpCS ) ;
     public final void rule__CollectionPatternCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23887:1: ( ( rulePatternExpCS ) )
-            // InternalOCLstdlib.g:23888:1: ( rulePatternExpCS )
+            // InternalOCLstdlib.g:23891:1: ( ( rulePatternExpCS ) )
+            // InternalOCLstdlib.g:23892:1: ( rulePatternExpCS )
             {
-            // InternalOCLstdlib.g:23888:1: ( rulePatternExpCS )
-            // InternalOCLstdlib.g:23889:1: rulePatternExpCS
+            // InternalOCLstdlib.g:23892:1: ( rulePatternExpCS )
+            // InternalOCLstdlib.g:23893:1: rulePatternExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());
@@ -69219,17 +69219,17 @@
 
 
     // $ANTLR start "rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1"
-    // InternalOCLstdlib.g:23898:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
+    // InternalOCLstdlib.g:23902:1: rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1 : ( ruleIdentifier ) ;
     public final void rule__CollectionPatternCS__RestVariableNameAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23902:1: ( ( ruleIdentifier ) )
-            // InternalOCLstdlib.g:23903:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23906:1: ( ( ruleIdentifier ) )
+            // InternalOCLstdlib.g:23907:1: ( ruleIdentifier )
             {
-            // InternalOCLstdlib.g:23903:1: ( ruleIdentifier )
-            // InternalOCLstdlib.g:23904:1: ruleIdentifier
+            // InternalOCLstdlib.g:23907:1: ( ruleIdentifier )
+            // InternalOCLstdlib.g:23908:1: ruleIdentifier
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());
@@ -69264,23 +69264,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__ReferredPropertyAssignment_0_0"
-    // InternalOCLstdlib.g:23913:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLstdlib.g:23917:1: rule__ShadowPartCS__ReferredPropertyAssignment_0_0 : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__ShadowPartCS__ReferredPropertyAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23917:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLstdlib.g:23918:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23921:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLstdlib.g:23922:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLstdlib.g:23918:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:23919:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23922:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23923:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());
             }
-            // InternalOCLstdlib.g:23920:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:23921:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:23924:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23925:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyUnrestrictedNameParserRuleCall_0_0_0_1());
@@ -69321,23 +69321,23 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2"
-    // InternalOCLstdlib.g:23932:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
+    // InternalOCLstdlib.g:23936:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2 : ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23936:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
-            // InternalOCLstdlib.g:23937:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalOCLstdlib.g:23940:1: ( ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) ) )
+            // InternalOCLstdlib.g:23941:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
             {
-            // InternalOCLstdlib.g:23937:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
-            // InternalOCLstdlib.g:23938:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalOCLstdlib.g:23941:1: ( ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 ) )
+            // InternalOCLstdlib.g:23942:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionAlternatives_0_2_0());
             }
-            // InternalOCLstdlib.g:23939:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
-            // InternalOCLstdlib.g:23939:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
+            // InternalOCLstdlib.g:23943:1: ( rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 )
+            // InternalOCLstdlib.g:23943:2: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0();
@@ -69372,17 +69372,17 @@
 
 
     // $ANTLR start "rule__ShadowPartCS__OwnedInitExpressionAssignment_1"
-    // InternalOCLstdlib.g:23948:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
+    // InternalOCLstdlib.g:23952:1: rule__ShadowPartCS__OwnedInitExpressionAssignment_1 : ( ruleStringLiteralExpCS ) ;
     public final void rule__ShadowPartCS__OwnedInitExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23952:1: ( ( ruleStringLiteralExpCS ) )
-            // InternalOCLstdlib.g:23953:1: ( ruleStringLiteralExpCS )
+            // InternalOCLstdlib.g:23956:1: ( ( ruleStringLiteralExpCS ) )
+            // InternalOCLstdlib.g:23957:1: ( ruleStringLiteralExpCS )
             {
-            // InternalOCLstdlib.g:23953:1: ( ruleStringLiteralExpCS )
-            // InternalOCLstdlib.g:23954:1: ruleStringLiteralExpCS
+            // InternalOCLstdlib.g:23957:1: ( ruleStringLiteralExpCS )
+            // InternalOCLstdlib.g:23958:1: ruleStringLiteralExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());
@@ -69417,17 +69417,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__PatternVariableNameAssignment_0"
-    // InternalOCLstdlib.g:23963:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:23967:1: rule__PatternExpCS__PatternVariableNameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__PatternExpCS__PatternVariableNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23967:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:23968:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23971:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:23972:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:23968:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:23969:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:23972:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:23973:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());
@@ -69462,17 +69462,17 @@
 
 
     // $ANTLR start "rule__PatternExpCS__OwnedPatternTypeAssignment_2"
-    // InternalOCLstdlib.g:23978:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:23982:1: rule__PatternExpCS__OwnedPatternTypeAssignment_2 : ( ruleTypeExpCS ) ;
     public final void rule__PatternExpCS__OwnedPatternTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23982:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:23983:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:23986:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:23987:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:23983:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:23984:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:23987:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:23988:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());
@@ -69507,17 +69507,17 @@
 
 
     // $ANTLR start "rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2"
-    // InternalOCLstdlib.g:23993:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:23997:1: rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2 : ( ruleExpCS ) ;
     public final void rule__LambdaLiteralExpCS__OwnedExpressionCSAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:23997:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:23998:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24001:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24002:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:23998:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:23999:1: ruleExpCS
+            // InternalOCLstdlib.g:24002:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24003:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());
@@ -69552,17 +69552,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedTypeAssignment_0"
-    // InternalOCLstdlib.g:24008:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
+    // InternalOCLstdlib.g:24012:1: rule__MapLiteralExpCS__OwnedTypeAssignment_0 : ( ruleMapTypeCS ) ;
     public final void rule__MapLiteralExpCS__OwnedTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24012:1: ( ( ruleMapTypeCS ) )
-            // InternalOCLstdlib.g:24013:1: ( ruleMapTypeCS )
+            // InternalOCLstdlib.g:24016:1: ( ( ruleMapTypeCS ) )
+            // InternalOCLstdlib.g:24017:1: ( ruleMapTypeCS )
             {
-            // InternalOCLstdlib.g:24013:1: ( ruleMapTypeCS )
-            // InternalOCLstdlib.g:24014:1: ruleMapTypeCS
+            // InternalOCLstdlib.g:24017:1: ( ruleMapTypeCS )
+            // InternalOCLstdlib.g:24018:1: ruleMapTypeCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());
@@ -69597,17 +69597,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_0"
-    // InternalOCLstdlib.g:24023:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
+    // InternalOCLstdlib.g:24027:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_0 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24027:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalOCLstdlib.g:24028:1: ( ruleMapLiteralPartCS )
+            // InternalOCLstdlib.g:24031:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalOCLstdlib.g:24032:1: ( ruleMapLiteralPartCS )
             {
-            // InternalOCLstdlib.g:24028:1: ( ruleMapLiteralPartCS )
-            // InternalOCLstdlib.g:24029:1: ruleMapLiteralPartCS
+            // InternalOCLstdlib.g:24032:1: ( ruleMapLiteralPartCS )
+            // InternalOCLstdlib.g:24033:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());
@@ -69642,17 +69642,17 @@
 
 
     // $ANTLR start "rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLstdlib.g:24038:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
+    // InternalOCLstdlib.g:24042:1: rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1 : ( ruleMapLiteralPartCS ) ;
     public final void rule__MapLiteralExpCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24042:1: ( ( ruleMapLiteralPartCS ) )
-            // InternalOCLstdlib.g:24043:1: ( ruleMapLiteralPartCS )
+            // InternalOCLstdlib.g:24046:1: ( ( ruleMapLiteralPartCS ) )
+            // InternalOCLstdlib.g:24047:1: ( ruleMapLiteralPartCS )
             {
-            // InternalOCLstdlib.g:24043:1: ( ruleMapLiteralPartCS )
-            // InternalOCLstdlib.g:24044:1: ruleMapLiteralPartCS
+            // InternalOCLstdlib.g:24047:1: ( ruleMapLiteralPartCS )
+            // InternalOCLstdlib.g:24048:1: ruleMapLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());
@@ -69687,17 +69687,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedKeyAssignment_0"
-    // InternalOCLstdlib.g:24053:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24057:1: rule__MapLiteralPartCS__OwnedKeyAssignment_0 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedKeyAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24057:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24058:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24061:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24062:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24058:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24059:1: ruleExpCS
+            // InternalOCLstdlib.g:24062:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24063:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());
@@ -69732,17 +69732,17 @@
 
 
     // $ANTLR start "rule__MapLiteralPartCS__OwnedValueAssignment_2"
-    // InternalOCLstdlib.g:24068:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24072:1: rule__MapLiteralPartCS__OwnedValueAssignment_2 : ( ruleExpCS ) ;
     public final void rule__MapLiteralPartCS__OwnedValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24072:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24073:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24076:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24077:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24073:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24074:1: ruleExpCS
+            // InternalOCLstdlib.g:24077:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24078:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());
@@ -69777,17 +69777,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_2"
-    // InternalOCLstdlib.g:24083:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
+    // InternalOCLstdlib.g:24087:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_2 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24087:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalOCLstdlib.g:24088:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLstdlib.g:24091:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalOCLstdlib.g:24092:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalOCLstdlib.g:24088:1: ( ruleTupleLiteralPartCS )
-            // InternalOCLstdlib.g:24089:1: ruleTupleLiteralPartCS
+            // InternalOCLstdlib.g:24092:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLstdlib.g:24093:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());
@@ -69822,17 +69822,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1"
-    // InternalOCLstdlib.g:24098:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
+    // InternalOCLstdlib.g:24102:1: rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1 : ( ruleTupleLiteralPartCS ) ;
     public final void rule__TupleLiteralExpCS__OwnedPartsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24102:1: ( ( ruleTupleLiteralPartCS ) )
-            // InternalOCLstdlib.g:24103:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLstdlib.g:24106:1: ( ( ruleTupleLiteralPartCS ) )
+            // InternalOCLstdlib.g:24107:1: ( ruleTupleLiteralPartCS )
             {
-            // InternalOCLstdlib.g:24103:1: ( ruleTupleLiteralPartCS )
-            // InternalOCLstdlib.g:24104:1: ruleTupleLiteralPartCS
+            // InternalOCLstdlib.g:24107:1: ( ruleTupleLiteralPartCS )
+            // InternalOCLstdlib.g:24108:1: ruleTupleLiteralPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());
@@ -69867,17 +69867,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__NameAssignment_0"
-    // InternalOCLstdlib.g:24113:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:24117:1: rule__TupleLiteralPartCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TupleLiteralPartCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24117:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:24118:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:24121:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:24122:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:24118:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:24119:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:24122:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:24123:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -69912,17 +69912,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1"
-    // InternalOCLstdlib.g:24128:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24132:1: rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24132:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24133:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24136:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24137:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24133:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24134:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24137:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24138:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -69957,17 +69957,17 @@
 
 
     // $ANTLR start "rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3"
-    // InternalOCLstdlib.g:24143:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24147:1: rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__TupleLiteralPartCS__OwnedInitExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24147:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24148:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24151:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24152:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24148:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24149:1: ruleExpCS
+            // InternalOCLstdlib.g:24152:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24153:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());
@@ -70002,17 +70002,17 @@
 
 
     // $ANTLR start "rule__NumberLiteralExpCS__SymbolAssignment"
-    // InternalOCLstdlib.g:24158:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
+    // InternalOCLstdlib.g:24162:1: rule__NumberLiteralExpCS__SymbolAssignment : ( ruleNUMBER_LITERAL ) ;
     public final void rule__NumberLiteralExpCS__SymbolAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24162:1: ( ( ruleNUMBER_LITERAL ) )
-            // InternalOCLstdlib.g:24163:1: ( ruleNUMBER_LITERAL )
+            // InternalOCLstdlib.g:24166:1: ( ( ruleNUMBER_LITERAL ) )
+            // InternalOCLstdlib.g:24167:1: ( ruleNUMBER_LITERAL )
             {
-            // InternalOCLstdlib.g:24163:1: ( ruleNUMBER_LITERAL )
-            // InternalOCLstdlib.g:24164:1: ruleNUMBER_LITERAL
+            // InternalOCLstdlib.g:24167:1: ( ruleNUMBER_LITERAL )
+            // InternalOCLstdlib.g:24168:1: ruleNUMBER_LITERAL
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());
@@ -70047,17 +70047,17 @@
 
 
     // $ANTLR start "rule__StringLiteralExpCS__SegmentsAssignment"
-    // InternalOCLstdlib.g:24173:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
+    // InternalOCLstdlib.g:24177:1: rule__StringLiteralExpCS__SegmentsAssignment : ( ruleStringLiteral ) ;
     public final void rule__StringLiteralExpCS__SegmentsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24177:1: ( ( ruleStringLiteral ) )
-            // InternalOCLstdlib.g:24178:1: ( ruleStringLiteral )
+            // InternalOCLstdlib.g:24181:1: ( ( ruleStringLiteral ) )
+            // InternalOCLstdlib.g:24182:1: ( ruleStringLiteral )
             {
-            // InternalOCLstdlib.g:24178:1: ( ruleStringLiteral )
-            // InternalOCLstdlib.g:24179:1: ruleStringLiteral
+            // InternalOCLstdlib.g:24182:1: ( ruleStringLiteral )
+            // InternalOCLstdlib.g:24183:1: ruleStringLiteral
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());
@@ -70092,23 +70092,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_0"
-    // InternalOCLstdlib.g:24188:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
+    // InternalOCLstdlib.g:24192:1: rule__BooleanLiteralExpCS__SymbolAssignment_0 : ( ( 'true' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24192:1: ( ( ( 'true' ) ) )
-            // InternalOCLstdlib.g:24193:1: ( ( 'true' ) )
+            // InternalOCLstdlib.g:24196:1: ( ( ( 'true' ) ) )
+            // InternalOCLstdlib.g:24197:1: ( ( 'true' ) )
             {
-            // InternalOCLstdlib.g:24193:1: ( ( 'true' ) )
-            // InternalOCLstdlib.g:24194:1: ( 'true' )
+            // InternalOCLstdlib.g:24197:1: ( ( 'true' ) )
+            // InternalOCLstdlib.g:24198:1: ( 'true' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
             }
-            // InternalOCLstdlib.g:24195:1: ( 'true' )
-            // InternalOCLstdlib.g:24196:1: 'true'
+            // InternalOCLstdlib.g:24199:1: ( 'true' )
+            // InternalOCLstdlib.g:24200:1: 'true'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());
@@ -70145,23 +70145,23 @@
 
 
     // $ANTLR start "rule__BooleanLiteralExpCS__SymbolAssignment_1"
-    // InternalOCLstdlib.g:24211:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
+    // InternalOCLstdlib.g:24215:1: rule__BooleanLiteralExpCS__SymbolAssignment_1 : ( ( 'false' ) ) ;
     public final void rule__BooleanLiteralExpCS__SymbolAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24215:1: ( ( ( 'false' ) ) )
-            // InternalOCLstdlib.g:24216:1: ( ( 'false' ) )
+            // InternalOCLstdlib.g:24219:1: ( ( ( 'false' ) ) )
+            // InternalOCLstdlib.g:24220:1: ( ( 'false' ) )
             {
-            // InternalOCLstdlib.g:24216:1: ( ( 'false' ) )
-            // InternalOCLstdlib.g:24217:1: ( 'false' )
+            // InternalOCLstdlib.g:24220:1: ( ( 'false' ) )
+            // InternalOCLstdlib.g:24221:1: ( 'false' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
             }
-            // InternalOCLstdlib.g:24218:1: ( 'false' )
-            // InternalOCLstdlib.g:24219:1: 'false'
+            // InternalOCLstdlib.g:24222:1: ( 'false' )
+            // InternalOCLstdlib.g:24223:1: 'false'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());
@@ -70198,17 +70198,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1"
-    // InternalOCLstdlib.g:24234:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalOCLstdlib.g:24238:1: rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeLiteralWithMultiplicityCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24238:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLstdlib.g:24239:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:24242:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLstdlib.g:24243:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLstdlib.g:24239:1: ( ruleMultiplicityCS )
-            // InternalOCLstdlib.g:24240:1: ruleMultiplicityCS
+            // InternalOCLstdlib.g:24243:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:24244:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -70243,17 +70243,17 @@
 
 
     // $ANTLR start "rule__TypeLiteralExpCS__OwnedTypeAssignment"
-    // InternalOCLstdlib.g:24249:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
+    // InternalOCLstdlib.g:24253:1: rule__TypeLiteralExpCS__OwnedTypeAssignment : ( ruleTypeLiteralWithMultiplicityCS ) ;
     public final void rule__TypeLiteralExpCS__OwnedTypeAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24253:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
-            // InternalOCLstdlib.g:24254:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalOCLstdlib.g:24257:1: ( ( ruleTypeLiteralWithMultiplicityCS ) )
+            // InternalOCLstdlib.g:24258:1: ( ruleTypeLiteralWithMultiplicityCS )
             {
-            // InternalOCLstdlib.g:24254:1: ( ruleTypeLiteralWithMultiplicityCS )
-            // InternalOCLstdlib.g:24255:1: ruleTypeLiteralWithMultiplicityCS
+            // InternalOCLstdlib.g:24258:1: ( ruleTypeLiteralWithMultiplicityCS )
+            // InternalOCLstdlib.g:24259:1: ruleTypeLiteralWithMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());
@@ -70288,17 +70288,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPathNameAssignment_0"
-    // InternalOCLstdlib.g:24264:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalOCLstdlib.g:24268:1: rule__TypeNameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__TypeNameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24268:1: ( ( rulePathNameCS ) )
-            // InternalOCLstdlib.g:24269:1: ( rulePathNameCS )
+            // InternalOCLstdlib.g:24272:1: ( ( rulePathNameCS ) )
+            // InternalOCLstdlib.g:24273:1: ( rulePathNameCS )
             {
-            // InternalOCLstdlib.g:24269:1: ( rulePathNameCS )
-            // InternalOCLstdlib.g:24270:1: rulePathNameCS
+            // InternalOCLstdlib.g:24273:1: ( rulePathNameCS )
+            // InternalOCLstdlib.g:24274:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -70333,17 +70333,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0"
-    // InternalOCLstdlib.g:24279:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalOCLstdlib.g:24283:1: rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__TypeNameExpCS__OwnedCurlyBracketedClauseAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24283:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalOCLstdlib.g:24284:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLstdlib.g:24287:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalOCLstdlib.g:24288:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalOCLstdlib.g:24284:1: ( ruleCurlyBracketedClauseCS )
-            // InternalOCLstdlib.g:24285:1: ruleCurlyBracketedClauseCS
+            // InternalOCLstdlib.g:24288:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLstdlib.g:24289:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());
@@ -70378,17 +70378,17 @@
 
 
     // $ANTLR start "rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1"
-    // InternalOCLstdlib.g:24294:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24298:1: rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1 : ( ruleExpCS ) ;
     public final void rule__TypeNameExpCS__OwnedPatternGuardAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24298:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24299:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24302:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24303:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24299:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24300:1: ruleExpCS
+            // InternalOCLstdlib.g:24303:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24304:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());
@@ -70423,17 +70423,17 @@
 
 
     // $ANTLR start "rule__TypeExpCS__OwnedMultiplicityAssignment_1"
-    // InternalOCLstdlib.g:24309:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
+    // InternalOCLstdlib.g:24313:1: rule__TypeExpCS__OwnedMultiplicityAssignment_1 : ( ruleMultiplicityCS ) ;
     public final void rule__TypeExpCS__OwnedMultiplicityAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24313:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLstdlib.g:24314:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:24317:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLstdlib.g:24318:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLstdlib.g:24314:1: ( ruleMultiplicityCS )
-            // InternalOCLstdlib.g:24315:1: ruleMultiplicityCS
+            // InternalOCLstdlib.g:24318:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:24319:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());
@@ -70468,17 +70468,17 @@
 
 
     // $ANTLR start "rule__ExpCS__NameAssignment_0_1_1"
-    // InternalOCLstdlib.g:24324:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
+    // InternalOCLstdlib.g:24328:1: rule__ExpCS__NameAssignment_0_1_1 : ( ruleBinaryOperatorName ) ;
     public final void rule__ExpCS__NameAssignment_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24328:1: ( ( ruleBinaryOperatorName ) )
-            // InternalOCLstdlib.g:24329:1: ( ruleBinaryOperatorName )
+            // InternalOCLstdlib.g:24332:1: ( ( ruleBinaryOperatorName ) )
+            // InternalOCLstdlib.g:24333:1: ( ruleBinaryOperatorName )
             {
-            // InternalOCLstdlib.g:24329:1: ( ruleBinaryOperatorName )
-            // InternalOCLstdlib.g:24330:1: ruleBinaryOperatorName
+            // InternalOCLstdlib.g:24333:1: ( ruleBinaryOperatorName )
+            // InternalOCLstdlib.g:24334:1: ruleBinaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());
@@ -70513,17 +70513,17 @@
 
 
     // $ANTLR start "rule__ExpCS__OwnedRightAssignment_0_1_2"
-    // InternalOCLstdlib.g:24339:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24343:1: rule__ExpCS__OwnedRightAssignment_0_1_2 : ( ruleExpCS ) ;
     public final void rule__ExpCS__OwnedRightAssignment_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24343:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24344:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24347:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24348:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24344:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24345:1: ruleExpCS
+            // InternalOCLstdlib.g:24348:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24349:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());
@@ -70558,17 +70558,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__NameAssignment_0_1"
-    // InternalOCLstdlib.g:24354:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalOCLstdlib.g:24358:1: rule__PrefixedLetExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedLetExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24358:1: ( ( ruleUnaryOperatorName ) )
-            // InternalOCLstdlib.g:24359:1: ( ruleUnaryOperatorName )
+            // InternalOCLstdlib.g:24362:1: ( ( ruleUnaryOperatorName ) )
+            // InternalOCLstdlib.g:24363:1: ( ruleUnaryOperatorName )
             {
-            // InternalOCLstdlib.g:24359:1: ( ruleUnaryOperatorName )
-            // InternalOCLstdlib.g:24360:1: ruleUnaryOperatorName
+            // InternalOCLstdlib.g:24363:1: ( ruleUnaryOperatorName )
+            // InternalOCLstdlib.g:24364:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -70603,17 +70603,17 @@
 
 
     // $ANTLR start "rule__PrefixedLetExpCS__OwnedRightAssignment_0_2"
-    // InternalOCLstdlib.g:24369:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
+    // InternalOCLstdlib.g:24373:1: rule__PrefixedLetExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedLetExpCS ) ;
     public final void rule__PrefixedLetExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24373:1: ( ( rulePrefixedLetExpCS ) )
-            // InternalOCLstdlib.g:24374:1: ( rulePrefixedLetExpCS )
+            // InternalOCLstdlib.g:24377:1: ( ( rulePrefixedLetExpCS ) )
+            // InternalOCLstdlib.g:24378:1: ( rulePrefixedLetExpCS )
             {
-            // InternalOCLstdlib.g:24374:1: ( rulePrefixedLetExpCS )
-            // InternalOCLstdlib.g:24375:1: rulePrefixedLetExpCS
+            // InternalOCLstdlib.g:24378:1: ( rulePrefixedLetExpCS )
+            // InternalOCLstdlib.g:24379:1: rulePrefixedLetExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());
@@ -70648,17 +70648,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__NameAssignment_0_1"
-    // InternalOCLstdlib.g:24384:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
+    // InternalOCLstdlib.g:24388:1: rule__PrefixedPrimaryExpCS__NameAssignment_0_1 : ( ruleUnaryOperatorName ) ;
     public final void rule__PrefixedPrimaryExpCS__NameAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24388:1: ( ( ruleUnaryOperatorName ) )
-            // InternalOCLstdlib.g:24389:1: ( ruleUnaryOperatorName )
+            // InternalOCLstdlib.g:24392:1: ( ( ruleUnaryOperatorName ) )
+            // InternalOCLstdlib.g:24393:1: ( ruleUnaryOperatorName )
             {
-            // InternalOCLstdlib.g:24389:1: ( ruleUnaryOperatorName )
-            // InternalOCLstdlib.g:24390:1: ruleUnaryOperatorName
+            // InternalOCLstdlib.g:24393:1: ( ruleUnaryOperatorName )
+            // InternalOCLstdlib.g:24394:1: ruleUnaryOperatorName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());
@@ -70693,17 +70693,17 @@
 
 
     // $ANTLR start "rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2"
-    // InternalOCLstdlib.g:24399:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
+    // InternalOCLstdlib.g:24403:1: rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2 : ( rulePrefixedPrimaryExpCS ) ;
     public final void rule__PrefixedPrimaryExpCS__OwnedRightAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24403:1: ( ( rulePrefixedPrimaryExpCS ) )
-            // InternalOCLstdlib.g:24404:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLstdlib.g:24407:1: ( ( rulePrefixedPrimaryExpCS ) )
+            // InternalOCLstdlib.g:24408:1: ( rulePrefixedPrimaryExpCS )
             {
-            // InternalOCLstdlib.g:24404:1: ( rulePrefixedPrimaryExpCS )
-            // InternalOCLstdlib.g:24405:1: rulePrefixedPrimaryExpCS
+            // InternalOCLstdlib.g:24408:1: ( rulePrefixedPrimaryExpCS )
+            // InternalOCLstdlib.g:24409:1: rulePrefixedPrimaryExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());
@@ -70738,17 +70738,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedPathNameAssignment_0"
-    // InternalOCLstdlib.g:24414:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
+    // InternalOCLstdlib.g:24418:1: rule__NameExpCS__OwnedPathNameAssignment_0 : ( rulePathNameCS ) ;
     public final void rule__NameExpCS__OwnedPathNameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24418:1: ( ( rulePathNameCS ) )
-            // InternalOCLstdlib.g:24419:1: ( rulePathNameCS )
+            // InternalOCLstdlib.g:24422:1: ( ( rulePathNameCS ) )
+            // InternalOCLstdlib.g:24423:1: ( rulePathNameCS )
             {
-            // InternalOCLstdlib.g:24419:1: ( rulePathNameCS )
-            // InternalOCLstdlib.g:24420:1: rulePathNameCS
+            // InternalOCLstdlib.g:24423:1: ( rulePathNameCS )
+            // InternalOCLstdlib.g:24424:1: rulePathNameCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());
@@ -70783,17 +70783,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1"
-    // InternalOCLstdlib.g:24429:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
+    // InternalOCLstdlib.g:24433:1: rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1 : ( ruleSquareBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedSquareBracketedClausesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24433:1: ( ( ruleSquareBracketedClauseCS ) )
-            // InternalOCLstdlib.g:24434:1: ( ruleSquareBracketedClauseCS )
+            // InternalOCLstdlib.g:24437:1: ( ( ruleSquareBracketedClauseCS ) )
+            // InternalOCLstdlib.g:24438:1: ( ruleSquareBracketedClauseCS )
             {
-            // InternalOCLstdlib.g:24434:1: ( ruleSquareBracketedClauseCS )
-            // InternalOCLstdlib.g:24435:1: ruleSquareBracketedClauseCS
+            // InternalOCLstdlib.g:24438:1: ( ruleSquareBracketedClauseCS )
+            // InternalOCLstdlib.g:24439:1: ruleSquareBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());
@@ -70828,17 +70828,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2"
-    // InternalOCLstdlib.g:24444:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalOCLstdlib.g:24448:1: rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedRoundBracketedClauseAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24448:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalOCLstdlib.g:24449:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLstdlib.g:24452:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalOCLstdlib.g:24453:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalOCLstdlib.g:24449:1: ( ruleRoundBracketedClauseCS )
-            // InternalOCLstdlib.g:24450:1: ruleRoundBracketedClauseCS
+            // InternalOCLstdlib.g:24453:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLstdlib.g:24454:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());
@@ -70873,17 +70873,17 @@
 
 
     // $ANTLR start "rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3"
-    // InternalOCLstdlib.g:24459:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
+    // InternalOCLstdlib.g:24463:1: rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3 : ( ruleCurlyBracketedClauseCS ) ;
     public final void rule__NameExpCS__OwnedCurlyBracketedClauseAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24463:1: ( ( ruleCurlyBracketedClauseCS ) )
-            // InternalOCLstdlib.g:24464:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLstdlib.g:24467:1: ( ( ruleCurlyBracketedClauseCS ) )
+            // InternalOCLstdlib.g:24468:1: ( ruleCurlyBracketedClauseCS )
             {
-            // InternalOCLstdlib.g:24464:1: ( ruleCurlyBracketedClauseCS )
-            // InternalOCLstdlib.g:24465:1: ruleCurlyBracketedClauseCS
+            // InternalOCLstdlib.g:24468:1: ( ruleCurlyBracketedClauseCS )
+            // InternalOCLstdlib.g:24469:1: ruleCurlyBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());
@@ -70918,23 +70918,23 @@
 
 
     // $ANTLR start "rule__NameExpCS__IsPreAssignment_4_0"
-    // InternalOCLstdlib.g:24474:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
+    // InternalOCLstdlib.g:24478:1: rule__NameExpCS__IsPreAssignment_4_0 : ( ( '@' ) ) ;
     public final void rule__NameExpCS__IsPreAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24478:1: ( ( ( '@' ) ) )
-            // InternalOCLstdlib.g:24479:1: ( ( '@' ) )
+            // InternalOCLstdlib.g:24482:1: ( ( ( '@' ) ) )
+            // InternalOCLstdlib.g:24483:1: ( ( '@' ) )
             {
-            // InternalOCLstdlib.g:24479:1: ( ( '@' ) )
-            // InternalOCLstdlib.g:24480:1: ( '@' )
+            // InternalOCLstdlib.g:24483:1: ( ( '@' ) )
+            // InternalOCLstdlib.g:24484:1: ( '@' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
             }
-            // InternalOCLstdlib.g:24481:1: ( '@' )
-            // InternalOCLstdlib.g:24482:1: '@'
+            // InternalOCLstdlib.g:24485:1: ( '@' )
+            // InternalOCLstdlib.g:24486:1: '@'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());
@@ -70971,17 +70971,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0"
-    // InternalOCLstdlib.g:24497:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
+    // InternalOCLstdlib.g:24501:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24501:1: ( ( ruleShadowPartCS ) )
-            // InternalOCLstdlib.g:24502:1: ( ruleShadowPartCS )
+            // InternalOCLstdlib.g:24505:1: ( ( ruleShadowPartCS ) )
+            // InternalOCLstdlib.g:24506:1: ( ruleShadowPartCS )
             {
-            // InternalOCLstdlib.g:24502:1: ( ruleShadowPartCS )
-            // InternalOCLstdlib.g:24503:1: ruleShadowPartCS
+            // InternalOCLstdlib.g:24506:1: ( ruleShadowPartCS )
+            // InternalOCLstdlib.g:24507:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());
@@ -71016,17 +71016,17 @@
 
 
     // $ANTLR start "rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1"
-    // InternalOCLstdlib.g:24512:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
+    // InternalOCLstdlib.g:24516:1: rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1 : ( ruleShadowPartCS ) ;
     public final void rule__CurlyBracketedClauseCS__OwnedPartsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24516:1: ( ( ruleShadowPartCS ) )
-            // InternalOCLstdlib.g:24517:1: ( ruleShadowPartCS )
+            // InternalOCLstdlib.g:24520:1: ( ( ruleShadowPartCS ) )
+            // InternalOCLstdlib.g:24521:1: ( ruleShadowPartCS )
             {
-            // InternalOCLstdlib.g:24517:1: ( ruleShadowPartCS )
-            // InternalOCLstdlib.g:24518:1: ruleShadowPartCS
+            // InternalOCLstdlib.g:24521:1: ( ruleShadowPartCS )
+            // InternalOCLstdlib.g:24522:1: ruleShadowPartCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());
@@ -71061,17 +71061,17 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0"
-    // InternalOCLstdlib.g:24527:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
+    // InternalOCLstdlib.g:24531:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0 : ( ruleNavigatingArgCS ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24531:1: ( ( ruleNavigatingArgCS ) )
-            // InternalOCLstdlib.g:24532:1: ( ruleNavigatingArgCS )
+            // InternalOCLstdlib.g:24535:1: ( ( ruleNavigatingArgCS ) )
+            // InternalOCLstdlib.g:24536:1: ( ruleNavigatingArgCS )
             {
-            // InternalOCLstdlib.g:24532:1: ( ruleNavigatingArgCS )
-            // InternalOCLstdlib.g:24533:1: ruleNavigatingArgCS
+            // InternalOCLstdlib.g:24536:1: ( ruleNavigatingArgCS )
+            // InternalOCLstdlib.g:24537:1: ruleNavigatingArgCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());
@@ -71106,23 +71106,23 @@
 
 
     // $ANTLR start "rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1"
-    // InternalOCLstdlib.g:24542:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
+    // InternalOCLstdlib.g:24546:1: rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1 : ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) ;
     public final void rule__RoundBracketedClauseCS__OwnedArgumentsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24546:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
-            // InternalOCLstdlib.g:24547:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalOCLstdlib.g:24550:1: ( ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) ) )
+            // InternalOCLstdlib.g:24551:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
             {
-            // InternalOCLstdlib.g:24547:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
-            // InternalOCLstdlib.g:24548:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalOCLstdlib.g:24551:1: ( ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 ) )
+            // InternalOCLstdlib.g:24552:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsAlternatives_2_1_0());
             }
-            // InternalOCLstdlib.g:24549:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
-            // InternalOCLstdlib.g:24549:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
+            // InternalOCLstdlib.g:24553:1: ( rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0 )
+            // InternalOCLstdlib.g:24553:2: rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__RoundBracketedClauseCS__OwnedArgumentsAlternatives_2_1_0();
@@ -71157,17 +71157,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_1"
-    // InternalOCLstdlib.g:24558:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24562:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24562:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24563:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24566:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24567:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24563:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24564:1: ruleExpCS
+            // InternalOCLstdlib.g:24567:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24568:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());
@@ -71202,17 +71202,17 @@
 
 
     // $ANTLR start "rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1"
-    // InternalOCLstdlib.g:24573:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24577:1: rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1 : ( ruleExpCS ) ;
     public final void rule__SquareBracketedClauseCS__OwnedTermsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24577:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24578:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24581:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24582:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24578:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24579:1: ruleExpCS
+            // InternalOCLstdlib.g:24582:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24583:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());
@@ -71247,17 +71247,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0"
-    // InternalOCLstdlib.g:24588:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLstdlib.g:24592:1: rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedNameExpressionAssignment_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24592:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLstdlib.g:24593:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24596:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLstdlib.g:24597:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLstdlib.g:24593:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLstdlib.g:24594:1: ruleNavigatingArgExpCS
+            // InternalOCLstdlib.g:24597:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24598:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());
@@ -71292,17 +71292,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1"
-    // InternalOCLstdlib.g:24603:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLstdlib.g:24607:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24607:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLstdlib.g:24608:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24611:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLstdlib.g:24612:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLstdlib.g:24608:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLstdlib.g:24609:1: ruleCoIteratorVariableCS
+            // InternalOCLstdlib.g:24612:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24613:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());
@@ -71337,17 +71337,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1"
-    // InternalOCLstdlib.g:24618:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24622:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24622:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24623:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24626:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24627:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24623:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24624:1: ruleExpCS
+            // InternalOCLstdlib.g:24627:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24628:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());
@@ -71382,17 +71382,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1"
-    // InternalOCLstdlib.g:24633:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24637:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24637:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24638:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24641:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24642:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24638:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24639:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24642:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24643:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());
@@ -71427,17 +71427,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1"
-    // InternalOCLstdlib.g:24648:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLstdlib.g:24652:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24652:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLstdlib.g:24653:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24656:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLstdlib.g:24657:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLstdlib.g:24653:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLstdlib.g:24654:1: ruleCoIteratorVariableCS
+            // InternalOCLstdlib.g:24657:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24658:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());
@@ -71472,17 +71472,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1"
-    // InternalOCLstdlib.g:24663:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24667:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24667:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24668:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24671:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24672:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24668:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24669:1: ruleExpCS
+            // InternalOCLstdlib.g:24672:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24673:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());
@@ -71517,17 +71517,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1"
-    // InternalOCLstdlib.g:24678:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24682:1: rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_0_1_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24682:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24683:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24686:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24687:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24683:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24684:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24687:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24688:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());
@@ -71562,17 +71562,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1"
-    // InternalOCLstdlib.g:24693:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLstdlib.g:24697:1: rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingArgCS__OwnedCoIteratorAssignment_0_1_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24697:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLstdlib.g:24698:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24701:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLstdlib.g:24702:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLstdlib.g:24698:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLstdlib.g:24699:1: ruleCoIteratorVariableCS
+            // InternalOCLstdlib.g:24702:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24703:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());
@@ -71607,17 +71607,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3"
-    // InternalOCLstdlib.g:24708:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24712:1: rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedInitExpressionAssignment_0_1_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24712:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24713:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24716:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24717:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24713:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24714:1: ruleExpCS
+            // InternalOCLstdlib.g:24717:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24718:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());
@@ -71652,17 +71652,17 @@
 
 
     // $ANTLR start "rule__NavigatingArgCS__OwnedTypeAssignment_1_1"
-    // InternalOCLstdlib.g:24723:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24727:1: rule__NavigatingArgCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingArgCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24727:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24728:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24731:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24732:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24728:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24729:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24732:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24733:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -71697,23 +71697,23 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__PrefixAssignment_0"
-    // InternalOCLstdlib.g:24738:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
+    // InternalOCLstdlib.g:24742:1: rule__NavigatingBarArgCS__PrefixAssignment_0 : ( ( '|' ) ) ;
     public final void rule__NavigatingBarArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24742:1: ( ( ( '|' ) ) )
-            // InternalOCLstdlib.g:24743:1: ( ( '|' ) )
+            // InternalOCLstdlib.g:24746:1: ( ( ( '|' ) ) )
+            // InternalOCLstdlib.g:24747:1: ( ( '|' ) )
             {
-            // InternalOCLstdlib.g:24743:1: ( ( '|' ) )
-            // InternalOCLstdlib.g:24744:1: ( '|' )
+            // InternalOCLstdlib.g:24747:1: ( ( '|' ) )
+            // InternalOCLstdlib.g:24748:1: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
             }
-            // InternalOCLstdlib.g:24745:1: ( '|' )
-            // InternalOCLstdlib.g:24746:1: '|'
+            // InternalOCLstdlib.g:24749:1: ( '|' )
+            // InternalOCLstdlib.g:24750:1: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());
@@ -71750,17 +71750,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1"
-    // InternalOCLstdlib.g:24761:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLstdlib.g:24765:1: rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24765:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLstdlib.g:24766:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24769:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLstdlib.g:24770:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLstdlib.g:24766:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLstdlib.g:24767:1: ruleNavigatingArgExpCS
+            // InternalOCLstdlib.g:24770:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24771:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -71795,17 +71795,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1"
-    // InternalOCLstdlib.g:24776:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24780:1: rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24780:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24781:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24784:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24785:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24781:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24782:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24785:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24786:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -71840,17 +71840,17 @@
 
 
     // $ANTLR start "rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalOCLstdlib.g:24791:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24795:1: rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingBarArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24795:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24796:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24799:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24800:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24796:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24797:1: ruleExpCS
+            // InternalOCLstdlib.g:24800:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24801:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -71885,23 +71885,23 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__PrefixAssignment_0"
-    // InternalOCLstdlib.g:24806:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
+    // InternalOCLstdlib.g:24810:1: rule__NavigatingCommaArgCS__PrefixAssignment_0 : ( ( ',' ) ) ;
     public final void rule__NavigatingCommaArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24810:1: ( ( ( ',' ) ) )
-            // InternalOCLstdlib.g:24811:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:24814:1: ( ( ( ',' ) ) )
+            // InternalOCLstdlib.g:24815:1: ( ( ',' ) )
             {
-            // InternalOCLstdlib.g:24811:1: ( ( ',' ) )
-            // InternalOCLstdlib.g:24812:1: ( ',' )
+            // InternalOCLstdlib.g:24815:1: ( ( ',' ) )
+            // InternalOCLstdlib.g:24816:1: ( ',' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
             }
-            // InternalOCLstdlib.g:24813:1: ( ',' )
-            // InternalOCLstdlib.g:24814:1: ','
+            // InternalOCLstdlib.g:24817:1: ( ',' )
+            // InternalOCLstdlib.g:24818:1: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());
@@ -71938,17 +71938,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1"
-    // InternalOCLstdlib.g:24829:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLstdlib.g:24833:1: rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24833:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLstdlib.g:24834:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24837:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLstdlib.g:24838:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLstdlib.g:24834:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLstdlib.g:24835:1: ruleNavigatingArgExpCS
+            // InternalOCLstdlib.g:24838:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24839:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -71983,17 +71983,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1"
-    // InternalOCLstdlib.g:24844:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLstdlib.g:24848:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24848:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLstdlib.g:24849:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24852:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLstdlib.g:24853:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLstdlib.g:24849:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLstdlib.g:24850:1: ruleCoIteratorVariableCS
+            // InternalOCLstdlib.g:24853:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24854:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());
@@ -72028,17 +72028,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1"
-    // InternalOCLstdlib.g:24859:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24863:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_0_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24863:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24864:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24867:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24868:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24864:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24865:1: ruleExpCS
+            // InternalOCLstdlib.g:24868:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24869:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());
@@ -72073,17 +72073,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1"
-    // InternalOCLstdlib.g:24874:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24878:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24878:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24879:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24882:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24883:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24879:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24880:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24883:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24884:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());
@@ -72118,17 +72118,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1"
-    // InternalOCLstdlib.g:24889:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLstdlib.g:24893:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24893:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLstdlib.g:24894:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24897:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLstdlib.g:24898:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLstdlib.g:24894:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLstdlib.g:24895:1: ruleCoIteratorVariableCS
+            // InternalOCLstdlib.g:24898:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24899:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());
@@ -72163,17 +72163,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1"
-    // InternalOCLstdlib.g:24904:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24908:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24908:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24909:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24912:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24913:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24909:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24910:1: ruleExpCS
+            // InternalOCLstdlib.g:24913:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24914:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());
@@ -72208,17 +72208,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1"
-    // InternalOCLstdlib.g:24919:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:24923:1: rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedTypeAssignment_2_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24923:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:24924:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24927:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:24928:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:24924:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:24925:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:24928:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:24929:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());
@@ -72253,17 +72253,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1"
-    // InternalOCLstdlib.g:24934:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
+    // InternalOCLstdlib.g:24938:1: rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1 : ( ruleCoIteratorVariableCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedCoIteratorAssignment_2_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24938:1: ( ( ruleCoIteratorVariableCS ) )
-            // InternalOCLstdlib.g:24939:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24942:1: ( ( ruleCoIteratorVariableCS ) )
+            // InternalOCLstdlib.g:24943:1: ( ruleCoIteratorVariableCS )
             {
-            // InternalOCLstdlib.g:24939:1: ( ruleCoIteratorVariableCS )
-            // InternalOCLstdlib.g:24940:1: ruleCoIteratorVariableCS
+            // InternalOCLstdlib.g:24943:1: ( ruleCoIteratorVariableCS )
+            // InternalOCLstdlib.g:24944:1: ruleCoIteratorVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());
@@ -72298,17 +72298,17 @@
 
 
     // $ANTLR start "rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3"
-    // InternalOCLstdlib.g:24949:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:24953:1: rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3 : ( ruleExpCS ) ;
     public final void rule__NavigatingCommaArgCS__OwnedInitExpressionAssignment_2_2_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24953:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:24954:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24957:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:24958:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:24954:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:24955:1: ruleExpCS
+            // InternalOCLstdlib.g:24958:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:24959:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());
@@ -72343,23 +72343,23 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__PrefixAssignment_0"
-    // InternalOCLstdlib.g:24964:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
+    // InternalOCLstdlib.g:24968:1: rule__NavigatingSemiArgCS__PrefixAssignment_0 : ( ( ';' ) ) ;
     public final void rule__NavigatingSemiArgCS__PrefixAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24968:1: ( ( ( ';' ) ) )
-            // InternalOCLstdlib.g:24969:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:24972:1: ( ( ( ';' ) ) )
+            // InternalOCLstdlib.g:24973:1: ( ( ';' ) )
             {
-            // InternalOCLstdlib.g:24969:1: ( ( ';' ) )
-            // InternalOCLstdlib.g:24970:1: ( ';' )
+            // InternalOCLstdlib.g:24973:1: ( ( ';' ) )
+            // InternalOCLstdlib.g:24974:1: ( ';' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
             }
-            // InternalOCLstdlib.g:24971:1: ( ';' )
-            // InternalOCLstdlib.g:24972:1: ';'
+            // InternalOCLstdlib.g:24975:1: ( ';' )
+            // InternalOCLstdlib.g:24976:1: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());
@@ -72396,17 +72396,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1"
-    // InternalOCLstdlib.g:24987:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
+    // InternalOCLstdlib.g:24991:1: rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1 : ( ruleNavigatingArgExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedNameExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:24991:1: ( ( ruleNavigatingArgExpCS ) )
-            // InternalOCLstdlib.g:24992:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24995:1: ( ( ruleNavigatingArgExpCS ) )
+            // InternalOCLstdlib.g:24996:1: ( ruleNavigatingArgExpCS )
             {
-            // InternalOCLstdlib.g:24992:1: ( ruleNavigatingArgExpCS )
-            // InternalOCLstdlib.g:24993:1: ruleNavigatingArgExpCS
+            // InternalOCLstdlib.g:24996:1: ( ruleNavigatingArgExpCS )
+            // InternalOCLstdlib.g:24997:1: ruleNavigatingArgExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());
@@ -72441,17 +72441,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1"
-    // InternalOCLstdlib.g:25002:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:25006:1: rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25006:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:25007:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:25010:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:25011:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:25007:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:25008:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:25011:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:25012:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -72486,17 +72486,17 @@
 
 
     // $ANTLR start "rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1"
-    // InternalOCLstdlib.g:25017:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25021:1: rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1 : ( ruleExpCS ) ;
     public final void rule__NavigatingSemiArgCS__OwnedInitExpressionAssignment_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25021:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25022:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25025:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25026:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25022:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25023:1: ruleExpCS
+            // InternalOCLstdlib.g:25026:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25027:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());
@@ -72531,17 +72531,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__NameAssignment_0"
-    // InternalOCLstdlib.g:25032:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:25036:1: rule__CoIteratorVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__CoIteratorVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25036:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:25037:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25040:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:25041:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:25037:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:25038:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:25041:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25042:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -72576,17 +72576,17 @@
 
 
     // $ANTLR start "rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1"
-    // InternalOCLstdlib.g:25047:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:25051:1: rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1 : ( ruleTypeExpCS ) ;
     public final void rule__CoIteratorVariableCS__OwnedTypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25051:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:25052:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:25055:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:25056:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:25052:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:25053:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:25056:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:25057:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());
@@ -72621,23 +72621,23 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedConditionAssignment_1"
-    // InternalOCLstdlib.g:25062:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
+    // InternalOCLstdlib.g:25066:1: rule__IfExpCS__OwnedConditionAssignment_1 : ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) ;
     public final void rule__IfExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25066:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
-            // InternalOCLstdlib.g:25067:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalOCLstdlib.g:25070:1: ( ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) ) )
+            // InternalOCLstdlib.g:25071:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
             {
-            // InternalOCLstdlib.g:25067:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
-            // InternalOCLstdlib.g:25068:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalOCLstdlib.g:25071:1: ( ( rule__IfExpCS__OwnedConditionAlternatives_1_0 ) )
+            // InternalOCLstdlib.g:25072:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedConditionAlternatives_1_0());
             }
-            // InternalOCLstdlib.g:25069:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
-            // InternalOCLstdlib.g:25069:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
+            // InternalOCLstdlib.g:25073:1: ( rule__IfExpCS__OwnedConditionAlternatives_1_0 )
+            // InternalOCLstdlib.g:25073:2: rule__IfExpCS__OwnedConditionAlternatives_1_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__IfExpCS__OwnedConditionAlternatives_1_0();
@@ -72672,17 +72672,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedThenExpressionAssignment_3"
-    // InternalOCLstdlib.g:25078:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25082:1: rule__IfExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25082:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25083:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25086:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25087:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25083:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25084:1: ruleExpCS
+            // InternalOCLstdlib.g:25087:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25088:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -72717,17 +72717,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedIfThenExpressionsAssignment_4"
-    // InternalOCLstdlib.g:25093:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
+    // InternalOCLstdlib.g:25097:1: rule__IfExpCS__OwnedIfThenExpressionsAssignment_4 : ( ruleElseIfThenExpCS ) ;
     public final void rule__IfExpCS__OwnedIfThenExpressionsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25097:1: ( ( ruleElseIfThenExpCS ) )
-            // InternalOCLstdlib.g:25098:1: ( ruleElseIfThenExpCS )
+            // InternalOCLstdlib.g:25101:1: ( ( ruleElseIfThenExpCS ) )
+            // InternalOCLstdlib.g:25102:1: ( ruleElseIfThenExpCS )
             {
-            // InternalOCLstdlib.g:25098:1: ( ruleElseIfThenExpCS )
-            // InternalOCLstdlib.g:25099:1: ruleElseIfThenExpCS
+            // InternalOCLstdlib.g:25102:1: ( ruleElseIfThenExpCS )
+            // InternalOCLstdlib.g:25103:1: ruleElseIfThenExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());
@@ -72762,17 +72762,17 @@
 
 
     // $ANTLR start "rule__IfExpCS__OwnedElseExpressionAssignment_6"
-    // InternalOCLstdlib.g:25108:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25112:1: rule__IfExpCS__OwnedElseExpressionAssignment_6 : ( ruleExpCS ) ;
     public final void rule__IfExpCS__OwnedElseExpressionAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25112:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25113:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25116:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25117:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25113:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25114:1: ruleExpCS
+            // InternalOCLstdlib.g:25117:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25118:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());
@@ -72807,17 +72807,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedConditionAssignment_1"
-    // InternalOCLstdlib.g:25123:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25127:1: rule__ElseIfThenExpCS__OwnedConditionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedConditionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25127:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25128:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25131:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25132:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25128:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25129:1: ruleExpCS
+            // InternalOCLstdlib.g:25132:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25133:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());
@@ -72852,17 +72852,17 @@
 
 
     // $ANTLR start "rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3"
-    // InternalOCLstdlib.g:25138:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25142:1: rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3 : ( ruleExpCS ) ;
     public final void rule__ElseIfThenExpCS__OwnedThenExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25142:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25143:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25146:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25147:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25143:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25144:1: ruleExpCS
+            // InternalOCLstdlib.g:25147:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25148:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());
@@ -72897,17 +72897,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_1"
-    // InternalOCLstdlib.g:25153:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
+    // InternalOCLstdlib.g:25157:1: rule__LetExpCS__OwnedVariablesAssignment_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25157:1: ( ( ruleLetVariableCS ) )
-            // InternalOCLstdlib.g:25158:1: ( ruleLetVariableCS )
+            // InternalOCLstdlib.g:25161:1: ( ( ruleLetVariableCS ) )
+            // InternalOCLstdlib.g:25162:1: ( ruleLetVariableCS )
             {
-            // InternalOCLstdlib.g:25158:1: ( ruleLetVariableCS )
-            // InternalOCLstdlib.g:25159:1: ruleLetVariableCS
+            // InternalOCLstdlib.g:25162:1: ( ruleLetVariableCS )
+            // InternalOCLstdlib.g:25163:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());
@@ -72942,17 +72942,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedVariablesAssignment_2_1"
-    // InternalOCLstdlib.g:25168:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
+    // InternalOCLstdlib.g:25172:1: rule__LetExpCS__OwnedVariablesAssignment_2_1 : ( ruleLetVariableCS ) ;
     public final void rule__LetExpCS__OwnedVariablesAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25172:1: ( ( ruleLetVariableCS ) )
-            // InternalOCLstdlib.g:25173:1: ( ruleLetVariableCS )
+            // InternalOCLstdlib.g:25176:1: ( ( ruleLetVariableCS ) )
+            // InternalOCLstdlib.g:25177:1: ( ruleLetVariableCS )
             {
-            // InternalOCLstdlib.g:25173:1: ( ruleLetVariableCS )
-            // InternalOCLstdlib.g:25174:1: ruleLetVariableCS
+            // InternalOCLstdlib.g:25177:1: ( ruleLetVariableCS )
+            // InternalOCLstdlib.g:25178:1: ruleLetVariableCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());
@@ -72987,17 +72987,17 @@
 
 
     // $ANTLR start "rule__LetExpCS__OwnedInExpressionAssignment_4"
-    // InternalOCLstdlib.g:25183:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25187:1: rule__LetExpCS__OwnedInExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetExpCS__OwnedInExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25187:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25188:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25191:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25192:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25188:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25189:1: ruleExpCS
+            // InternalOCLstdlib.g:25192:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25193:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());
@@ -73032,17 +73032,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__NameAssignment_0"
-    // InternalOCLstdlib.g:25198:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:25202:1: rule__LetVariableCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__LetVariableCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25202:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:25203:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25206:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:25207:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:25203:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:25204:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:25207:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25208:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -73077,17 +73077,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1"
-    // InternalOCLstdlib.g:25213:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
+    // InternalOCLstdlib.g:25217:1: rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1 : ( ruleRoundBracketedClauseCS ) ;
     public final void rule__LetVariableCS__OwnedRoundBracketedClauseAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25217:1: ( ( ruleRoundBracketedClauseCS ) )
-            // InternalOCLstdlib.g:25218:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLstdlib.g:25221:1: ( ( ruleRoundBracketedClauseCS ) )
+            // InternalOCLstdlib.g:25222:1: ( ruleRoundBracketedClauseCS )
             {
-            // InternalOCLstdlib.g:25218:1: ( ruleRoundBracketedClauseCS )
-            // InternalOCLstdlib.g:25219:1: ruleRoundBracketedClauseCS
+            // InternalOCLstdlib.g:25222:1: ( ruleRoundBracketedClauseCS )
+            // InternalOCLstdlib.g:25223:1: ruleRoundBracketedClauseCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());
@@ -73122,17 +73122,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedTypeAssignment_2_1"
-    // InternalOCLstdlib.g:25228:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
+    // InternalOCLstdlib.g:25232:1: rule__LetVariableCS__OwnedTypeAssignment_2_1 : ( ruleTypeExpCS ) ;
     public final void rule__LetVariableCS__OwnedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25232:1: ( ( ruleTypeExpCS ) )
-            // InternalOCLstdlib.g:25233:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:25236:1: ( ( ruleTypeExpCS ) )
+            // InternalOCLstdlib.g:25237:1: ( ruleTypeExpCS )
             {
-            // InternalOCLstdlib.g:25233:1: ( ruleTypeExpCS )
-            // InternalOCLstdlib.g:25234:1: ruleTypeExpCS
+            // InternalOCLstdlib.g:25237:1: ( ruleTypeExpCS )
+            // InternalOCLstdlib.g:25238:1: ruleTypeExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());
@@ -73167,17 +73167,17 @@
 
 
     // $ANTLR start "rule__LetVariableCS__OwnedInitExpressionAssignment_4"
-    // InternalOCLstdlib.g:25243:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25247:1: rule__LetVariableCS__OwnedInitExpressionAssignment_4 : ( ruleExpCS ) ;
     public final void rule__LetVariableCS__OwnedInitExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25247:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25248:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25251:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25252:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25248:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25249:1: ruleExpCS
+            // InternalOCLstdlib.g:25252:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25253:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());
@@ -73212,17 +73212,17 @@
 
 
     // $ANTLR start "rule__NestedExpCS__OwnedExpressionAssignment_1"
-    // InternalOCLstdlib.g:25258:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
+    // InternalOCLstdlib.g:25262:1: rule__NestedExpCS__OwnedExpressionAssignment_1 : ( ruleExpCS ) ;
     public final void rule__NestedExpCS__OwnedExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25262:1: ( ( ruleExpCS ) )
-            // InternalOCLstdlib.g:25263:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25266:1: ( ( ruleExpCS ) )
+            // InternalOCLstdlib.g:25267:1: ( ruleExpCS )
             {
-            // InternalOCLstdlib.g:25263:1: ( ruleExpCS )
-            // InternalOCLstdlib.g:25264:1: ruleExpCS
+            // InternalOCLstdlib.g:25267:1: ( ruleExpCS )
+            // InternalOCLstdlib.g:25268:1: ruleExpCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());
@@ -73257,17 +73257,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__LowerBoundAssignment_0"
-    // InternalOCLstdlib.g:25273:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
+    // InternalOCLstdlib.g:25277:1: rule__MultiplicityBoundsCS__LowerBoundAssignment_0 : ( ruleLOWER ) ;
     public final void rule__MultiplicityBoundsCS__LowerBoundAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25277:1: ( ( ruleLOWER ) )
-            // InternalOCLstdlib.g:25278:1: ( ruleLOWER )
+            // InternalOCLstdlib.g:25281:1: ( ( ruleLOWER ) )
+            // InternalOCLstdlib.g:25282:1: ( ruleLOWER )
             {
-            // InternalOCLstdlib.g:25278:1: ( ruleLOWER )
-            // InternalOCLstdlib.g:25279:1: ruleLOWER
+            // InternalOCLstdlib.g:25282:1: ( ruleLOWER )
+            // InternalOCLstdlib.g:25283:1: ruleLOWER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());
@@ -73302,17 +73302,17 @@
 
 
     // $ANTLR start "rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1"
-    // InternalOCLstdlib.g:25288:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
+    // InternalOCLstdlib.g:25292:1: rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1 : ( ruleUPPER ) ;
     public final void rule__MultiplicityBoundsCS__UpperBoundAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25292:1: ( ( ruleUPPER ) )
-            // InternalOCLstdlib.g:25293:1: ( ruleUPPER )
+            // InternalOCLstdlib.g:25296:1: ( ( ruleUPPER ) )
+            // InternalOCLstdlib.g:25297:1: ( ruleUPPER )
             {
-            // InternalOCLstdlib.g:25293:1: ( ruleUPPER )
-            // InternalOCLstdlib.g:25294:1: ruleUPPER
+            // InternalOCLstdlib.g:25297:1: ( ruleUPPER )
+            // InternalOCLstdlib.g:25298:1: ruleUPPER
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());
@@ -73347,23 +73347,23 @@
 
 
     // $ANTLR start "rule__MultiplicityCS__IsNullFreeAssignment_2_1"
-    // InternalOCLstdlib.g:25303:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
+    // InternalOCLstdlib.g:25307:1: rule__MultiplicityCS__IsNullFreeAssignment_2_1 : ( ( '|1' ) ) ;
     public final void rule__MultiplicityCS__IsNullFreeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25307:1: ( ( ( '|1' ) ) )
-            // InternalOCLstdlib.g:25308:1: ( ( '|1' ) )
+            // InternalOCLstdlib.g:25311:1: ( ( ( '|1' ) ) )
+            // InternalOCLstdlib.g:25312:1: ( ( '|1' ) )
             {
-            // InternalOCLstdlib.g:25308:1: ( ( '|1' ) )
-            // InternalOCLstdlib.g:25309:1: ( '|1' )
+            // InternalOCLstdlib.g:25312:1: ( ( '|1' ) )
+            // InternalOCLstdlib.g:25313:1: ( '|1' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
             }
-            // InternalOCLstdlib.g:25310:1: ( '|1' )
-            // InternalOCLstdlib.g:25311:1: '|1'
+            // InternalOCLstdlib.g:25314:1: ( '|1' )
+            // InternalOCLstdlib.g:25315:1: '|1'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());
@@ -73400,23 +73400,23 @@
 
 
     // $ANTLR start "rule__MultiplicityStringCS__StringBoundsAssignment"
-    // InternalOCLstdlib.g:25326:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
+    // InternalOCLstdlib.g:25330:1: rule__MultiplicityStringCS__StringBoundsAssignment : ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) ;
     public final void rule__MultiplicityStringCS__StringBoundsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25330:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
-            // InternalOCLstdlib.g:25331:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalOCLstdlib.g:25334:1: ( ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) ) )
+            // InternalOCLstdlib.g:25335:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
             {
-            // InternalOCLstdlib.g:25331:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
-            // InternalOCLstdlib.g:25332:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalOCLstdlib.g:25335:1: ( ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 ) )
+            // InternalOCLstdlib.g:25336:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAlternatives_0());
             }
-            // InternalOCLstdlib.g:25333:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
-            // InternalOCLstdlib.g:25333:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
+            // InternalOCLstdlib.g:25337:1: ( rule__MultiplicityStringCS__StringBoundsAlternatives_0 )
+            // InternalOCLstdlib.g:25337:2: rule__MultiplicityStringCS__StringBoundsAlternatives_0
             {
             pushFollow(FollowSets000.FOLLOW_2);
             rule__MultiplicityStringCS__StringBoundsAlternatives_0();
@@ -73451,17 +73451,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_0"
-    // InternalOCLstdlib.g:25342:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
+    // InternalOCLstdlib.g:25346:1: rule__PathNameCS__OwnedPathElementsAssignment_0 : ( ruleFirstPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25346:1: ( ( ruleFirstPathElementCS ) )
-            // InternalOCLstdlib.g:25347:1: ( ruleFirstPathElementCS )
+            // InternalOCLstdlib.g:25350:1: ( ( ruleFirstPathElementCS ) )
+            // InternalOCLstdlib.g:25351:1: ( ruleFirstPathElementCS )
             {
-            // InternalOCLstdlib.g:25347:1: ( ruleFirstPathElementCS )
-            // InternalOCLstdlib.g:25348:1: ruleFirstPathElementCS
+            // InternalOCLstdlib.g:25351:1: ( ruleFirstPathElementCS )
+            // InternalOCLstdlib.g:25352:1: ruleFirstPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());
@@ -73496,17 +73496,17 @@
 
 
     // $ANTLR start "rule__PathNameCS__OwnedPathElementsAssignment_1_1"
-    // InternalOCLstdlib.g:25357:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
+    // InternalOCLstdlib.g:25361:1: rule__PathNameCS__OwnedPathElementsAssignment_1_1 : ( ruleNextPathElementCS ) ;
     public final void rule__PathNameCS__OwnedPathElementsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25361:1: ( ( ruleNextPathElementCS ) )
-            // InternalOCLstdlib.g:25362:1: ( ruleNextPathElementCS )
+            // InternalOCLstdlib.g:25365:1: ( ( ruleNextPathElementCS ) )
+            // InternalOCLstdlib.g:25366:1: ( ruleNextPathElementCS )
             {
-            // InternalOCLstdlib.g:25362:1: ( ruleNextPathElementCS )
-            // InternalOCLstdlib.g:25363:1: ruleNextPathElementCS
+            // InternalOCLstdlib.g:25366:1: ( ruleNextPathElementCS )
+            // InternalOCLstdlib.g:25367:1: ruleNextPathElementCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());
@@ -73541,23 +73541,23 @@
 
 
     // $ANTLR start "rule__FirstPathElementCS__ReferredElementAssignment"
-    // InternalOCLstdlib.g:25372:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLstdlib.g:25378:1: rule__FirstPathElementCS__ReferredElementAssignment : ( ( ruleUnrestrictedName ) ) ;
     public final void rule__FirstPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25376:1: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLstdlib.g:25377:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:25382:1: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLstdlib.g:25383:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLstdlib.g:25377:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:25378:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25383:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:25384:1: ( ruleUnrestrictedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalOCLstdlib.g:25379:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:25380:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:25385:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25386:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementUnrestrictedNameParserRuleCall_0_1());
@@ -73598,23 +73598,23 @@
 
 
     // $ANTLR start "rule__NextPathElementCS__ReferredElementAssignment"
-    // InternalOCLstdlib.g:25391:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
+    // InternalOCLstdlib.g:25397:1: rule__NextPathElementCS__ReferredElementAssignment : ( ( ruleUnreservedName ) ) ;
     public final void rule__NextPathElementCS__ReferredElementAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25395:1: ( ( ( ruleUnreservedName ) ) )
-            // InternalOCLstdlib.g:25396:1: ( ( ruleUnreservedName ) )
+            // InternalOCLstdlib.g:25401:1: ( ( ( ruleUnreservedName ) ) )
+            // InternalOCLstdlib.g:25402:1: ( ( ruleUnreservedName ) )
             {
-            // InternalOCLstdlib.g:25396:1: ( ( ruleUnreservedName ) )
-            // InternalOCLstdlib.g:25397:1: ( ruleUnreservedName )
+            // InternalOCLstdlib.g:25402:1: ( ( ruleUnreservedName ) )
+            // InternalOCLstdlib.g:25403:1: ( ruleUnreservedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());
             }
-            // InternalOCLstdlib.g:25398:1: ( ruleUnreservedName )
-            // InternalOCLstdlib.g:25399:1: ruleUnreservedName
+            // InternalOCLstdlib.g:25404:1: ( ruleUnreservedName )
+            // InternalOCLstdlib.g:25405:1: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementUnreservedNameParserRuleCall_0_1());
@@ -73655,17 +73655,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0"
-    // InternalOCLstdlib.g:25410:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalOCLstdlib.g:25416:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25414:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalOCLstdlib.g:25415:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLstdlib.g:25420:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalOCLstdlib.g:25421:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalOCLstdlib.g:25415:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalOCLstdlib.g:25416:1: ruleTemplateParameterSubstitutionCS
+            // InternalOCLstdlib.g:25421:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLstdlib.g:25422:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_0_0());
@@ -73700,17 +73700,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1"
-    // InternalOCLstdlib.g:25425:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
+    // InternalOCLstdlib.g:25431:1: rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1 : ( ruleTemplateParameterSubstitutionCS ) ;
     public final void rule__TemplateBindingCS__OwnedSubstitutionsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25429:1: ( ( ruleTemplateParameterSubstitutionCS ) )
-            // InternalOCLstdlib.g:25430:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLstdlib.g:25435:1: ( ( ruleTemplateParameterSubstitutionCS ) )
+            // InternalOCLstdlib.g:25436:1: ( ruleTemplateParameterSubstitutionCS )
             {
-            // InternalOCLstdlib.g:25430:1: ( ruleTemplateParameterSubstitutionCS )
-            // InternalOCLstdlib.g:25431:1: ruleTemplateParameterSubstitutionCS
+            // InternalOCLstdlib.g:25436:1: ( ruleTemplateParameterSubstitutionCS )
+            // InternalOCLstdlib.g:25437:1: ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedSubstitutionsTemplateParameterSubstitutionCSParserRuleCall_1_1_0());
@@ -73745,17 +73745,17 @@
 
 
     // $ANTLR start "rule__TemplateBindingCS__OwnedMultiplicityAssignment_2"
-    // InternalOCLstdlib.g:25440:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
+    // InternalOCLstdlib.g:25446:1: rule__TemplateBindingCS__OwnedMultiplicityAssignment_2 : ( ruleMultiplicityCS ) ;
     public final void rule__TemplateBindingCS__OwnedMultiplicityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25444:1: ( ( ruleMultiplicityCS ) )
-            // InternalOCLstdlib.g:25445:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:25450:1: ( ( ruleMultiplicityCS ) )
+            // InternalOCLstdlib.g:25451:1: ( ruleMultiplicityCS )
             {
-            // InternalOCLstdlib.g:25445:1: ( ruleMultiplicityCS )
-            // InternalOCLstdlib.g:25446:1: ruleMultiplicityCS
+            // InternalOCLstdlib.g:25451:1: ( ruleMultiplicityCS )
+            // InternalOCLstdlib.g:25452:1: ruleMultiplicityCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateBindingCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_0());
@@ -73790,17 +73790,17 @@
 
 
     // $ANTLR start "rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment"
-    // InternalOCLstdlib.g:25455:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
+    // InternalOCLstdlib.g:25461:1: rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment : ( ruleTypeRefCS ) ;
     public final void rule__TemplateParameterSubstitutionCS__OwnedActualParameterAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25459:1: ( ( ruleTypeRefCS ) )
-            // InternalOCLstdlib.g:25460:1: ( ruleTypeRefCS )
+            // InternalOCLstdlib.g:25465:1: ( ( ruleTypeRefCS ) )
+            // InternalOCLstdlib.g:25466:1: ( ruleTypeRefCS )
             {
-            // InternalOCLstdlib.g:25460:1: ( ruleTypeRefCS )
-            // InternalOCLstdlib.g:25461:1: ruleTypeRefCS
+            // InternalOCLstdlib.g:25466:1: ( ruleTypeRefCS )
+            // InternalOCLstdlib.g:25467:1: ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());
@@ -73835,17 +73835,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_1"
-    // InternalOCLstdlib.g:25470:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1 : ( ruleTypeParameterCS ) ;
+    // InternalOCLstdlib.g:25476:1: rule__TemplateSignatureCS__OwnedParametersAssignment_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25474:1: ( ( ruleTypeParameterCS ) )
-            // InternalOCLstdlib.g:25475:1: ( ruleTypeParameterCS )
+            // InternalOCLstdlib.g:25480:1: ( ( ruleTypeParameterCS ) )
+            // InternalOCLstdlib.g:25481:1: ( ruleTypeParameterCS )
             {
-            // InternalOCLstdlib.g:25475:1: ( ruleTypeParameterCS )
-            // InternalOCLstdlib.g:25476:1: ruleTypeParameterCS
+            // InternalOCLstdlib.g:25481:1: ( ruleTypeParameterCS )
+            // InternalOCLstdlib.g:25482:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_0());
@@ -73880,17 +73880,17 @@
 
 
     // $ANTLR start "rule__TemplateSignatureCS__OwnedParametersAssignment_2_1"
-    // InternalOCLstdlib.g:25485:1: rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 : ( ruleTypeParameterCS ) ;
+    // InternalOCLstdlib.g:25491:1: rule__TemplateSignatureCS__OwnedParametersAssignment_2_1 : ( ruleTypeParameterCS ) ;
     public final void rule__TemplateSignatureCS__OwnedParametersAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25489:1: ( ( ruleTypeParameterCS ) )
-            // InternalOCLstdlib.g:25490:1: ( ruleTypeParameterCS )
+            // InternalOCLstdlib.g:25495:1: ( ( ruleTypeParameterCS ) )
+            // InternalOCLstdlib.g:25496:1: ( ruleTypeParameterCS )
             {
-            // InternalOCLstdlib.g:25490:1: ( ruleTypeParameterCS )
-            // InternalOCLstdlib.g:25491:1: ruleTypeParameterCS
+            // InternalOCLstdlib.g:25496:1: ( ruleTypeParameterCS )
+            // InternalOCLstdlib.g:25497:1: ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_2_1_0());
@@ -73925,17 +73925,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__NameAssignment_0"
-    // InternalOCLstdlib.g:25500:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
+    // InternalOCLstdlib.g:25506:1: rule__TypeParameterCS__NameAssignment_0 : ( ruleUnrestrictedName ) ;
     public final void rule__TypeParameterCS__NameAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25504:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:25505:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25510:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:25511:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:25505:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:25506:1: ruleUnrestrictedName
+            // InternalOCLstdlib.g:25511:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:25512:1: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());
@@ -73970,17 +73970,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_1"
-    // InternalOCLstdlib.g:25515:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLstdlib.g:25521:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25519:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLstdlib.g:25520:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:25525:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLstdlib.g:25526:1: ( ruleTypedRefCS )
             {
-            // InternalOCLstdlib.g:25520:1: ( ruleTypedRefCS )
-            // InternalOCLstdlib.g:25521:1: ruleTypedRefCS
+            // InternalOCLstdlib.g:25526:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:25527:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());
@@ -74015,17 +74015,17 @@
 
 
     // $ANTLR start "rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1"
-    // InternalOCLstdlib.g:25530:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLstdlib.g:25536:1: rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__TypeParameterCS__OwnedExtendsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25534:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLstdlib.g:25535:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:25540:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLstdlib.g:25541:1: ( ruleTypedRefCS )
             {
-            // InternalOCLstdlib.g:25535:1: ( ruleTypedRefCS )
-            // InternalOCLstdlib.g:25536:1: ruleTypedRefCS
+            // InternalOCLstdlib.g:25541:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:25542:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());
@@ -74060,17 +74060,17 @@
 
 
     // $ANTLR start "rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1"
-    // InternalOCLstdlib.g:25545:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
+    // InternalOCLstdlib.g:25551:1: rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1 : ( ruleTypedRefCS ) ;
     public final void rule__WildcardTypeRefCS__OwnedExtendsAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
 
         try {
-            // InternalOCLstdlib.g:25549:1: ( ( ruleTypedRefCS ) )
-            // InternalOCLstdlib.g:25550:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:25555:1: ( ( ruleTypedRefCS ) )
+            // InternalOCLstdlib.g:25556:1: ( ruleTypedRefCS )
             {
-            // InternalOCLstdlib.g:25550:1: ( ruleTypedRefCS )
-            // InternalOCLstdlib.g:25551:1: ruleTypedRefCS
+            // InternalOCLstdlib.g:25556:1: ( ruleTypedRefCS )
+            // InternalOCLstdlib.g:25557:1: ruleTypedRefCS
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());
@@ -74105,11 +74105,11 @@
 
     // $ANTLR start synpred132_InternalOCLstdlib
     public final void synpred132_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:4938:6: ( ( ruleTypeLiteralCS ) )
-        // InternalOCLstdlib.g:4938:6: ( ruleTypeLiteralCS )
+        // InternalOCLstdlib.g:4940:6: ( ( ruleTypeLiteralCS ) )
+        // InternalOCLstdlib.g:4940:6: ( ruleTypeLiteralCS )
         {
-        // InternalOCLstdlib.g:4938:6: ( ruleTypeLiteralCS )
-        // InternalOCLstdlib.g:4939:1: ruleTypeLiteralCS
+        // InternalOCLstdlib.g:4940:6: ( ruleTypeLiteralCS )
+        // InternalOCLstdlib.g:4941:1: ruleTypeLiteralCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());
@@ -74129,17 +74129,17 @@
 
     // $ANTLR start synpred133_InternalOCLstdlib
     public final void synpred133_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:4960:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
-        // InternalOCLstdlib.g:4960:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalOCLstdlib.g:4962:1: ( ( ( rule__ExpCS__Group_0__0 ) ) )
+        // InternalOCLstdlib.g:4962:1: ( ( rule__ExpCS__Group_0__0 ) )
         {
-        // InternalOCLstdlib.g:4960:1: ( ( rule__ExpCS__Group_0__0 ) )
-        // InternalOCLstdlib.g:4961:1: ( rule__ExpCS__Group_0__0 )
+        // InternalOCLstdlib.g:4962:1: ( ( rule__ExpCS__Group_0__0 ) )
+        // InternalOCLstdlib.g:4963:1: ( rule__ExpCS__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getExpCSAccess().getGroup_0());
         }
-        // InternalOCLstdlib.g:4962:1: ( rule__ExpCS__Group_0__0 )
-        // InternalOCLstdlib.g:4962:2: rule__ExpCS__Group_0__0
+        // InternalOCLstdlib.g:4964:1: ( rule__ExpCS__Group_0__0 )
+        // InternalOCLstdlib.g:4964:2: rule__ExpCS__Group_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__ExpCS__Group_0__0();
@@ -74159,11 +74159,11 @@
 
     // $ANTLR start synpred140_InternalOCLstdlib
     public final void synpred140_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5050:6: ( ( ruleTupleLiteralExpCS ) )
-        // InternalOCLstdlib.g:5050:6: ( ruleTupleLiteralExpCS )
+        // InternalOCLstdlib.g:5052:6: ( ( ruleTupleLiteralExpCS ) )
+        // InternalOCLstdlib.g:5052:6: ( ruleTupleLiteralExpCS )
         {
-        // InternalOCLstdlib.g:5050:6: ( ruleTupleLiteralExpCS )
-        // InternalOCLstdlib.g:5051:1: ruleTupleLiteralExpCS
+        // InternalOCLstdlib.g:5052:6: ( ruleTupleLiteralExpCS )
+        // InternalOCLstdlib.g:5053:1: ruleTupleLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());
@@ -74183,11 +74183,11 @@
 
     // $ANTLR start synpred141_InternalOCLstdlib
     public final void synpred141_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5056:6: ( ( ruleMapLiteralExpCS ) )
-        // InternalOCLstdlib.g:5056:6: ( ruleMapLiteralExpCS )
+        // InternalOCLstdlib.g:5058:6: ( ( ruleMapLiteralExpCS ) )
+        // InternalOCLstdlib.g:5058:6: ( ruleMapLiteralExpCS )
         {
-        // InternalOCLstdlib.g:5056:6: ( ruleMapLiteralExpCS )
-        // InternalOCLstdlib.g:5057:1: ruleMapLiteralExpCS
+        // InternalOCLstdlib.g:5058:6: ( ruleMapLiteralExpCS )
+        // InternalOCLstdlib.g:5059:1: ruleMapLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());
@@ -74207,11 +74207,11 @@
 
     // $ANTLR start synpred142_InternalOCLstdlib
     public final void synpred142_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5062:6: ( ( ruleCollectionLiteralExpCS ) )
-        // InternalOCLstdlib.g:5062:6: ( ruleCollectionLiteralExpCS )
+        // InternalOCLstdlib.g:5064:6: ( ( ruleCollectionLiteralExpCS ) )
+        // InternalOCLstdlib.g:5064:6: ( ruleCollectionLiteralExpCS )
         {
-        // InternalOCLstdlib.g:5062:6: ( ruleCollectionLiteralExpCS )
-        // InternalOCLstdlib.g:5063:1: ruleCollectionLiteralExpCS
+        // InternalOCLstdlib.g:5064:6: ( ruleCollectionLiteralExpCS )
+        // InternalOCLstdlib.g:5065:1: ruleCollectionLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());
@@ -74231,11 +74231,11 @@
 
     // $ANTLR start synpred144_InternalOCLstdlib
     public final void synpred144_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5074:6: ( ( ruleTypeLiteralExpCS ) )
-        // InternalOCLstdlib.g:5074:6: ( ruleTypeLiteralExpCS )
+        // InternalOCLstdlib.g:5076:6: ( ( ruleTypeLiteralExpCS ) )
+        // InternalOCLstdlib.g:5076:6: ( ruleTypeLiteralExpCS )
         {
-        // InternalOCLstdlib.g:5074:6: ( ruleTypeLiteralExpCS )
-        // InternalOCLstdlib.g:5075:1: ruleTypeLiteralExpCS
+        // InternalOCLstdlib.g:5076:6: ( ruleTypeLiteralExpCS )
+        // InternalOCLstdlib.g:5077:1: ruleTypeLiteralExpCS
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());
@@ -74255,17 +74255,17 @@
 
     // $ANTLR start synpred148_InternalOCLstdlib
     public final void synpred148_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5146:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
-        // InternalOCLstdlib.g:5146:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalOCLstdlib.g:5148:1: ( ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) ) )
+        // InternalOCLstdlib.g:5148:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
         {
-        // InternalOCLstdlib.g:5146:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
-        // InternalOCLstdlib.g:5147:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalOCLstdlib.g:5148:1: ( ( rule__NavigatingArgCS__Group_0_1_0__0 ) )
+        // InternalOCLstdlib.g:5149:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_0());
         }
-        // InternalOCLstdlib.g:5148:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
-        // InternalOCLstdlib.g:5148:2: rule__NavigatingArgCS__Group_0_1_0__0
+        // InternalOCLstdlib.g:5150:1: ( rule__NavigatingArgCS__Group_0_1_0__0 )
+        // InternalOCLstdlib.g:5150:2: rule__NavigatingArgCS__Group_0_1_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_0__0();
@@ -74285,17 +74285,17 @@
 
     // $ANTLR start synpred149_InternalOCLstdlib
     public final void synpred149_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5152:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
-        // InternalOCLstdlib.g:5152:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalOCLstdlib.g:5154:6: ( ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) ) )
+        // InternalOCLstdlib.g:5154:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
         {
-        // InternalOCLstdlib.g:5152:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
-        // InternalOCLstdlib.g:5153:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalOCLstdlib.g:5154:6: ( ( rule__NavigatingArgCS__Group_0_1_1__0 ) )
+        // InternalOCLstdlib.g:5155:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingArgCSAccess().getGroup_0_1_1());
         }
-        // InternalOCLstdlib.g:5154:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
-        // InternalOCLstdlib.g:5154:2: rule__NavigatingArgCS__Group_0_1_1__0
+        // InternalOCLstdlib.g:5156:1: ( rule__NavigatingArgCS__Group_0_1_1__0 )
+        // InternalOCLstdlib.g:5156:2: rule__NavigatingArgCS__Group_0_1_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingArgCS__Group_0_1_1__0();
@@ -74315,17 +74315,17 @@
 
     // $ANTLR start synpred150_InternalOCLstdlib
     public final void synpred150_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5174:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
-        // InternalOCLstdlib.g:5174:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalOCLstdlib.g:5176:1: ( ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) ) )
+        // InternalOCLstdlib.g:5176:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
         {
-        // InternalOCLstdlib.g:5174:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
-        // InternalOCLstdlib.g:5175:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalOCLstdlib.g:5176:1: ( ( rule__NavigatingCommaArgCS__Group_2_0__0 ) )
+        // InternalOCLstdlib.g:5177:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_0());
         }
-        // InternalOCLstdlib.g:5176:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
-        // InternalOCLstdlib.g:5176:2: rule__NavigatingCommaArgCS__Group_2_0__0
+        // InternalOCLstdlib.g:5178:1: ( rule__NavigatingCommaArgCS__Group_2_0__0 )
+        // InternalOCLstdlib.g:5178:2: rule__NavigatingCommaArgCS__Group_2_0__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_0__0();
@@ -74345,17 +74345,17 @@
 
     // $ANTLR start synpred151_InternalOCLstdlib
     public final void synpred151_InternalOCLstdlib_fragment() throws RecognitionException {
-        // InternalOCLstdlib.g:5180:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
-        // InternalOCLstdlib.g:5180:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalOCLstdlib.g:5182:6: ( ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) ) )
+        // InternalOCLstdlib.g:5182:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
         {
-        // InternalOCLstdlib.g:5180:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
-        // InternalOCLstdlib.g:5181:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalOCLstdlib.g:5182:6: ( ( rule__NavigatingCommaArgCS__Group_2_1__0 ) )
+        // InternalOCLstdlib.g:5183:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getNavigatingCommaArgCSAccess().getGroup_2_1());
         }
-        // InternalOCLstdlib.g:5182:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
-        // InternalOCLstdlib.g:5182:2: rule__NavigatingCommaArgCS__Group_2_1__0
+        // InternalOCLstdlib.g:5184:1: ( rule__NavigatingCommaArgCS__Group_2_1__0 )
+        // InternalOCLstdlib.g:5184:2: rule__NavigatingCommaArgCS__Group_2_1__0
         {
         pushFollow(FollowSets000.FOLLOW_2);
         rule__NavigatingCommaArgCS__Group_2_1__0();
@@ -74584,7 +74584,7 @@
             this.transition = dfa_7;
         }
         public String getDescription() {
-            return "4759:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );";
+            return "4761:1: rule__CollectionLiteralPartCS__Alternatives : ( ( ( rule__CollectionLiteralPartCS__Group_0__0 ) ) | ( ( rule__CollectionLiteralPartCS__OwnedExpressionAssignment_1 ) ) );";
         }
     }
     static final String[] dfa_8s = {
@@ -74632,7 +74632,7 @@
             this.transition = dfa_8;
         }
         public String getDescription() {
-            return "4803:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
+            return "4805:1: rule__ShadowPartCS__OwnedInitExpressionAlternatives_0_2_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
         }
     }
     static final String dfa_9s = "\51\uffff";
@@ -74705,7 +74705,7 @@
             this.transition = dfa_14;
         }
         public String getDescription() {
-            return "4927:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
+            return "4929:1: rule__TypeExpWithoutMultiplicityCS__Alternatives : ( ( ruleTypeNameExpCS ) | ( ruleTypeLiteralCS ) | ( ruleCollectionPatternCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -74878,7 +74878,7 @@
             this.transition = dfa_20;
         }
         public String getDescription() {
-            return "4955:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
+            return "4957:1: rule__ExpCS__Alternatives : ( ( ( rule__ExpCS__Group_0__0 ) ) | ( rulePrefixedLetExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -75020,7 +75020,7 @@
             this.transition = dfa_26;
         }
         public String getDescription() {
-            return "5021:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
+            return "5023:1: rule__PrimaryExpCS__Alternatives : ( ( ruleNestedExpCS ) | ( ruleIfExpCS ) | ( ruleSelfExpCS ) | ( rulePrimitiveLiteralExpCS ) | ( ruleTupleLiteralExpCS ) | ( ruleMapLiteralExpCS ) | ( ruleCollectionLiteralExpCS ) | ( ruleLambdaLiteralExpCS ) | ( ruleTypeLiteralExpCS ) | ( ruleNameExpCS ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -75184,7 +75184,7 @@
             this.transition = dfa_27;
         }
         public String getDescription() {
-            return "5197:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
+            return "5199:1: rule__IfExpCS__OwnedConditionAlternatives_1_0 : ( ( ruleExpCS ) | ( rulePatternExpCS ) );";
         }
     }
     static final String dfa_28s = "\1\uffff\30\31\2\uffff";
@@ -75240,7 +75240,7 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "7120:1: ( rule__ImportCS__Group_1__0 )?";
+            return "7122:1: ( rule__ImportCS__Group_1__0 )?";
         }
     }
     static final String dfa_33s = "\34\uffff";
@@ -75300,7 +75300,7 @@
             this.transition = dfa_38;
         }
         public String getDescription() {
-            return "8066:1: ( rule__LibIterationCS__OwnedSignatureAssignment_2 )?";
+            return "8068:1: ( rule__LibIterationCS__OwnedSignatureAssignment_2 )?";
         }
     }
     static final String dfa_39s = "\1\131\1\132\30\133\2\uffff";
@@ -75353,7 +75353,7 @@
             this.transition = dfa_41;
         }
         public String getDescription() {
-            return "9574:1: ( rule__LibOperationCS__OwnedSignatureAssignment_3 )?";
+            return "9576:1: ( rule__LibOperationCS__OwnedSignatureAssignment_3 )?";
         }
     }
 
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlib.xtextbin b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlib.xtextbin
index 6d04e37..55ea200 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlib.xtextbin
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlib.xtextbin
Binary files differ
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlibGrammarResource.java b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlibGrammarResource.java
index f429042..13c969d 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlibGrammarResource.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/OCLstdlibGrammarResource.java
@@ -1378,6 +1378,7 @@
 		private static final @NonNull ParserRule PR_UPPER = createParserRule("UPPER", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.EINT));
 		private static final @NonNull ParserRule PR_URI = createParserRule("URI", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_UnreservedName = createParserRule("UnreservedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
+		private static final @NonNull ParserRule PR_UnreservedPathNameCS = createParserRule("UnreservedPathNameCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.PATH_NAME_CS));
 		private static final @NonNull ParserRule PR_UnrestrictedName = createParserRule("UnrestrictedName", createTypeRef(MM_ecore, org.eclipse.emf.ecore.EcorePackage.Literals.ESTRING));
 		private static final @NonNull ParserRule PR_WildcardTypeRefCS = createParserRule("WildcardTypeRefCS", createTypeRef(MM, org.eclipse.ocl.xtext.basecs.BaseCSPackage.Literals.WILDCARD_TYPE_REF_CS));
 
@@ -1474,6 +1475,12 @@
 				createRuleCall(TR_SINGLE_QUOTED_STRING));
 			PR_UnreservedName.setAlternatives(
 				createRuleCall(_EssentialOCL.PR_UnrestrictedName));
+			PR_UnreservedPathNameCS.setAlternatives(
+				createGroup(
+					createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS)),
+					setCardinality("*", createGroup(
+						createKeyword("::"),
+						createAssignment("ownedPathElements", "+=", createRuleCall(PR_NextPathElementCS))))));
 			PR_UnrestrictedName.setAlternatives(
 				createRuleCall(_OCLstdlib.PR_Identifier));
 			PR_WildcardTypeRefCS.setAlternatives(
@@ -1502,6 +1509,7 @@
 				rules.add(PR_MultiplicityCS);
 				rules.add(PR_MultiplicityStringCS);
 				rules.add(PR_PathNameCS);
+				rules.add(PR_UnreservedPathNameCS);
 				rules.add(PR_FirstPathElementCS);
 				rules.add(PR_NextPathElementCS);
 				rules.add(PR_TemplateBindingCS);
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlib.g b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlib.g
index b2cfe83..c75e4f5 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlib.g
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlib.g
@@ -8806,6 +8806,8 @@
 
 
 
+
+
 // Entry rule entryRuleFirstPathElementCS
 entryRuleFirstPathElementCS returns [EObject current=null]
 	:
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibLexer.java b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibLexer.java
index c48632c..fade0f0 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibLexer.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibLexer.java
@@ -2188,8 +2188,8 @@
     // $ANTLR start "RULE_ESCAPED_CHARACTER"
     public final void mRULE_ESCAPED_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:9442:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
-            // InternalOCLstdlib.g:9442:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+            // InternalOCLstdlib.g:9444:33: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) )
+            // InternalOCLstdlib.g:9444:35: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
             {
             match('\\');
             if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -2213,8 +2213,8 @@
     // $ANTLR start "RULE_LETTER_CHARACTER"
     public final void mRULE_LETTER_CHARACTER() throws RecognitionException {
         try {
-            // InternalOCLstdlib.g:9444:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
-            // InternalOCLstdlib.g:9444:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
+            // InternalOCLstdlib.g:9446:32: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) )
+            // InternalOCLstdlib.g:9446:34: ( 'a' .. 'z' | 'A' .. 'Z' | '_' )
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2239,11 +2239,11 @@
         try {
             int _type = RULE_DOUBLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9446:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
-            // InternalOCLstdlib.g:9446:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+            // InternalOCLstdlib.g:9448:27: ( '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"' )
+            // InternalOCLstdlib.g:9448:29: '\"' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
             {
             match('\"');
-            // InternalOCLstdlib.g:9446:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
+            // InternalOCLstdlib.g:9448:33: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\"' ) ) )*
             loop1:
             do {
                 int alt1=3;
@@ -2259,14 +2259,14 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9446:34: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLstdlib.g:9448:34: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLstdlib.g:9446:57: ~ ( ( '\\\\' | '\"' ) )
+            	    // InternalOCLstdlib.g:9448:57: ~ ( ( '\\\\' | '\"' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2303,11 +2303,11 @@
         try {
             int _type = RULE_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9448:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
-            // InternalOCLstdlib.g:9448:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+            // InternalOCLstdlib.g:9450:27: ( '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // InternalOCLstdlib.g:9450:29: '\\'' ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
             {
             match('\'');
-            // InternalOCLstdlib.g:9448:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
+            // InternalOCLstdlib.g:9450:34: ( RULE_ESCAPED_CHARACTER | ~ ( ( '\\\\' | '\\'' ) ) )*
             loop2:
             do {
                 int alt2=3;
@@ -2323,14 +2323,14 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9448:35: RULE_ESCAPED_CHARACTER
+            	    // InternalOCLstdlib.g:9450:35: RULE_ESCAPED_CHARACTER
             	    {
             	    mRULE_ESCAPED_CHARACTER();
 
             	    }
             	    break;
             	case 2 :
-            	    // InternalOCLstdlib.g:9448:58: ~ ( ( '\\\\' | '\\'' ) )
+            	    // InternalOCLstdlib.g:9450:58: ~ ( ( '\\\\' | '\\'' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2367,12 +2367,12 @@
         try {
             int _type = RULE_ML_SINGLE_QUOTED_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9450:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
-            // InternalOCLstdlib.g:9450:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
+            // InternalOCLstdlib.g:9452:30: ( '/\\'' ( options {greedy=false; } : . )* '\\'/' )
+            // InternalOCLstdlib.g:9452:32: '/\\'' ( options {greedy=false; } : . )* '\\'/'
             {
             match("/'");
 
-            // InternalOCLstdlib.g:9450:38: ( options {greedy=false; } : . )*
+            // InternalOCLstdlib.g:9452:38: ( options {greedy=false; } : . )*
             loop3:
             do {
                 int alt3=2;
@@ -2397,7 +2397,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9450:66: .
+            	    // InternalOCLstdlib.g:9452:66: .
             	    {
             	    matchAny();
 
@@ -2427,11 +2427,11 @@
         try {
             int _type = RULE_SIMPLE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9452:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
-            // InternalOCLstdlib.g:9452:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLstdlib.g:9454:16: ( RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )* )
+            // InternalOCLstdlib.g:9454:18: RULE_LETTER_CHARACTER ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             {
             mRULE_LETTER_CHARACTER();
-            // InternalOCLstdlib.g:9452:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
+            // InternalOCLstdlib.g:9454:40: ( RULE_LETTER_CHARACTER | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -2480,8 +2480,8 @@
         try {
             int _type = RULE_ESCAPED_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9454:17: ( '_' RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:9454:19: '_' RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:9456:17: ( '_' RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:9456:19: '_' RULE_SINGLE_QUOTED_STRING
             {
             match('_');
             mRULE_SINGLE_QUOTED_STRING();
@@ -2501,10 +2501,10 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9456:10: ( ( '0' .. '9' )+ )
-            // InternalOCLstdlib.g:9456:12: ( '0' .. '9' )+
+            // InternalOCLstdlib.g:9458:10: ( ( '0' .. '9' )+ )
+            // InternalOCLstdlib.g:9458:12: ( '0' .. '9' )+
             {
-            // InternalOCLstdlib.g:9456:12: ( '0' .. '9' )+
+            // InternalOCLstdlib.g:9458:12: ( '0' .. '9' )+
             int cnt5=0;
             loop5:
             do {
@@ -2518,7 +2518,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9456:13: '0' .. '9'
+            	    // InternalOCLstdlib.g:9458:13: '0' .. '9'
             	    {
             	    matchRange('0','9');
 
@@ -2550,12 +2550,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9458:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalOCLstdlib.g:9458:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalOCLstdlib.g:9460:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalOCLstdlib.g:9460:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*");
 
-            // InternalOCLstdlib.g:9458:24: ( options {greedy=false; } : . )*
+            // InternalOCLstdlib.g:9460:24: ( options {greedy=false; } : . )*
             loop6:
             do {
                 int alt6=2;
@@ -2580,7 +2580,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9458:52: .
+            	    // InternalOCLstdlib.g:9460:52: .
             	    {
             	    matchAny();
 
@@ -2610,12 +2610,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9460:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalOCLstdlib.g:9460:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalOCLstdlib.g:9462:17: ( '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalOCLstdlib.g:9462:19: '--' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("--");
 
-            // InternalOCLstdlib.g:9460:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalOCLstdlib.g:9462:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop7:
             do {
                 int alt7=2;
@@ -2628,7 +2628,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9460:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalOCLstdlib.g:9462:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -2648,7 +2648,7 @@
                 }
             } while (true);
 
-            // InternalOCLstdlib.g:9460:40: ( ( '\\r' )? '\\n' )?
+            // InternalOCLstdlib.g:9462:40: ( ( '\\r' )? '\\n' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2657,9 +2657,9 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalOCLstdlib.g:9460:41: ( '\\r' )? '\\n'
+                    // InternalOCLstdlib.g:9462:41: ( '\\r' )? '\\n'
                     {
-                    // InternalOCLstdlib.g:9460:41: ( '\\r' )?
+                    // InternalOCLstdlib.g:9462:41: ( '\\r' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -2668,7 +2668,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // InternalOCLstdlib.g:9460:41: '\\r'
+                            // InternalOCLstdlib.g:9462:41: '\\r'
                             {
                             match('\r');
 
@@ -2700,10 +2700,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9462:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalOCLstdlib.g:9462:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLstdlib.g:9464:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalOCLstdlib.g:9464:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalOCLstdlib.g:9462:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalOCLstdlib.g:9464:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt10=0;
             loop10:
             do {
@@ -2757,8 +2757,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalOCLstdlib.g:9464:16: ( . )
-            // InternalOCLstdlib.g:9464:18: .
+            // InternalOCLstdlib.g:9466:16: ( . )
+            // InternalOCLstdlib.g:9466:18: .
             {
             matchAny();
 
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibParser.java b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibParser.java
index 7e29ea2..9ca2a9d 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibParser.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/parser/antlr/internal/InternalOCLstdlibParser.java
@@ -25080,7 +25080,7 @@
 
 
     // $ANTLR start "entryRuleFirstPathElementCS"
-    // InternalOCLstdlib.g:8810:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
+    // InternalOCLstdlib.g:8812:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
     public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -25088,8 +25088,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:8811:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
-            // InternalOCLstdlib.g:8812:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
+            // InternalOCLstdlib.g:8813:2: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
+            // InternalOCLstdlib.g:8814:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFirstPathElementCSRule());
@@ -25120,21 +25120,21 @@
 
 
     // $ANTLR start "ruleFirstPathElementCS"
-    // InternalOCLstdlib.g:8819:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
+    // InternalOCLstdlib.g:8821:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
     public final EObject ruleFirstPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:8822:28: ( ( ( ruleUnrestrictedName ) ) )
-            // InternalOCLstdlib.g:8823:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:8824:28: ( ( ( ruleUnrestrictedName ) ) )
+            // InternalOCLstdlib.g:8825:1: ( ( ruleUnrestrictedName ) )
             {
-            // InternalOCLstdlib.g:8823:1: ( ( ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:8824:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:8825:1: ( ( ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:8826:1: ( ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:8824:1: ( ruleUnrestrictedName )
-            // InternalOCLstdlib.g:8825:3: ruleUnrestrictedName
+            // InternalOCLstdlib.g:8826:1: ( ruleUnrestrictedName )
+            // InternalOCLstdlib.g:8827:3: ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -25189,7 +25189,7 @@
 
 
     // $ANTLR start "entryRuleNextPathElementCS"
-    // InternalOCLstdlib.g:8849:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
+    // InternalOCLstdlib.g:8851:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
     public final EObject entryRuleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
@@ -25197,8 +25197,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:8850:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
-            // InternalOCLstdlib.g:8851:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
+            // InternalOCLstdlib.g:8852:2: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
+            // InternalOCLstdlib.g:8853:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNextPathElementCSRule());
@@ -25229,21 +25229,21 @@
 
 
     // $ANTLR start "ruleNextPathElementCS"
-    // InternalOCLstdlib.g:8858:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
+    // InternalOCLstdlib.g:8860:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
     public final EObject ruleNextPathElementCS() throws RecognitionException {
         EObject current = null;
 
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:8861:28: ( ( ( ruleUnreservedName ) ) )
-            // InternalOCLstdlib.g:8862:1: ( ( ruleUnreservedName ) )
+            // InternalOCLstdlib.g:8863:28: ( ( ( ruleUnreservedName ) ) )
+            // InternalOCLstdlib.g:8864:1: ( ( ruleUnreservedName ) )
             {
-            // InternalOCLstdlib.g:8862:1: ( ( ruleUnreservedName ) )
-            // InternalOCLstdlib.g:8863:1: ( ruleUnreservedName )
+            // InternalOCLstdlib.g:8864:1: ( ( ruleUnreservedName ) )
+            // InternalOCLstdlib.g:8865:1: ( ruleUnreservedName )
             {
-            // InternalOCLstdlib.g:8863:1: ( ruleUnreservedName )
-            // InternalOCLstdlib.g:8864:3: ruleUnreservedName
+            // InternalOCLstdlib.g:8865:1: ( ruleUnreservedName )
+            // InternalOCLstdlib.g:8866:3: ruleUnreservedName
             {
             if ( state.backtracking==0 ) {
 
@@ -25298,7 +25298,7 @@
 
 
     // $ANTLR start "entryRuleTemplateBindingCS"
-    // InternalOCLstdlib.g:8888:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
+    // InternalOCLstdlib.g:8890:1: entryRuleTemplateBindingCS returns [EObject current=null] : iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF ;
     public final EObject entryRuleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -25306,8 +25306,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:8889:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
-            // InternalOCLstdlib.g:8890:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
+            // InternalOCLstdlib.g:8891:2: (iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF )
+            // InternalOCLstdlib.g:8892:2: iv_ruleTemplateBindingCS= ruleTemplateBindingCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateBindingCSRule());
@@ -25338,7 +25338,7 @@
 
 
     // $ANTLR start "ruleTemplateBindingCS"
-    // InternalOCLstdlib.g:8897:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
+    // InternalOCLstdlib.g:8899:1: ruleTemplateBindingCS returns [EObject current=null] : ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) ;
     public final EObject ruleTemplateBindingCS() throws RecognitionException {
         EObject current = null;
 
@@ -25353,17 +25353,17 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:8900:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
-            // InternalOCLstdlib.g:8901:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalOCLstdlib.g:8902:28: ( ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) )
+            // InternalOCLstdlib.g:8903:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
             {
-            // InternalOCLstdlib.g:8901:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
-            // InternalOCLstdlib.g:8901:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalOCLstdlib.g:8903:1: ( ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
+            // InternalOCLstdlib.g:8903:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) ) (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )* ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             {
-            // InternalOCLstdlib.g:8901:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
-            // InternalOCLstdlib.g:8902:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalOCLstdlib.g:8903:2: ( (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS ) )
+            // InternalOCLstdlib.g:8904:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
             {
-            // InternalOCLstdlib.g:8902:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
-            // InternalOCLstdlib.g:8903:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
+            // InternalOCLstdlib.g:8904:1: (lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS )
+            // InternalOCLstdlib.g:8905:3: lv_ownedSubstitutions_0_0= ruleTemplateParameterSubstitutionCS
             {
             if ( state.backtracking==0 ) {
 
@@ -25394,7 +25394,7 @@
 
             }
 
-            // InternalOCLstdlib.g:8919:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
+            // InternalOCLstdlib.g:8921:2: (otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) ) )*
             loop159:
             do {
                 int alt159=2;
@@ -25407,7 +25407,7 @@
 
                 switch (alt159) {
             	case 1 :
-            	    // InternalOCLstdlib.g:8919:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalOCLstdlib.g:8921:4: otherlv_1= ',' ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
             	    {
             	    otherlv_1=(Token)match(input,45,FollowSets000.FOLLOW_62); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -25415,11 +25415,11 @@
             	          	newLeafNode(otherlv_1, grammarAccess.getTemplateBindingCSAccess().getCommaKeyword_1_0());
 
             	    }
-            	    // InternalOCLstdlib.g:8923:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
-            	    // InternalOCLstdlib.g:8924:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalOCLstdlib.g:8925:1: ( (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS ) )
+            	    // InternalOCLstdlib.g:8926:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
             	    {
-            	    // InternalOCLstdlib.g:8924:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
-            	    // InternalOCLstdlib.g:8925:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
+            	    // InternalOCLstdlib.g:8926:1: (lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS )
+            	    // InternalOCLstdlib.g:8927:3: lv_ownedSubstitutions_2_0= ruleTemplateParameterSubstitutionCS
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -25459,7 +25459,7 @@
                 }
             } while (true);
 
-            // InternalOCLstdlib.g:8941:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
+            // InternalOCLstdlib.g:8943:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
             int alt160=2;
             int LA160_0 = input.LA(1);
 
@@ -25468,10 +25468,10 @@
             }
             switch (alt160) {
                 case 1 :
-                    // InternalOCLstdlib.g:8942:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalOCLstdlib.g:8944:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                     {
-                    // InternalOCLstdlib.g:8942:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
-                    // InternalOCLstdlib.g:8943:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
+                    // InternalOCLstdlib.g:8944:1: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
+                    // InternalOCLstdlib.g:8945:3: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -25528,7 +25528,7 @@
 
 
     // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
-    // InternalOCLstdlib.g:8967:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
+    // InternalOCLstdlib.g:8969:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
     public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -25536,8 +25536,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:8968:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
-            // InternalOCLstdlib.g:8969:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
+            // InternalOCLstdlib.g:8970:2: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
+            // InternalOCLstdlib.g:8971:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
@@ -25568,7 +25568,7 @@
 
 
     // $ANTLR start "ruleTemplateParameterSubstitutionCS"
-    // InternalOCLstdlib.g:8976:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
+    // InternalOCLstdlib.g:8978:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
     public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
         EObject current = null;
 
@@ -25578,14 +25578,14 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:8979:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
-            // InternalOCLstdlib.g:8980:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalOCLstdlib.g:8981:28: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
+            // InternalOCLstdlib.g:8982:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
             {
-            // InternalOCLstdlib.g:8980:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
-            // InternalOCLstdlib.g:8981:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalOCLstdlib.g:8982:1: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
+            // InternalOCLstdlib.g:8983:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
             {
-            // InternalOCLstdlib.g:8981:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
-            // InternalOCLstdlib.g:8982:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
+            // InternalOCLstdlib.g:8983:1: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
+            // InternalOCLstdlib.g:8984:3: lv_ownedActualParameter_0_0= ruleTypeRefCS
             {
             if ( state.backtracking==0 ) {
 
@@ -25636,7 +25636,7 @@
 
 
     // $ANTLR start "entryRuleTemplateSignatureCS"
-    // InternalOCLstdlib.g:9006:1: entryRuleTemplateSignatureCS returns [EObject current=null] : iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF ;
+    // InternalOCLstdlib.g:9008:1: entryRuleTemplateSignatureCS returns [EObject current=null] : iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF ;
     public final EObject entryRuleTemplateSignatureCS() throws RecognitionException {
         EObject current = null;
 
@@ -25644,8 +25644,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9007:2: (iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF )
-            // InternalOCLstdlib.g:9008:2: iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF
+            // InternalOCLstdlib.g:9009:2: (iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF )
+            // InternalOCLstdlib.g:9010:2: iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTemplateSignatureCSRule());
@@ -25676,7 +25676,7 @@
 
 
     // $ANTLR start "ruleTemplateSignatureCS"
-    // InternalOCLstdlib.g:9015:1: ruleTemplateSignatureCS returns [EObject current=null] : (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) ;
+    // InternalOCLstdlib.g:9017:1: ruleTemplateSignatureCS returns [EObject current=null] : (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) ;
     public final EObject ruleTemplateSignatureCS() throws RecognitionException {
         EObject current = null;
 
@@ -25691,11 +25691,11 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9018:28: ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) )
-            // InternalOCLstdlib.g:9019:1: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
+            // InternalOCLstdlib.g:9020:28: ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) )
+            // InternalOCLstdlib.g:9021:1: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
             {
-            // InternalOCLstdlib.g:9019:1: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
-            // InternalOCLstdlib.g:9019:3: otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')'
+            // InternalOCLstdlib.g:9021:1: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
+            // InternalOCLstdlib.g:9021:3: otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')'
             {
             otherlv_0=(Token)match(input,44,FollowSets000.FOLLOW_37); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -25703,11 +25703,11 @@
                   	newLeafNode(otherlv_0, grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0());
 
             }
-            // InternalOCLstdlib.g:9023:1: ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) )
-            // InternalOCLstdlib.g:9024:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
+            // InternalOCLstdlib.g:9025:1: ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) )
+            // InternalOCLstdlib.g:9026:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
             {
-            // InternalOCLstdlib.g:9024:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
-            // InternalOCLstdlib.g:9025:3: lv_ownedParameters_1_0= ruleTypeParameterCS
+            // InternalOCLstdlib.g:9026:1: (lv_ownedParameters_1_0= ruleTypeParameterCS )
+            // InternalOCLstdlib.g:9027:3: lv_ownedParameters_1_0= ruleTypeParameterCS
             {
             if ( state.backtracking==0 ) {
 
@@ -25738,7 +25738,7 @@
 
             }
 
-            // InternalOCLstdlib.g:9041:2: (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )*
+            // InternalOCLstdlib.g:9043:2: (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )*
             loop161:
             do {
                 int alt161=2;
@@ -25751,7 +25751,7 @@
 
                 switch (alt161) {
             	case 1 :
-            	    // InternalOCLstdlib.g:9041:4: otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
+            	    // InternalOCLstdlib.g:9043:4: otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
             	    {
             	    otherlv_2=(Token)match(input,45,FollowSets000.FOLLOW_37); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -25759,11 +25759,11 @@
             	          	newLeafNode(otherlv_2, grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_2_0());
 
             	    }
-            	    // InternalOCLstdlib.g:9045:1: ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
-            	    // InternalOCLstdlib.g:9046:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
+            	    // InternalOCLstdlib.g:9047:1: ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
+            	    // InternalOCLstdlib.g:9048:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
             	    {
-            	    // InternalOCLstdlib.g:9046:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
-            	    // InternalOCLstdlib.g:9047:3: lv_ownedParameters_3_0= ruleTypeParameterCS
+            	    // InternalOCLstdlib.g:9048:1: (lv_ownedParameters_3_0= ruleTypeParameterCS )
+            	    // InternalOCLstdlib.g:9049:3: lv_ownedParameters_3_0= ruleTypeParameterCS
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -25832,7 +25832,7 @@
 
 
     // $ANTLR start "entryRuleTypeParameterCS"
-    // InternalOCLstdlib.g:9075:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
+    // InternalOCLstdlib.g:9077:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
     public final EObject entryRuleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -25840,8 +25840,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9076:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
-            // InternalOCLstdlib.g:9077:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
+            // InternalOCLstdlib.g:9078:2: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
+            // InternalOCLstdlib.g:9079:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeParameterCSRule());
@@ -25872,7 +25872,7 @@
 
 
     // $ANTLR start "ruleTypeParameterCS"
-    // InternalOCLstdlib.g:9084:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
+    // InternalOCLstdlib.g:9086:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
     public final EObject ruleTypeParameterCS() throws RecognitionException {
         EObject current = null;
 
@@ -25888,17 +25888,17 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9087:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
-            // InternalOCLstdlib.g:9088:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalOCLstdlib.g:9089:28: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
+            // InternalOCLstdlib.g:9090:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
             {
-            // InternalOCLstdlib.g:9088:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
-            // InternalOCLstdlib.g:9088:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalOCLstdlib.g:9090:1: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
+            // InternalOCLstdlib.g:9090:2: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             {
-            // InternalOCLstdlib.g:9088:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
-            // InternalOCLstdlib.g:9089:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalOCLstdlib.g:9090:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
+            // InternalOCLstdlib.g:9091:1: (lv_name_0_0= ruleUnrestrictedName )
             {
-            // InternalOCLstdlib.g:9089:1: (lv_name_0_0= ruleUnrestrictedName )
-            // InternalOCLstdlib.g:9090:3: lv_name_0_0= ruleUnrestrictedName
+            // InternalOCLstdlib.g:9091:1: (lv_name_0_0= ruleUnrestrictedName )
+            // InternalOCLstdlib.g:9092:3: lv_name_0_0= ruleUnrestrictedName
             {
             if ( state.backtracking==0 ) {
 
@@ -25929,7 +25929,7 @@
 
             }
 
-            // InternalOCLstdlib.g:9106:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
+            // InternalOCLstdlib.g:9108:2: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
             int alt163=2;
             int LA163_0 = input.LA(1);
 
@@ -25938,7 +25938,7 @@
             }
             switch (alt163) {
                 case 1 :
-                    // InternalOCLstdlib.g:9106:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalOCLstdlib.g:9108:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     {
                     otherlv_1=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -25946,11 +25946,11 @@
                           	newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());
 
                     }
-                    // InternalOCLstdlib.g:9110:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
-                    // InternalOCLstdlib.g:9111:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalOCLstdlib.g:9112:1: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
+                    // InternalOCLstdlib.g:9113:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
                     {
-                    // InternalOCLstdlib.g:9111:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
-                    // InternalOCLstdlib.g:9112:3: lv_ownedExtends_2_0= ruleTypedRefCS
+                    // InternalOCLstdlib.g:9113:1: (lv_ownedExtends_2_0= ruleTypedRefCS )
+                    // InternalOCLstdlib.g:9114:3: lv_ownedExtends_2_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -25981,7 +25981,7 @@
 
                     }
 
-                    // InternalOCLstdlib.g:9128:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
+                    // InternalOCLstdlib.g:9130:2: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                     loop162:
                     do {
                         int alt162=2;
@@ -25994,7 +25994,7 @@
 
                         switch (alt162) {
                     	case 1 :
-                    	    // InternalOCLstdlib.g:9128:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalOCLstdlib.g:9130:4: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                     	    {
                     	    otherlv_3=(Token)match(input,113,FollowSets000.FOLLOW_9); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -26002,11 +26002,11 @@
                     	          	newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());
 
                     	    }
-                    	    // InternalOCLstdlib.g:9132:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
-                    	    // InternalOCLstdlib.g:9133:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalOCLstdlib.g:9134:1: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
+                    	    // InternalOCLstdlib.g:9135:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
                     	    {
-                    	    // InternalOCLstdlib.g:9133:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
-                    	    // InternalOCLstdlib.g:9134:3: lv_ownedExtends_4_0= ruleTypedRefCS
+                    	    // InternalOCLstdlib.g:9135:1: (lv_ownedExtends_4_0= ruleTypedRefCS )
+                    	    // InternalOCLstdlib.g:9136:3: lv_ownedExtends_4_0= ruleTypedRefCS
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -26075,7 +26075,7 @@
 
 
     // $ANTLR start "entryRuleTypeRefCS"
-    // InternalOCLstdlib.g:9158:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
+    // InternalOCLstdlib.g:9160:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
     public final EObject entryRuleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -26083,8 +26083,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9159:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
-            // InternalOCLstdlib.g:9160:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
+            // InternalOCLstdlib.g:9161:2: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
+            // InternalOCLstdlib.g:9162:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTypeRefCSRule());
@@ -26115,7 +26115,7 @@
 
 
     // $ANTLR start "ruleTypeRefCS"
-    // InternalOCLstdlib.g:9167:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
+    // InternalOCLstdlib.g:9169:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
     public final EObject ruleTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -26127,10 +26127,10 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9170:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
-            // InternalOCLstdlib.g:9171:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalOCLstdlib.g:9172:28: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
+            // InternalOCLstdlib.g:9173:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             {
-            // InternalOCLstdlib.g:9171:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
+            // InternalOCLstdlib.g:9173:1: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
             int alt164=2;
             int LA164_0 = input.LA(1);
 
@@ -26149,7 +26149,7 @@
             }
             switch (alt164) {
                 case 1 :
-                    // InternalOCLstdlib.g:9172:2: this_TypedRefCS_0= ruleTypedRefCS
+                    // InternalOCLstdlib.g:9174:2: this_TypedRefCS_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -26176,7 +26176,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:9185:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
+                    // InternalOCLstdlib.g:9187:2: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -26225,7 +26225,7 @@
 
 
     // $ANTLR start "entryRuleWildcardTypeRefCS"
-    // InternalOCLstdlib.g:9204:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
+    // InternalOCLstdlib.g:9206:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
     public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -26233,8 +26233,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9205:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
-            // InternalOCLstdlib.g:9206:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
+            // InternalOCLstdlib.g:9207:2: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
+            // InternalOCLstdlib.g:9208:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
@@ -26265,7 +26265,7 @@
 
 
     // $ANTLR start "ruleWildcardTypeRefCS"
-    // InternalOCLstdlib.g:9213:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
+    // InternalOCLstdlib.g:9215:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
     public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
         EObject current = null;
 
@@ -26277,14 +26277,14 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9216:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
-            // InternalOCLstdlib.g:9217:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalOCLstdlib.g:9218:28: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
+            // InternalOCLstdlib.g:9219:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
             {
-            // InternalOCLstdlib.g:9217:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
-            // InternalOCLstdlib.g:9217:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalOCLstdlib.g:9219:1: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
+            // InternalOCLstdlib.g:9219:2: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             {
-            // InternalOCLstdlib.g:9217:2: ()
-            // InternalOCLstdlib.g:9218:2:
+            // InternalOCLstdlib.g:9219:2: ()
+            // InternalOCLstdlib.g:9220:2:
             {
             if ( state.backtracking==0 ) {
 
@@ -26307,7 +26307,7 @@
                   	newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());
 
             }
-            // InternalOCLstdlib.g:9230:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
+            // InternalOCLstdlib.g:9232:1: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
             int alt165=2;
             int LA165_0 = input.LA(1);
 
@@ -26316,7 +26316,7 @@
             }
             switch (alt165) {
                 case 1 :
-                    // InternalOCLstdlib.g:9230:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalOCLstdlib.g:9232:3: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                     {
                     otherlv_2=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -26324,11 +26324,11 @@
                           	newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());
 
                     }
-                    // InternalOCLstdlib.g:9234:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
-                    // InternalOCLstdlib.g:9235:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalOCLstdlib.g:9236:1: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
+                    // InternalOCLstdlib.g:9237:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
                     {
-                    // InternalOCLstdlib.g:9235:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
-                    // InternalOCLstdlib.g:9236:3: lv_ownedExtends_3_0= ruleTypedRefCS
+                    // InternalOCLstdlib.g:9237:1: (lv_ownedExtends_3_0= ruleTypedRefCS )
+                    // InternalOCLstdlib.g:9238:3: lv_ownedExtends_3_0= ruleTypedRefCS
                     {
                     if ( state.backtracking==0 ) {
 
@@ -26388,7 +26388,7 @@
 
 
     // $ANTLR start "entryRuleID"
-    // InternalOCLstdlib.g:9260:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
+    // InternalOCLstdlib.g:9262:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
     public final String entryRuleID() throws RecognitionException {
         String current = null;
 
@@ -26396,8 +26396,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9261:2: (iv_ruleID= ruleID EOF )
-            // InternalOCLstdlib.g:9262:2: iv_ruleID= ruleID EOF
+            // InternalOCLstdlib.g:9263:2: (iv_ruleID= ruleID EOF )
+            // InternalOCLstdlib.g:9264:2: iv_ruleID= ruleID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIDRule());
@@ -26428,7 +26428,7 @@
 
 
     // $ANTLR start "ruleID"
-    // InternalOCLstdlib.g:9269:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
+    // InternalOCLstdlib.g:9271:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
     public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26438,10 +26438,10 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9272:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
-            // InternalOCLstdlib.g:9273:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalOCLstdlib.g:9274:28: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
+            // InternalOCLstdlib.g:9275:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             {
-            // InternalOCLstdlib.g:9273:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
+            // InternalOCLstdlib.g:9275:1: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
             int alt166=2;
             int LA166_0 = input.LA(1);
 
@@ -26460,7 +26460,7 @@
             }
             switch (alt166) {
                 case 1 :
-                    // InternalOCLstdlib.g:9273:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
+                    // InternalOCLstdlib.g:9275:6: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                     {
                     this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -26477,7 +26477,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:9281:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
+                    // InternalOCLstdlib.g:9283:10: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                     {
                     this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -26516,7 +26516,7 @@
 
 
     // $ANTLR start "entryRuleLOWER"
-    // InternalOCLstdlib.g:9296:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
+    // InternalOCLstdlib.g:9298:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
     public final String entryRuleLOWER() throws RecognitionException {
         String current = null;
 
@@ -26524,8 +26524,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9297:2: (iv_ruleLOWER= ruleLOWER EOF )
-            // InternalOCLstdlib.g:9298:2: iv_ruleLOWER= ruleLOWER EOF
+            // InternalOCLstdlib.g:9299:2: (iv_ruleLOWER= ruleLOWER EOF )
+            // InternalOCLstdlib.g:9300:2: iv_ruleLOWER= ruleLOWER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLOWERRule());
@@ -26556,7 +26556,7 @@
 
 
     // $ANTLR start "ruleLOWER"
-    // InternalOCLstdlib.g:9305:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalOCLstdlib.g:9307:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26565,8 +26565,8 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9308:28: (this_INT_0= RULE_INT )
-            // InternalOCLstdlib.g:9309:5: this_INT_0= RULE_INT
+            // InternalOCLstdlib.g:9310:28: (this_INT_0= RULE_INT )
+            // InternalOCLstdlib.g:9311:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -26599,7 +26599,7 @@
 
 
     // $ANTLR start "entryRuleNUMBER_LITERAL"
-    // InternalOCLstdlib.g:9324:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
+    // InternalOCLstdlib.g:9326:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
     public final String entryRuleNUMBER_LITERAL() throws RecognitionException {
         String current = null;
 
@@ -26607,8 +26607,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9325:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
-            // InternalOCLstdlib.g:9326:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
+            // InternalOCLstdlib.g:9327:2: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
+            // InternalOCLstdlib.g:9328:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNUMBER_LITERALRule());
@@ -26639,7 +26639,7 @@
 
 
     // $ANTLR start "ruleNUMBER_LITERAL"
-    // InternalOCLstdlib.g:9333:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
+    // InternalOCLstdlib.g:9335:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
     public final AntlrDatatypeRuleToken ruleNUMBER_LITERAL() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26648,8 +26648,8 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9336:28: (this_INT_0= RULE_INT )
-            // InternalOCLstdlib.g:9337:5: this_INT_0= RULE_INT
+            // InternalOCLstdlib.g:9338:28: (this_INT_0= RULE_INT )
+            // InternalOCLstdlib.g:9339:5: this_INT_0= RULE_INT
             {
             this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -26682,7 +26682,7 @@
 
 
     // $ANTLR start "entryRuleStringLiteral"
-    // InternalOCLstdlib.g:9352:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
+    // InternalOCLstdlib.g:9354:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
     public final String entryRuleStringLiteral() throws RecognitionException {
         String current = null;
 
@@ -26690,8 +26690,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9353:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
-            // InternalOCLstdlib.g:9354:2: iv_ruleStringLiteral= ruleStringLiteral EOF
+            // InternalOCLstdlib.g:9355:2: (iv_ruleStringLiteral= ruleStringLiteral EOF )
+            // InternalOCLstdlib.g:9356:2: iv_ruleStringLiteral= ruleStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getStringLiteralRule());
@@ -26722,7 +26722,7 @@
 
 
     // $ANTLR start "ruleStringLiteral"
-    // InternalOCLstdlib.g:9361:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalOCLstdlib.g:9363:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleStringLiteral() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26731,8 +26731,8 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9364:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:9365:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:9366:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:9367:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -26765,7 +26765,7 @@
 
 
     // $ANTLR start "entryRuleUPPER"
-    // InternalOCLstdlib.g:9380:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
+    // InternalOCLstdlib.g:9382:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
     public final String entryRuleUPPER() throws RecognitionException {
         String current = null;
 
@@ -26773,8 +26773,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9381:2: (iv_ruleUPPER= ruleUPPER EOF )
-            // InternalOCLstdlib.g:9382:2: iv_ruleUPPER= ruleUPPER EOF
+            // InternalOCLstdlib.g:9383:2: (iv_ruleUPPER= ruleUPPER EOF )
+            // InternalOCLstdlib.g:9384:2: iv_ruleUPPER= ruleUPPER EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getUPPERRule());
@@ -26805,7 +26805,7 @@
 
 
     // $ANTLR start "ruleUPPER"
-    // InternalOCLstdlib.g:9389:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
+    // InternalOCLstdlib.g:9391:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26815,10 +26815,10 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9392:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
-            // InternalOCLstdlib.g:9393:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalOCLstdlib.g:9394:28: ( (this_INT_0= RULE_INT | kw= '*' ) )
+            // InternalOCLstdlib.g:9395:1: (this_INT_0= RULE_INT | kw= '*' )
             {
-            // InternalOCLstdlib.g:9393:1: (this_INT_0= RULE_INT | kw= '*' )
+            // InternalOCLstdlib.g:9395:1: (this_INT_0= RULE_INT | kw= '*' )
             int alt167=2;
             int LA167_0 = input.LA(1);
 
@@ -26837,7 +26837,7 @@
             }
             switch (alt167) {
                 case 1 :
-                    // InternalOCLstdlib.g:9393:6: this_INT_0= RULE_INT
+                    // InternalOCLstdlib.g:9395:6: this_INT_0= RULE_INT
                     {
                     this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -26854,7 +26854,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalOCLstdlib.g:9402:2: kw= '*'
+                    // InternalOCLstdlib.g:9404:2: kw= '*'
                     {
                     kw=(Token)match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -26889,7 +26889,7 @@
 
 
     // $ANTLR start "entryRuleURI"
-    // InternalOCLstdlib.g:9415:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
+    // InternalOCLstdlib.g:9417:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
     public final String entryRuleURI() throws RecognitionException {
         String current = null;
 
@@ -26897,8 +26897,8 @@
 
 
         try {
-            // InternalOCLstdlib.g:9416:2: (iv_ruleURI= ruleURI EOF )
-            // InternalOCLstdlib.g:9417:2: iv_ruleURI= ruleURI EOF
+            // InternalOCLstdlib.g:9418:2: (iv_ruleURI= ruleURI EOF )
+            // InternalOCLstdlib.g:9419:2: iv_ruleURI= ruleURI EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getURIRule());
@@ -26929,7 +26929,7 @@
 
 
     // $ANTLR start "ruleURI"
-    // InternalOCLstdlib.g:9424:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
+    // InternalOCLstdlib.g:9426:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
     public final AntlrDatatypeRuleToken ruleURI() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26938,8 +26938,8 @@
          enterRule();
 
         try {
-            // InternalOCLstdlib.g:9427:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
-            // InternalOCLstdlib.g:9428:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
+            // InternalOCLstdlib.g:9429:28: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
+            // InternalOCLstdlib.g:9430:5: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
             {
             this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/serializer/AbstractOCLstdlibSemanticSequencer.java b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/serializer/AbstractOCLstdlibSemanticSequencer.java
index 54f2d4c..fcb6bef 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/serializer/AbstractOCLstdlibSemanticSequencer.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/serializer/AbstractOCLstdlibSemanticSequencer.java
@@ -206,6 +206,10 @@
 					sequence_URIPathNameCS(context, (PathNameCS) semanticObject);
 					return;
 				}
+				else if (rule == grammarAccess.getUnreservedPathNameCSRule()) {
+					sequence_UnreservedPathNameCS(context, (PathNameCS) semanticObject);
+					return;
+				}
 				else break;
 			case BaseCSPackage.PRIMITIVE_TYPE_REF_CS:
 				if (rule == grammarAccess.getPrimitiveTypeCSRule()
diff --git a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/services/OCLstdlibGrammarAccess.java b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/services/OCLstdlibGrammarAccess.java
index b992e14..9e51bf3 100644
--- a/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/services/OCLstdlibGrammarAccess.java
+++ b/plugins/org.eclipse.ocl.xtext.oclstdlib/src-gen/org/eclipse/ocl/xtext/oclstdlib/services/OCLstdlibGrammarAccess.java
@@ -3261,8 +3261,8 @@
 	}
 
 	//CollectionTypeCS:
-	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS?
-	//	')')?;
+	//	name=CollectionTypeIdentifier ('(' ownedType=TypeExpWithoutMultiplicityCS ownedCollectionMultiplicity=MultiplicityCS
+	//	? ')')?;
 	public EssentialOCLGrammarAccess.CollectionTypeCSElements getCollectionTypeCSAccess() {
 		return gaEssentialOCL.getCollectionTypeCSAccess();
 	}
@@ -3841,6 +3841,16 @@
 		return getPathNameCSAccess().getRule();
 	}
 
+	//UnreservedPathNameCS PathNameCS:
+	//	ownedPathElements+=NextPathElementCS ('::' ownedPathElements+=NextPathElementCS)*;
+	public BaseGrammarAccess.UnreservedPathNameCSElements getUnreservedPathNameCSAccess() {
+		return gaBase.getUnreservedPathNameCSAccess();
+	}
+
+	public ParserRule getUnreservedPathNameCSRule() {
+		return getUnreservedPathNameCSAccess().getRule();
+	}
+
 	//FirstPathElementCS PathElementCS:
 	//	referredElement=[pivot::NamedElement|super::UnrestrictedName];
 	public BaseGrammarAccess.FirstPathElementCSElements getFirstPathElementCSAccess() {
