From 87d451fa1c1b6254bbfa211b5883cee8b516ec8a Mon Sep 17 00:00:00 2001
From: Jose
Date: Wed, 25 May 2022 08:06:57 -0500
Subject: [PATCH 1/6] feat: dsl grammar adjustments #1446
---
agama/transpiler/grammar/AuthnFlow.g4 | 8 +-
agama/transpiler/grammar/AuthnFlow.interp | 5 +-
agama/transpiler/grammar/AuthnFlow.tokens | 146 +-
.../transpiler/grammar/AuthnFlowLexer.interp | 5 +-
.../transpiler/grammar/AuthnFlowLexer.tokens | 142 +-
.../agama/antlr/AuthnFlowBaseListener.java | 12 +
.../agama/antlr/AuthnFlowBaseVisitor.java | 7 +
.../io/jans/agama/antlr/AuthnFlowLexer.java | 379 ++---
.../jans/agama/antlr/AuthnFlowListener.java | 10 +
.../io/jans/agama/antlr/AuthnFlowParser.java | 1391 +++++++++--------
.../io/jans/agama/antlr/AuthnFlowVisitor.java | 6 +
11 files changed, 1126 insertions(+), 985 deletions(-)
diff --git a/agama/transpiler/grammar/AuthnFlow.g4 b/agama/transpiler/grammar/AuthnFlow.g4
index bbcabcb39c2..d20e7b9f91a 100644
--- a/agama/transpiler/grammar/AuthnFlow.g4
+++ b/agama/transpiler/grammar/AuthnFlow.g4
@@ -1,4 +1,4 @@
-// Whenever this file is edited, Class org.gluu.flowless.dsl.Transpiler and its dependants MUST BE reviewed
+// Whenever this file is edited, Class io.jans.agama.dsl.Transpiler and its dependants MUST BE reviewed
grammar AuthnFlow;
/*
@@ -32,13 +32,15 @@ NL: '\r'? '\n' [\t ]* ;
flow: header statement+ ;
-header: FLOWSTART WS qname WS? INDENT base configs? inputs? DEDENT NL* ;
+header: FLOWSTART WS qname WS? INDENT base timeout? configs? inputs? DEDENT NL* ;
// header always ends in a NL
qname: ALPHANUM | QNAME ; //if flow name is a single word, it is not identified as QNAME but ALPHANUM by parser
base: BASE WS STRING WS? NL;
+timeout: TIMEOUT WS UINT WS SECS WS? NL ;
+
configs: CONFIGS WS short_var WS? NL ;
inputs: FLOWINPUTS (WS short_var)+ WS? NL ;
@@ -130,6 +132,8 @@ FLOWSTART: 'Flow' ;
BASE: 'Basepath' ;
+TIMEOUT: 'Timeout' ;
+
CONFIGS: 'Configs' ;
FLOWINPUTS: 'Inputs' ;
diff --git a/agama/transpiler/grammar/AuthnFlow.interp b/agama/transpiler/grammar/AuthnFlow.interp
index 1c197ddfda9..5b9a2ee7b92 100644
--- a/agama/transpiler/grammar/AuthnFlow.interp
+++ b/agama/transpiler/grammar/AuthnFlow.interp
@@ -12,6 +12,7 @@ null
null
'Flow'
'Basepath'
+'Timeout'
'Configs'
'Inputs'
'Log'
@@ -70,6 +71,7 @@ NL
COMMENT
FLOWSTART
BASE
+TIMEOUT
CONFIGS
FLOWINPUTS
LOG
@@ -119,6 +121,7 @@ flow
header
qname
base
+timeout
configs
inputs
short_var
@@ -159,4 +162,4 @@ stchk_close
atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 57, 576, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 3, 2, 3, 2, 6, 2, 87, 10, 2, 13, 2, 14, 2, 88, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 95, 10, 3, 3, 3, 3, 3, 3, 3, 5, 3, 100, 10, 3, 3, 3, 5, 3, 103, 10, 3, 3, 3, 3, 3, 7, 3, 107, 10, 3, 12, 3, 14, 3, 110, 11, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 118, 10, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 126, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 6, 7, 133, 10, 7, 13, 7, 14, 7, 134, 3, 7, 5, 7, 138, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 5, 10, 159, 10, 10, 3, 10, 3, 10, 5, 10, 163, 10, 10, 3, 11, 5, 11, 166, 10, 11, 3, 11, 5, 11, 169, 10, 11, 3, 11, 3, 11, 5, 11, 173, 10, 11, 3, 11, 3, 11, 5, 11, 177, 10, 11, 3, 11, 3, 11, 5, 11, 181, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 187, 10, 12, 3, 13, 5, 13, 190, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 197, 10, 13, 3, 13, 7, 13, 200, 10, 13, 12, 13, 14, 13, 203, 11, 13, 3, 13, 5, 13, 206, 10, 13, 3, 13, 3, 13, 5, 13, 210, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 218, 10, 14, 12, 14, 14, 14, 221, 11, 14, 3, 14, 5, 14, 224, 10, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 5, 15, 231, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 237, 10, 15, 3, 15, 5, 15, 240, 10, 15, 3, 15, 3, 15, 3, 16, 5, 16, 245, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 252, 10, 16, 3, 16, 3, 16, 5, 16, 256, 10, 16, 3, 16, 5, 16, 259, 10, 16, 3, 16, 3, 16, 5, 16, 263, 10, 16, 3, 17, 3, 17, 6, 17, 267, 10, 17, 13, 17, 14, 17, 268, 3, 17, 5, 17, 272, 10, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 280, 10, 18, 12, 18, 14, 18, 283, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 289, 10, 19, 12, 19, 14, 19, 292, 11, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 301, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 5, 23, 308, 10, 23, 3, 24, 3, 24, 5, 24, 312, 10, 24, 3, 24, 7, 24, 315, 10, 24, 12, 24, 14, 24, 318, 11, 24, 3, 24, 3, 24, 7, 24, 322, 10, 24, 12, 24, 14, 24, 325, 11, 24, 3, 24, 5, 24, 328, 10, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 334, 10, 25, 3, 25, 7, 25, 337, 10, 25, 12, 25, 14, 25, 340, 11, 25, 3, 25, 3, 25, 7, 25, 344, 10, 25, 12, 25, 14, 25, 347, 11, 25, 3, 25, 5, 25, 350, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 5, 26, 357, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 363, 10, 27, 3, 27, 3, 27, 5, 27, 367, 10, 27, 3, 27, 3, 27, 3, 28, 5, 28, 372, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 378, 10, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 386, 10, 29, 3, 29, 5, 29, 389, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 399, 10, 30, 3, 30, 3, 30, 6, 30, 403, 10, 30, 13, 30, 14, 30, 404, 3, 30, 3, 30, 5, 30, 409, 10, 30, 3, 31, 3, 31, 5, 31, 413, 10, 31, 3, 31, 3, 31, 6, 31, 417, 10, 31, 13, 31, 14, 31, 418, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 6, 32, 426, 10, 32, 13, 32, 14, 32, 427, 3, 32, 3, 32, 5, 32, 432, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 438, 10, 33, 12, 33, 14, 33, 441, 11, 33, 3, 34, 7, 34, 444, 10, 34, 12, 34, 14, 34, 447, 11, 34, 3, 34, 3, 34, 5, 34, 451, 10, 34, 3, 34, 7, 34, 454, 10, 34, 12, 34, 14, 34, 457, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 467, 10, 35, 3, 35, 3, 35, 5, 35, 471, 10, 35, 3, 36, 3, 36, 5, 36, 475, 10, 36, 3, 36, 3, 36, 6, 36, 479, 10, 36, 13, 36, 14, 36, 480, 3, 36, 3, 36, 3, 37, 5, 37, 486, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 6, 37, 497, 10, 37, 13, 37, 14, 37, 498, 3, 37, 5, 37, 502, 10, 37, 3, 37, 3, 37, 3, 38, 5, 38, 507, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 513, 10, 38, 3, 38, 3, 38, 3, 38, 5, 38, 518, 10, 38, 3, 38, 3, 38, 6, 38, 522, 10, 38, 13, 38, 14, 38, 523, 3, 38, 5, 38, 527, 10, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 536, 10, 39, 12, 39, 14, 39, 539, 11, 39, 3, 40, 3, 40, 3, 40, 5, 40, 544, 10, 40, 3, 40, 3, 40, 3, 40, 5, 40, 549, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 559, 10, 41, 3, 41, 3, 41, 3, 41, 5, 41, 564, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 572, 10, 42, 3, 42, 3, 42, 3, 42, 2, 2, 43, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 2, 5, 3, 2, 49, 50, 3, 2, 43, 48, 3, 2, 35, 36, 2, 631, 2, 84, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 111, 3, 2, 2, 2, 8, 113, 3, 2, 2, 2, 10, 121, 3, 2, 2, 2, 12, 129, 3, 2, 2, 2, 14, 141, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 165, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 189, 3, 2, 2, 2, 26, 211, 3, 2, 2, 2, 28, 230, 3, 2, 2, 2, 30, 244, 3, 2, 2, 2, 32, 264, 3, 2, 2, 2, 34, 275, 3, 2, 2, 2, 36, 284, 3, 2, 2, 2, 38, 293, 3, 2, 2, 2, 40, 300, 3, 2, 2, 2, 42, 302, 3, 2, 2, 2, 44, 307, 3, 2, 2, 2, 46, 309, 3, 2, 2, 2, 48, 331, 3, 2, 2, 2, 50, 353, 3, 2, 2, 2, 52, 360, 3, 2, 2, 2, 54, 371, 3, 2, 2, 2, 56, 381, 3, 2, 2, 2, 58, 392, 3, 2, 2, 2, 60, 410, 3, 2, 2, 2, 62, 422, 3, 2, 2, 2, 64, 433, 3, 2, 2, 2, 66, 445, 3, 2, 2, 2, 68, 460, 3, 2, 2, 2, 70, 472, 3, 2, 2, 2, 72, 485, 3, 2, 2, 2, 74, 506, 3, 2, 2, 2, 76, 530, 3, 2, 2, 2, 78, 540, 3, 2, 2, 2, 80, 554, 3, 2, 2, 2, 82, 567, 3, 2, 2, 2, 84, 86, 5, 4, 3, 2, 85, 87, 5, 16, 9, 2, 86, 85, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 3, 3, 2, 2, 2, 90, 91, 7, 13, 2, 2, 91, 92, 7, 55, 2, 2, 92, 94, 5, 6, 4, 2, 93, 95, 7, 55, 2, 2, 94, 93, 3, 2, 2, 2, 94, 95, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 97, 7, 56, 2, 2, 97, 99, 5, 8, 5, 2, 98, 100, 5, 10, 6, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 103, 5, 12, 7, 2, 102, 101, 3, 2, 2, 2, 102, 103, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 108, 7, 57, 2, 2, 105, 107, 7, 11, 2, 2, 106, 105, 3, 2, 2, 2, 107, 110, 3, 2, 2, 2, 108, 106, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 5, 3, 2, 2, 2, 110, 108, 3, 2, 2, 2, 111, 112, 9, 2, 2, 2, 112, 7, 3, 2, 2, 2, 113, 114, 7, 14, 2, 2, 114, 115, 7, 55, 2, 2, 115, 117, 7, 45, 2, 2, 116, 118, 7, 55, 2, 2, 117, 116, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 120, 7, 11, 2, 2, 120, 9, 3, 2, 2, 2, 121, 122, 7, 15, 2, 2, 122, 123, 7, 55, 2, 2, 123, 125, 5, 14, 8, 2, 124, 126, 7, 55, 2, 2, 125, 124, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 127, 3, 2, 2, 2, 127, 128, 7, 11, 2, 2, 128, 11, 3, 2, 2, 2, 129, 132, 7, 16, 2, 2, 130, 131, 7, 55, 2, 2, 131, 133, 5, 14, 8, 2, 132, 130, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 137, 3, 2, 2, 2, 136, 138, 7, 55, 2, 2, 137, 136, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 7, 11, 2, 2, 140, 13, 3, 2, 2, 2, 141, 142, 7, 49, 2, 2, 142, 15, 3, 2, 2, 2, 143, 155, 5, 24, 13, 2, 144, 155, 5, 28, 15, 2, 145, 155, 5, 30, 16, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 32, 17, 2, 148, 155, 5, 54, 28, 2, 149, 155, 5, 56, 29, 2, 150, 155, 5, 62, 32, 2, 151, 155, 5, 58, 30, 2, 152, 155, 5, 72, 37, 2, 153, 155, 5, 74, 38, 2, 154, 143, 3, 2, 2, 2, 154, 144, 3, 2, 2, 2, 154, 145, 3, 2, 2, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 158, 5, 22, 12, 2, 157, 159, 7, 55, 2, 2, 158, 157, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 162, 7, 41, 2, 2, 161, 163, 7, 55, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 19, 3, 2, 2, 2, 164, 166, 5, 22, 12, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 169, 7, 55, 2, 2, 168, 167, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 172, 7, 3, 2, 2, 171, 173, 7, 55, 2, 2, 172, 171, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 5, 14, 8, 2, 175, 177, 7, 55, 2, 2, 176, 175, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 180, 7, 41, 2, 2, 179, 181, 7, 55, 2, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 21, 3, 2, 2, 2, 182, 187, 5, 14, 8, 2, 183, 187, 7, 50, 2, 2, 184, 187, 7, 52, 2, 2, 185, 187, 7, 53, 2, 2, 186, 182, 3, 2, 2, 2, 186, 183, 3, 2, 2, 2, 186, 184, 3, 2, 2, 2, 186, 185, 3, 2, 2, 2, 187, 23, 3, 2, 2, 2, 188, 190, 5, 18, 10, 2, 189, 188, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 7, 18, 2, 2, 192, 196, 7, 55, 2, 2, 193, 194, 7, 4, 2, 2, 194, 197, 5, 22, 12, 2, 195, 197, 5, 6, 4, 2, 196, 193, 3, 2, 2, 2, 196, 195, 3, 2, 2, 2, 197, 201, 3, 2, 2, 2, 198, 200, 5, 38, 20, 2, 199, 198, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 201, 202, 3, 2, 2, 2, 202, 205, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 204, 206, 7, 55, 2, 2, 205, 204, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 209, 3, 2, 2, 2, 207, 210, 5, 26, 14, 2, 208, 210, 7, 11, 2, 2, 209, 207, 3, 2, 2, 2, 209, 208, 3, 2, 2, 2, 210, 25, 3, 2, 2, 2, 211, 212, 7, 56, 2, 2, 212, 213, 7, 24, 2, 2, 213, 214, 7, 55, 2, 2, 214, 219, 7, 45, 2, 2, 215, 216, 7, 55, 2, 2, 216, 218, 7, 45, 2, 2, 217, 215, 3, 2, 2, 2, 218, 221, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 223, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 222, 224, 7, 55, 2, 2, 223, 222, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 226, 7, 11, 2, 2, 226, 227, 7, 57, 2, 2, 227, 27, 3, 2, 2, 2, 228, 231, 5, 18, 10, 2, 229, 231, 5, 20, 11, 2, 230, 228, 3, 2, 2, 2, 230, 229, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 7, 19, 2, 2, 233, 236, 7, 55, 2, 2, 234, 237, 5, 34, 18, 2, 235, 237, 5, 36, 19, 2, 236, 234, 3, 2, 2, 2, 236, 235, 3, 2, 2, 2, 237, 239, 3, 2, 2, 2, 238, 240, 7, 55, 2, 2, 239, 238, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 11, 2, 2, 242, 29, 3, 2, 2, 2, 243, 245, 5, 18, 10, 2, 244, 243, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 7, 20, 2, 2, 247, 248, 7, 55, 2, 2, 248, 251, 7, 45, 2, 2, 249, 250, 7, 55, 2, 2, 250, 252, 5, 22, 12, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 255, 3, 2, 2, 2, 253, 254, 7, 55, 2, 2, 254, 256, 7, 44, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 258, 3, 2, 2, 2, 257, 259, 7, 55, 2, 2, 258, 257, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 262, 3, 2, 2, 2, 260, 263, 5, 78, 40, 2, 261, 263, 7, 11, 2, 2, 262, 260, 3, 2, 2, 2, 262, 261, 3, 2, 2, 2, 263, 31, 3, 2, 2, 2, 264, 266, 7, 17, 2, 2, 265, 267, 5, 38, 20, 2, 266, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 55, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 274, 7, 11, 2, 2, 274, 33, 3, 2, 2, 2, 275, 276, 5, 6, 4, 2, 276, 277, 7, 5, 2, 2, 277, 281, 7, 49, 2, 2, 278, 280, 5, 38, 20, 2, 279, 278, 3, 2, 2, 2, 280, 283, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 35, 3, 2, 2, 2, 283, 281, 3, 2, 2, 2, 284, 285, 5, 22, 12, 2, 285, 286, 7, 55, 2, 2, 286, 290, 7, 49, 2, 2, 287, 289, 5, 38, 20, 2, 288, 287, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 288, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 37, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 293, 294, 7, 55, 2, 2, 294, 295, 5, 40, 21, 2, 295, 39, 3, 2, 2, 2, 296, 301, 5, 42, 22, 2, 297, 301, 5, 22, 12, 2, 298, 299, 7, 42, 2, 2, 299, 301, 5, 22, 12, 2, 300, 296, 3, 2, 2, 2, 300, 297, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 41, 3, 2, 2, 2, 302, 303, 9, 3, 2, 2, 303, 43, 3, 2, 2, 2, 304, 308, 5, 48, 25, 2, 305, 308, 5, 46, 24, 2, 306, 308, 5, 40, 21, 2, 307, 304, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 306, 3, 2, 2, 2, 308, 45, 3, 2, 2, 2, 309, 311, 7, 6, 2, 2, 310, 312, 7, 55, 2, 2, 311, 310, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, 316, 3, 2, 2, 2, 313, 315, 5, 44, 23, 2, 314, 313, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 323, 3, 2, 2, 2, 318, 316, 3, 2, 2, 2, 319, 320, 7, 54, 2, 2, 320, 322, 5, 44, 23, 2, 321, 319, 3, 2, 2, 2, 322, 325, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 328, 7, 55, 2, 2, 327, 326, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 330, 7, 7, 2, 2, 330, 47, 3, 2, 2, 2, 331, 333, 7, 8, 2, 2, 332, 334, 7, 55, 2, 2, 333, 332, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 338, 3, 2, 2, 2, 335, 337, 5, 52, 27, 2, 336, 335, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 345, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, 342, 7, 54, 2, 2, 342, 344, 5, 52, 27, 2, 343, 341, 3, 2, 2, 2, 344, 347, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 349, 3, 2, 2, 2, 347, 345, 3, 2, 2, 2, 348, 350, 7, 55, 2, 2, 349, 348, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 7, 9, 2, 2, 352, 49, 3, 2, 2, 2, 353, 354, 5, 18, 10, 2, 354, 356, 5, 44, 23, 2, 355, 357, 7, 55, 2, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 11, 2, 2, 359, 51, 3, 2, 2, 2, 360, 362, 7, 49, 2, 2, 361, 363, 7, 55, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 366, 7, 10, 2, 2, 365, 367, 7, 55, 2, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 5, 44, 23, 2, 369, 53, 3, 2, 2, 2, 370, 372, 5, 18, 10, 2, 371, 370, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 7, 32, 2, 2, 374, 377, 7, 55, 2, 2, 375, 378, 7, 45, 2, 2, 376, 378, 5, 22, 12, 2, 377, 375, 3, 2, 2, 2, 377, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 380, 7, 11, 2, 2, 380, 55, 3, 2, 2, 2, 381, 382, 7, 31, 2, 2, 382, 385, 7, 55, 2, 2, 383, 386, 7, 44, 2, 2, 384, 386, 5, 22, 12, 2, 385, 383, 3, 2, 2, 2, 385, 384, 3, 2, 2, 2, 386, 388, 3, 2, 2, 2, 387, 389, 7, 55, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 11, 2, 2, 391, 57, 3, 2, 2, 2, 392, 393, 7, 29, 2, 2, 393, 394, 7, 55, 2, 2, 394, 395, 5, 40, 21, 2, 395, 396, 7, 55, 2, 2, 396, 398, 7, 38, 2, 2, 397, 399, 7, 55, 2, 2, 398, 397, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 402, 7, 56, 2, 2, 401, 403, 5, 60, 31, 2, 402, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 408, 7, 57, 2, 2, 407, 409, 5, 70, 36, 2, 408, 407, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 59, 3, 2, 2, 2, 410, 412, 5, 40, 21, 2, 411, 413, 7, 55, 2, 2, 412, 411, 3, 2, 2, 2, 412, 413, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 7, 56, 2, 2, 415, 417, 5, 16, 9, 2, 416, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 421, 7, 57, 2, 2, 421, 61, 3, 2, 2, 2, 422, 423, 5, 64, 33, 2, 423, 425, 7, 56, 2, 2, 424, 426, 5, 16, 9, 2, 425, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 431, 7, 57, 2, 2, 430, 432, 5, 70, 36, 2, 431, 430, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 63, 3, 2, 2, 2, 433, 434, 7, 25, 2, 2, 434, 435, 7, 55, 2, 2, 435, 439, 5, 68, 35, 2, 436, 438, 5, 66, 34, 2, 437, 436, 3, 2, 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 65, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 444, 7, 11, 2, 2, 443, 442, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 448, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 450, 9, 4, 2, 2, 449, 451, 7, 55, 2, 2, 450, 449, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 454, 7, 11, 2, 2, 453, 452, 3, 2, 2, 2, 454, 457, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 458, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 458, 459, 5, 68, 35, 2, 459, 67, 3, 2, 2, 2, 460, 461, 5, 40, 21, 2, 461, 462, 7, 55, 2, 2, 462, 463, 7, 33, 2, 2, 463, 466, 7, 55, 2, 2, 464, 465, 7, 34, 2, 2, 465, 467, 7, 55, 2, 2, 466, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 470, 5, 40, 21, 2, 469, 471, 7, 55, 2, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 69, 3, 2, 2, 2, 472, 474, 7, 26, 2, 2, 473, 475, 7, 55, 2, 2, 474, 473, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 478, 7, 56, 2, 2, 477, 479, 5, 16, 9, 2, 478, 477, 3, 2, 2, 2, 479, 480, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 7, 57, 2, 2, 483, 71, 3, 2, 2, 2, 484, 486, 5, 18, 10, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 28, 2, 2, 488, 489, 7, 55, 2, 2, 489, 490, 5, 22, 12, 2, 490, 491, 7, 55, 2, 2, 491, 492, 7, 40, 2, 2, 492, 493, 7, 55, 2, 2, 493, 494, 5, 14, 8, 2, 494, 496, 7, 56, 2, 2, 495, 497, 5, 16, 9, 2, 496, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 501, 3, 2, 2, 2, 500, 502, 5, 76, 39, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 57, 2, 2, 504, 73, 3, 2, 2, 2, 505, 507, 5, 18, 10, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 27, 2, 2, 509, 512, 7, 55, 2, 2, 510, 513, 5, 22, 12, 2, 511, 513, 7, 46, 2, 2, 512, 510, 3, 2, 2, 2, 512, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 7, 55, 2, 2, 515, 517, 7, 39, 2, 2, 516, 518, 7, 55, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 521, 7, 56, 2, 2, 520, 522, 5, 16, 9, 2, 521, 520, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 526, 3, 2, 2, 2, 525, 527, 5, 76, 39, 2, 526, 525, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 7, 57, 2, 2, 529, 75, 3, 2, 2, 2, 530, 531, 7, 30, 2, 2, 531, 532, 7, 55, 2, 2, 532, 533, 5, 64, 33, 2, 533, 537, 7, 11, 2, 2, 534, 536, 5, 16, 9, 2, 535, 534, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 77, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 540, 541, 7, 56, 2, 2, 541, 543, 7, 21, 2, 2, 542, 544, 7, 55, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 7, 56, 2, 2, 546, 548, 5, 80, 41, 2, 547, 549, 5, 28, 15, 2, 548, 547, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 5, 82, 42, 2, 551, 552, 7, 57, 2, 2, 552, 553, 7, 57, 2, 2, 553, 79, 3, 2, 2, 2, 554, 555, 7, 22, 2, 2, 555, 558, 7, 55, 2, 2, 556, 559, 5, 22, 12, 2, 557, 559, 7, 46, 2, 2, 558, 556, 3, 2, 2, 2, 558, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 7, 55, 2, 2, 561, 563, 7, 37, 2, 2, 562, 564, 7, 55, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 11, 2, 2, 566, 81, 3, 2, 2, 2, 567, 568, 7, 23, 2, 2, 568, 569, 7, 55, 2, 2, 569, 571, 5, 64, 33, 2, 570, 572, 7, 55, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 11, 2, 2, 574, 83, 3, 2, 2, 2, 85, 88, 94, 99, 102, 108, 117, 125, 134, 137, 154, 158, 162, 165, 168, 172, 176, 180, 186, 189, 196, 201, 205, 209, 219, 223, 230, 236, 239, 244, 251, 255, 258, 262, 268, 271, 281, 290, 300, 307, 311, 316, 323, 327, 333, 338, 345, 349, 356, 362, 366, 371, 377, 385, 388, 398, 404, 408, 412, 418, 427, 431, 439, 445, 450, 455, 466, 470, 474, 480, 485, 498, 501, 506, 512, 517, 523, 526, 537, 543, 548, 558, 563, 571]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 58, 591, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 3, 2, 6, 2, 89, 10, 2, 13, 2, 14, 2, 90, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 97, 10, 3, 3, 3, 3, 3, 3, 3, 5, 3, 102, 10, 3, 3, 3, 5, 3, 105, 10, 3, 3, 3, 5, 3, 108, 10, 3, 3, 3, 3, 3, 7, 3, 112, 10, 3, 12, 3, 14, 3, 115, 11, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 123, 10, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 133, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 141, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 6, 8, 148, 10, 8, 13, 8, 14, 8, 149, 3, 8, 5, 8, 153, 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 170, 10, 10, 3, 11, 3, 11, 5, 11, 174, 10, 11, 3, 11, 3, 11, 5, 11, 178, 10, 11, 3, 12, 5, 12, 181, 10, 12, 3, 12, 5, 12, 184, 10, 12, 3, 12, 3, 12, 5, 12, 188, 10, 12, 3, 12, 3, 12, 5, 12, 192, 10, 12, 3, 12, 3, 12, 5, 12, 196, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 202, 10, 13, 3, 14, 5, 14, 205, 10, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 212, 10, 14, 3, 14, 7, 14, 215, 10, 14, 12, 14, 14, 14, 218, 11, 14, 3, 14, 5, 14, 221, 10, 14, 3, 14, 3, 14, 5, 14, 225, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 233, 10, 15, 12, 15, 14, 15, 236, 11, 15, 3, 15, 5, 15, 239, 10, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 5, 16, 246, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 252, 10, 16, 3, 16, 5, 16, 255, 10, 16, 3, 16, 3, 16, 3, 17, 5, 17, 260, 10, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 5, 17, 267, 10, 17, 3, 17, 3, 17, 5, 17, 271, 10, 17, 3, 17, 5, 17, 274, 10, 17, 3, 17, 3, 17, 5, 17, 278, 10, 17, 3, 18, 3, 18, 6, 18, 282, 10, 18, 13, 18, 14, 18, 283, 3, 18, 5, 18, 287, 10, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 295, 10, 19, 12, 19, 14, 19, 298, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 304, 10, 20, 12, 20, 14, 20, 307, 11, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 316, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 5, 24, 323, 10, 24, 3, 25, 3, 25, 5, 25, 327, 10, 25, 3, 25, 7, 25, 330, 10, 25, 12, 25, 14, 25, 333, 11, 25, 3, 25, 3, 25, 7, 25, 337, 10, 25, 12, 25, 14, 25, 340, 11, 25, 3, 25, 5, 25, 343, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 349, 10, 26, 3, 26, 7, 26, 352, 10, 26, 12, 26, 14, 26, 355, 11, 26, 3, 26, 3, 26, 7, 26, 359, 10, 26, 12, 26, 14, 26, 362, 11, 26, 3, 26, 5, 26, 365, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 5, 27, 372, 10, 27, 3, 27, 3, 27, 3, 28, 3, 28, 5, 28, 378, 10, 28, 3, 28, 3, 28, 5, 28, 382, 10, 28, 3, 28, 3, 28, 3, 29, 5, 29, 387, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 393, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 401, 10, 30, 3, 30, 5, 30, 404, 10, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 414, 10, 31, 3, 31, 3, 31, 6, 31, 418, 10, 31, 13, 31, 14, 31, 419, 3, 31, 3, 31, 5, 31, 424, 10, 31, 3, 32, 3, 32, 5, 32, 428, 10, 32, 3, 32, 3, 32, 6, 32, 432, 10, 32, 13, 32, 14, 32, 433, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 6, 33, 441, 10, 33, 13, 33, 14, 33, 442, 3, 33, 3, 33, 5, 33, 447, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 7, 34, 453, 10, 34, 12, 34, 14, 34, 456, 11, 34, 3, 35, 7, 35, 459, 10, 35, 12, 35, 14, 35, 462, 11, 35, 3, 35, 3, 35, 5, 35, 466, 10, 35, 3, 35, 7, 35, 469, 10, 35, 12, 35, 14, 35, 472, 11, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 482, 10, 36, 3, 36, 3, 36, 5, 36, 486, 10, 36, 3, 37, 3, 37, 5, 37, 490, 10, 37, 3, 37, 3, 37, 6, 37, 494, 10, 37, 13, 37, 14, 37, 495, 3, 37, 3, 37, 3, 38, 5, 38, 501, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 6, 38, 512, 10, 38, 13, 38, 14, 38, 513, 3, 38, 5, 38, 517, 10, 38, 3, 38, 3, 38, 3, 39, 5, 39, 522, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 528, 10, 39, 3, 39, 3, 39, 3, 39, 5, 39, 533, 10, 39, 3, 39, 3, 39, 6, 39, 537, 10, 39, 13, 39, 14, 39, 538, 3, 39, 5, 39, 542, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 551, 10, 40, 12, 40, 14, 40, 554, 11, 40, 3, 41, 3, 41, 3, 41, 5, 41, 559, 10, 41, 3, 41, 3, 41, 3, 41, 5, 41, 564, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 574, 10, 42, 3, 42, 3, 42, 3, 42, 5, 42, 579, 10, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 587, 10, 43, 3, 43, 3, 43, 3, 43, 2, 2, 44, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 2, 5, 3, 2, 50, 51, 3, 2, 44, 49, 3, 2, 36, 37, 2, 647, 2, 86, 3, 2, 2, 2, 4, 92, 3, 2, 2, 2, 6, 116, 3, 2, 2, 2, 8, 118, 3, 2, 2, 2, 10, 126, 3, 2, 2, 2, 12, 136, 3, 2, 2, 2, 14, 144, 3, 2, 2, 2, 16, 156, 3, 2, 2, 2, 18, 169, 3, 2, 2, 2, 20, 171, 3, 2, 2, 2, 22, 180, 3, 2, 2, 2, 24, 201, 3, 2, 2, 2, 26, 204, 3, 2, 2, 2, 28, 226, 3, 2, 2, 2, 30, 245, 3, 2, 2, 2, 32, 259, 3, 2, 2, 2, 34, 279, 3, 2, 2, 2, 36, 290, 3, 2, 2, 2, 38, 299, 3, 2, 2, 2, 40, 308, 3, 2, 2, 2, 42, 315, 3, 2, 2, 2, 44, 317, 3, 2, 2, 2, 46, 322, 3, 2, 2, 2, 48, 324, 3, 2, 2, 2, 50, 346, 3, 2, 2, 2, 52, 368, 3, 2, 2, 2, 54, 375, 3, 2, 2, 2, 56, 386, 3, 2, 2, 2, 58, 396, 3, 2, 2, 2, 60, 407, 3, 2, 2, 2, 62, 425, 3, 2, 2, 2, 64, 437, 3, 2, 2, 2, 66, 448, 3, 2, 2, 2, 68, 460, 3, 2, 2, 2, 70, 475, 3, 2, 2, 2, 72, 487, 3, 2, 2, 2, 74, 500, 3, 2, 2, 2, 76, 521, 3, 2, 2, 2, 78, 545, 3, 2, 2, 2, 80, 555, 3, 2, 2, 2, 82, 569, 3, 2, 2, 2, 84, 582, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 89, 5, 18, 10, 2, 88, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 3, 3, 2, 2, 2, 92, 93, 7, 13, 2, 2, 93, 94, 7, 56, 2, 2, 94, 96, 5, 6, 4, 2, 95, 97, 7, 56, 2, 2, 96, 95, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 99, 7, 57, 2, 2, 99, 101, 5, 8, 5, 2, 100, 102, 5, 10, 6, 2, 101, 100, 3, 2, 2, 2, 101, 102, 3, 2, 2, 2, 102, 104, 3, 2, 2, 2, 103, 105, 5, 12, 7, 2, 104, 103, 3, 2, 2, 2, 104, 105, 3, 2, 2, 2, 105, 107, 3, 2, 2, 2, 106, 108, 5, 14, 8, 2, 107, 106, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 113, 7, 58, 2, 2, 110, 112, 7, 11, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 5, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 9, 2, 2, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 14, 2, 2, 119, 120, 7, 56, 2, 2, 120, 122, 7, 46, 2, 2, 121, 123, 7, 56, 2, 2, 122, 121, 3, 2, 2, 2, 122, 123, 3, 2, 2, 2, 123, 124, 3, 2, 2, 2, 124, 125, 7, 11, 2, 2, 125, 9, 3, 2, 2, 2, 126, 127, 7, 15, 2, 2, 127, 128, 7, 56, 2, 2, 128, 129, 7, 47, 2, 2, 129, 130, 7, 56, 2, 2, 130, 132, 7, 38, 2, 2, 131, 133, 7, 56, 2, 2, 132, 131, 3, 2, 2, 2, 132, 133, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 135, 7, 11, 2, 2, 135, 11, 3, 2, 2, 2, 136, 137, 7, 16, 2, 2, 137, 138, 7, 56, 2, 2, 138, 140, 5, 16, 9, 2, 139, 141, 7, 56, 2, 2, 140, 139, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 143, 7, 11, 2, 2, 143, 13, 3, 2, 2, 2, 144, 147, 7, 17, 2, 2, 145, 146, 7, 56, 2, 2, 146, 148, 5, 16, 9, 2, 147, 145, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 147, 3, 2, 2, 2, 149, 150, 3, 2, 2, 2, 150, 152, 3, 2, 2, 2, 151, 153, 7, 56, 2, 2, 152, 151, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 154, 3, 2, 2, 2, 154, 155, 7, 11, 2, 2, 155, 15, 3, 2, 2, 2, 156, 157, 7, 50, 2, 2, 157, 17, 3, 2, 2, 2, 158, 170, 5, 26, 14, 2, 159, 170, 5, 30, 16, 2, 160, 170, 5, 32, 17, 2, 161, 170, 5, 52, 27, 2, 162, 170, 5, 34, 18, 2, 163, 170, 5, 56, 29, 2, 164, 170, 5, 58, 30, 2, 165, 170, 5, 64, 33, 2, 166, 170, 5, 60, 31, 2, 167, 170, 5, 74, 38, 2, 168, 170, 5, 76, 39, 2, 169, 158, 3, 2, 2, 2, 169, 159, 3, 2, 2, 2, 169, 160, 3, 2, 2, 2, 169, 161, 3, 2, 2, 2, 169, 162, 3, 2, 2, 2, 169, 163, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 169, 165, 3, 2, 2, 2, 169, 166, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 168, 3, 2, 2, 2, 170, 19, 3, 2, 2, 2, 171, 173, 5, 24, 13, 2, 172, 174, 7, 56, 2, 2, 173, 172, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 177, 7, 42, 2, 2, 176, 178, 7, 56, 2, 2, 177, 176, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 21, 3, 2, 2, 2, 179, 181, 5, 24, 13, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 183, 3, 2, 2, 2, 182, 184, 7, 56, 2, 2, 183, 182, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 185, 3, 2, 2, 2, 185, 187, 7, 3, 2, 2, 186, 188, 7, 56, 2, 2, 187, 186, 3, 2, 2, 2, 187, 188, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 5, 16, 9, 2, 190, 192, 7, 56, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 195, 7, 42, 2, 2, 194, 196, 7, 56, 2, 2, 195, 194, 3, 2, 2, 2, 195, 196, 3, 2, 2, 2, 196, 23, 3, 2, 2, 2, 197, 202, 5, 16, 9, 2, 198, 202, 7, 51, 2, 2, 199, 202, 7, 53, 2, 2, 200, 202, 7, 54, 2, 2, 201, 197, 3, 2, 2, 2, 201, 198, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 201, 200, 3, 2, 2, 2, 202, 25, 3, 2, 2, 2, 203, 205, 5, 20, 11, 2, 204, 203, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 7, 19, 2, 2, 207, 211, 7, 56, 2, 2, 208, 209, 7, 4, 2, 2, 209, 212, 5, 24, 13, 2, 210, 212, 5, 6, 4, 2, 211, 208, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 216, 3, 2, 2, 2, 213, 215, 5, 40, 21, 2, 214, 213, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 220, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 221, 7, 56, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 224, 3, 2, 2, 2, 222, 225, 5, 28, 15, 2, 223, 225, 7, 11, 2, 2, 224, 222, 3, 2, 2, 2, 224, 223, 3, 2, 2, 2, 225, 27, 3, 2, 2, 2, 226, 227, 7, 57, 2, 2, 227, 228, 7, 25, 2, 2, 228, 229, 7, 56, 2, 2, 229, 234, 7, 46, 2, 2, 230, 231, 7, 56, 2, 2, 231, 233, 7, 46, 2, 2, 232, 230, 3, 2, 2, 2, 233, 236, 3, 2, 2, 2, 234, 232, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 237, 239, 7, 56, 2, 2, 238, 237, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 7, 11, 2, 2, 241, 242, 7, 58, 2, 2, 242, 29, 3, 2, 2, 2, 243, 246, 5, 20, 11, 2, 244, 246, 5, 22, 12, 2, 245, 243, 3, 2, 2, 2, 245, 244, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 248, 7, 20, 2, 2, 248, 251, 7, 56, 2, 2, 249, 252, 5, 36, 19, 2, 250, 252, 5, 38, 20, 2, 251, 249, 3, 2, 2, 2, 251, 250, 3, 2, 2, 2, 252, 254, 3, 2, 2, 2, 253, 255, 7, 56, 2, 2, 254, 253, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 7, 11, 2, 2, 257, 31, 3, 2, 2, 2, 258, 260, 5, 20, 11, 2, 259, 258, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 262, 7, 21, 2, 2, 262, 263, 7, 56, 2, 2, 263, 266, 7, 46, 2, 2, 264, 265, 7, 56, 2, 2, 265, 267, 5, 24, 13, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 269, 7, 56, 2, 2, 269, 271, 7, 45, 2, 2, 270, 268, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 273, 3, 2, 2, 2, 272, 274, 7, 56, 2, 2, 273, 272, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 277, 3, 2, 2, 2, 275, 278, 5, 80, 41, 2, 276, 278, 7, 11, 2, 2, 277, 275, 3, 2, 2, 2, 277, 276, 3, 2, 2, 2, 278, 33, 3, 2, 2, 2, 279, 281, 7, 18, 2, 2, 280, 282, 5, 40, 21, 2, 281, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 281, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 286, 3, 2, 2, 2, 285, 287, 7, 56, 2, 2, 286, 285, 3, 2, 2, 2, 286, 287, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 289, 7, 11, 2, 2, 289, 35, 3, 2, 2, 2, 290, 291, 5, 6, 4, 2, 291, 292, 7, 5, 2, 2, 292, 296, 7, 50, 2, 2, 293, 295, 5, 40, 21, 2, 294, 293, 3, 2, 2, 2, 295, 298, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 37, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 299, 300, 5, 24, 13, 2, 300, 301, 7, 56, 2, 2, 301, 305, 7, 50, 2, 2, 302, 304, 5, 40, 21, 2, 303, 302, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 39, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 56, 2, 2, 309, 310, 5, 42, 22, 2, 310, 41, 3, 2, 2, 2, 311, 316, 5, 44, 23, 2, 312, 316, 5, 24, 13, 2, 313, 314, 7, 43, 2, 2, 314, 316, 5, 24, 13, 2, 315, 311, 3, 2, 2, 2, 315, 312, 3, 2, 2, 2, 315, 313, 3, 2, 2, 2, 316, 43, 3, 2, 2, 2, 317, 318, 9, 3, 2, 2, 318, 45, 3, 2, 2, 2, 319, 323, 5, 50, 26, 2, 320, 323, 5, 48, 25, 2, 321, 323, 5, 42, 22, 2, 322, 319, 3, 2, 2, 2, 322, 320, 3, 2, 2, 2, 322, 321, 3, 2, 2, 2, 323, 47, 3, 2, 2, 2, 324, 326, 7, 6, 2, 2, 325, 327, 7, 56, 2, 2, 326, 325, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 331, 3, 2, 2, 2, 328, 330, 5, 46, 24, 2, 329, 328, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 338, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 334, 335, 7, 55, 2, 2, 335, 337, 5, 46, 24, 2, 336, 334, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 342, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, 343, 7, 56, 2, 2, 342, 341, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 345, 7, 7, 2, 2, 345, 49, 3, 2, 2, 2, 346, 348, 7, 8, 2, 2, 347, 349, 7, 56, 2, 2, 348, 347, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 353, 3, 2, 2, 2, 350, 352, 5, 54, 28, 2, 351, 350, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 360, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 356, 357, 7, 55, 2, 2, 357, 359, 5, 54, 28, 2, 358, 356, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 363, 365, 7, 56, 2, 2, 364, 363, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 7, 9, 2, 2, 367, 51, 3, 2, 2, 2, 368, 369, 5, 20, 11, 2, 369, 371, 5, 46, 24, 2, 370, 372, 7, 56, 2, 2, 371, 370, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 7, 11, 2, 2, 374, 53, 3, 2, 2, 2, 375, 377, 7, 50, 2, 2, 376, 378, 7, 56, 2, 2, 377, 376, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 381, 7, 10, 2, 2, 380, 382, 7, 56, 2, 2, 381, 380, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 384, 5, 46, 24, 2, 384, 55, 3, 2, 2, 2, 385, 387, 5, 20, 11, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 7, 33, 2, 2, 389, 392, 7, 56, 2, 2, 390, 393, 7, 46, 2, 2, 391, 393, 5, 24, 13, 2, 392, 390, 3, 2, 2, 2, 392, 391, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 395, 7, 11, 2, 2, 395, 57, 3, 2, 2, 2, 396, 397, 7, 32, 2, 2, 397, 400, 7, 56, 2, 2, 398, 401, 7, 45, 2, 2, 399, 401, 5, 24, 13, 2, 400, 398, 3, 2, 2, 2, 400, 399, 3, 2, 2, 2, 401, 403, 3, 2, 2, 2, 402, 404, 7, 56, 2, 2, 403, 402, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 11, 2, 2, 406, 59, 3, 2, 2, 2, 407, 408, 7, 30, 2, 2, 408, 409, 7, 56, 2, 2, 409, 410, 5, 42, 22, 2, 410, 411, 7, 56, 2, 2, 411, 413, 7, 39, 2, 2, 412, 414, 7, 56, 2, 2, 413, 412, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 417, 7, 57, 2, 2, 416, 418, 5, 62, 32, 2, 417, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 421, 3, 2, 2, 2, 421, 423, 7, 58, 2, 2, 422, 424, 5, 72, 37, 2, 423, 422, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 61, 3, 2, 2, 2, 425, 427, 5, 42, 22, 2, 426, 428, 7, 56, 2, 2, 427, 426, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 431, 7, 57, 2, 2, 430, 432, 5, 18, 10, 2, 431, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 7, 58, 2, 2, 436, 63, 3, 2, 2, 2, 437, 438, 5, 66, 34, 2, 438, 440, 7, 57, 2, 2, 439, 441, 5, 18, 10, 2, 440, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 446, 7, 58, 2, 2, 445, 447, 5, 72, 37, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 65, 3, 2, 2, 2, 448, 449, 7, 26, 2, 2, 449, 450, 7, 56, 2, 2, 450, 454, 5, 70, 36, 2, 451, 453, 5, 68, 35, 2, 452, 451, 3, 2, 2, 2, 453, 456, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 67, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 459, 7, 11, 2, 2, 458, 457, 3, 2, 2, 2, 459, 462, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 9, 4, 2, 2, 464, 466, 7, 56, 2, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 470, 3, 2, 2, 2, 467, 469, 7, 11, 2, 2, 468, 467, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 474, 5, 70, 36, 2, 474, 69, 3, 2, 2, 2, 475, 476, 5, 42, 22, 2, 476, 477, 7, 56, 2, 2, 477, 478, 7, 34, 2, 2, 478, 481, 7, 56, 2, 2, 479, 480, 7, 35, 2, 2, 480, 482, 7, 56, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 485, 5, 42, 22, 2, 484, 486, 7, 56, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 71, 3, 2, 2, 2, 487, 489, 7, 27, 2, 2, 488, 490, 7, 56, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 493, 7, 57, 2, 2, 492, 494, 5, 18, 10, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 58, 2, 2, 498, 73, 3, 2, 2, 2, 499, 501, 5, 20, 11, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 29, 2, 2, 503, 504, 7, 56, 2, 2, 504, 505, 5, 24, 13, 2, 505, 506, 7, 56, 2, 2, 506, 507, 7, 41, 2, 2, 507, 508, 7, 56, 2, 2, 508, 509, 5, 16, 9, 2, 509, 511, 7, 57, 2, 2, 510, 512, 5, 18, 10, 2, 511, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 516, 3, 2, 2, 2, 515, 517, 5, 78, 40, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 58, 2, 2, 519, 75, 3, 2, 2, 2, 520, 522, 5, 20, 11, 2, 521, 520, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 7, 28, 2, 2, 524, 527, 7, 56, 2, 2, 525, 528, 5, 24, 13, 2, 526, 528, 7, 47, 2, 2, 527, 525, 3, 2, 2, 2, 527, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 56, 2, 2, 530, 532, 7, 40, 2, 2, 531, 533, 7, 56, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 536, 7, 57, 2, 2, 535, 537, 5, 18, 10, 2, 536, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 541, 3, 2, 2, 2, 540, 542, 5, 78, 40, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 544, 7, 58, 2, 2, 544, 77, 3, 2, 2, 2, 545, 546, 7, 31, 2, 2, 546, 547, 7, 56, 2, 2, 547, 548, 5, 66, 34, 2, 548, 552, 7, 11, 2, 2, 549, 551, 5, 18, 10, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 79, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 7, 57, 2, 2, 556, 558, 7, 22, 2, 2, 557, 559, 7, 56, 2, 2, 558, 557, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 7, 57, 2, 2, 561, 563, 5, 82, 42, 2, 562, 564, 5, 30, 16, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 5, 84, 43, 2, 566, 567, 7, 58, 2, 2, 567, 568, 7, 58, 2, 2, 568, 81, 3, 2, 2, 2, 569, 570, 7, 23, 2, 2, 570, 573, 7, 56, 2, 2, 571, 574, 5, 24, 13, 2, 572, 574, 7, 47, 2, 2, 573, 571, 3, 2, 2, 2, 573, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 576, 7, 56, 2, 2, 576, 578, 7, 38, 2, 2, 577, 579, 7, 56, 2, 2, 578, 577, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 7, 11, 2, 2, 581, 83, 3, 2, 2, 2, 582, 583, 7, 24, 2, 2, 583, 584, 7, 56, 2, 2, 584, 586, 5, 66, 34, 2, 585, 587, 7, 56, 2, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 7, 11, 2, 2, 589, 85, 3, 2, 2, 2, 87, 90, 96, 101, 104, 107, 113, 122, 132, 140, 149, 152, 169, 173, 177, 180, 183, 187, 191, 195, 201, 204, 211, 216, 220, 224, 234, 238, 245, 251, 254, 259, 266, 270, 273, 277, 283, 286, 296, 305, 315, 322, 326, 331, 338, 342, 348, 353, 360, 364, 371, 377, 381, 386, 392, 400, 403, 413, 419, 423, 427, 433, 442, 446, 454, 460, 465, 470, 481, 485, 489, 495, 500, 513, 516, 521, 527, 532, 538, 541, 552, 558, 563, 573, 578, 586]
\ No newline at end of file
diff --git a/agama/transpiler/grammar/AuthnFlow.tokens b/agama/transpiler/grammar/AuthnFlow.tokens
index 33861795baa..995d34f4e8b 100644
--- a/agama/transpiler/grammar/AuthnFlow.tokens
+++ b/agama/transpiler/grammar/AuthnFlow.tokens
@@ -10,49 +10,50 @@ NL=9
COMMENT=10
FLOWSTART=11
BASE=12
-CONFIGS=13
-FLOWINPUTS=14
-LOG=15
-FLOWCALL=16
-ACTIONCALL=17
-RRFCALL=18
-STATUS_CHK=19
-OPEN=20
-CLOSE=21
-OVERRIDE=22
-WHEN=23
-OTHERWISE=24
-REPEAT=25
-ITERATE=26
-MATCH=27
-QUIT=28
-FINISH=29
-RFAC=30
-IS=31
-NOT=32
-AND=33
-OR=34
-SECS=35
-TO=36
-MAXTIMES=37
-USE=38
-EQ=39
-MINUS=40
-NUL=41
-BOOL=42
-STRING=43
-UINT=44
-SINT=45
-DECIMAL=46
-ALPHANUM=47
-QNAME=48
-EVALNUM=49
-DOTEXPR=50
-DOTIDXEXPR=51
-SPCOMMA=52
-WS=53
-INDENT=54
-DEDENT=55
+TIMEOUT=13
+CONFIGS=14
+FLOWINPUTS=15
+LOG=16
+FLOWCALL=17
+ACTIONCALL=18
+RRFCALL=19
+STATUS_CHK=20
+OPEN=21
+CLOSE=22
+OVERRIDE=23
+WHEN=24
+OTHERWISE=25
+REPEAT=26
+ITERATE=27
+MATCH=28
+QUIT=29
+FINISH=30
+RFAC=31
+IS=32
+NOT=33
+AND=34
+OR=35
+SECS=36
+TO=37
+MAXTIMES=38
+USE=39
+EQ=40
+MINUS=41
+NUL=42
+BOOL=43
+STRING=44
+UINT=45
+SINT=46
+DECIMAL=47
+ALPHANUM=48
+QNAME=49
+EVALNUM=50
+DOTEXPR=51
+DOTIDXEXPR=52
+SPCOMMA=53
+WS=54
+INDENT=55
+DEDENT=56
'|'=1
'$'=2
'#'=3
@@ -63,32 +64,33 @@ DEDENT=55
':'=8
'Flow'=11
'Basepath'=12
-'Configs'=13
-'Inputs'=14
-'Log'=15
-'Trigger'=16
-'Call'=17
-'RRF'=18
-'Status checker'=19
-'Open for'=20
-'Close'=21
-'Override templates'=22
-'When'=23
-'Otherwise'=24
-'Repeat'=25
-'Iterate over'=26
-'Match'=27
-'Quit'=28
-'Finish'=29
-'RFAC'=30
-'is'=31
-'not'=32
-'and'=33
-'or'=34
-'seconds'=35
-'to'=36
-'times max'=37
-'using'=38
-'='=39
-'-'=40
-'null'=41
+'Timeout'=13
+'Configs'=14
+'Inputs'=15
+'Log'=16
+'Trigger'=17
+'Call'=18
+'RRF'=19
+'Status checker'=20
+'Open for'=21
+'Close'=22
+'Override templates'=23
+'When'=24
+'Otherwise'=25
+'Repeat'=26
+'Iterate over'=27
+'Match'=28
+'Quit'=29
+'Finish'=30
+'RFAC'=31
+'is'=32
+'not'=33
+'and'=34
+'or'=35
+'seconds'=36
+'to'=37
+'times max'=38
+'using'=39
+'='=40
+'-'=41
+'null'=42
diff --git a/agama/transpiler/grammar/AuthnFlowLexer.interp b/agama/transpiler/grammar/AuthnFlowLexer.interp
index 05a192bdc8b..160f6dae137 100644
--- a/agama/transpiler/grammar/AuthnFlowLexer.interp
+++ b/agama/transpiler/grammar/AuthnFlowLexer.interp
@@ -12,6 +12,7 @@ null
null
'Flow'
'Basepath'
+'Timeout'
'Configs'
'Inputs'
'Log'
@@ -68,6 +69,7 @@ NL
COMMENT
FLOWSTART
BASE
+TIMEOUT
CONFIGS
FLOWINPUTS
LOG
@@ -128,6 +130,7 @@ COMMA
COMMENT
FLOWSTART
BASE
+TIMEOUT
CONFIGS
FLOWINPUTS
LOG
@@ -178,4 +181,4 @@ mode names:
DEFAULT_MODE
atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 55, 487, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 5, 10, 137, 10, 10, 3, 10, 3, 10, 7, 10, 141, 10, 10, 12, 10, 14, 10, 144, 11, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 154, 10, 13, 12, 13, 14, 13, 157, 11, 13, 3, 14, 6, 14, 160, 10, 14, 13, 14, 14, 14, 161, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 170, 10, 16, 12, 16, 14, 16, 173, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 393, 10, 48, 3, 49, 3, 49, 7, 49, 397, 10, 49, 12, 49, 14, 49, 400, 11, 49, 3, 49, 3, 49, 3, 50, 6, 50, 405, 10, 50, 13, 50, 14, 50, 406, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 5, 52, 414, 10, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 7, 54, 424, 10, 54, 12, 54, 14, 54, 427, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 432, 10, 55, 3, 55, 5, 55, 435, 10, 55, 3, 56, 3, 56, 7, 56, 439, 10, 56, 12, 56, 14, 56, 442, 11, 56, 3, 57, 3, 57, 3, 57, 5, 57, 447, 10, 57, 3, 57, 3, 57, 5, 57, 451, 10, 57, 3, 57, 5, 57, 454, 10, 57, 3, 57, 3, 57, 7, 57, 458, 10, 57, 12, 57, 14, 57, 461, 11, 57, 6, 57, 463, 10, 57, 13, 57, 14, 57, 464, 3, 58, 5, 58, 468, 10, 58, 3, 58, 7, 58, 471, 10, 58, 12, 58, 14, 58, 474, 11, 58, 3, 58, 3, 58, 5, 58, 478, 10, 58, 3, 58, 7, 58, 481, 10, 58, 12, 58, 14, 58, 484, 11, 58, 3, 59, 3, 59, 2, 2, 60, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 2, 23, 2, 25, 2, 27, 2, 29, 2, 31, 12, 33, 13, 35, 14, 37, 15, 39, 16, 41, 17, 43, 18, 45, 19, 47, 20, 49, 21, 51, 22, 53, 23, 55, 24, 57, 25, 59, 26, 61, 27, 63, 28, 65, 29, 67, 30, 69, 31, 71, 32, 73, 33, 75, 34, 77, 35, 79, 36, 81, 37, 83, 38, 85, 39, 87, 40, 89, 41, 91, 42, 93, 43, 95, 44, 97, 45, 99, 46, 101, 47, 103, 48, 105, 49, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 3, 2, 7, 4, 2, 11, 11, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 12, 12, 15, 15, 7, 2, 11, 11, 34, 35, 37, 128, 130, 142, 162, 1, 2, 505, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 3, 119, 3, 2, 2, 2, 5, 121, 3, 2, 2, 2, 7, 123, 3, 2, 2, 2, 9, 125, 3, 2, 2, 2, 11, 127, 3, 2, 2, 2, 13, 129, 3, 2, 2, 2, 15, 131, 3, 2, 2, 2, 17, 133, 3, 2, 2, 2, 19, 136, 3, 2, 2, 2, 21, 145, 3, 2, 2, 2, 23, 147, 3, 2, 2, 2, 25, 149, 3, 2, 2, 2, 27, 159, 3, 2, 2, 2, 29, 163, 3, 2, 2, 2, 31, 165, 3, 2, 2, 2, 33, 176, 3, 2, 2, 2, 35, 181, 3, 2, 2, 2, 37, 190, 3, 2, 2, 2, 39, 198, 3, 2, 2, 2, 41, 205, 3, 2, 2, 2, 43, 209, 3, 2, 2, 2, 45, 217, 3, 2, 2, 2, 47, 222, 3, 2, 2, 2, 49, 226, 3, 2, 2, 2, 51, 241, 3, 2, 2, 2, 53, 250, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 275, 3, 2, 2, 2, 59, 280, 3, 2, 2, 2, 61, 290, 3, 2, 2, 2, 63, 297, 3, 2, 2, 2, 65, 310, 3, 2, 2, 2, 67, 316, 3, 2, 2, 2, 69, 321, 3, 2, 2, 2, 71, 328, 3, 2, 2, 2, 73, 333, 3, 2, 2, 2, 75, 336, 3, 2, 2, 2, 77, 340, 3, 2, 2, 2, 79, 344, 3, 2, 2, 2, 81, 347, 3, 2, 2, 2, 83, 355, 3, 2, 2, 2, 85, 358, 3, 2, 2, 2, 87, 368, 3, 2, 2, 2, 89, 374, 3, 2, 2, 2, 91, 376, 3, 2, 2, 2, 93, 378, 3, 2, 2, 2, 95, 392, 3, 2, 2, 2, 97, 394, 3, 2, 2, 2, 99, 404, 3, 2, 2, 2, 101, 408, 3, 2, 2, 2, 103, 413, 3, 2, 2, 2, 105, 418, 3, 2, 2, 2, 107, 420, 3, 2, 2, 2, 109, 428, 3, 2, 2, 2, 111, 436, 3, 2, 2, 2, 113, 443, 3, 2, 2, 2, 115, 467, 3, 2, 2, 2, 117, 485, 3, 2, 2, 2, 119, 120, 7, 126, 2, 2, 120, 4, 3, 2, 2, 2, 121, 122, 7, 38, 2, 2, 122, 6, 3, 2, 2, 2, 123, 124, 7, 37, 2, 2, 124, 8, 3, 2, 2, 2, 125, 126, 7, 93, 2, 2, 126, 10, 3, 2, 2, 2, 127, 128, 7, 95, 2, 2, 128, 12, 3, 2, 2, 2, 129, 130, 7, 125, 2, 2, 130, 14, 3, 2, 2, 2, 131, 132, 7, 127, 2, 2, 132, 16, 3, 2, 2, 2, 133, 134, 7, 60, 2, 2, 134, 18, 3, 2, 2, 2, 135, 137, 7, 15, 2, 2, 136, 135, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 142, 7, 12, 2, 2, 139, 141, 9, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 20, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 146, 9, 3, 2, 2, 146, 22, 3, 2, 2, 2, 147, 148, 9, 4, 2, 2, 148, 24, 3, 2, 2, 2, 149, 155, 5, 23, 12, 2, 150, 154, 7, 97, 2, 2, 151, 154, 5, 23, 12, 2, 152, 154, 5, 21, 11, 2, 153, 150, 3, 2, 2, 2, 153, 151, 3, 2, 2, 2, 153, 152, 3, 2, 2, 2, 154, 157, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 156, 3, 2, 2, 2, 156, 26, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 158, 160, 9, 2, 2, 2, 159, 158, 3, 2, 2, 2, 160, 161, 3, 2, 2, 2, 161, 159, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 28, 3, 2, 2, 2, 163, 164, 7, 46, 2, 2, 164, 30, 3, 2, 2, 2, 165, 166, 7, 49, 2, 2, 166, 167, 7, 49, 2, 2, 167, 171, 3, 2, 2, 2, 168, 170, 10, 5, 2, 2, 169, 168, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 8, 16, 2, 2, 175, 32, 3, 2, 2, 2, 176, 177, 7, 72, 2, 2, 177, 178, 7, 110, 2, 2, 178, 179, 7, 113, 2, 2, 179, 180, 7, 121, 2, 2, 180, 34, 3, 2, 2, 2, 181, 182, 7, 68, 2, 2, 182, 183, 7, 99, 2, 2, 183, 184, 7, 117, 2, 2, 184, 185, 7, 103, 2, 2, 185, 186, 7, 114, 2, 2, 186, 187, 7, 99, 2, 2, 187, 188, 7, 118, 2, 2, 188, 189, 7, 106, 2, 2, 189, 36, 3, 2, 2, 2, 190, 191, 7, 69, 2, 2, 191, 192, 7, 113, 2, 2, 192, 193, 7, 112, 2, 2, 193, 194, 7, 104, 2, 2, 194, 195, 7, 107, 2, 2, 195, 196, 7, 105, 2, 2, 196, 197, 7, 117, 2, 2, 197, 38, 3, 2, 2, 2, 198, 199, 7, 75, 2, 2, 199, 200, 7, 112, 2, 2, 200, 201, 7, 114, 2, 2, 201, 202, 7, 119, 2, 2, 202, 203, 7, 118, 2, 2, 203, 204, 7, 117, 2, 2, 204, 40, 3, 2, 2, 2, 205, 206, 7, 78, 2, 2, 206, 207, 7, 113, 2, 2, 207, 208, 7, 105, 2, 2, 208, 42, 3, 2, 2, 2, 209, 210, 7, 86, 2, 2, 210, 211, 7, 116, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 105, 2, 2, 213, 214, 7, 105, 2, 2, 214, 215, 7, 103, 2, 2, 215, 216, 7, 116, 2, 2, 216, 44, 3, 2, 2, 2, 217, 218, 7, 69, 2, 2, 218, 219, 7, 99, 2, 2, 219, 220, 7, 110, 2, 2, 220, 221, 7, 110, 2, 2, 221, 46, 3, 2, 2, 2, 222, 223, 7, 84, 2, 2, 223, 224, 7, 84, 2, 2, 224, 225, 7, 72, 2, 2, 225, 48, 3, 2, 2, 2, 226, 227, 7, 85, 2, 2, 227, 228, 7, 118, 2, 2, 228, 229, 7, 99, 2, 2, 229, 230, 7, 118, 2, 2, 230, 231, 7, 119, 2, 2, 231, 232, 7, 117, 2, 2, 232, 233, 7, 34, 2, 2, 233, 234, 7, 101, 2, 2, 234, 235, 7, 106, 2, 2, 235, 236, 7, 103, 2, 2, 236, 237, 7, 101, 2, 2, 237, 238, 7, 109, 2, 2, 238, 239, 7, 103, 2, 2, 239, 240, 7, 116, 2, 2, 240, 50, 3, 2, 2, 2, 241, 242, 7, 81, 2, 2, 242, 243, 7, 114, 2, 2, 243, 244, 7, 103, 2, 2, 244, 245, 7, 112, 2, 2, 245, 246, 7, 34, 2, 2, 246, 247, 7, 104, 2, 2, 247, 248, 7, 113, 2, 2, 248, 249, 7, 116, 2, 2, 249, 52, 3, 2, 2, 2, 250, 251, 7, 69, 2, 2, 251, 252, 7, 110, 2, 2, 252, 253, 7, 113, 2, 2, 253, 254, 7, 117, 2, 2, 254, 255, 7, 103, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 81, 2, 2, 257, 258, 7, 120, 2, 2, 258, 259, 7, 103, 2, 2, 259, 260, 7, 116, 2, 2, 260, 261, 7, 116, 2, 2, 261, 262, 7, 107, 2, 2, 262, 263, 7, 102, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 34, 2, 2, 265, 266, 7, 118, 2, 2, 266, 267, 7, 103, 2, 2, 267, 268, 7, 111, 2, 2, 268, 269, 7, 114, 2, 2, 269, 270, 7, 110, 2, 2, 270, 271, 7, 99, 2, 2, 271, 272, 7, 118, 2, 2, 272, 273, 7, 103, 2, 2, 273, 274, 7, 117, 2, 2, 274, 56, 3, 2, 2, 2, 275, 276, 7, 89, 2, 2, 276, 277, 7, 106, 2, 2, 277, 278, 7, 103, 2, 2, 278, 279, 7, 112, 2, 2, 279, 58, 3, 2, 2, 2, 280, 281, 7, 81, 2, 2, 281, 282, 7, 118, 2, 2, 282, 283, 7, 106, 2, 2, 283, 284, 7, 103, 2, 2, 284, 285, 7, 116, 2, 2, 285, 286, 7, 121, 2, 2, 286, 287, 7, 107, 2, 2, 287, 288, 7, 117, 2, 2, 288, 289, 7, 103, 2, 2, 289, 60, 3, 2, 2, 2, 290, 291, 7, 84, 2, 2, 291, 292, 7, 103, 2, 2, 292, 293, 7, 114, 2, 2, 293, 294, 7, 103, 2, 2, 294, 295, 7, 99, 2, 2, 295, 296, 7, 118, 2, 2, 296, 62, 3, 2, 2, 2, 297, 298, 7, 75, 2, 2, 298, 299, 7, 118, 2, 2, 299, 300, 7, 103, 2, 2, 300, 301, 7, 116, 2, 2, 301, 302, 7, 99, 2, 2, 302, 303, 7, 118, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 34, 2, 2, 305, 306, 7, 113, 2, 2, 306, 307, 7, 120, 2, 2, 307, 308, 7, 103, 2, 2, 308, 309, 7, 116, 2, 2, 309, 64, 3, 2, 2, 2, 310, 311, 7, 79, 2, 2, 311, 312, 7, 99, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 101, 2, 2, 314, 315, 7, 106, 2, 2, 315, 66, 3, 2, 2, 2, 316, 317, 7, 83, 2, 2, 317, 318, 7, 119, 2, 2, 318, 319, 7, 107, 2, 2, 319, 320, 7, 118, 2, 2, 320, 68, 3, 2, 2, 2, 321, 322, 7, 72, 2, 2, 322, 323, 7, 107, 2, 2, 323, 324, 7, 112, 2, 2, 324, 325, 7, 107, 2, 2, 325, 326, 7, 117, 2, 2, 326, 327, 7, 106, 2, 2, 327, 70, 3, 2, 2, 2, 328, 329, 7, 84, 2, 2, 329, 330, 7, 72, 2, 2, 330, 331, 7, 67, 2, 2, 331, 332, 7, 69, 2, 2, 332, 72, 3, 2, 2, 2, 333, 334, 7, 107, 2, 2, 334, 335, 7, 117, 2, 2, 335, 74, 3, 2, 2, 2, 336, 337, 7, 112, 2, 2, 337, 338, 7, 113, 2, 2, 338, 339, 7, 118, 2, 2, 339, 76, 3, 2, 2, 2, 340, 341, 7, 99, 2, 2, 341, 342, 7, 112, 2, 2, 342, 343, 7, 102, 2, 2, 343, 78, 3, 2, 2, 2, 344, 345, 7, 113, 2, 2, 345, 346, 7, 116, 2, 2, 346, 80, 3, 2, 2, 2, 347, 348, 7, 117, 2, 2, 348, 349, 7, 103, 2, 2, 349, 350, 7, 101, 2, 2, 350, 351, 7, 113, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 102, 2, 2, 353, 354, 7, 117, 2, 2, 354, 82, 3, 2, 2, 2, 355, 356, 7, 118, 2, 2, 356, 357, 7, 113, 2, 2, 357, 84, 3, 2, 2, 2, 358, 359, 7, 118, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 111, 2, 2, 361, 362, 7, 103, 2, 2, 362, 363, 7, 117, 2, 2, 363, 364, 7, 34, 2, 2, 364, 365, 7, 111, 2, 2, 365, 366, 7, 99, 2, 2, 366, 367, 7, 122, 2, 2, 367, 86, 3, 2, 2, 2, 368, 369, 7, 119, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 107, 2, 2, 371, 372, 7, 112, 2, 2, 372, 373, 7, 105, 2, 2, 373, 88, 3, 2, 2, 2, 374, 375, 7, 63, 2, 2, 375, 90, 3, 2, 2, 2, 376, 377, 7, 47, 2, 2, 377, 92, 3, 2, 2, 2, 378, 379, 7, 112, 2, 2, 379, 380, 7, 119, 2, 2, 380, 381, 7, 110, 2, 2, 381, 382, 7, 110, 2, 2, 382, 94, 3, 2, 2, 2, 383, 384, 7, 104, 2, 2, 384, 385, 7, 99, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 117, 2, 2, 387, 393, 7, 103, 2, 2, 388, 389, 7, 118, 2, 2, 389, 390, 7, 116, 2, 2, 390, 391, 7, 119, 2, 2, 391, 393, 7, 103, 2, 2, 392, 383, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 96, 3, 2, 2, 2, 394, 398, 7, 36, 2, 2, 395, 397, 9, 6, 2, 2, 396, 395, 3, 2, 2, 2, 397, 400, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 401, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 401, 402, 7, 36, 2, 2, 402, 98, 3, 2, 2, 2, 403, 405, 5, 21, 11, 2, 404, 403, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 404, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 100, 3, 2, 2, 2, 408, 409, 5, 91, 46, 2, 409, 410, 5, 99, 50, 2, 410, 102, 3, 2, 2, 2, 411, 414, 5, 101, 51, 2, 412, 414, 5, 99, 50, 2, 413, 411, 3, 2, 2, 2, 413, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 416, 7, 48, 2, 2, 416, 417, 5, 99, 50, 2, 417, 104, 3, 2, 2, 2, 418, 419, 5, 25, 13, 2, 419, 106, 3, 2, 2, 2, 420, 425, 5, 25, 13, 2, 421, 422, 7, 48, 2, 2, 422, 424, 5, 25, 13, 2, 423, 421, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 108, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 434, 7, 48, 2, 2, 429, 435, 5, 97, 49, 2, 430, 432, 7, 38, 2, 2, 431, 430, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 435, 5, 25, 13, 2, 434, 429, 3, 2, 2, 2, 434, 431, 3, 2, 2, 2, 435, 110, 3, 2, 2, 2, 436, 440, 5, 25, 13, 2, 437, 439, 5, 109, 55, 2, 438, 437, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 112, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 462, 5, 111, 56, 2, 444, 446, 7, 93, 2, 2, 445, 447, 5, 27, 14, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 451, 5, 99, 50, 2, 449, 451, 5, 25, 13, 2, 450, 448, 3, 2, 2, 2, 450, 449, 3, 2, 2, 2, 451, 453, 3, 2, 2, 2, 452, 454, 5, 27, 14, 2, 453, 452, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 459, 7, 95, 2, 2, 456, 458, 5, 109, 55, 2, 457, 456, 3, 2, 2, 2, 458, 461, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 463, 3, 2, 2, 2, 461, 459, 3, 2, 2, 2, 462, 444, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 114, 3, 2, 2, 2, 466, 468, 5, 27, 14, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 472, 3, 2, 2, 2, 469, 471, 5, 19, 10, 2, 470, 469, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 475, 477, 5, 29, 15, 2, 476, 478, 5, 27, 14, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 482, 3, 2, 2, 2, 479, 481, 5, 19, 10, 2, 480, 479, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 116, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 486, 5, 27, 14, 2, 486, 118, 3, 2, 2, 2, 26, 2, 136, 142, 153, 155, 161, 171, 392, 398, 406, 413, 425, 431, 434, 440, 446, 450, 453, 459, 464, 467, 472, 477, 482, 3, 8, 2, 2]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 56, 497, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 5, 10, 139, 10, 10, 3, 10, 3, 10, 7, 10, 143, 10, 10, 12, 10, 14, 10, 146, 11, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 156, 10, 13, 12, 13, 14, 13, 159, 11, 13, 3, 14, 6, 14, 162, 10, 14, 13, 14, 14, 14, 163, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 172, 10, 16, 12, 16, 14, 16, 175, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 403, 10, 49, 3, 50, 3, 50, 7, 50, 407, 10, 50, 12, 50, 14, 50, 410, 11, 50, 3, 50, 3, 50, 3, 51, 6, 51, 415, 10, 51, 13, 51, 14, 51, 416, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 5, 53, 424, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 7, 55, 434, 10, 55, 12, 55, 14, 55, 437, 11, 55, 3, 56, 3, 56, 3, 56, 5, 56, 442, 10, 56, 3, 56, 5, 56, 445, 10, 56, 3, 57, 3, 57, 7, 57, 449, 10, 57, 12, 57, 14, 57, 452, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 457, 10, 58, 3, 58, 3, 58, 5, 58, 461, 10, 58, 3, 58, 5, 58, 464, 10, 58, 3, 58, 3, 58, 7, 58, 468, 10, 58, 12, 58, 14, 58, 471, 11, 58, 6, 58, 473, 10, 58, 13, 58, 14, 58, 474, 3, 59, 5, 59, 478, 10, 59, 3, 59, 7, 59, 481, 10, 59, 12, 59, 14, 59, 484, 11, 59, 3, 59, 3, 59, 5, 59, 488, 10, 59, 3, 59, 7, 59, 491, 10, 59, 12, 59, 14, 59, 494, 11, 59, 3, 60, 3, 60, 2, 2, 61, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 2, 23, 2, 25, 2, 27, 2, 29, 2, 31, 12, 33, 13, 35, 14, 37, 15, 39, 16, 41, 17, 43, 18, 45, 19, 47, 20, 49, 21, 51, 22, 53, 23, 55, 24, 57, 25, 59, 26, 61, 27, 63, 28, 65, 29, 67, 30, 69, 31, 71, 32, 73, 33, 75, 34, 77, 35, 79, 36, 81, 37, 83, 38, 85, 39, 87, 40, 89, 41, 91, 42, 93, 43, 95, 44, 97, 45, 99, 46, 101, 47, 103, 48, 105, 49, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 119, 56, 3, 2, 7, 4, 2, 11, 11, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 12, 12, 15, 15, 7, 2, 11, 11, 34, 35, 37, 128, 130, 142, 162, 1, 2, 515, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 3, 121, 3, 2, 2, 2, 5, 123, 3, 2, 2, 2, 7, 125, 3, 2, 2, 2, 9, 127, 3, 2, 2, 2, 11, 129, 3, 2, 2, 2, 13, 131, 3, 2, 2, 2, 15, 133, 3, 2, 2, 2, 17, 135, 3, 2, 2, 2, 19, 138, 3, 2, 2, 2, 21, 147, 3, 2, 2, 2, 23, 149, 3, 2, 2, 2, 25, 151, 3, 2, 2, 2, 27, 161, 3, 2, 2, 2, 29, 165, 3, 2, 2, 2, 31, 167, 3, 2, 2, 2, 33, 178, 3, 2, 2, 2, 35, 183, 3, 2, 2, 2, 37, 192, 3, 2, 2, 2, 39, 200, 3, 2, 2, 2, 41, 208, 3, 2, 2, 2, 43, 215, 3, 2, 2, 2, 45, 219, 3, 2, 2, 2, 47, 227, 3, 2, 2, 2, 49, 232, 3, 2, 2, 2, 51, 236, 3, 2, 2, 2, 53, 251, 3, 2, 2, 2, 55, 260, 3, 2, 2, 2, 57, 266, 3, 2, 2, 2, 59, 285, 3, 2, 2, 2, 61, 290, 3, 2, 2, 2, 63, 300, 3, 2, 2, 2, 65, 307, 3, 2, 2, 2, 67, 320, 3, 2, 2, 2, 69, 326, 3, 2, 2, 2, 71, 331, 3, 2, 2, 2, 73, 338, 3, 2, 2, 2, 75, 343, 3, 2, 2, 2, 77, 346, 3, 2, 2, 2, 79, 350, 3, 2, 2, 2, 81, 354, 3, 2, 2, 2, 83, 357, 3, 2, 2, 2, 85, 365, 3, 2, 2, 2, 87, 368, 3, 2, 2, 2, 89, 378, 3, 2, 2, 2, 91, 384, 3, 2, 2, 2, 93, 386, 3, 2, 2, 2, 95, 388, 3, 2, 2, 2, 97, 402, 3, 2, 2, 2, 99, 404, 3, 2, 2, 2, 101, 414, 3, 2, 2, 2, 103, 418, 3, 2, 2, 2, 105, 423, 3, 2, 2, 2, 107, 428, 3, 2, 2, 2, 109, 430, 3, 2, 2, 2, 111, 438, 3, 2, 2, 2, 113, 446, 3, 2, 2, 2, 115, 453, 3, 2, 2, 2, 117, 477, 3, 2, 2, 2, 119, 495, 3, 2, 2, 2, 121, 122, 7, 126, 2, 2, 122, 4, 3, 2, 2, 2, 123, 124, 7, 38, 2, 2, 124, 6, 3, 2, 2, 2, 125, 126, 7, 37, 2, 2, 126, 8, 3, 2, 2, 2, 127, 128, 7, 93, 2, 2, 128, 10, 3, 2, 2, 2, 129, 130, 7, 95, 2, 2, 130, 12, 3, 2, 2, 2, 131, 132, 7, 125, 2, 2, 132, 14, 3, 2, 2, 2, 133, 134, 7, 127, 2, 2, 134, 16, 3, 2, 2, 2, 135, 136, 7, 60, 2, 2, 136, 18, 3, 2, 2, 2, 137, 139, 7, 15, 2, 2, 138, 137, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 144, 7, 12, 2, 2, 141, 143, 9, 2, 2, 2, 142, 141, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 20, 3, 2, 2, 2, 146, 144, 3, 2, 2, 2, 147, 148, 9, 3, 2, 2, 148, 22, 3, 2, 2, 2, 149, 150, 9, 4, 2, 2, 150, 24, 3, 2, 2, 2, 151, 157, 5, 23, 12, 2, 152, 156, 7, 97, 2, 2, 153, 156, 5, 23, 12, 2, 154, 156, 5, 21, 11, 2, 155, 152, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 154, 3, 2, 2, 2, 156, 159, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 26, 3, 2, 2, 2, 159, 157, 3, 2, 2, 2, 160, 162, 9, 2, 2, 2, 161, 160, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 28, 3, 2, 2, 2, 165, 166, 7, 46, 2, 2, 166, 30, 3, 2, 2, 2, 167, 168, 7, 49, 2, 2, 168, 169, 7, 49, 2, 2, 169, 173, 3, 2, 2, 2, 170, 172, 10, 5, 2, 2, 171, 170, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 3, 2, 2, 2, 175, 173, 3, 2, 2, 2, 176, 177, 8, 16, 2, 2, 177, 32, 3, 2, 2, 2, 178, 179, 7, 72, 2, 2, 179, 180, 7, 110, 2, 2, 180, 181, 7, 113, 2, 2, 181, 182, 7, 121, 2, 2, 182, 34, 3, 2, 2, 2, 183, 184, 7, 68, 2, 2, 184, 185, 7, 99, 2, 2, 185, 186, 7, 117, 2, 2, 186, 187, 7, 103, 2, 2, 187, 188, 7, 114, 2, 2, 188, 189, 7, 99, 2, 2, 189, 190, 7, 118, 2, 2, 190, 191, 7, 106, 2, 2, 191, 36, 3, 2, 2, 2, 192, 193, 7, 86, 2, 2, 193, 194, 7, 107, 2, 2, 194, 195, 7, 111, 2, 2, 195, 196, 7, 103, 2, 2, 196, 197, 7, 113, 2, 2, 197, 198, 7, 119, 2, 2, 198, 199, 7, 118, 2, 2, 199, 38, 3, 2, 2, 2, 200, 201, 7, 69, 2, 2, 201, 202, 7, 113, 2, 2, 202, 203, 7, 112, 2, 2, 203, 204, 7, 104, 2, 2, 204, 205, 7, 107, 2, 2, 205, 206, 7, 105, 2, 2, 206, 207, 7, 117, 2, 2, 207, 40, 3, 2, 2, 2, 208, 209, 7, 75, 2, 2, 209, 210, 7, 112, 2, 2, 210, 211, 7, 114, 2, 2, 211, 212, 7, 119, 2, 2, 212, 213, 7, 118, 2, 2, 213, 214, 7, 117, 2, 2, 214, 42, 3, 2, 2, 2, 215, 216, 7, 78, 2, 2, 216, 217, 7, 113, 2, 2, 217, 218, 7, 105, 2, 2, 218, 44, 3, 2, 2, 2, 219, 220, 7, 86, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 107, 2, 2, 222, 223, 7, 105, 2, 2, 223, 224, 7, 105, 2, 2, 224, 225, 7, 103, 2, 2, 225, 226, 7, 116, 2, 2, 226, 46, 3, 2, 2, 2, 227, 228, 7, 69, 2, 2, 228, 229, 7, 99, 2, 2, 229, 230, 7, 110, 2, 2, 230, 231, 7, 110, 2, 2, 231, 48, 3, 2, 2, 2, 232, 233, 7, 84, 2, 2, 233, 234, 7, 84, 2, 2, 234, 235, 7, 72, 2, 2, 235, 50, 3, 2, 2, 2, 236, 237, 7, 85, 2, 2, 237, 238, 7, 118, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 118, 2, 2, 240, 241, 7, 119, 2, 2, 241, 242, 7, 117, 2, 2, 242, 243, 7, 34, 2, 2, 243, 244, 7, 101, 2, 2, 244, 245, 7, 106, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 101, 2, 2, 247, 248, 7, 109, 2, 2, 248, 249, 7, 103, 2, 2, 249, 250, 7, 116, 2, 2, 250, 52, 3, 2, 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 114, 2, 2, 253, 254, 7, 103, 2, 2, 254, 255, 7, 112, 2, 2, 255, 256, 7, 34, 2, 2, 256, 257, 7, 104, 2, 2, 257, 258, 7, 113, 2, 2, 258, 259, 7, 116, 2, 2, 259, 54, 3, 2, 2, 2, 260, 261, 7, 69, 2, 2, 261, 262, 7, 110, 2, 2, 262, 263, 7, 113, 2, 2, 263, 264, 7, 117, 2, 2, 264, 265, 7, 103, 2, 2, 265, 56, 3, 2, 2, 2, 266, 267, 7, 81, 2, 2, 267, 268, 7, 120, 2, 2, 268, 269, 7, 103, 2, 2, 269, 270, 7, 116, 2, 2, 270, 271, 7, 116, 2, 2, 271, 272, 7, 107, 2, 2, 272, 273, 7, 102, 2, 2, 273, 274, 7, 103, 2, 2, 274, 275, 7, 34, 2, 2, 275, 276, 7, 118, 2, 2, 276, 277, 7, 103, 2, 2, 277, 278, 7, 111, 2, 2, 278, 279, 7, 114, 2, 2, 279, 280, 7, 110, 2, 2, 280, 281, 7, 99, 2, 2, 281, 282, 7, 118, 2, 2, 282, 283, 7, 103, 2, 2, 283, 284, 7, 117, 2, 2, 284, 58, 3, 2, 2, 2, 285, 286, 7, 89, 2, 2, 286, 287, 7, 106, 2, 2, 287, 288, 7, 103, 2, 2, 288, 289, 7, 112, 2, 2, 289, 60, 3, 2, 2, 2, 290, 291, 7, 81, 2, 2, 291, 292, 7, 118, 2, 2, 292, 293, 7, 106, 2, 2, 293, 294, 7, 103, 2, 2, 294, 295, 7, 116, 2, 2, 295, 296, 7, 121, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 117, 2, 2, 298, 299, 7, 103, 2, 2, 299, 62, 3, 2, 2, 2, 300, 301, 7, 84, 2, 2, 301, 302, 7, 103, 2, 2, 302, 303, 7, 114, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 99, 2, 2, 305, 306, 7, 118, 2, 2, 306, 64, 3, 2, 2, 2, 307, 308, 7, 75, 2, 2, 308, 309, 7, 118, 2, 2, 309, 310, 7, 103, 2, 2, 310, 311, 7, 116, 2, 2, 311, 312, 7, 99, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 103, 2, 2, 314, 315, 7, 34, 2, 2, 315, 316, 7, 113, 2, 2, 316, 317, 7, 120, 2, 2, 317, 318, 7, 103, 2, 2, 318, 319, 7, 116, 2, 2, 319, 66, 3, 2, 2, 2, 320, 321, 7, 79, 2, 2, 321, 322, 7, 99, 2, 2, 322, 323, 7, 118, 2, 2, 323, 324, 7, 101, 2, 2, 324, 325, 7, 106, 2, 2, 325, 68, 3, 2, 2, 2, 326, 327, 7, 83, 2, 2, 327, 328, 7, 119, 2, 2, 328, 329, 7, 107, 2, 2, 329, 330, 7, 118, 2, 2, 330, 70, 3, 2, 2, 2, 331, 332, 7, 72, 2, 2, 332, 333, 7, 107, 2, 2, 333, 334, 7, 112, 2, 2, 334, 335, 7, 107, 2, 2, 335, 336, 7, 117, 2, 2, 336, 337, 7, 106, 2, 2, 337, 72, 3, 2, 2, 2, 338, 339, 7, 84, 2, 2, 339, 340, 7, 72, 2, 2, 340, 341, 7, 67, 2, 2, 341, 342, 7, 69, 2, 2, 342, 74, 3, 2, 2, 2, 343, 344, 7, 107, 2, 2, 344, 345, 7, 117, 2, 2, 345, 76, 3, 2, 2, 2, 346, 347, 7, 112, 2, 2, 347, 348, 7, 113, 2, 2, 348, 349, 7, 118, 2, 2, 349, 78, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 102, 2, 2, 353, 80, 3, 2, 2, 2, 354, 355, 7, 113, 2, 2, 355, 356, 7, 116, 2, 2, 356, 82, 3, 2, 2, 2, 357, 358, 7, 117, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 101, 2, 2, 360, 361, 7, 113, 2, 2, 361, 362, 7, 112, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 117, 2, 2, 364, 84, 3, 2, 2, 2, 365, 366, 7, 118, 2, 2, 366, 367, 7, 113, 2, 2, 367, 86, 3, 2, 2, 2, 368, 369, 7, 118, 2, 2, 369, 370, 7, 107, 2, 2, 370, 371, 7, 111, 2, 2, 371, 372, 7, 103, 2, 2, 372, 373, 7, 117, 2, 2, 373, 374, 7, 34, 2, 2, 374, 375, 7, 111, 2, 2, 375, 376, 7, 99, 2, 2, 376, 377, 7, 122, 2, 2, 377, 88, 3, 2, 2, 2, 378, 379, 7, 119, 2, 2, 379, 380, 7, 117, 2, 2, 380, 381, 7, 107, 2, 2, 381, 382, 7, 112, 2, 2, 382, 383, 7, 105, 2, 2, 383, 90, 3, 2, 2, 2, 384, 385, 7, 63, 2, 2, 385, 92, 3, 2, 2, 2, 386, 387, 7, 47, 2, 2, 387, 94, 3, 2, 2, 2, 388, 389, 7, 112, 2, 2, 389, 390, 7, 119, 2, 2, 390, 391, 7, 110, 2, 2, 391, 392, 7, 110, 2, 2, 392, 96, 3, 2, 2, 2, 393, 394, 7, 104, 2, 2, 394, 395, 7, 99, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 117, 2, 2, 397, 403, 7, 103, 2, 2, 398, 399, 7, 118, 2, 2, 399, 400, 7, 116, 2, 2, 400, 401, 7, 119, 2, 2, 401, 403, 7, 103, 2, 2, 402, 393, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 98, 3, 2, 2, 2, 404, 408, 7, 36, 2, 2, 405, 407, 9, 6, 2, 2, 406, 405, 3, 2, 2, 2, 407, 410, 3, 2, 2, 2, 408, 406, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 411, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 411, 412, 7, 36, 2, 2, 412, 100, 3, 2, 2, 2, 413, 415, 5, 21, 11, 2, 414, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 102, 3, 2, 2, 2, 418, 419, 5, 93, 47, 2, 419, 420, 5, 101, 51, 2, 420, 104, 3, 2, 2, 2, 421, 424, 5, 103, 52, 2, 422, 424, 5, 101, 51, 2, 423, 421, 3, 2, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 7, 48, 2, 2, 426, 427, 5, 101, 51, 2, 427, 106, 3, 2, 2, 2, 428, 429, 5, 25, 13, 2, 429, 108, 3, 2, 2, 2, 430, 435, 5, 25, 13, 2, 431, 432, 7, 48, 2, 2, 432, 434, 5, 25, 13, 2, 433, 431, 3, 2, 2, 2, 434, 437, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 110, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 438, 444, 7, 48, 2, 2, 439, 445, 5, 99, 50, 2, 440, 442, 7, 38, 2, 2, 441, 440, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 5, 25, 13, 2, 444, 439, 3, 2, 2, 2, 444, 441, 3, 2, 2, 2, 445, 112, 3, 2, 2, 2, 446, 450, 5, 25, 13, 2, 447, 449, 5, 111, 56, 2, 448, 447, 3, 2, 2, 2, 449, 452, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 114, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 453, 472, 5, 113, 57, 2, 454, 456, 7, 93, 2, 2, 455, 457, 5, 27, 14, 2, 456, 455, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 461, 5, 101, 51, 2, 459, 461, 5, 25, 13, 2, 460, 458, 3, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 463, 3, 2, 2, 2, 462, 464, 5, 27, 14, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 469, 7, 95, 2, 2, 466, 468, 5, 111, 56, 2, 467, 466, 3, 2, 2, 2, 468, 471, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 472, 454, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 116, 3, 2, 2, 2, 476, 478, 5, 27, 14, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 482, 3, 2, 2, 2, 479, 481, 5, 19, 10, 2, 480, 479, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 485, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 5, 29, 15, 2, 486, 488, 5, 27, 14, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 492, 3, 2, 2, 2, 489, 491, 5, 19, 10, 2, 490, 489, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 118, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 496, 5, 27, 14, 2, 496, 120, 3, 2, 2, 2, 26, 2, 138, 144, 155, 157, 163, 173, 402, 408, 416, 423, 435, 441, 444, 450, 456, 460, 463, 469, 474, 477, 482, 487, 492, 3, 8, 2, 2]
\ No newline at end of file
diff --git a/agama/transpiler/grammar/AuthnFlowLexer.tokens b/agama/transpiler/grammar/AuthnFlowLexer.tokens
index 4293a8bd2df..d13dc365d1a 100644
--- a/agama/transpiler/grammar/AuthnFlowLexer.tokens
+++ b/agama/transpiler/grammar/AuthnFlowLexer.tokens
@@ -10,47 +10,48 @@ NL=9
COMMENT=10
FLOWSTART=11
BASE=12
-CONFIGS=13
-FLOWINPUTS=14
-LOG=15
-FLOWCALL=16
-ACTIONCALL=17
-RRFCALL=18
-STATUS_CHK=19
-OPEN=20
-CLOSE=21
-OVERRIDE=22
-WHEN=23
-OTHERWISE=24
-REPEAT=25
-ITERATE=26
-MATCH=27
-QUIT=28
-FINISH=29
-RFAC=30
-IS=31
-NOT=32
-AND=33
-OR=34
-SECS=35
-TO=36
-MAXTIMES=37
-USE=38
-EQ=39
-MINUS=40
-NUL=41
-BOOL=42
-STRING=43
-UINT=44
-SINT=45
-DECIMAL=46
-ALPHANUM=47
-QNAME=48
-EVALNUM=49
-DOTEXPR=50
-DOTIDXEXPR=51
-SPCOMMA=52
-WS=53
+TIMEOUT=13
+CONFIGS=14
+FLOWINPUTS=15
+LOG=16
+FLOWCALL=17
+ACTIONCALL=18
+RRFCALL=19
+STATUS_CHK=20
+OPEN=21
+CLOSE=22
+OVERRIDE=23
+WHEN=24
+OTHERWISE=25
+REPEAT=26
+ITERATE=27
+MATCH=28
+QUIT=29
+FINISH=30
+RFAC=31
+IS=32
+NOT=33
+AND=34
+OR=35
+SECS=36
+TO=37
+MAXTIMES=38
+USE=39
+EQ=40
+MINUS=41
+NUL=42
+BOOL=43
+STRING=44
+UINT=45
+SINT=46
+DECIMAL=47
+ALPHANUM=48
+QNAME=49
+EVALNUM=50
+DOTEXPR=51
+DOTIDXEXPR=52
+SPCOMMA=53
+WS=54
'|'=1
'$'=2
'#'=3
@@ -61,32 +62,33 @@ WS=53
':'=8
'Flow'=11
'Basepath'=12
-'Configs'=13
-'Inputs'=14
-'Log'=15
-'Trigger'=16
-'Call'=17
-'RRF'=18
-'Status checker'=19
-'Open for'=20
-'Close'=21
-'Override templates'=22
-'When'=23
-'Otherwise'=24
-'Repeat'=25
-'Iterate over'=26
-'Match'=27
-'Quit'=28
-'Finish'=29
-'RFAC'=30
-'is'=31
-'not'=32
-'and'=33
-'or'=34
-'seconds'=35
-'to'=36
-'times max'=37
-'using'=38
-'='=39
-'-'=40
-'null'=41
+'Timeout'=13
+'Configs'=14
+'Inputs'=15
+'Log'=16
+'Trigger'=17
+'Call'=18
+'RRF'=19
+'Status checker'=20
+'Open for'=21
+'Close'=22
+'Override templates'=23
+'When'=24
+'Otherwise'=25
+'Repeat'=26
+'Iterate over'=27
+'Match'=28
+'Quit'=29
+'Finish'=30
+'RFAC'=31
+'is'=32
+'not'=33
+'and'=34
+'or'=35
+'seconds'=36
+'to'=37
+'times max'=38
+'using'=39
+'='=40
+'-'=41
+'null'=42
diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java
index 16b7db5d3e4..47bdcfc288c 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java
@@ -59,6 +59,18 @@ public class AuthnFlowBaseListener implements AuthnFlowListener {
* The default implementation does nothing.
*/
@Override public void exitBase(AuthnFlowParser.BaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTimeout(AuthnFlowParser.TimeoutContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTimeout(AuthnFlowParser.TimeoutContext ctx) { }
/**
* {@inheritDoc}
*
diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java
index e9ed56d81de..e2aaa03c317 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java
@@ -39,6 +39,13 @@ public class AuthnFlowBaseVisitor extends AbstractParseTreeVisitor impleme
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitBase(AuthnFlowParser.BaseContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitTimeout(AuthnFlowParser.TimeoutContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java
index d2f95140a54..a5e17904834 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java
@@ -21,13 +21,13 @@ public class AuthnFlowLexer extends Lexer {
new PredictionContextCache();
public static final int
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, NL=9,
- COMMENT=10, FLOWSTART=11, BASE=12, CONFIGS=13, FLOWINPUTS=14, LOG=15,
- FLOWCALL=16, ACTIONCALL=17, RRFCALL=18, STATUS_CHK=19, OPEN=20, CLOSE=21,
- OVERRIDE=22, WHEN=23, OTHERWISE=24, REPEAT=25, ITERATE=26, MATCH=27, QUIT=28,
- FINISH=29, RFAC=30, IS=31, NOT=32, AND=33, OR=34, SECS=35, TO=36, MAXTIMES=37,
- USE=38, EQ=39, MINUS=40, NUL=41, BOOL=42, STRING=43, UINT=44, SINT=45,
- DECIMAL=46, ALPHANUM=47, QNAME=48, EVALNUM=49, DOTEXPR=50, DOTIDXEXPR=51,
- SPCOMMA=52, WS=53;
+ COMMENT=10, FLOWSTART=11, BASE=12, TIMEOUT=13, CONFIGS=14, FLOWINPUTS=15,
+ LOG=16, FLOWCALL=17, ACTIONCALL=18, RRFCALL=19, STATUS_CHK=20, OPEN=21,
+ CLOSE=22, OVERRIDE=23, WHEN=24, OTHERWISE=25, REPEAT=26, ITERATE=27, MATCH=28,
+ QUIT=29, FINISH=30, RFAC=31, IS=32, NOT=33, AND=34, OR=35, SECS=36, TO=37,
+ MAXTIMES=38, USE=39, EQ=40, MINUS=41, NUL=42, BOOL=43, STRING=44, UINT=45,
+ SINT=46, DECIMAL=47, ALPHANUM=48, QNAME=49, EVALNUM=50, DOTEXPR=51, DOTIDXEXPR=52,
+ SPCOMMA=53, WS=54;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -40,12 +40,12 @@ private static String[] makeRuleNames() {
return new String[] {
"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "NL",
"DIGIT", "CH", "ALNUM", "SPACES", "COMMA", "COMMENT", "FLOWSTART", "BASE",
- "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL", "RRFCALL",
- "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE", "REPEAT",
- "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT", "AND", "OR",
- "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL", "STRING",
- "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM", "DOTEXPR",
- "DOTIDXEXPR", "SPCOMMA", "WS"
+ "TIMEOUT", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL",
+ "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE",
+ "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT",
+ "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL",
+ "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM",
+ "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS"
};
}
public static final String[] ruleNames = makeRuleNames();
@@ -53,23 +53,24 @@ private static String[] makeRuleNames() {
private static String[] makeLiteralNames() {
return new String[] {
null, "'|'", "'$'", "'#'", "'['", "']'", "'{'", "'}'", "':'", null, null,
- "'Flow'", "'Basepath'", "'Configs'", "'Inputs'", "'Log'", "'Trigger'",
- "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'", "'Override templates'",
- "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'", "'Match'", "'Quit'",
- "'Finish'", "'RFAC'", "'is'", "'not'", "'and'", "'or'", "'seconds'",
- "'to'", "'times max'", "'using'", "'='", "'-'", "'null'"
+ "'Flow'", "'Basepath'", "'Timeout'", "'Configs'", "'Inputs'", "'Log'",
+ "'Trigger'", "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'",
+ "'Override templates'", "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'",
+ "'Match'", "'Quit'", "'Finish'", "'RFAC'", "'is'", "'not'", "'and'",
+ "'or'", "'seconds'", "'to'", "'times max'", "'using'", "'='", "'-'",
+ "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
private static String[] makeSymbolicNames() {
return new String[] {
null, null, null, null, null, null, null, null, null, "NL", "COMMENT",
- "FLOWSTART", "BASE", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL",
- "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE",
- "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT",
- "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL",
- "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM",
- "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS"
+ "FLOWSTART", "BASE", "TIMEOUT", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL",
+ "ACTIONCALL", "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN",
+ "OTHERWISE", "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC",
+ "IS", "NOT", "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS",
+ "NUL", "BOOL", "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME",
+ "EVALNUM", "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -143,172 +144,174 @@ public AuthnFlowLexer(CharStream input) {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\67\u01e7\b\1\4\2"+
- "\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+
- "\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
- "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
- "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+
- " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+
- "+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+
- "\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\3\2\3\2\3"+
- "\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\5\n\u0089\n"+
- "\n\3\n\3\n\7\n\u008d\n\n\f\n\16\n\u0090\13\n\3\13\3\13\3\f\3\f\3\r\3\r"+
- "\3\r\3\r\7\r\u009a\n\r\f\r\16\r\u009d\13\r\3\16\6\16\u00a0\n\16\r\16\16"+
- "\16\u00a1\3\17\3\17\3\20\3\20\3\20\3\20\7\20\u00aa\n\20\f\20\16\20\u00ad"+
- "\13\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22"+
- "\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24"+
- "\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26"+
- "\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31"+
- "\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32"+
- "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34"+
- "\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
- "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36"+
- "\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 "+
- "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3"+
- "#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3"+
- "\'\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3"+
- "+\3+\3,\3,\3,\3,\3,\3,\3-\3-\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60"+
- "\3\60\3\60\3\60\3\60\3\60\5\60\u0189\n\60\3\61\3\61\7\61\u018d\n\61\f"+
- "\61\16\61\u0190\13\61\3\61\3\61\3\62\6\62\u0195\n\62\r\62\16\62\u0196"+
- "\3\63\3\63\3\63\3\64\3\64\5\64\u019e\n\64\3\64\3\64\3\64\3\65\3\65\3\66"+
- "\3\66\3\66\7\66\u01a8\n\66\f\66\16\66\u01ab\13\66\3\67\3\67\3\67\5\67"+
- "\u01b0\n\67\3\67\5\67\u01b3\n\67\38\38\78\u01b7\n8\f8\168\u01ba\138\3"+
- "9\39\39\59\u01bf\n9\39\39\59\u01c3\n9\39\59\u01c6\n9\39\39\79\u01ca\n"+
- "9\f9\169\u01cd\139\69\u01cf\n9\r9\169\u01d0\3:\5:\u01d4\n:\3:\7:\u01d7"+
- "\n:\f:\16:\u01da\13:\3:\3:\5:\u01de\n:\3:\7:\u01e1\n:\f:\16:\u01e4\13"+
- ":\3;\3;\2\2<\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\2\27\2\31\2\33"+
- "\2\35\2\37\f!\r#\16%\17\'\20)\21+\22-\23/\24\61\25\63\26\65\27\67\309"+
- "\31;\32=\33?\34A\35C\36E\37G I!K\"M#O$Q%S&U\'W(Y)[*]+_,a-c.e/g\60i\61"+
- "k\62m\63o\64q\65s\66u\67\3\2\7\4\2\13\13\"\"\3\2\62;\4\2C\\c|\4\2\f\f"+
- "\17\17\7\2\13\13\"#%\u0080\u0082\u008e\u00a2\1\2\u01f9\2\3\3\2\2\2\2\5"+
- "\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2"+
- "\2\21\3\2\2\2\2\23\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2"+
- "\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2"+
- "\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2"+
- "\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2"+
- "\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W"+
- "\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2"+
- "\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2"+
- "\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\3w\3\2\2\2\5y\3\2\2\2\7{\3\2\2\2\t}"+
- "\3\2\2\2\13\177\3\2\2\2\r\u0081\3\2\2\2\17\u0083\3\2\2\2\21\u0085\3\2"+
- "\2\2\23\u0088\3\2\2\2\25\u0091\3\2\2\2\27\u0093\3\2\2\2\31\u0095\3\2\2"+
- "\2\33\u009f\3\2\2\2\35\u00a3\3\2\2\2\37\u00a5\3\2\2\2!\u00b0\3\2\2\2#"+
- "\u00b5\3\2\2\2%\u00be\3\2\2\2\'\u00c6\3\2\2\2)\u00cd\3\2\2\2+\u00d1\3"+
- "\2\2\2-\u00d9\3\2\2\2/\u00de\3\2\2\2\61\u00e2\3\2\2\2\63\u00f1\3\2\2\2"+
- "\65\u00fa\3\2\2\2\67\u0100\3\2\2\29\u0113\3\2\2\2;\u0118\3\2\2\2=\u0122"+
- "\3\2\2\2?\u0129\3\2\2\2A\u0136\3\2\2\2C\u013c\3\2\2\2E\u0141\3\2\2\2G"+
- "\u0148\3\2\2\2I\u014d\3\2\2\2K\u0150\3\2\2\2M\u0154\3\2\2\2O\u0158\3\2"+
- "\2\2Q\u015b\3\2\2\2S\u0163\3\2\2\2U\u0166\3\2\2\2W\u0170\3\2\2\2Y\u0176"+
- "\3\2\2\2[\u0178\3\2\2\2]\u017a\3\2\2\2_\u0188\3\2\2\2a\u018a\3\2\2\2c"+
- "\u0194\3\2\2\2e\u0198\3\2\2\2g\u019d\3\2\2\2i\u01a2\3\2\2\2k\u01a4\3\2"+
- "\2\2m\u01ac\3\2\2\2o\u01b4\3\2\2\2q\u01bb\3\2\2\2s\u01d3\3\2\2\2u\u01e5"+
- "\3\2\2\2wx\7~\2\2x\4\3\2\2\2yz\7&\2\2z\6\3\2\2\2{|\7%\2\2|\b\3\2\2\2}"+
- "~\7]\2\2~\n\3\2\2\2\177\u0080\7_\2\2\u0080\f\3\2\2\2\u0081\u0082\7}\2"+
- "\2\u0082\16\3\2\2\2\u0083\u0084\7\177\2\2\u0084\20\3\2\2\2\u0085\u0086"+
- "\7<\2\2\u0086\22\3\2\2\2\u0087\u0089\7\17\2\2\u0088\u0087\3\2\2\2\u0088"+
- "\u0089\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u008e\7\f\2\2\u008b\u008d\t\2"+
- "\2\2\u008c\u008b\3\2\2\2\u008d\u0090\3\2\2\2\u008e\u008c\3\2\2\2\u008e"+
- "\u008f\3\2\2\2\u008f\24\3\2\2\2\u0090\u008e\3\2\2\2\u0091\u0092\t\3\2"+
- "\2\u0092\26\3\2\2\2\u0093\u0094\t\4\2\2\u0094\30\3\2\2\2\u0095\u009b\5"+
- "\27\f\2\u0096\u009a\7a\2\2\u0097\u009a\5\27\f\2\u0098\u009a\5\25\13\2"+
- "\u0099\u0096\3\2\2\2\u0099\u0097\3\2\2\2\u0099\u0098\3\2\2\2\u009a\u009d"+
- "\3\2\2\2\u009b\u0099\3\2\2\2\u009b\u009c\3\2\2\2\u009c\32\3\2\2\2\u009d"+
- "\u009b\3\2\2\2\u009e\u00a0\t\2\2\2\u009f\u009e\3\2\2\2\u00a0\u00a1\3\2"+
- "\2\2\u00a1\u009f\3\2\2\2\u00a1\u00a2\3\2\2\2\u00a2\34\3\2\2\2\u00a3\u00a4"+
- "\7.\2\2\u00a4\36\3\2\2\2\u00a5\u00a6\7\61\2\2\u00a6\u00a7\7\61\2\2\u00a7"+
- "\u00ab\3\2\2\2\u00a8\u00aa\n\5\2\2\u00a9\u00a8\3\2\2\2\u00aa\u00ad\3\2"+
- "\2\2\u00ab\u00a9\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ae\3\2\2\2\u00ad"+
- "\u00ab\3\2\2\2\u00ae\u00af\b\20\2\2\u00af \3\2\2\2\u00b0\u00b1\7H\2\2"+
- "\u00b1\u00b2\7n\2\2\u00b2\u00b3\7q\2\2\u00b3\u00b4\7y\2\2\u00b4\"\3\2"+
- "\2\2\u00b5\u00b6\7D\2\2\u00b6\u00b7\7c\2\2\u00b7\u00b8\7u\2\2\u00b8\u00b9"+
- "\7g\2\2\u00b9\u00ba\7r\2\2\u00ba\u00bb\7c\2\2\u00bb\u00bc\7v\2\2\u00bc"+
- "\u00bd\7j\2\2\u00bd$\3\2\2\2\u00be\u00bf\7E\2\2\u00bf\u00c0\7q\2\2\u00c0"+
- "\u00c1\7p\2\2\u00c1\u00c2\7h\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4\7i\2\2"+
- "\u00c4\u00c5\7u\2\2\u00c5&\3\2\2\2\u00c6\u00c7\7K\2\2\u00c7\u00c8\7p\2"+
- "\2\u00c8\u00c9\7r\2\2\u00c9\u00ca\7w\2\2\u00ca\u00cb\7v\2\2\u00cb\u00cc"+
- "\7u\2\2\u00cc(\3\2\2\2\u00cd\u00ce\7N\2\2\u00ce\u00cf\7q\2\2\u00cf\u00d0"+
- "\7i\2\2\u00d0*\3\2\2\2\u00d1\u00d2\7V\2\2\u00d2\u00d3\7t\2\2\u00d3\u00d4"+
- "\7k\2\2\u00d4\u00d5\7i\2\2\u00d5\u00d6\7i\2\2\u00d6\u00d7\7g\2\2\u00d7"+
- "\u00d8\7t\2\2\u00d8,\3\2\2\2\u00d9\u00da\7E\2\2\u00da\u00db\7c\2\2\u00db"+
- "\u00dc\7n\2\2\u00dc\u00dd\7n\2\2\u00dd.\3\2\2\2\u00de\u00df\7T\2\2\u00df"+
- "\u00e0\7T\2\2\u00e0\u00e1\7H\2\2\u00e1\60\3\2\2\2\u00e2\u00e3\7U\2\2\u00e3"+
- "\u00e4\7v\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6\7v\2\2\u00e6\u00e7\7w\2\2"+
- "\u00e7\u00e8\7u\2\2\u00e8\u00e9\7\"\2\2\u00e9\u00ea\7e\2\2\u00ea\u00eb"+
- "\7j\2\2\u00eb\u00ec\7g\2\2\u00ec\u00ed\7e\2\2\u00ed\u00ee\7m\2\2\u00ee"+
- "\u00ef\7g\2\2\u00ef\u00f0\7t\2\2\u00f0\62\3\2\2\2\u00f1\u00f2\7Q\2\2\u00f2"+
- "\u00f3\7r\2\2\u00f3\u00f4\7g\2\2\u00f4\u00f5\7p\2\2\u00f5\u00f6\7\"\2"+
- "\2\u00f6\u00f7\7h\2\2\u00f7\u00f8\7q\2\2\u00f8\u00f9\7t\2\2\u00f9\64\3"+
- "\2\2\2\u00fa\u00fb\7E\2\2\u00fb\u00fc\7n\2\2\u00fc\u00fd\7q\2\2\u00fd"+
- "\u00fe\7u\2\2\u00fe\u00ff\7g\2\2\u00ff\66\3\2\2\2\u0100\u0101\7Q\2\2\u0101"+
- "\u0102\7x\2\2\u0102\u0103\7g\2\2\u0103\u0104\7t\2\2\u0104\u0105\7t\2\2"+
- "\u0105\u0106\7k\2\2\u0106\u0107\7f\2\2\u0107\u0108\7g\2\2\u0108\u0109"+
- "\7\"\2\2\u0109\u010a\7v\2\2\u010a\u010b\7g\2\2\u010b\u010c\7o\2\2\u010c"+
- "\u010d\7r\2\2\u010d\u010e\7n\2\2\u010e\u010f\7c\2\2\u010f\u0110\7v\2\2"+
- "\u0110\u0111\7g\2\2\u0111\u0112\7u\2\2\u01128\3\2\2\2\u0113\u0114\7Y\2"+
- "\2\u0114\u0115\7j\2\2\u0115\u0116\7g\2\2\u0116\u0117\7p\2\2\u0117:\3\2"+
- "\2\2\u0118\u0119\7Q\2\2\u0119\u011a\7v\2\2\u011a\u011b\7j\2\2\u011b\u011c"+
- "\7g\2\2\u011c\u011d\7t\2\2\u011d\u011e\7y\2\2\u011e\u011f\7k\2\2\u011f"+
- "\u0120\7u\2\2\u0120\u0121\7g\2\2\u0121<\3\2\2\2\u0122\u0123\7T\2\2\u0123"+
- "\u0124\7g\2\2\u0124\u0125\7r\2\2\u0125\u0126\7g\2\2\u0126\u0127\7c\2\2"+
- "\u0127\u0128\7v\2\2\u0128>\3\2\2\2\u0129\u012a\7K\2\2\u012a\u012b\7v\2"+
- "\2\u012b\u012c\7g\2\2\u012c\u012d\7t\2\2\u012d\u012e\7c\2\2\u012e\u012f"+
- "\7v\2\2\u012f\u0130\7g\2\2\u0130\u0131\7\"\2\2\u0131\u0132\7q\2\2\u0132"+
- "\u0133\7x\2\2\u0133\u0134\7g\2\2\u0134\u0135\7t\2\2\u0135@\3\2\2\2\u0136"+
- "\u0137\7O\2\2\u0137\u0138\7c\2\2\u0138\u0139\7v\2\2\u0139\u013a\7e\2\2"+
- "\u013a\u013b\7j\2\2\u013bB\3\2\2\2\u013c\u013d\7S\2\2\u013d\u013e\7w\2"+
- "\2\u013e\u013f\7k\2\2\u013f\u0140\7v\2\2\u0140D\3\2\2\2\u0141\u0142\7"+
- "H\2\2\u0142\u0143\7k\2\2\u0143\u0144\7p\2\2\u0144\u0145\7k\2\2\u0145\u0146"+
- "\7u\2\2\u0146\u0147\7j\2\2\u0147F\3\2\2\2\u0148\u0149\7T\2\2\u0149\u014a"+
- "\7H\2\2\u014a\u014b\7C\2\2\u014b\u014c\7E\2\2\u014cH\3\2\2\2\u014d\u014e"+
- "\7k\2\2\u014e\u014f\7u\2\2\u014fJ\3\2\2\2\u0150\u0151\7p\2\2\u0151\u0152"+
- "\7q\2\2\u0152\u0153\7v\2\2\u0153L\3\2\2\2\u0154\u0155\7c\2\2\u0155\u0156"+
- "\7p\2\2\u0156\u0157\7f\2\2\u0157N\3\2\2\2\u0158\u0159\7q\2\2\u0159\u015a"+
- "\7t\2\2\u015aP\3\2\2\2\u015b\u015c\7u\2\2\u015c\u015d\7g\2\2\u015d\u015e"+
- "\7e\2\2\u015e\u015f\7q\2\2\u015f\u0160\7p\2\2\u0160\u0161\7f\2\2\u0161"+
- "\u0162\7u\2\2\u0162R\3\2\2\2\u0163\u0164\7v\2\2\u0164\u0165\7q\2\2\u0165"+
- "T\3\2\2\2\u0166\u0167\7v\2\2\u0167\u0168\7k\2\2\u0168\u0169\7o\2\2\u0169"+
- "\u016a\7g\2\2\u016a\u016b\7u\2\2\u016b\u016c\7\"\2\2\u016c\u016d\7o\2"+
- "\2\u016d\u016e\7c\2\2\u016e\u016f\7z\2\2\u016fV\3\2\2\2\u0170\u0171\7"+
- "w\2\2\u0171\u0172\7u\2\2\u0172\u0173\7k\2\2\u0173\u0174\7p\2\2\u0174\u0175"+
- "\7i\2\2\u0175X\3\2\2\2\u0176\u0177\7?\2\2\u0177Z\3\2\2\2\u0178\u0179\7"+
- "/\2\2\u0179\\\3\2\2\2\u017a\u017b\7p\2\2\u017b\u017c\7w\2\2\u017c\u017d"+
- "\7n\2\2\u017d\u017e\7n\2\2\u017e^\3\2\2\2\u017f\u0180\7h\2\2\u0180\u0181"+
- "\7c\2\2\u0181\u0182\7n\2\2\u0182\u0183\7u\2\2\u0183\u0189\7g\2\2\u0184"+
- "\u0185\7v\2\2\u0185\u0186\7t\2\2\u0186\u0187\7w\2\2\u0187\u0189\7g\2\2"+
- "\u0188\u017f\3\2\2\2\u0188\u0184\3\2\2\2\u0189`\3\2\2\2\u018a\u018e\7"+
- "$\2\2\u018b\u018d\t\6\2\2\u018c\u018b\3\2\2\2\u018d\u0190\3\2\2\2\u018e"+
- "\u018c\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0191\3\2\2\2\u0190\u018e\3\2"+
- "\2\2\u0191\u0192\7$\2\2\u0192b\3\2\2\2\u0193\u0195\5\25\13\2\u0194\u0193"+
- "\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2\2\2\u0197"+
- "d\3\2\2\2\u0198\u0199\5[.\2\u0199\u019a\5c\62\2\u019af\3\2\2\2\u019b\u019e"+
- "\5e\63\2\u019c\u019e\5c\62\2\u019d\u019b\3\2\2\2\u019d\u019c\3\2\2\2\u019e"+
- "\u019f\3\2\2\2\u019f\u01a0\7\60\2\2\u01a0\u01a1\5c\62\2\u01a1h\3\2\2\2"+
- "\u01a2\u01a3\5\31\r\2\u01a3j\3\2\2\2\u01a4\u01a9\5\31\r\2\u01a5\u01a6"+
- "\7\60\2\2\u01a6\u01a8\5\31\r\2\u01a7\u01a5\3\2\2\2\u01a8\u01ab\3\2\2\2"+
- "\u01a9\u01a7\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aal\3\2\2\2\u01ab\u01a9\3"+
- "\2\2\2\u01ac\u01b2\7\60\2\2\u01ad\u01b3\5a\61\2\u01ae\u01b0\7&\2\2\u01af"+
- "\u01ae\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\5\31"+
- "\r\2\u01b2\u01ad\3\2\2\2\u01b2\u01af\3\2\2\2\u01b3n\3\2\2\2\u01b4\u01b8"+
- "\5\31\r\2\u01b5\u01b7\5m\67\2\u01b6\u01b5\3\2\2\2\u01b7\u01ba\3\2\2\2"+
- "\u01b8\u01b6\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9p\3\2\2\2\u01ba\u01b8\3"+
- "\2\2\2\u01bb\u01ce\5o8\2\u01bc\u01be\7]\2\2\u01bd\u01bf\5\33\16\2\u01be"+
- "\u01bd\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0\u01c3\5c"+
- "\62\2\u01c1\u01c3\5\31\r\2\u01c2\u01c0\3\2\2\2\u01c2\u01c1\3\2\2\2\u01c3"+
- "\u01c5\3\2\2\2\u01c4\u01c6\5\33\16\2\u01c5\u01c4\3\2\2\2\u01c5\u01c6\3"+
- "\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01cb\7_\2\2\u01c8\u01ca\5m\67\2\u01c9"+
- "\u01c8\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2"+
- "\2\2\u01cc\u01cf\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce\u01bc\3\2\2\2\u01cf"+
- "\u01d0\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1r\3\2\2\2"+
- "\u01d2\u01d4\5\33\16\2\u01d3\u01d2\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d8"+
- "\3\2\2\2\u01d5\u01d7\5\23\n\2\u01d6\u01d5\3\2\2\2\u01d7\u01da\3\2\2\2"+
- "\u01d8\u01d6\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01db\3\2\2\2\u01da\u01d8"+
- "\3\2\2\2\u01db\u01dd\5\35\17\2\u01dc\u01de\5\33\16\2\u01dd\u01dc\3\2\2"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\28\u01f1\b\1\4\2\t"+
+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
+ ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
+ "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\3\2\3"+
+ "\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\5\n\u008b"+
+ "\n\n\3\n\3\n\7\n\u008f\n\n\f\n\16\n\u0092\13\n\3\13\3\13\3\f\3\f\3\r\3"+
+ "\r\3\r\3\r\7\r\u009c\n\r\f\r\16\r\u009f\13\r\3\16\6\16\u00a2\n\16\r\16"+
+ "\16\16\u00a3\3\17\3\17\3\20\3\20\3\20\3\20\7\20\u00ac\n\20\f\20\16\20"+
+ "\u00af\13\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3"+
+ "\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3"+
+ "\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3"+
+ "\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3"+
+ "\30\3\30\3\30\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
+ "\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3"+
+ "\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3"+
+ "\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3"+
+ "\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3"+
+ "\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3"+
+ "\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%"+
+ "\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3"+
+ "*\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3/\3"+
+ "/\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+
+ "\5\61\u0193\n\61\3\62\3\62\7\62\u0197\n\62\f\62\16\62\u019a\13\62\3\62"+
+ "\3\62\3\63\6\63\u019f\n\63\r\63\16\63\u01a0\3\64\3\64\3\64\3\65\3\65\5"+
+ "\65\u01a8\n\65\3\65\3\65\3\65\3\66\3\66\3\67\3\67\3\67\7\67\u01b2\n\67"+
+ "\f\67\16\67\u01b5\13\67\38\38\38\58\u01ba\n8\38\58\u01bd\n8\39\39\79\u01c1"+
+ "\n9\f9\169\u01c4\139\3:\3:\3:\5:\u01c9\n:\3:\3:\5:\u01cd\n:\3:\5:\u01d0"+
+ "\n:\3:\3:\7:\u01d4\n:\f:\16:\u01d7\13:\6:\u01d9\n:\r:\16:\u01da\3;\5;"+
+ "\u01de\n;\3;\7;\u01e1\n;\f;\16;\u01e4\13;\3;\3;\5;\u01e8\n;\3;\7;\u01eb"+
+ "\n;\f;\16;\u01ee\13;\3<\3<\2\2=\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23"+
+ "\13\25\2\27\2\31\2\33\2\35\2\37\f!\r#\16%\17\'\20)\21+\22-\23/\24\61\25"+
+ "\63\26\65\27\67\309\31;\32=\33?\34A\35C\36E\37G I!K\"M#O$Q%S&U\'W(Y)["+
+ "*]+_,a-c.e/g\60i\61k\62m\63o\64q\65s\66u\67w8\3\2\7\4\2\13\13\"\"\3\2"+
+ "\62;\4\2C\\c|\4\2\f\f\17\17\7\2\13\13\"#%\u0080\u0082\u008e\u00a2\1\2"+
+ "\u0203\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+
+ "\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\37\3\2\2\2\2!\3\2"+
+ "\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2"+
+ "\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3"+
+ "\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2"+
+ "\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2"+
+ "S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3"+
+ "\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2"+
+ "\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\3"+
+ "y\3\2\2\2\5{\3\2\2\2\7}\3\2\2\2\t\177\3\2\2\2\13\u0081\3\2\2\2\r\u0083"+
+ "\3\2\2\2\17\u0085\3\2\2\2\21\u0087\3\2\2\2\23\u008a\3\2\2\2\25\u0093\3"+
+ "\2\2\2\27\u0095\3\2\2\2\31\u0097\3\2\2\2\33\u00a1\3\2\2\2\35\u00a5\3\2"+
+ "\2\2\37\u00a7\3\2\2\2!\u00b2\3\2\2\2#\u00b7\3\2\2\2%\u00c0\3\2\2\2\'\u00c8"+
+ "\3\2\2\2)\u00d0\3\2\2\2+\u00d7\3\2\2\2-\u00db\3\2\2\2/\u00e3\3\2\2\2\61"+
+ "\u00e8\3\2\2\2\63\u00ec\3\2\2\2\65\u00fb\3\2\2\2\67\u0104\3\2\2\29\u010a"+
+ "\3\2\2\2;\u011d\3\2\2\2=\u0122\3\2\2\2?\u012c\3\2\2\2A\u0133\3\2\2\2C"+
+ "\u0140\3\2\2\2E\u0146\3\2\2\2G\u014b\3\2\2\2I\u0152\3\2\2\2K\u0157\3\2"+
+ "\2\2M\u015a\3\2\2\2O\u015e\3\2\2\2Q\u0162\3\2\2\2S\u0165\3\2\2\2U\u016d"+
+ "\3\2\2\2W\u0170\3\2\2\2Y\u017a\3\2\2\2[\u0180\3\2\2\2]\u0182\3\2\2\2_"+
+ "\u0184\3\2\2\2a\u0192\3\2\2\2c\u0194\3\2\2\2e\u019e\3\2\2\2g\u01a2\3\2"+
+ "\2\2i\u01a7\3\2\2\2k\u01ac\3\2\2\2m\u01ae\3\2\2\2o\u01b6\3\2\2\2q\u01be"+
+ "\3\2\2\2s\u01c5\3\2\2\2u\u01dd\3\2\2\2w\u01ef\3\2\2\2yz\7~\2\2z\4\3\2"+
+ "\2\2{|\7&\2\2|\6\3\2\2\2}~\7%\2\2~\b\3\2\2\2\177\u0080\7]\2\2\u0080\n"+
+ "\3\2\2\2\u0081\u0082\7_\2\2\u0082\f\3\2\2\2\u0083\u0084\7}\2\2\u0084\16"+
+ "\3\2\2\2\u0085\u0086\7\177\2\2\u0086\20\3\2\2\2\u0087\u0088\7<\2\2\u0088"+
+ "\22\3\2\2\2\u0089\u008b\7\17\2\2\u008a\u0089\3\2\2\2\u008a\u008b\3\2\2"+
+ "\2\u008b\u008c\3\2\2\2\u008c\u0090\7\f\2\2\u008d\u008f\t\2\2\2\u008e\u008d"+
+ "\3\2\2\2\u008f\u0092\3\2\2\2\u0090\u008e\3\2\2\2\u0090\u0091\3\2\2\2\u0091"+
+ "\24\3\2\2\2\u0092\u0090\3\2\2\2\u0093\u0094\t\3\2\2\u0094\26\3\2\2\2\u0095"+
+ "\u0096\t\4\2\2\u0096\30\3\2\2\2\u0097\u009d\5\27\f\2\u0098\u009c\7a\2"+
+ "\2\u0099\u009c\5\27\f\2\u009a\u009c\5\25\13\2\u009b\u0098\3\2\2\2\u009b"+
+ "\u0099\3\2\2\2\u009b\u009a\3\2\2\2\u009c\u009f\3\2\2\2\u009d\u009b\3\2"+
+ "\2\2\u009d\u009e\3\2\2\2\u009e\32\3\2\2\2\u009f\u009d\3\2\2\2\u00a0\u00a2"+
+ "\t\2\2\2\u00a1\u00a0\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a1\3\2\2\2\u00a3"+
+ "\u00a4\3\2\2\2\u00a4\34\3\2\2\2\u00a5\u00a6\7.\2\2\u00a6\36\3\2\2\2\u00a7"+
+ "\u00a8\7\61\2\2\u00a8\u00a9\7\61\2\2\u00a9\u00ad\3\2\2\2\u00aa\u00ac\n"+
+ "\5\2\2\u00ab\u00aa\3\2\2\2\u00ac\u00af\3\2\2\2\u00ad\u00ab\3\2\2\2\u00ad"+
+ "\u00ae\3\2\2\2\u00ae\u00b0\3\2\2\2\u00af\u00ad\3\2\2\2\u00b0\u00b1\b\20"+
+ "\2\2\u00b1 \3\2\2\2\u00b2\u00b3\7H\2\2\u00b3\u00b4\7n\2\2\u00b4\u00b5"+
+ "\7q\2\2\u00b5\u00b6\7y\2\2\u00b6\"\3\2\2\2\u00b7\u00b8\7D\2\2\u00b8\u00b9"+
+ "\7c\2\2\u00b9\u00ba\7u\2\2\u00ba\u00bb\7g\2\2\u00bb\u00bc\7r\2\2\u00bc"+
+ "\u00bd\7c\2\2\u00bd\u00be\7v\2\2\u00be\u00bf\7j\2\2\u00bf$\3\2\2\2\u00c0"+
+ "\u00c1\7V\2\2\u00c1\u00c2\7k\2\2\u00c2\u00c3\7o\2\2\u00c3\u00c4\7g\2\2"+
+ "\u00c4\u00c5\7q\2\2\u00c5\u00c6\7w\2\2\u00c6\u00c7\7v\2\2\u00c7&\3\2\2"+
+ "\2\u00c8\u00c9\7E\2\2\u00c9\u00ca\7q\2\2\u00ca\u00cb\7p\2\2\u00cb\u00cc"+
+ "\7h\2\2\u00cc\u00cd\7k\2\2\u00cd\u00ce\7i\2\2\u00ce\u00cf\7u\2\2\u00cf"+
+ "(\3\2\2\2\u00d0\u00d1\7K\2\2\u00d1\u00d2\7p\2\2\u00d2\u00d3\7r\2\2\u00d3"+
+ "\u00d4\7w\2\2\u00d4\u00d5\7v\2\2\u00d5\u00d6\7u\2\2\u00d6*\3\2\2\2\u00d7"+
+ "\u00d8\7N\2\2\u00d8\u00d9\7q\2\2\u00d9\u00da\7i\2\2\u00da,\3\2\2\2\u00db"+
+ "\u00dc\7V\2\2\u00dc\u00dd\7t\2\2\u00dd\u00de\7k\2\2\u00de\u00df\7i\2\2"+
+ "\u00df\u00e0\7i\2\2\u00e0\u00e1\7g\2\2\u00e1\u00e2\7t\2\2\u00e2.\3\2\2"+
+ "\2\u00e3\u00e4\7E\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6\7n\2\2\u00e6\u00e7"+
+ "\7n\2\2\u00e7\60\3\2\2\2\u00e8\u00e9\7T\2\2\u00e9\u00ea\7T\2\2\u00ea\u00eb"+
+ "\7H\2\2\u00eb\62\3\2\2\2\u00ec\u00ed\7U\2\2\u00ed\u00ee\7v\2\2\u00ee\u00ef"+
+ "\7c\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1\7w\2\2\u00f1\u00f2\7u\2\2\u00f2"+
+ "\u00f3\7\"\2\2\u00f3\u00f4\7e\2\2\u00f4\u00f5\7j\2\2\u00f5\u00f6\7g\2"+
+ "\2\u00f6\u00f7\7e\2\2\u00f7\u00f8\7m\2\2\u00f8\u00f9\7g\2\2\u00f9\u00fa"+
+ "\7t\2\2\u00fa\64\3\2\2\2\u00fb\u00fc\7Q\2\2\u00fc\u00fd\7r\2\2\u00fd\u00fe"+
+ "\7g\2\2\u00fe\u00ff\7p\2\2\u00ff\u0100\7\"\2\2\u0100\u0101\7h\2\2\u0101"+
+ "\u0102\7q\2\2\u0102\u0103\7t\2\2\u0103\66\3\2\2\2\u0104\u0105\7E\2\2\u0105"+
+ "\u0106\7n\2\2\u0106\u0107\7q\2\2\u0107\u0108\7u\2\2\u0108\u0109\7g\2\2"+
+ "\u01098\3\2\2\2\u010a\u010b\7Q\2\2\u010b\u010c\7x\2\2\u010c\u010d\7g\2"+
+ "\2\u010d\u010e\7t\2\2\u010e\u010f\7t\2\2\u010f\u0110\7k\2\2\u0110\u0111"+
+ "\7f\2\2\u0111\u0112\7g\2\2\u0112\u0113\7\"\2\2\u0113\u0114\7v\2\2\u0114"+
+ "\u0115\7g\2\2\u0115\u0116\7o\2\2\u0116\u0117\7r\2\2\u0117\u0118\7n\2\2"+
+ "\u0118\u0119\7c\2\2\u0119\u011a\7v\2\2\u011a\u011b\7g\2\2\u011b\u011c"+
+ "\7u\2\2\u011c:\3\2\2\2\u011d\u011e\7Y\2\2\u011e\u011f\7j\2\2\u011f\u0120"+
+ "\7g\2\2\u0120\u0121\7p\2\2\u0121<\3\2\2\2\u0122\u0123\7Q\2\2\u0123\u0124"+
+ "\7v\2\2\u0124\u0125\7j\2\2\u0125\u0126\7g\2\2\u0126\u0127\7t\2\2\u0127"+
+ "\u0128\7y\2\2\u0128\u0129\7k\2\2\u0129\u012a\7u\2\2\u012a\u012b\7g\2\2"+
+ "\u012b>\3\2\2\2\u012c\u012d\7T\2\2\u012d\u012e\7g\2\2\u012e\u012f\7r\2"+
+ "\2\u012f\u0130\7g\2\2\u0130\u0131\7c\2\2\u0131\u0132\7v\2\2\u0132@\3\2"+
+ "\2\2\u0133\u0134\7K\2\2\u0134\u0135\7v\2\2\u0135\u0136\7g\2\2\u0136\u0137"+
+ "\7t\2\2\u0137\u0138\7c\2\2\u0138\u0139\7v\2\2\u0139\u013a\7g\2\2\u013a"+
+ "\u013b\7\"\2\2\u013b\u013c\7q\2\2\u013c\u013d\7x\2\2\u013d\u013e\7g\2"+
+ "\2\u013e\u013f\7t\2\2\u013fB\3\2\2\2\u0140\u0141\7O\2\2\u0141\u0142\7"+
+ "c\2\2\u0142\u0143\7v\2\2\u0143\u0144\7e\2\2\u0144\u0145\7j\2\2\u0145D"+
+ "\3\2\2\2\u0146\u0147\7S\2\2\u0147\u0148\7w\2\2\u0148\u0149\7k\2\2\u0149"+
+ "\u014a\7v\2\2\u014aF\3\2\2\2\u014b\u014c\7H\2\2\u014c\u014d\7k\2\2\u014d"+
+ "\u014e\7p\2\2\u014e\u014f\7k\2\2\u014f\u0150\7u\2\2\u0150\u0151\7j\2\2"+
+ "\u0151H\3\2\2\2\u0152\u0153\7T\2\2\u0153\u0154\7H\2\2\u0154\u0155\7C\2"+
+ "\2\u0155\u0156\7E\2\2\u0156J\3\2\2\2\u0157\u0158\7k\2\2\u0158\u0159\7"+
+ "u\2\2\u0159L\3\2\2\2\u015a\u015b\7p\2\2\u015b\u015c\7q\2\2\u015c\u015d"+
+ "\7v\2\2\u015dN\3\2\2\2\u015e\u015f\7c\2\2\u015f\u0160\7p\2\2\u0160\u0161"+
+ "\7f\2\2\u0161P\3\2\2\2\u0162\u0163\7q\2\2\u0163\u0164\7t\2\2\u0164R\3"+
+ "\2\2\2\u0165\u0166\7u\2\2\u0166\u0167\7g\2\2\u0167\u0168\7e\2\2\u0168"+
+ "\u0169\7q\2\2\u0169\u016a\7p\2\2\u016a\u016b\7f\2\2\u016b\u016c\7u\2\2"+
+ "\u016cT\3\2\2\2\u016d\u016e\7v\2\2\u016e\u016f\7q\2\2\u016fV\3\2\2\2\u0170"+
+ "\u0171\7v\2\2\u0171\u0172\7k\2\2\u0172\u0173\7o\2\2\u0173\u0174\7g\2\2"+
+ "\u0174\u0175\7u\2\2\u0175\u0176\7\"\2\2\u0176\u0177\7o\2\2\u0177\u0178"+
+ "\7c\2\2\u0178\u0179\7z\2\2\u0179X\3\2\2\2\u017a\u017b\7w\2\2\u017b\u017c"+
+ "\7u\2\2\u017c\u017d\7k\2\2\u017d\u017e\7p\2\2\u017e\u017f\7i\2\2\u017f"+
+ "Z\3\2\2\2\u0180\u0181\7?\2\2\u0181\\\3\2\2\2\u0182\u0183\7/\2\2\u0183"+
+ "^\3\2\2\2\u0184\u0185\7p\2\2\u0185\u0186\7w\2\2\u0186\u0187\7n\2\2\u0187"+
+ "\u0188\7n\2\2\u0188`\3\2\2\2\u0189\u018a\7h\2\2\u018a\u018b\7c\2\2\u018b"+
+ "\u018c\7n\2\2\u018c\u018d\7u\2\2\u018d\u0193\7g\2\2\u018e\u018f\7v\2\2"+
+ "\u018f\u0190\7t\2\2\u0190\u0191\7w\2\2\u0191\u0193\7g\2\2\u0192\u0189"+
+ "\3\2\2\2\u0192\u018e\3\2\2\2\u0193b\3\2\2\2\u0194\u0198\7$\2\2\u0195\u0197"+
+ "\t\6\2\2\u0196\u0195\3\2\2\2\u0197\u019a\3\2\2\2\u0198\u0196\3\2\2\2\u0198"+
+ "\u0199\3\2\2\2\u0199\u019b\3\2\2\2\u019a\u0198\3\2\2\2\u019b\u019c\7$"+
+ "\2\2\u019cd\3\2\2\2\u019d\u019f\5\25\13\2\u019e\u019d\3\2\2\2\u019f\u01a0"+
+ "\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1f\3\2\2\2\u01a2"+
+ "\u01a3\5]/\2\u01a3\u01a4\5e\63\2\u01a4h\3\2\2\2\u01a5\u01a8\5g\64\2\u01a6"+
+ "\u01a8\5e\63\2\u01a7\u01a5\3\2\2\2\u01a7\u01a6\3\2\2\2\u01a8\u01a9\3\2"+
+ "\2\2\u01a9\u01aa\7\60\2\2\u01aa\u01ab\5e\63\2\u01abj\3\2\2\2\u01ac\u01ad"+
+ "\5\31\r\2\u01adl\3\2\2\2\u01ae\u01b3\5\31\r\2\u01af\u01b0\7\60\2\2\u01b0"+
+ "\u01b2\5\31\r\2\u01b1\u01af\3\2\2\2\u01b2\u01b5\3\2\2\2\u01b3\u01b1\3"+
+ "\2\2\2\u01b3\u01b4\3\2\2\2\u01b4n\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b6\u01bc"+
+ "\7\60\2\2\u01b7\u01bd\5c\62\2\u01b8\u01ba\7&\2\2\u01b9\u01b8\3\2\2\2\u01b9"+
+ "\u01ba\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bd\5\31\r\2\u01bc\u01b7\3"+
+ "\2\2\2\u01bc\u01b9\3\2\2\2\u01bdp\3\2\2\2\u01be\u01c2\5\31\r\2\u01bf\u01c1"+
+ "\5o8\2\u01c0\u01bf\3\2\2\2\u01c1\u01c4\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c2"+
+ "\u01c3\3\2\2\2\u01c3r\3\2\2\2\u01c4\u01c2\3\2\2\2\u01c5\u01d8\5q9\2\u01c6"+
+ "\u01c8\7]\2\2\u01c7\u01c9\5\33\16\2\u01c8\u01c7\3\2\2\2\u01c8\u01c9\3"+
+ "\2\2\2\u01c9\u01cc\3\2\2\2\u01ca\u01cd\5e\63\2\u01cb\u01cd\5\31\r\2\u01cc"+
+ "\u01ca\3\2\2\2\u01cc\u01cb\3\2\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01d0\5\33"+
+ "\16\2\u01cf\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1"+
+ "\u01d5\7_\2\2\u01d2\u01d4\5o8\2\u01d3\u01d2\3\2\2\2\u01d4\u01d7\3\2\2"+
+ "\2\u01d5\u01d3\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5"+
+ "\3\2\2\2\u01d8\u01c6\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01d8\3\2\2\2\u01da"+
+ "\u01db\3\2\2\2\u01dbt\3\2\2\2\u01dc\u01de\5\33\16\2\u01dd\u01dc\3\2\2"+
"\2\u01dd\u01de\3\2\2\2\u01de\u01e2\3\2\2\2\u01df\u01e1\5\23\n\2\u01e0"+
"\u01df\3\2\2\2\u01e1\u01e4\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e2\u01e3\3\2"+
- "\2\2\u01e3t\3\2\2\2\u01e4\u01e2\3\2\2\2\u01e5\u01e6\5\33\16\2\u01e6v\3"+
- "\2\2\2\32\2\u0088\u008e\u0099\u009b\u00a1\u00ab\u0188\u018e\u0196\u019d"+
- "\u01a9\u01af\u01b2\u01b8\u01be\u01c2\u01c5\u01cb\u01d0\u01d3\u01d8\u01dd"+
- "\u01e2\3\b\2\2";
+ "\2\2\u01e3\u01e5\3\2\2\2\u01e4\u01e2\3\2\2\2\u01e5\u01e7\5\35\17\2\u01e6"+
+ "\u01e8\5\33\16\2\u01e7\u01e6\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8\u01ec\3"+
+ "\2\2\2\u01e9\u01eb\5\23\n\2\u01ea\u01e9\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec"+
+ "\u01ea\3\2\2\2\u01ec\u01ed\3\2\2\2\u01edv\3\2\2\2\u01ee\u01ec\3\2\2\2"+
+ "\u01ef\u01f0\5\33\16\2\u01f0x\3\2\2\2\32\2\u008a\u0090\u009b\u009d\u00a3"+
+ "\u00ad\u0192\u0198\u01a0\u01a7\u01b3\u01b9\u01bc\u01c2\u01c8\u01cc\u01cf"+
+ "\u01d5\u01da\u01dd\u01e2\u01e7\u01ec\3\b\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java
index 344148256db..f9eedccd7f4 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java
@@ -47,6 +47,16 @@ public interface AuthnFlowListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitBase(AuthnFlowParser.BaseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link AuthnFlowParser#timeout}.
+ * @param ctx the parse tree
+ */
+ void enterTimeout(AuthnFlowParser.TimeoutContext ctx);
+ /**
+ * Exit a parse tree produced by {@link AuthnFlowParser#timeout}.
+ * @param ctx the parse tree
+ */
+ void exitTimeout(AuthnFlowParser.TimeoutContext ctx);
/**
* Enter a parse tree produced by {@link AuthnFlowParser#configs}.
* @param ctx the parse tree
diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java
index 3e355b8d666..7eb780e94fc 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java
@@ -18,27 +18,28 @@ public class AuthnFlowParser extends Parser {
new PredictionContextCache();
public static final int
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, NL=9,
- COMMENT=10, FLOWSTART=11, BASE=12, CONFIGS=13, FLOWINPUTS=14, LOG=15,
- FLOWCALL=16, ACTIONCALL=17, RRFCALL=18, STATUS_CHK=19, OPEN=20, CLOSE=21,
- OVERRIDE=22, WHEN=23, OTHERWISE=24, REPEAT=25, ITERATE=26, MATCH=27, QUIT=28,
- FINISH=29, RFAC=30, IS=31, NOT=32, AND=33, OR=34, SECS=35, TO=36, MAXTIMES=37,
- USE=38, EQ=39, MINUS=40, NUL=41, BOOL=42, STRING=43, UINT=44, SINT=45,
- DECIMAL=46, ALPHANUM=47, QNAME=48, EVALNUM=49, DOTEXPR=50, DOTIDXEXPR=51,
- SPCOMMA=52, WS=53, INDENT=54, DEDENT=55;
+ COMMENT=10, FLOWSTART=11, BASE=12, TIMEOUT=13, CONFIGS=14, FLOWINPUTS=15,
+ LOG=16, FLOWCALL=17, ACTIONCALL=18, RRFCALL=19, STATUS_CHK=20, OPEN=21,
+ CLOSE=22, OVERRIDE=23, WHEN=24, OTHERWISE=25, REPEAT=26, ITERATE=27, MATCH=28,
+ QUIT=29, FINISH=30, RFAC=31, IS=32, NOT=33, AND=34, OR=35, SECS=36, TO=37,
+ MAXTIMES=38, USE=39, EQ=40, MINUS=41, NUL=42, BOOL=43, STRING=44, UINT=45,
+ SINT=46, DECIMAL=47, ALPHANUM=48, QNAME=49, EVALNUM=50, DOTEXPR=51, DOTIDXEXPR=52,
+ SPCOMMA=53, WS=54, INDENT=55, DEDENT=56;
public static final int
- RULE_flow = 0, RULE_header = 1, RULE_qname = 2, RULE_base = 3, RULE_configs = 4,
- RULE_inputs = 5, RULE_short_var = 6, RULE_statement = 7, RULE_preassign = 8,
- RULE_preassign_catch = 9, RULE_variable = 10, RULE_flow_call = 11, RULE_overrides = 12,
- RULE_action_call = 13, RULE_rrf_call = 14, RULE_log = 15, RULE_static_call = 16,
- RULE_oo_call = 17, RULE_argument = 18, RULE_simple_expr = 19, RULE_literal = 20,
- RULE_expression = 21, RULE_array_expr = 22, RULE_object_expr = 23, RULE_assignment = 24,
- RULE_keypair = 25, RULE_rfac = 26, RULE_finish = 27, RULE_choice = 28,
- RULE_option = 29, RULE_ifelse = 30, RULE_caseof = 31, RULE_boolean_op_expr = 32,
- RULE_boolean_expr = 33, RULE_elseblock = 34, RULE_loop = 35, RULE_loopy = 36,
- RULE_quit_stmt = 37, RULE_stchk_block = 38, RULE_stchk_open = 39, RULE_stchk_close = 40;
+ RULE_flow = 0, RULE_header = 1, RULE_qname = 2, RULE_base = 3, RULE_timeout = 4,
+ RULE_configs = 5, RULE_inputs = 6, RULE_short_var = 7, RULE_statement = 8,
+ RULE_preassign = 9, RULE_preassign_catch = 10, RULE_variable = 11, RULE_flow_call = 12,
+ RULE_overrides = 13, RULE_action_call = 14, RULE_rrf_call = 15, RULE_log = 16,
+ RULE_static_call = 17, RULE_oo_call = 18, RULE_argument = 19, RULE_simple_expr = 20,
+ RULE_literal = 21, RULE_expression = 22, RULE_array_expr = 23, RULE_object_expr = 24,
+ RULE_assignment = 25, RULE_keypair = 26, RULE_rfac = 27, RULE_finish = 28,
+ RULE_choice = 29, RULE_option = 30, RULE_ifelse = 31, RULE_caseof = 32,
+ RULE_boolean_op_expr = 33, RULE_boolean_expr = 34, RULE_elseblock = 35,
+ RULE_loop = 36, RULE_loopy = 37, RULE_quit_stmt = 38, RULE_stchk_block = 39,
+ RULE_stchk_open = 40, RULE_stchk_close = 41;
private static String[] makeRuleNames() {
return new String[] {
- "flow", "header", "qname", "base", "configs", "inputs", "short_var",
+ "flow", "header", "qname", "base", "timeout", "configs", "inputs", "short_var",
"statement", "preassign", "preassign_catch", "variable", "flow_call",
"overrides", "action_call", "rrf_call", "log", "static_call", "oo_call",
"argument", "simple_expr", "literal", "expression", "array_expr", "object_expr",
@@ -52,23 +53,24 @@ private static String[] makeRuleNames() {
private static String[] makeLiteralNames() {
return new String[] {
null, "'|'", "'$'", "'#'", "'['", "']'", "'{'", "'}'", "':'", null, null,
- "'Flow'", "'Basepath'", "'Configs'", "'Inputs'", "'Log'", "'Trigger'",
- "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'", "'Override templates'",
- "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'", "'Match'", "'Quit'",
- "'Finish'", "'RFAC'", "'is'", "'not'", "'and'", "'or'", "'seconds'",
- "'to'", "'times max'", "'using'", "'='", "'-'", "'null'"
+ "'Flow'", "'Basepath'", "'Timeout'", "'Configs'", "'Inputs'", "'Log'",
+ "'Trigger'", "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'",
+ "'Override templates'", "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'",
+ "'Match'", "'Quit'", "'Finish'", "'RFAC'", "'is'", "'not'", "'and'",
+ "'or'", "'seconds'", "'to'", "'times max'", "'using'", "'='", "'-'",
+ "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
private static String[] makeSymbolicNames() {
return new String[] {
null, null, null, null, null, null, null, null, null, "NL", "COMMENT",
- "FLOWSTART", "BASE", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL",
- "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE",
- "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT",
- "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL",
- "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM",
- "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS", "INDENT", "DEDENT"
+ "FLOWSTART", "BASE", "TIMEOUT", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL",
+ "ACTIONCALL", "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN",
+ "OTHERWISE", "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC",
+ "IS", "NOT", "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS",
+ "NUL", "BOOL", "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME",
+ "EVALNUM", "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS", "INDENT", "DEDENT"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -158,19 +160,19 @@ public final FlowContext flow() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(82);
+ setState(84);
header();
- setState(84);
+ setState(86);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(83);
+ setState(85);
statement();
}
}
- setState(86);
+ setState(88);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) );
@@ -201,6 +203,9 @@ public BaseContext base() {
return getRuleContext(BaseContext.class,0);
}
public TerminalNode DEDENT() { return getToken(AuthnFlowParser.DEDENT, 0); }
+ public TimeoutContext timeout() {
+ return getRuleContext(TimeoutContext.class,0);
+ }
public ConfigsContext configs() {
return getRuleContext(ConfigsContext.class,0);
}
@@ -237,59 +242,69 @@ public final HeaderContext header() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(88);
+ setState(90);
match(FLOWSTART);
- setState(89);
+ setState(91);
match(WS);
- setState(90);
- qname();
setState(92);
+ qname();
+ setState(94);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(91);
+ setState(93);
match(WS);
}
}
- setState(94);
+ setState(96);
match(INDENT);
- setState(95);
- base();
setState(97);
+ base();
+ setState(99);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==TIMEOUT) {
+ {
+ setState(98);
+ timeout();
+ }
+ }
+
+ setState(102);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==CONFIGS) {
{
- setState(96);
+ setState(101);
configs();
}
}
- setState(100);
+ setState(105);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==FLOWINPUTS) {
{
- setState(99);
+ setState(104);
inputs();
}
}
- setState(102);
+ setState(107);
match(DEDENT);
- setState(106);
+ setState(111);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==NL) {
{
{
- setState(103);
+ setState(108);
match(NL);
}
}
- setState(108);
+ setState(113);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -335,7 +350,7 @@ public final QnameContext qname() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(109);
+ setState(114);
_la = _input.LA(1);
if ( !(_la==ALPHANUM || _la==QNAME) ) {
_errHandler.recoverInline(this);
@@ -392,23 +407,93 @@ public final BaseContext base() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(111);
+ setState(116);
match(BASE);
- setState(112);
+ setState(117);
match(WS);
- setState(113);
+ setState(118);
match(STRING);
- setState(115);
+ setState(120);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(114);
+ setState(119);
match(WS);
}
}
- setState(117);
+ setState(122);
+ match(NL);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class TimeoutContext extends ParserRuleContext {
+ public TerminalNode TIMEOUT() { return getToken(AuthnFlowParser.TIMEOUT, 0); }
+ public List WS() { return getTokens(AuthnFlowParser.WS); }
+ public TerminalNode WS(int i) {
+ return getToken(AuthnFlowParser.WS, i);
+ }
+ public TerminalNode UINT() { return getToken(AuthnFlowParser.UINT, 0); }
+ public TerminalNode SECS() { return getToken(AuthnFlowParser.SECS, 0); }
+ public TerminalNode NL() { return getToken(AuthnFlowParser.NL, 0); }
+ public TimeoutContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_timeout; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof AuthnFlowListener ) ((AuthnFlowListener)listener).enterTimeout(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof AuthnFlowListener ) ((AuthnFlowListener)listener).exitTimeout(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof AuthnFlowVisitor ) return ((AuthnFlowVisitor extends T>)visitor).visitTimeout(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final TimeoutContext timeout() throws RecognitionException {
+ TimeoutContext _localctx = new TimeoutContext(_ctx, getState());
+ enterRule(_localctx, 8, RULE_timeout);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(124);
+ match(TIMEOUT);
+ setState(125);
+ match(WS);
+ setState(126);
+ match(UINT);
+ setState(127);
+ match(WS);
+ setState(128);
+ match(SECS);
+ setState(130);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==WS) {
+ {
+ setState(129);
+ match(WS);
+ }
+ }
+
+ setState(132);
match(NL);
}
}
@@ -454,28 +539,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ConfigsContext configs() throws RecognitionException {
ConfigsContext _localctx = new ConfigsContext(_ctx, getState());
- enterRule(_localctx, 8, RULE_configs);
+ enterRule(_localctx, 10, RULE_configs);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(119);
+ setState(134);
match(CONFIGS);
- setState(120);
+ setState(135);
match(WS);
- setState(121);
+ setState(136);
short_var();
- setState(123);
+ setState(138);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(122);
+ setState(137);
match(WS);
}
}
- setState(125);
+ setState(140);
match(NL);
}
}
@@ -524,15 +609,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final InputsContext inputs() throws RecognitionException {
InputsContext _localctx = new InputsContext(_ctx, getState());
- enterRule(_localctx, 10, RULE_inputs);
+ enterRule(_localctx, 12, RULE_inputs);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(127);
+ setState(142);
match(FLOWINPUTS);
- setState(130);
+ setState(145);
_errHandler.sync(this);
_alt = 1;
do {
@@ -540,9 +625,9 @@ public final InputsContext inputs() throws RecognitionException {
case 1:
{
{
- setState(128);
+ setState(143);
match(WS);
- setState(129);
+ setState(144);
short_var();
}
}
@@ -550,21 +635,21 @@ public final InputsContext inputs() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(132);
+ setState(147);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
- setState(135);
+ setState(150);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(134);
+ setState(149);
match(WS);
}
}
- setState(137);
+ setState(152);
match(NL);
}
}
@@ -602,11 +687,11 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Short_varContext short_var() throws RecognitionException {
Short_varContext _localctx = new Short_varContext(_ctx, getState());
- enterRule(_localctx, 12, RULE_short_var);
+ enterRule(_localctx, 14, RULE_short_var);
try {
enterOuterAlt(_localctx, 1);
{
- setState(139);
+ setState(154);
match(ALPHANUM);
}
}
@@ -676,85 +761,85 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final StatementContext statement() throws RecognitionException {
StatementContext _localctx = new StatementContext(_ctx, getState());
- enterRule(_localctx, 14, RULE_statement);
+ enterRule(_localctx, 16, RULE_statement);
try {
- setState(152);
+ setState(167);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(141);
+ setState(156);
flow_call();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(142);
+ setState(157);
action_call();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(143);
+ setState(158);
rrf_call();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(144);
+ setState(159);
assignment();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(145);
+ setState(160);
log();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(146);
+ setState(161);
rfac();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(147);
+ setState(162);
finish();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(148);
+ setState(163);
ifelse();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(149);
+ setState(164);
choice();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(150);
+ setState(165);
loop();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(151);
+ setState(166);
loopy();
}
break;
@@ -801,31 +886,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final PreassignContext preassign() throws RecognitionException {
PreassignContext _localctx = new PreassignContext(_ctx, getState());
- enterRule(_localctx, 16, RULE_preassign);
+ enterRule(_localctx, 18, RULE_preassign);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(154);
+ setState(169);
variable();
- setState(156);
+ setState(171);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(155);
+ setState(170);
match(WS);
}
}
- setState(158);
+ setState(173);
match(EQ);
- setState(160);
+ setState(175);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(159);
+ setState(174);
match(WS);
}
}
@@ -876,63 +961,63 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Preassign_catchContext preassign_catch() throws RecognitionException {
Preassign_catchContext _localctx = new Preassign_catchContext(_ctx, getState());
- enterRule(_localctx, 18, RULE_preassign_catch);
+ enterRule(_localctx, 20, RULE_preassign_catch);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(163);
+ setState(178);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
- setState(162);
+ setState(177);
variable();
}
}
- setState(166);
+ setState(181);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(165);
+ setState(180);
match(WS);
}
}
- setState(168);
+ setState(183);
match(T__0);
- setState(170);
+ setState(185);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(169);
+ setState(184);
match(WS);
}
}
- setState(172);
+ setState(187);
short_var();
- setState(174);
+ setState(189);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(173);
+ setState(188);
match(WS);
}
}
- setState(176);
+ setState(191);
match(EQ);
- setState(178);
+ setState(193);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(177);
+ setState(192);
match(WS);
}
}
@@ -978,36 +1063,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final VariableContext variable() throws RecognitionException {
VariableContext _localctx = new VariableContext(_ctx, getState());
- enterRule(_localctx, 20, RULE_variable);
+ enterRule(_localctx, 22, RULE_variable);
try {
- setState(184);
+ setState(199);
_errHandler.sync(this);
switch (_input.LA(1)) {
case ALPHANUM:
enterOuterAlt(_localctx, 1);
{
- setState(180);
+ setState(195);
short_var();
}
break;
case QNAME:
enterOuterAlt(_localctx, 2);
{
- setState(181);
+ setState(196);
match(QNAME);
}
break;
case DOTEXPR:
enterOuterAlt(_localctx, 3);
{
- setState(182);
+ setState(197);
match(DOTEXPR);
}
break;
case DOTIDXEXPR:
enterOuterAlt(_localctx, 4);
{
- setState(183);
+ setState(198);
match(DOTIDXEXPR);
}
break;
@@ -1072,85 +1157,85 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Flow_callContext flow_call() throws RecognitionException {
Flow_callContext _localctx = new Flow_callContext(_ctx, getState());
- enterRule(_localctx, 22, RULE_flow_call);
+ enterRule(_localctx, 24, RULE_flow_call);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(187);
+ setState(202);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
- setState(186);
+ setState(201);
preassign();
}
}
- setState(189);
+ setState(204);
match(FLOWCALL);
- setState(190);
+ setState(205);
match(WS);
- setState(194);
+ setState(209);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__1:
{
- setState(191);
+ setState(206);
match(T__1);
- setState(192);
+ setState(207);
variable();
}
break;
case ALPHANUM:
case QNAME:
{
- setState(193);
+ setState(208);
qname();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(199);
+ setState(214);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,20,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,22,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(196);
+ setState(211);
argument();
}
}
}
- setState(201);
+ setState(216);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,20,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,22,_ctx);
}
- setState(203);
+ setState(218);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(202);
+ setState(217);
match(WS);
}
}
- setState(207);
+ setState(222);
_errHandler.sync(this);
switch (_input.LA(1)) {
case INDENT:
{
- setState(205);
+ setState(220);
overrides();
}
break;
case NL:
{
- setState(206);
+ setState(221);
match(NL);
}
break;
@@ -1204,51 +1289,51 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final OverridesContext overrides() throws RecognitionException {
OverridesContext _localctx = new OverridesContext(_ctx, getState());
- enterRule(_localctx, 24, RULE_overrides);
+ enterRule(_localctx, 26, RULE_overrides);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(209);
+ setState(224);
match(INDENT);
- setState(210);
+ setState(225);
match(OVERRIDE);
- setState(211);
+ setState(226);
match(WS);
- setState(212);
+ setState(227);
match(STRING);
- setState(217);
+ setState(232);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,23,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(213);
+ setState(228);
match(WS);
- setState(214);
+ setState(229);
match(STRING);
}
}
}
- setState(219);
+ setState(234);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,23,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,25,_ctx);
}
- setState(221);
+ setState(236);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(220);
+ setState(235);
match(WS);
}
}
- setState(223);
+ setState(238);
match(NL);
- setState(224);
+ setState(239);
match(DEDENT);
}
}
@@ -1303,58 +1388,58 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Action_callContext action_call() throws RecognitionException {
Action_callContext _localctx = new Action_callContext(_ctx, getState());
- enterRule(_localctx, 26, RULE_action_call);
+ enterRule(_localctx, 28, RULE_action_call);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(228);
+ setState(243);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
case 1:
{
- setState(226);
+ setState(241);
preassign();
}
break;
case 2:
{
- setState(227);
+ setState(242);
preassign_catch();
}
break;
}
- setState(230);
+ setState(245);
match(ACTIONCALL);
- setState(231);
+ setState(246);
match(WS);
- setState(234);
+ setState(249);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
case 1:
{
- setState(232);
+ setState(247);
static_call();
}
break;
case 2:
{
- setState(233);
+ setState(248);
oo_call();
}
break;
}
- setState(237);
+ setState(252);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(236);
+ setState(251);
match(WS);
}
}
- setState(239);
+ setState(254);
match(NL);
}
}
@@ -1408,73 +1493,73 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Rrf_callContext rrf_call() throws RecognitionException {
Rrf_callContext _localctx = new Rrf_callContext(_ctx, getState());
- enterRule(_localctx, 28, RULE_rrf_call);
+ enterRule(_localctx, 30, RULE_rrf_call);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(242);
+ setState(257);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
- setState(241);
+ setState(256);
preassign();
}
}
- setState(244);
+ setState(259);
match(RRFCALL);
- setState(245);
+ setState(260);
match(WS);
- setState(246);
+ setState(261);
match(STRING);
- setState(249);
+ setState(264);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) {
case 1:
{
- setState(247);
+ setState(262);
match(WS);
- setState(248);
+ setState(263);
variable();
}
break;
}
- setState(253);
+ setState(268);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
case 1:
{
- setState(251);
+ setState(266);
match(WS);
- setState(252);
+ setState(267);
match(BOOL);
}
break;
}
- setState(256);
+ setState(271);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(255);
+ setState(270);
match(WS);
}
}
- setState(260);
+ setState(275);
_errHandler.sync(this);
switch (_input.LA(1)) {
case INDENT:
{
- setState(258);
+ setState(273);
stchk_block();
}
break;
case NL:
{
- setState(259);
+ setState(274);
match(NL);
}
break;
@@ -1525,15 +1610,15 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LogContext log() throws RecognitionException {
LogContext _localctx = new LogContext(_ctx, getState());
- enterRule(_localctx, 30, RULE_log);
+ enterRule(_localctx, 32, RULE_log);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(262);
+ setState(277);
match(LOG);
- setState(264);
+ setState(279);
_errHandler.sync(this);
_alt = 1;
do {
@@ -1541,7 +1626,7 @@ public final LogContext log() throws RecognitionException {
case 1:
{
{
- setState(263);
+ setState(278);
argument();
}
}
@@ -1549,21 +1634,21 @@ public final LogContext log() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(266);
+ setState(281);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,33,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
- setState(269);
+ setState(284);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(268);
+ setState(283);
match(WS);
}
}
- setState(271);
+ setState(286);
match(NL);
}
}
@@ -1610,32 +1695,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Static_callContext static_call() throws RecognitionException {
Static_callContext _localctx = new Static_callContext(_ctx, getState());
- enterRule(_localctx, 32, RULE_static_call);
+ enterRule(_localctx, 34, RULE_static_call);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(273);
+ setState(288);
qname();
- setState(274);
+ setState(289);
match(T__2);
- setState(275);
+ setState(290);
match(ALPHANUM);
- setState(279);
+ setState(294);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,37,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(276);
+ setState(291);
argument();
}
}
}
- setState(281);
+ setState(296);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,37,_ctx);
}
}
}
@@ -1683,32 +1768,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Oo_callContext oo_call() throws RecognitionException {
Oo_callContext _localctx = new Oo_callContext(_ctx, getState());
- enterRule(_localctx, 34, RULE_oo_call);
+ enterRule(_localctx, 36, RULE_oo_call);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(282);
+ setState(297);
variable();
- setState(283);
+ setState(298);
match(WS);
- setState(284);
+ setState(299);
match(ALPHANUM);
- setState(288);
+ setState(303);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,36,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,38,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(285);
+ setState(300);
argument();
}
}
}
- setState(290);
+ setState(305);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,36,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,38,_ctx);
}
}
}
@@ -1749,13 +1834,13 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ArgumentContext argument() throws RecognitionException {
ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
- enterRule(_localctx, 36, RULE_argument);
+ enterRule(_localctx, 38, RULE_argument);
try {
enterOuterAlt(_localctx, 1);
{
- setState(291);
+ setState(306);
match(WS);
- setState(292);
+ setState(307);
simple_expr();
}
}
@@ -1799,9 +1884,9 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Simple_exprContext simple_expr() throws RecognitionException {
Simple_exprContext _localctx = new Simple_exprContext(_ctx, getState());
- enterRule(_localctx, 38, RULE_simple_expr);
+ enterRule(_localctx, 40, RULE_simple_expr);
try {
- setState(298);
+ setState(313);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NUL:
@@ -1812,7 +1897,7 @@ public final Simple_exprContext simple_expr() throws RecognitionException {
case DECIMAL:
enterOuterAlt(_localctx, 1);
{
- setState(294);
+ setState(309);
literal();
}
break;
@@ -1822,7 +1907,7 @@ public final Simple_exprContext simple_expr() throws RecognitionException {
case DOTIDXEXPR:
enterOuterAlt(_localctx, 2);
{
- setState(295);
+ setState(310);
variable();
}
break;
@@ -1830,9 +1915,9 @@ public final Simple_exprContext simple_expr() throws RecognitionException {
enterOuterAlt(_localctx, 3);
{
{
- setState(296);
+ setState(311);
match(MINUS);
- setState(297);
+ setState(312);
variable();
}
}
@@ -1880,12 +1965,12 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LiteralContext literal() throws RecognitionException {
LiteralContext _localctx = new LiteralContext(_ctx, getState());
- enterRule(_localctx, 40, RULE_literal);
+ enterRule(_localctx, 42, RULE_literal);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(300);
+ setState(315);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << NUL) | (1L << BOOL) | (1L << STRING) | (1L << UINT) | (1L << SINT) | (1L << DECIMAL))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -1939,22 +2024,22 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ExpressionContext expression() throws RecognitionException {
ExpressionContext _localctx = new ExpressionContext(_ctx, getState());
- enterRule(_localctx, 42, RULE_expression);
+ enterRule(_localctx, 44, RULE_expression);
try {
- setState(305);
+ setState(320);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__5:
enterOuterAlt(_localctx, 1);
{
- setState(302);
+ setState(317);
object_expr();
}
break;
case T__3:
enterOuterAlt(_localctx, 2);
{
- setState(303);
+ setState(318);
array_expr();
}
break;
@@ -1971,7 +2056,7 @@ public final ExpressionContext expression() throws RecognitionException {
case DOTIDXEXPR:
enterOuterAlt(_localctx, 3);
{
- setState(304);
+ setState(319);
simple_expr();
}
break;
@@ -2026,64 +2111,64 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Array_exprContext array_expr() throws RecognitionException {
Array_exprContext _localctx = new Array_exprContext(_ctx, getState());
- enterRule(_localctx, 44, RULE_array_expr);
+ enterRule(_localctx, 46, RULE_array_expr);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(307);
+ setState(322);
match(T__3);
- setState(309);
+ setState(324);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) {
case 1:
{
- setState(308);
+ setState(323);
match(WS);
}
break;
}
- setState(314);
+ setState(329);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << MINUS) | (1L << NUL) | (1L << BOOL) | (1L << STRING) | (1L << UINT) | (1L << SINT) | (1L << DECIMAL) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
{
- setState(311);
+ setState(326);
expression();
}
}
- setState(316);
+ setState(331);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(321);
+ setState(336);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==SPCOMMA) {
{
{
- setState(317);
+ setState(332);
match(SPCOMMA);
- setState(318);
+ setState(333);
expression();
}
}
- setState(323);
+ setState(338);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(325);
+ setState(340);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(324);
+ setState(339);
match(WS);
}
}
- setState(327);
+ setState(342);
match(T__4);
}
}
@@ -2134,64 +2219,64 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Object_exprContext object_expr() throws RecognitionException {
Object_exprContext _localctx = new Object_exprContext(_ctx, getState());
- enterRule(_localctx, 46, RULE_object_expr);
+ enterRule(_localctx, 48, RULE_object_expr);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(329);
+ setState(344);
match(T__5);
- setState(331);
+ setState(346);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) {
case 1:
{
- setState(330);
+ setState(345);
match(WS);
}
break;
}
- setState(336);
+ setState(351);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==ALPHANUM) {
{
{
- setState(333);
+ setState(348);
keypair();
}
}
- setState(338);
+ setState(353);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(343);
+ setState(358);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==SPCOMMA) {
{
{
- setState(339);
+ setState(354);
match(SPCOMMA);
- setState(340);
+ setState(355);
keypair();
}
}
- setState(345);
+ setState(360);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(347);
+ setState(362);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(346);
+ setState(361);
match(WS);
}
}
- setState(349);
+ setState(364);
match(T__6);
}
}
@@ -2236,26 +2321,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final AssignmentContext assignment() throws RecognitionException {
AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
- enterRule(_localctx, 48, RULE_assignment);
+ enterRule(_localctx, 50, RULE_assignment);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(351);
+ setState(366);
preassign();
- setState(352);
+ setState(367);
expression();
- setState(354);
+ setState(369);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(353);
+ setState(368);
match(WS);
}
}
- setState(356);
+ setState(371);
match(NL);
}
}
@@ -2300,36 +2385,36 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final KeypairContext keypair() throws RecognitionException {
KeypairContext _localctx = new KeypairContext(_ctx, getState());
- enterRule(_localctx, 50, RULE_keypair);
+ enterRule(_localctx, 52, RULE_keypair);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(358);
+ setState(373);
match(ALPHANUM);
- setState(360);
+ setState(375);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(359);
+ setState(374);
match(WS);
}
}
- setState(362);
+ setState(377);
match(T__7);
- setState(364);
+ setState(379);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(363);
+ setState(378);
match(WS);
}
}
- setState(366);
+ setState(381);
expression();
}
}
@@ -2376,31 +2461,31 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final RfacContext rfac() throws RecognitionException {
RfacContext _localctx = new RfacContext(_ctx, getState());
- enterRule(_localctx, 52, RULE_rfac);
+ enterRule(_localctx, 54, RULE_rfac);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(369);
+ setState(384);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
- setState(368);
+ setState(383);
preassign();
}
}
- setState(371);
+ setState(386);
match(RFAC);
- setState(372);
+ setState(387);
match(WS);
- setState(375);
+ setState(390);
_errHandler.sync(this);
switch (_input.LA(1)) {
case STRING:
{
- setState(373);
+ setState(388);
match(STRING);
}
break;
@@ -2409,14 +2494,14 @@ public final RfacContext rfac() throws RecognitionException {
case DOTEXPR:
case DOTIDXEXPR:
{
- setState(374);
+ setState(389);
variable();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(377);
+ setState(392);
match(NL);
}
}
@@ -2463,21 +2548,21 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final FinishContext finish() throws RecognitionException {
FinishContext _localctx = new FinishContext(_ctx, getState());
- enterRule(_localctx, 54, RULE_finish);
+ enterRule(_localctx, 56, RULE_finish);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(379);
+ setState(394);
match(FINISH);
- setState(380);
+ setState(395);
match(WS);
- setState(383);
+ setState(398);
_errHandler.sync(this);
switch (_input.LA(1)) {
case BOOL:
{
- setState(381);
+ setState(396);
match(BOOL);
}
break;
@@ -2486,24 +2571,24 @@ public final FinishContext finish() throws RecognitionException {
case DOTEXPR:
case DOTIDXEXPR:
{
- setState(382);
+ setState(397);
variable();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(386);
+ setState(401);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(385);
+ setState(400);
match(WS);
}
}
- setState(388);
+ setState(403);
match(NL);
}
}
@@ -2560,55 +2645,55 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ChoiceContext choice() throws RecognitionException {
ChoiceContext _localctx = new ChoiceContext(_ctx, getState());
- enterRule(_localctx, 56, RULE_choice);
+ enterRule(_localctx, 58, RULE_choice);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(390);
+ setState(405);
match(MATCH);
- setState(391);
+ setState(406);
match(WS);
- setState(392);
+ setState(407);
simple_expr();
- setState(393);
+ setState(408);
match(WS);
- setState(394);
+ setState(409);
match(TO);
- setState(396);
+ setState(411);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(395);
+ setState(410);
match(WS);
}
}
- setState(398);
+ setState(413);
match(INDENT);
- setState(400);
+ setState(415);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(399);
+ setState(414);
option();
}
}
- setState(402);
+ setState(417);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << MINUS) | (1L << NUL) | (1L << BOOL) | (1L << STRING) | (1L << UINT) | (1L << SINT) | (1L << DECIMAL) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0) );
- setState(404);
+ setState(419);
match(DEDENT);
- setState(406);
+ setState(421);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==OTHERWISE) {
{
- setState(405);
+ setState(420);
elseblock();
}
}
@@ -2660,40 +2745,40 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final OptionContext option() throws RecognitionException {
OptionContext _localctx = new OptionContext(_ctx, getState());
- enterRule(_localctx, 58, RULE_option);
+ enterRule(_localctx, 60, RULE_option);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(408);
+ setState(423);
simple_expr();
- setState(410);
+ setState(425);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(409);
+ setState(424);
match(WS);
}
}
- setState(412);
+ setState(427);
match(INDENT);
- setState(414);
+ setState(429);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(413);
+ setState(428);
statement();
}
}
- setState(416);
+ setState(431);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) );
- setState(418);
+ setState(433);
match(DEDENT);
}
}
@@ -2744,37 +2829,37 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final IfelseContext ifelse() throws RecognitionException {
IfelseContext _localctx = new IfelseContext(_ctx, getState());
- enterRule(_localctx, 60, RULE_ifelse);
+ enterRule(_localctx, 62, RULE_ifelse);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(420);
+ setState(435);
caseof();
- setState(421);
+ setState(436);
match(INDENT);
- setState(423);
+ setState(438);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(422);
+ setState(437);
statement();
}
}
- setState(425);
+ setState(440);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) );
- setState(427);
+ setState(442);
match(DEDENT);
- setState(429);
+ setState(444);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==OTHERWISE) {
{
- setState(428);
+ setState(443);
elseblock();
}
}
@@ -2825,32 +2910,32 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final CaseofContext caseof() throws RecognitionException {
CaseofContext _localctx = new CaseofContext(_ctx, getState());
- enterRule(_localctx, 62, RULE_caseof);
+ enterRule(_localctx, 64, RULE_caseof);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(431);
+ setState(446);
match(WHEN);
- setState(432);
+ setState(447);
match(WS);
- setState(433);
+ setState(448);
boolean_expr();
- setState(437);
+ setState(452);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,61,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,63,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(434);
+ setState(449);
boolean_op_expr();
}
}
}
- setState(439);
+ setState(454);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,61,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,63,_ctx);
}
}
}
@@ -2897,26 +2982,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Boolean_op_exprContext boolean_op_expr() throws RecognitionException {
Boolean_op_exprContext _localctx = new Boolean_op_exprContext(_ctx, getState());
- enterRule(_localctx, 64, RULE_boolean_op_expr);
+ enterRule(_localctx, 66, RULE_boolean_op_expr);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(443);
+ setState(458);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==NL) {
{
{
- setState(440);
+ setState(455);
match(NL);
}
}
- setState(445);
+ setState(460);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(446);
+ setState(461);
_la = _input.LA(1);
if ( !(_la==AND || _la==OR) ) {
_errHandler.recoverInline(this);
@@ -2926,31 +3011,31 @@ public final Boolean_op_exprContext boolean_op_expr() throws RecognitionExceptio
_errHandler.reportMatch(this);
consume();
}
- setState(448);
+ setState(463);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(447);
+ setState(462);
match(WS);
}
}
- setState(453);
+ setState(468);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==NL) {
{
{
- setState(450);
+ setState(465);
match(NL);
}
}
- setState(455);
+ setState(470);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(456);
+ setState(471);
boolean_expr();
}
}
@@ -2999,39 +3084,39 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Boolean_exprContext boolean_expr() throws RecognitionException {
Boolean_exprContext _localctx = new Boolean_exprContext(_ctx, getState());
- enterRule(_localctx, 66, RULE_boolean_expr);
+ enterRule(_localctx, 68, RULE_boolean_expr);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(458);
+ setState(473);
simple_expr();
- setState(459);
+ setState(474);
match(WS);
- setState(460);
+ setState(475);
match(IS);
- setState(461);
+ setState(476);
match(WS);
- setState(464);
+ setState(479);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(462);
+ setState(477);
match(NOT);
- setState(463);
+ setState(478);
match(WS);
}
}
- setState(466);
+ setState(481);
simple_expr();
- setState(468);
+ setState(483);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) {
case 1:
{
- setState(467);
+ setState(482);
match(WS);
}
break;
@@ -3081,40 +3166,40 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final ElseblockContext elseblock() throws RecognitionException {
ElseblockContext _localctx = new ElseblockContext(_ctx, getState());
- enterRule(_localctx, 68, RULE_elseblock);
+ enterRule(_localctx, 70, RULE_elseblock);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(470);
+ setState(485);
match(OTHERWISE);
- setState(472);
+ setState(487);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(471);
+ setState(486);
match(WS);
}
}
- setState(474);
+ setState(489);
match(INDENT);
- setState(476);
+ setState(491);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(475);
+ setState(490);
statement();
}
}
- setState(478);
+ setState(493);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) );
- setState(480);
+ setState(495);
match(DEDENT);
}
}
@@ -3177,62 +3262,62 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LoopContext loop() throws RecognitionException {
LoopContext _localctx = new LoopContext(_ctx, getState());
- enterRule(_localctx, 70, RULE_loop);
+ enterRule(_localctx, 72, RULE_loop);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(483);
+ setState(498);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
- setState(482);
+ setState(497);
preassign();
}
}
- setState(485);
+ setState(500);
match(ITERATE);
- setState(486);
+ setState(501);
match(WS);
- setState(487);
+ setState(502);
variable();
- setState(488);
+ setState(503);
match(WS);
- setState(489);
+ setState(504);
match(USE);
- setState(490);
+ setState(505);
match(WS);
- setState(491);
+ setState(506);
short_var();
- setState(492);
+ setState(507);
match(INDENT);
- setState(494);
+ setState(509);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(493);
+ setState(508);
statement();
}
}
- setState(496);
+ setState(511);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) );
- setState(499);
+ setState(514);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==QUIT) {
{
- setState(498);
+ setState(513);
quit_stmt();
}
}
- setState(501);
+ setState(516);
match(DEDENT);
}
}
@@ -3293,26 +3378,26 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final LoopyContext loopy() throws RecognitionException {
LoopyContext _localctx = new LoopyContext(_ctx, getState());
- enterRule(_localctx, 72, RULE_loopy);
+ enterRule(_localctx, 74, RULE_loopy);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(504);
+ setState(519);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) {
{
- setState(503);
+ setState(518);
preassign();
}
}
- setState(506);
+ setState(521);
match(REPEAT);
- setState(507);
+ setState(522);
match(WS);
- setState(510);
+ setState(525);
_errHandler.sync(this);
switch (_input.LA(1)) {
case ALPHANUM:
@@ -3320,60 +3405,60 @@ public final LoopyContext loopy() throws RecognitionException {
case DOTEXPR:
case DOTIDXEXPR:
{
- setState(508);
+ setState(523);
variable();
}
break;
case UINT:
{
- setState(509);
+ setState(524);
match(UINT);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(512);
+ setState(527);
match(WS);
- setState(513);
+ setState(528);
match(MAXTIMES);
- setState(515);
+ setState(530);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(514);
+ setState(529);
match(WS);
}
}
- setState(517);
+ setState(532);
match(INDENT);
- setState(519);
+ setState(534);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(518);
+ setState(533);
statement();
}
}
- setState(521);
+ setState(536);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) );
- setState(524);
+ setState(539);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==QUIT) {
{
- setState(523);
+ setState(538);
quit_stmt();
}
}
- setState(526);
+ setState(541);
match(DEDENT);
}
}
@@ -3422,30 +3507,30 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Quit_stmtContext quit_stmt() throws RecognitionException {
Quit_stmtContext _localctx = new Quit_stmtContext(_ctx, getState());
- enterRule(_localctx, 74, RULE_quit_stmt);
+ enterRule(_localctx, 76, RULE_quit_stmt);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(528);
+ setState(543);
match(QUIT);
- setState(529);
+ setState(544);
match(WS);
- setState(530);
+ setState(545);
caseof();
- setState(531);
+ setState(546);
match(NL);
- setState(535);
+ setState(550);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0)) {
{
{
- setState(532);
+ setState(547);
statement();
}
}
- setState(537);
+ setState(552);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3503,44 +3588,44 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Stchk_blockContext stchk_block() throws RecognitionException {
Stchk_blockContext _localctx = new Stchk_blockContext(_ctx, getState());
- enterRule(_localctx, 76, RULE_stchk_block);
+ enterRule(_localctx, 78, RULE_stchk_block);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(538);
+ setState(553);
match(INDENT);
- setState(539);
+ setState(554);
match(STATUS_CHK);
- setState(541);
+ setState(556);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(540);
+ setState(555);
match(WS);
}
}
- setState(543);
+ setState(558);
match(INDENT);
- setState(544);
+ setState(559);
stchk_open();
- setState(546);
+ setState(561);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ACTIONCALL) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0)) {
{
- setState(545);
+ setState(560);
action_call();
}
}
- setState(548);
+ setState(563);
stchk_close();
- setState(549);
+ setState(564);
match(DEDENT);
- setState(550);
+ setState(565);
match(DEDENT);
}
}
@@ -3588,16 +3673,16 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Stchk_openContext stchk_open() throws RecognitionException {
Stchk_openContext _localctx = new Stchk_openContext(_ctx, getState());
- enterRule(_localctx, 78, RULE_stchk_open);
+ enterRule(_localctx, 80, RULE_stchk_open);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(552);
+ setState(567);
match(OPEN);
- setState(553);
+ setState(568);
match(WS);
- setState(556);
+ setState(571);
_errHandler.sync(this);
switch (_input.LA(1)) {
case ALPHANUM:
@@ -3605,34 +3690,34 @@ public final Stchk_openContext stchk_open() throws RecognitionException {
case DOTEXPR:
case DOTIDXEXPR:
{
- setState(554);
+ setState(569);
variable();
}
break;
case UINT:
{
- setState(555);
+ setState(570);
match(UINT);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(558);
+ setState(573);
match(WS);
- setState(559);
+ setState(574);
match(SECS);
- setState(561);
+ setState(576);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(560);
+ setState(575);
match(WS);
}
}
- setState(563);
+ setState(578);
match(NL);
}
}
@@ -3678,28 +3763,28 @@ public T accept(ParseTreeVisitor extends T> visitor) {
public final Stchk_closeContext stchk_close() throws RecognitionException {
Stchk_closeContext _localctx = new Stchk_closeContext(_ctx, getState());
- enterRule(_localctx, 80, RULE_stchk_close);
+ enterRule(_localctx, 82, RULE_stchk_close);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(565);
+ setState(580);
match(CLOSE);
- setState(566);
+ setState(581);
match(WS);
- setState(567);
+ setState(582);
caseof();
- setState(569);
+ setState(584);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==WS) {
{
- setState(568);
+ setState(583);
match(WS);
}
}
- setState(571);
+ setState(586);
match(NL);
}
}
@@ -3715,226 +3800,230 @@ public final Stchk_closeContext stchk_close() throws RecognitionException {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\39\u0240\4\2\t\2\4"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3:\u024f\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
- "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\3\2\3\2"+
- "\6\2W\n\2\r\2\16\2X\3\3\3\3\3\3\3\3\5\3_\n\3\3\3\3\3\3\3\5\3d\n\3\3\3"+
- "\5\3g\n\3\3\3\3\3\7\3k\n\3\f\3\16\3n\13\3\3\4\3\4\3\5\3\5\3\5\3\5\5\5"+
- "v\n\5\3\5\3\5\3\6\3\6\3\6\3\6\5\6~\n\6\3\6\3\6\3\7\3\7\3\7\6\7\u0085\n"+
- "\7\r\7\16\7\u0086\3\7\5\7\u008a\n\7\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3"+
- "\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u009b\n\t\3\n\3\n\5\n\u009f\n\n\3\n\3\n"+
- "\5\n\u00a3\n\n\3\13\5\13\u00a6\n\13\3\13\5\13\u00a9\n\13\3\13\3\13\5\13"+
- "\u00ad\n\13\3\13\3\13\5\13\u00b1\n\13\3\13\3\13\5\13\u00b5\n\13\3\f\3"+
- "\f\3\f\3\f\5\f\u00bb\n\f\3\r\5\r\u00be\n\r\3\r\3\r\3\r\3\r\3\r\5\r\u00c5"+
- "\n\r\3\r\7\r\u00c8\n\r\f\r\16\r\u00cb\13\r\3\r\5\r\u00ce\n\r\3\r\3\r\5"+
- "\r\u00d2\n\r\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u00da\n\16\f\16\16\16"+
- "\u00dd\13\16\3\16\5\16\u00e0\n\16\3\16\3\16\3\16\3\17\3\17\5\17\u00e7"+
- "\n\17\3\17\3\17\3\17\3\17\5\17\u00ed\n\17\3\17\5\17\u00f0\n\17\3\17\3"+
- "\17\3\20\5\20\u00f5\n\20\3\20\3\20\3\20\3\20\3\20\5\20\u00fc\n\20\3\20"+
- "\3\20\5\20\u0100\n\20\3\20\5\20\u0103\n\20\3\20\3\20\5\20\u0107\n\20\3"+
- "\21\3\21\6\21\u010b\n\21\r\21\16\21\u010c\3\21\5\21\u0110\n\21\3\21\3"+
- "\21\3\22\3\22\3\22\3\22\7\22\u0118\n\22\f\22\16\22\u011b\13\22\3\23\3"+
- "\23\3\23\3\23\7\23\u0121\n\23\f\23\16\23\u0124\13\23\3\24\3\24\3\24\3"+
- "\25\3\25\3\25\3\25\5\25\u012d\n\25\3\26\3\26\3\27\3\27\3\27\5\27\u0134"+
- "\n\27\3\30\3\30\5\30\u0138\n\30\3\30\7\30\u013b\n\30\f\30\16\30\u013e"+
- "\13\30\3\30\3\30\7\30\u0142\n\30\f\30\16\30\u0145\13\30\3\30\5\30\u0148"+
- "\n\30\3\30\3\30\3\31\3\31\5\31\u014e\n\31\3\31\7\31\u0151\n\31\f\31\16"+
- "\31\u0154\13\31\3\31\3\31\7\31\u0158\n\31\f\31\16\31\u015b\13\31\3\31"+
- "\5\31\u015e\n\31\3\31\3\31\3\32\3\32\3\32\5\32\u0165\n\32\3\32\3\32\3"+
- "\33\3\33\5\33\u016b\n\33\3\33\3\33\5\33\u016f\n\33\3\33\3\33\3\34\5\34"+
- "\u0174\n\34\3\34\3\34\3\34\3\34\5\34\u017a\n\34\3\34\3\34\3\35\3\35\3"+
- "\35\3\35\5\35\u0182\n\35\3\35\5\35\u0185\n\35\3\35\3\35\3\36\3\36\3\36"+
- "\3\36\3\36\3\36\5\36\u018f\n\36\3\36\3\36\6\36\u0193\n\36\r\36\16\36\u0194"+
- "\3\36\3\36\5\36\u0199\n\36\3\37\3\37\5\37\u019d\n\37\3\37\3\37\6\37\u01a1"+
- "\n\37\r\37\16\37\u01a2\3\37\3\37\3 \3 \3 \6 \u01aa\n \r \16 \u01ab\3 "+
- "\3 \5 \u01b0\n \3!\3!\3!\3!\7!\u01b6\n!\f!\16!\u01b9\13!\3\"\7\"\u01bc"+
- "\n\"\f\"\16\"\u01bf\13\"\3\"\3\"\5\"\u01c3\n\"\3\"\7\"\u01c6\n\"\f\"\16"+
- "\"\u01c9\13\"\3\"\3\"\3#\3#\3#\3#\3#\3#\5#\u01d3\n#\3#\3#\5#\u01d7\n#"+
- "\3$\3$\5$\u01db\n$\3$\3$\6$\u01df\n$\r$\16$\u01e0\3$\3$\3%\5%\u01e6\n"+
- "%\3%\3%\3%\3%\3%\3%\3%\3%\3%\6%\u01f1\n%\r%\16%\u01f2\3%\5%\u01f6\n%\3"+
- "%\3%\3&\5&\u01fb\n&\3&\3&\3&\3&\5&\u0201\n&\3&\3&\3&\5&\u0206\n&\3&\3"+
- "&\6&\u020a\n&\r&\16&\u020b\3&\5&\u020f\n&\3&\3&\3\'\3\'\3\'\3\'\3\'\7"+
- "\'\u0218\n\'\f\'\16\'\u021b\13\'\3(\3(\3(\5(\u0220\n(\3(\3(\3(\5(\u0225"+
- "\n(\3(\3(\3(\3(\3)\3)\3)\3)\5)\u022f\n)\3)\3)\3)\5)\u0234\n)\3)\3)\3*"+
- "\3*\3*\3*\5*\u023c\n*\3*\3*\3*\2\2+\2\4\6\b\n\f\16\20\22\24\26\30\32\34"+
- "\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPR\2\5\3\2\61\62\3\2+\60\3\2#$\2\u0277"+
- "\2T\3\2\2\2\4Z\3\2\2\2\6o\3\2\2\2\bq\3\2\2\2\ny\3\2\2\2\f\u0081\3\2\2"+
- "\2\16\u008d\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2\24\u00a5\3\2\2\2"+
- "\26\u00ba\3\2\2\2\30\u00bd\3\2\2\2\32\u00d3\3\2\2\2\34\u00e6\3\2\2\2\36"+
- "\u00f4\3\2\2\2 \u0108\3\2\2\2\"\u0113\3\2\2\2$\u011c\3\2\2\2&\u0125\3"+
- "\2\2\2(\u012c\3\2\2\2*\u012e\3\2\2\2,\u0133\3\2\2\2.\u0135\3\2\2\2\60"+
- "\u014b\3\2\2\2\62\u0161\3\2\2\2\64\u0168\3\2\2\2\66\u0173\3\2\2\28\u017d"+
- "\3\2\2\2:\u0188\3\2\2\2<\u019a\3\2\2\2>\u01a6\3\2\2\2@\u01b1\3\2\2\2B"+
- "\u01bd\3\2\2\2D\u01cc\3\2\2\2F\u01d8\3\2\2\2H\u01e5\3\2\2\2J\u01fa\3\2"+
- "\2\2L\u0212\3\2\2\2N\u021c\3\2\2\2P\u022a\3\2\2\2R\u0237\3\2\2\2TV\5\4"+
- "\3\2UW\5\20\t\2VU\3\2\2\2WX\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y\3\3\2\2\2Z[\7"+
- "\r\2\2[\\\7\67\2\2\\^\5\6\4\2]_\7\67\2\2^]\3\2\2\2^_\3\2\2\2_`\3\2\2\2"+
- "`a\78\2\2ac\5\b\5\2bd\5\n\6\2cb\3\2\2\2cd\3\2\2\2df\3\2\2\2eg\5\f\7\2"+
- "fe\3\2\2\2fg\3\2\2\2gh\3\2\2\2hl\79\2\2ik\7\13\2\2ji\3\2\2\2kn\3\2\2\2"+
- "lj\3\2\2\2lm\3\2\2\2m\5\3\2\2\2nl\3\2\2\2op\t\2\2\2p\7\3\2\2\2qr\7\16"+
- "\2\2rs\7\67\2\2su\7-\2\2tv\7\67\2\2ut\3\2\2\2uv\3\2\2\2vw\3\2\2\2wx\7"+
- "\13\2\2x\t\3\2\2\2yz\7\17\2\2z{\7\67\2\2{}\5\16\b\2|~\7\67\2\2}|\3\2\2"+
- "\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7\13\2\2\u0080\13\3\2\2\2\u0081\u0084"+
- "\7\20\2\2\u0082\u0083\7\67\2\2\u0083\u0085\5\16\b\2\u0084\u0082\3\2\2"+
- "\2\u0085\u0086\3\2\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0089"+
- "\3\2\2\2\u0088\u008a\7\67\2\2\u0089\u0088\3\2\2\2\u0089\u008a\3\2\2\2"+
- "\u008a\u008b\3\2\2\2\u008b\u008c\7\13\2\2\u008c\r\3\2\2\2\u008d\u008e"+
- "\7\61\2\2\u008e\17\3\2\2\2\u008f\u009b\5\30\r\2\u0090\u009b\5\34\17\2"+
- "\u0091\u009b\5\36\20\2\u0092\u009b\5\62\32\2\u0093\u009b\5 \21\2\u0094"+
- "\u009b\5\66\34\2\u0095\u009b\58\35\2\u0096\u009b\5> \2\u0097\u009b\5:"+
- "\36\2\u0098\u009b\5H%\2\u0099\u009b\5J&\2\u009a\u008f\3\2\2\2\u009a\u0090"+
- "\3\2\2\2\u009a\u0091\3\2\2\2\u009a\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a"+
- "\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3\2"+
- "\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21\3\2\2\2\u009c\u009e"+
- "\5\26\f\2\u009d\u009f\7\67\2\2\u009e\u009d\3\2\2\2\u009e\u009f\3\2\2\2"+
- "\u009f\u00a0\3\2\2\2\u00a0\u00a2\7)\2\2\u00a1\u00a3\7\67\2\2\u00a2\u00a1"+
- "\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\23\3\2\2\2\u00a4\u00a6\5\26\f\2\u00a5"+
- "\u00a4\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a8\3\2\2\2\u00a7\u00a9\7\67"+
- "\2\2\u00a8\u00a7\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa"+
- "\u00ac\7\3\2\2\u00ab\u00ad\7\67\2\2\u00ac\u00ab\3\2\2\2\u00ac\u00ad\3"+
- "\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00b0\5\16\b\2\u00af\u00b1\7\67\2\2\u00b0"+
- "\u00af\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b4\7)"+
- "\2\2\u00b3\u00b5\7\67\2\2\u00b4\u00b3\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5"+
- "\25\3\2\2\2\u00b6\u00bb\5\16\b\2\u00b7\u00bb\7\62\2\2\u00b8\u00bb\7\64"+
- "\2\2\u00b9\u00bb\7\65\2\2\u00ba\u00b6\3\2\2\2\u00ba\u00b7\3\2\2\2\u00ba"+
- "\u00b8\3\2\2\2\u00ba\u00b9\3\2\2\2\u00bb\27\3\2\2\2\u00bc\u00be\5\22\n"+
- "\2\u00bd\u00bc\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c0"+
- "\7\22\2\2\u00c0\u00c4\7\67\2\2\u00c1\u00c2\7\4\2\2\u00c2\u00c5\5\26\f"+
- "\2\u00c3\u00c5\5\6\4\2\u00c4\u00c1\3\2\2\2\u00c4\u00c3\3\2\2\2\u00c5\u00c9"+
- "\3\2\2\2\u00c6\u00c8\5&\24\2\u00c7\u00c6\3\2\2\2\u00c8\u00cb\3\2\2\2\u00c9"+
- "\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cd\3\2\2\2\u00cb\u00c9\3\2"+
- "\2\2\u00cc\u00ce\7\67\2\2\u00cd\u00cc\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce"+
- "\u00d1\3\2\2\2\u00cf\u00d2\5\32\16\2\u00d0\u00d2\7\13\2\2\u00d1\u00cf"+
- "\3\2\2\2\u00d1\u00d0\3\2\2\2\u00d2\31\3\2\2\2\u00d3\u00d4\78\2\2\u00d4"+
- "\u00d5\7\30\2\2\u00d5\u00d6\7\67\2\2\u00d6\u00db\7-\2\2\u00d7\u00d8\7"+
- "\67\2\2\u00d8\u00da\7-\2\2\u00d9\u00d7\3\2\2\2\u00da\u00dd\3\2\2\2\u00db"+
- "\u00d9\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc\u00df\3\2\2\2\u00dd\u00db\3\2"+
- "\2\2\u00de\u00e0\7\67\2\2\u00df\u00de\3\2\2\2\u00df\u00e0\3\2\2\2\u00e0"+
- "\u00e1\3\2\2\2\u00e1\u00e2\7\13\2\2\u00e2\u00e3\79\2\2\u00e3\33\3\2\2"+
- "\2\u00e4\u00e7\5\22\n\2\u00e5\u00e7\5\24\13\2\u00e6\u00e4\3\2\2\2\u00e6"+
- "\u00e5\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00e9\7\23"+
- "\2\2\u00e9\u00ec\7\67\2\2\u00ea\u00ed\5\"\22\2\u00eb\u00ed\5$\23\2\u00ec"+
- "\u00ea\3\2\2\2\u00ec\u00eb\3\2\2\2\u00ed\u00ef\3\2\2\2\u00ee\u00f0\7\67"+
- "\2\2\u00ef\u00ee\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1"+
- "\u00f2\7\13\2\2\u00f2\35\3\2\2\2\u00f3\u00f5\5\22\n\2\u00f4\u00f3\3\2"+
- "\2\2\u00f4\u00f5\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f7\7\24\2\2\u00f7"+
- "\u00f8\7\67\2\2\u00f8\u00fb\7-\2\2\u00f9\u00fa\7\67\2\2\u00fa\u00fc\5"+
- "\26\f\2\u00fb\u00f9\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fc\u00ff\3\2\2\2\u00fd"+
- "\u00fe\7\67\2\2\u00fe\u0100\7,\2\2\u00ff\u00fd\3\2\2\2\u00ff\u0100\3\2"+
- "\2\2\u0100\u0102\3\2\2\2\u0101\u0103\7\67\2\2\u0102\u0101\3\2\2\2\u0102"+
- "\u0103\3\2\2\2\u0103\u0106\3\2\2\2\u0104\u0107\5N(\2\u0105\u0107\7\13"+
- "\2\2\u0106\u0104\3\2\2\2\u0106\u0105\3\2\2\2\u0107\37\3\2\2\2\u0108\u010a"+
- "\7\21\2\2\u0109\u010b\5&\24\2\u010a\u0109\3\2\2\2\u010b\u010c\3\2\2\2"+
- "\u010c\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0110"+
- "\7\67\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0111\3\2\2\2"+
- "\u0111\u0112\7\13\2\2\u0112!\3\2\2\2\u0113\u0114\5\6\4\2\u0114\u0115\7"+
- "\5\2\2\u0115\u0119\7\61\2\2\u0116\u0118\5&\24\2\u0117\u0116\3\2\2\2\u0118"+
- "\u011b\3\2\2\2\u0119\u0117\3\2\2\2\u0119\u011a\3\2\2\2\u011a#\3\2\2\2"+
- "\u011b\u0119\3\2\2\2\u011c\u011d\5\26\f\2\u011d\u011e\7\67\2\2\u011e\u0122"+
- "\7\61\2\2\u011f\u0121\5&\24\2\u0120\u011f\3\2\2\2\u0121\u0124\3\2\2\2"+
- "\u0122\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123%\3\2\2\2\u0124\u0122\3"+
- "\2\2\2\u0125\u0126\7\67\2\2\u0126\u0127\5(\25\2\u0127\'\3\2\2\2\u0128"+
- "\u012d\5*\26\2\u0129\u012d\5\26\f\2\u012a\u012b\7*\2\2\u012b\u012d\5\26"+
- "\f\2\u012c\u0128\3\2\2\2\u012c\u0129\3\2\2\2\u012c\u012a\3\2\2\2\u012d"+
- ")\3\2\2\2\u012e\u012f\t\3\2\2\u012f+\3\2\2\2\u0130\u0134\5\60\31\2\u0131"+
- "\u0134\5.\30\2\u0132\u0134\5(\25\2\u0133\u0130\3\2\2\2\u0133\u0131\3\2"+
- "\2\2\u0133\u0132\3\2\2\2\u0134-\3\2\2\2\u0135\u0137\7\6\2\2\u0136\u0138"+
- "\7\67\2\2\u0137\u0136\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u013c\3\2\2\2"+
- "\u0139\u013b\5,\27\2\u013a\u0139\3\2\2\2\u013b\u013e\3\2\2\2\u013c\u013a"+
- "\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u0143\3\2\2\2\u013e\u013c\3\2\2\2\u013f"+
- "\u0140\7\66\2\2\u0140\u0142\5,\27\2\u0141\u013f\3\2\2\2\u0142\u0145\3"+
- "\2\2\2\u0143\u0141\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0147\3\2\2\2\u0145"+
- "\u0143\3\2\2\2\u0146\u0148\7\67\2\2\u0147\u0146\3\2\2\2\u0147\u0148\3"+
- "\2\2\2\u0148\u0149\3\2\2\2\u0149\u014a\7\7\2\2\u014a/\3\2\2\2\u014b\u014d"+
- "\7\b\2\2\u014c\u014e\7\67\2\2\u014d\u014c\3\2\2\2\u014d\u014e\3\2\2\2"+
- "\u014e\u0152\3\2\2\2\u014f\u0151\5\64\33\2\u0150\u014f\3\2\2\2\u0151\u0154"+
- "\3\2\2\2\u0152\u0150\3\2\2\2\u0152\u0153\3\2\2\2\u0153\u0159\3\2\2\2\u0154"+
- "\u0152\3\2\2\2\u0155\u0156\7\66\2\2\u0156\u0158\5\64\33\2\u0157\u0155"+
- "\3\2\2\2\u0158\u015b\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u015a\3\2\2\2\u015a"+
- "\u015d\3\2\2\2\u015b\u0159\3\2\2\2\u015c\u015e\7\67\2\2\u015d\u015c\3"+
- "\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160\7\t\2\2\u0160"+
- "\61\3\2\2\2\u0161\u0162\5\22\n\2\u0162\u0164\5,\27\2\u0163\u0165\7\67"+
- "\2\2\u0164\u0163\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0166\3\2\2\2\u0166"+
- "\u0167\7\13\2\2\u0167\63\3\2\2\2\u0168\u016a\7\61\2\2\u0169\u016b\7\67"+
- "\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+
- "\u016e\7\n\2\2\u016d\u016f\7\67\2\2\u016e\u016d\3\2\2\2\u016e\u016f\3"+
- "\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\5,\27\2\u0171\65\3\2\2\2\u0172"+
- "\u0174\5\22\n\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3"+
- "\2\2\2\u0175\u0176\7 \2\2\u0176\u0179\7\67\2\2\u0177\u017a\7-\2\2\u0178"+
- "\u017a\5\26\f\2\u0179\u0177\3\2\2\2\u0179\u0178\3\2\2\2\u017a\u017b\3"+
- "\2\2\2\u017b\u017c\7\13\2\2\u017c\67\3\2\2\2\u017d\u017e\7\37\2\2\u017e"+
- "\u0181\7\67\2\2\u017f\u0182\7,\2\2\u0180\u0182\5\26\f\2\u0181\u017f\3"+
- "\2\2\2\u0181\u0180\3\2\2\2\u0182\u0184\3\2\2\2\u0183\u0185\7\67\2\2\u0184"+
- "\u0183\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187\7\13"+
- "\2\2\u01879\3\2\2\2\u0188\u0189\7\35\2\2\u0189\u018a\7\67\2\2\u018a\u018b"+
- "\5(\25\2\u018b\u018c\7\67\2\2\u018c\u018e\7&\2\2\u018d\u018f\7\67\2\2"+
- "\u018e\u018d\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0192"+
- "\78\2\2\u0191\u0193\5<\37\2\u0192\u0191\3\2\2\2\u0193\u0194\3\2\2\2\u0194"+
- "\u0192\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0198\79"+
- "\2\2\u0197\u0199\5F$\2\u0198\u0197\3\2\2\2\u0198\u0199\3\2\2\2\u0199;"+
- "\3\2\2\2\u019a\u019c\5(\25\2\u019b\u019d\7\67\2\2\u019c\u019b\3\2\2\2"+
- "\u019c\u019d\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u01a0\78\2\2\u019f\u01a1"+
- "\5\20\t\2\u01a0\u019f\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2\u01a0\3\2\2\2"+
- "\u01a2\u01a3\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4\u01a5\79\2\2\u01a5=\3\2"+
- "\2\2\u01a6\u01a7\5@!\2\u01a7\u01a9\78\2\2\u01a8\u01aa\5\20\t\2\u01a9\u01a8"+
- "\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac"+
- "\u01ad\3\2\2\2\u01ad\u01af\79\2\2\u01ae\u01b0\5F$\2\u01af\u01ae\3\2\2"+
- "\2\u01af\u01b0\3\2\2\2\u01b0?\3\2\2\2\u01b1\u01b2\7\31\2\2\u01b2\u01b3"+
- "\7\67\2\2\u01b3\u01b7\5D#\2\u01b4\u01b6\5B\"\2\u01b5\u01b4\3\2\2\2\u01b6"+
- "\u01b9\3\2\2\2\u01b7\u01b5\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8A\3\2\2\2"+
- "\u01b9\u01b7\3\2\2\2\u01ba\u01bc\7\13\2\2\u01bb\u01ba\3\2\2\2\u01bc\u01bf"+
- "\3\2\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf"+
- "\u01bd\3\2\2\2\u01c0\u01c2\t\4\2\2\u01c1\u01c3\7\67\2\2\u01c2\u01c1\3"+
- "\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c7\3\2\2\2\u01c4\u01c6\7\13\2\2\u01c5"+
- "\u01c4\3\2\2\2\u01c6\u01c9\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8\3\2"+
- "\2\2\u01c8\u01ca\3\2\2\2\u01c9\u01c7\3\2\2\2\u01ca\u01cb\5D#\2\u01cbC"+
- "\3\2\2\2\u01cc\u01cd\5(\25\2\u01cd\u01ce\7\67\2\2\u01ce\u01cf\7!\2\2\u01cf"+
- "\u01d2\7\67\2\2\u01d0\u01d1\7\"\2\2\u01d1\u01d3\7\67\2\2\u01d2\u01d0\3"+
- "\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d6\5(\25\2\u01d5"+
- "\u01d7\7\67\2\2\u01d6\u01d5\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7E\3\2\2\2"+
- "\u01d8\u01da\7\32\2\2\u01d9\u01db\7\67\2\2\u01da\u01d9\3\2\2\2\u01da\u01db"+
- "\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01de\78\2\2\u01dd\u01df\5\20\t\2\u01de"+
- "\u01dd\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2"+
- "\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\79\2\2\u01e3G\3\2\2\2\u01e4\u01e6"+
- "\5\22\n\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e7\3\2\2\2"+
- "\u01e7\u01e8\7\34\2\2\u01e8\u01e9\7\67\2\2\u01e9\u01ea\5\26\f\2\u01ea"+
- "\u01eb\7\67\2\2\u01eb\u01ec\7(\2\2\u01ec\u01ed\7\67\2\2\u01ed\u01ee\5"+
- "\16\b\2\u01ee\u01f0\78\2\2\u01ef\u01f1\5\20\t\2\u01f0\u01ef\3\2\2\2\u01f1"+
- "\u01f2\3\2\2\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f5\3\2"+
- "\2\2\u01f4\u01f6\5L\'\2\u01f5\u01f4\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6"+
- "\u01f7\3\2\2\2\u01f7\u01f8\79\2\2\u01f8I\3\2\2\2\u01f9\u01fb\5\22\n\2"+
- "\u01fa\u01f9\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\3\2\2\2\u01fc\u01fd"+
- "\7\33\2\2\u01fd\u0200\7\67\2\2\u01fe\u0201\5\26\f\2\u01ff\u0201\7.\2\2"+
- "\u0200\u01fe\3\2\2\2\u0200\u01ff\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203"+
- "\7\67\2\2\u0203\u0205\7\'\2\2\u0204\u0206\7\67\2\2\u0205\u0204\3\2\2\2"+
- "\u0205\u0206\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0209\78\2\2\u0208\u020a"+
- "\5\20\t\2\u0209\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u0209\3\2\2\2"+
- "\u020b\u020c\3\2\2\2\u020c\u020e\3\2\2\2\u020d\u020f\5L\'\2\u020e\u020d"+
- "\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0211\79\2\2\u0211"+
- "K\3\2\2\2\u0212\u0213\7\36\2\2\u0213\u0214\7\67\2\2\u0214\u0215\5@!\2"+
- "\u0215\u0219\7\13\2\2\u0216\u0218\5\20\t\2\u0217\u0216\3\2\2\2\u0218\u021b"+
- "\3\2\2\2\u0219\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021aM\3\2\2\2\u021b"+
- "\u0219\3\2\2\2\u021c\u021d\78\2\2\u021d\u021f\7\25\2\2\u021e\u0220\7\67"+
- "\2\2\u021f\u021e\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0221\3\2\2\2\u0221"+
- "\u0222\78\2\2\u0222\u0224\5P)\2\u0223\u0225\5\34\17\2\u0224\u0223\3\2"+
- "\2\2\u0224\u0225\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u0227\5R*\2\u0227\u0228"+
- "\79\2\2\u0228\u0229\79\2\2\u0229O\3\2\2\2\u022a\u022b\7\26\2\2\u022b\u022e"+
- "\7\67\2\2\u022c\u022f\5\26\f\2\u022d\u022f\7.\2\2\u022e\u022c\3\2\2\2"+
- "\u022e\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\7\67\2\2\u0231\u0233"+
- "\7%\2\2\u0232\u0234\7\67\2\2\u0233\u0232\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+
- "\u0235\3\2\2\2\u0235\u0236\7\13\2\2\u0236Q\3\2\2\2\u0237\u0238\7\27\2"+
- "\2\u0238\u0239\7\67\2\2\u0239\u023b\5@!\2\u023a\u023c\7\67\2\2\u023b\u023a"+
- "\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u023d\3\2\2\2\u023d\u023e\7\13\2\2"+
- "\u023eS\3\2\2\2UX^cflu}\u0086\u0089\u009a\u009e\u00a2\u00a5\u00a8\u00ac"+
- "\u00b0\u00b4\u00ba\u00bd\u00c4\u00c9\u00cd\u00d1\u00db\u00df\u00e6\u00ec"+
- "\u00ef\u00f4\u00fb\u00ff\u0102\u0106\u010c\u010f\u0119\u0122\u012c\u0133"+
- "\u0137\u013c\u0143\u0147\u014d\u0152\u0159\u015d\u0164\u016a\u016e\u0173"+
- "\u0179\u0181\u0184\u018e\u0194\u0198\u019c\u01a2\u01ab\u01af\u01b7\u01bd"+
- "\u01c2\u01c7\u01d2\u01d6\u01da\u01e0\u01e5\u01f2\u01f5\u01fa\u0200\u0205"+
- "\u020b\u020e\u0219\u021f\u0224\u022e\u0233\u023b";
+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\3"+
+ "\2\3\2\6\2Y\n\2\r\2\16\2Z\3\3\3\3\3\3\3\3\5\3a\n\3\3\3\3\3\3\3\5\3f\n"+
+ "\3\3\3\5\3i\n\3\3\3\5\3l\n\3\3\3\3\3\7\3p\n\3\f\3\16\3s\13\3\3\4\3\4\3"+
+ "\5\3\5\3\5\3\5\5\5{\n\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0085\n\6"+
+ "\3\6\3\6\3\7\3\7\3\7\3\7\5\7\u008d\n\7\3\7\3\7\3\b\3\b\3\b\6\b\u0094\n"+
+ "\b\r\b\16\b\u0095\3\b\5\b\u0099\n\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3"+
+ "\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u00aa\n\n\3\13\3\13\5\13\u00ae\n\13\3\13"+
+ "\3\13\5\13\u00b2\n\13\3\f\5\f\u00b5\n\f\3\f\5\f\u00b8\n\f\3\f\3\f\5\f"+
+ "\u00bc\n\f\3\f\3\f\5\f\u00c0\n\f\3\f\3\f\5\f\u00c4\n\f\3\r\3\r\3\r\3\r"+
+ "\5\r\u00ca\n\r\3\16\5\16\u00cd\n\16\3\16\3\16\3\16\3\16\3\16\5\16\u00d4"+
+ "\n\16\3\16\7\16\u00d7\n\16\f\16\16\16\u00da\13\16\3\16\5\16\u00dd\n\16"+
+ "\3\16\3\16\5\16\u00e1\n\16\3\17\3\17\3\17\3\17\3\17\3\17\7\17\u00e9\n"+
+ "\17\f\17\16\17\u00ec\13\17\3\17\5\17\u00ef\n\17\3\17\3\17\3\17\3\20\3"+
+ "\20\5\20\u00f6\n\20\3\20\3\20\3\20\3\20\5\20\u00fc\n\20\3\20\5\20\u00ff"+
+ "\n\20\3\20\3\20\3\21\5\21\u0104\n\21\3\21\3\21\3\21\3\21\3\21\5\21\u010b"+
+ "\n\21\3\21\3\21\5\21\u010f\n\21\3\21\5\21\u0112\n\21\3\21\3\21\5\21\u0116"+
+ "\n\21\3\22\3\22\6\22\u011a\n\22\r\22\16\22\u011b\3\22\5\22\u011f\n\22"+
+ "\3\22\3\22\3\23\3\23\3\23\3\23\7\23\u0127\n\23\f\23\16\23\u012a\13\23"+
+ "\3\24\3\24\3\24\3\24\7\24\u0130\n\24\f\24\16\24\u0133\13\24\3\25\3\25"+
+ "\3\25\3\26\3\26\3\26\3\26\5\26\u013c\n\26\3\27\3\27\3\30\3\30\3\30\5\30"+
+ "\u0143\n\30\3\31\3\31\5\31\u0147\n\31\3\31\7\31\u014a\n\31\f\31\16\31"+
+ "\u014d\13\31\3\31\3\31\7\31\u0151\n\31\f\31\16\31\u0154\13\31\3\31\5\31"+
+ "\u0157\n\31\3\31\3\31\3\32\3\32\5\32\u015d\n\32\3\32\7\32\u0160\n\32\f"+
+ "\32\16\32\u0163\13\32\3\32\3\32\7\32\u0167\n\32\f\32\16\32\u016a\13\32"+
+ "\3\32\5\32\u016d\n\32\3\32\3\32\3\33\3\33\3\33\5\33\u0174\n\33\3\33\3"+
+ "\33\3\34\3\34\5\34\u017a\n\34\3\34\3\34\5\34\u017e\n\34\3\34\3\34\3\35"+
+ "\5\35\u0183\n\35\3\35\3\35\3\35\3\35\5\35\u0189\n\35\3\35\3\35\3\36\3"+
+ "\36\3\36\3\36\5\36\u0191\n\36\3\36\5\36\u0194\n\36\3\36\3\36\3\37\3\37"+
+ "\3\37\3\37\3\37\3\37\5\37\u019e\n\37\3\37\3\37\6\37\u01a2\n\37\r\37\16"+
+ "\37\u01a3\3\37\3\37\5\37\u01a8\n\37\3 \3 \5 \u01ac\n \3 \3 \6 \u01b0\n"+
+ " \r \16 \u01b1\3 \3 \3!\3!\3!\6!\u01b9\n!\r!\16!\u01ba\3!\3!\5!\u01bf"+
+ "\n!\3\"\3\"\3\"\3\"\7\"\u01c5\n\"\f\"\16\"\u01c8\13\"\3#\7#\u01cb\n#\f"+
+ "#\16#\u01ce\13#\3#\3#\5#\u01d2\n#\3#\7#\u01d5\n#\f#\16#\u01d8\13#\3#\3"+
+ "#\3$\3$\3$\3$\3$\3$\5$\u01e2\n$\3$\3$\5$\u01e6\n$\3%\3%\5%\u01ea\n%\3"+
+ "%\3%\6%\u01ee\n%\r%\16%\u01ef\3%\3%\3&\5&\u01f5\n&\3&\3&\3&\3&\3&\3&\3"+
+ "&\3&\3&\6&\u0200\n&\r&\16&\u0201\3&\5&\u0205\n&\3&\3&\3\'\5\'\u020a\n"+
+ "\'\3\'\3\'\3\'\3\'\5\'\u0210\n\'\3\'\3\'\3\'\5\'\u0215\n\'\3\'\3\'\6\'"+
+ "\u0219\n\'\r\'\16\'\u021a\3\'\5\'\u021e\n\'\3\'\3\'\3(\3(\3(\3(\3(\7("+
+ "\u0227\n(\f(\16(\u022a\13(\3)\3)\3)\5)\u022f\n)\3)\3)\3)\5)\u0234\n)\3"+
+ ")\3)\3)\3)\3*\3*\3*\3*\5*\u023e\n*\3*\3*\3*\5*\u0243\n*\3*\3*\3+\3+\3"+
+ "+\3+\5+\u024b\n+\3+\3+\3+\2\2,\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36"+
+ " \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT\2\5\3\2\62\63\3\2,\61\3\2$%\2\u0287"+
+ "\2V\3\2\2\2\4\\\3\2\2\2\6t\3\2\2\2\bv\3\2\2\2\n~\3\2\2\2\f\u0088\3\2\2"+
+ "\2\16\u0090\3\2\2\2\20\u009c\3\2\2\2\22\u00a9\3\2\2\2\24\u00ab\3\2\2\2"+
+ "\26\u00b4\3\2\2\2\30\u00c9\3\2\2\2\32\u00cc\3\2\2\2\34\u00e2\3\2\2\2\36"+
+ "\u00f5\3\2\2\2 \u0103\3\2\2\2\"\u0117\3\2\2\2$\u0122\3\2\2\2&\u012b\3"+
+ "\2\2\2(\u0134\3\2\2\2*\u013b\3\2\2\2,\u013d\3\2\2\2.\u0142\3\2\2\2\60"+
+ "\u0144\3\2\2\2\62\u015a\3\2\2\2\64\u0170\3\2\2\2\66\u0177\3\2\2\28\u0182"+
+ "\3\2\2\2:\u018c\3\2\2\2<\u0197\3\2\2\2>\u01a9\3\2\2\2@\u01b5\3\2\2\2B"+
+ "\u01c0\3\2\2\2D\u01cc\3\2\2\2F\u01db\3\2\2\2H\u01e7\3\2\2\2J\u01f4\3\2"+
+ "\2\2L\u0209\3\2\2\2N\u0221\3\2\2\2P\u022b\3\2\2\2R\u0239\3\2\2\2T\u0246"+
+ "\3\2\2\2VX\5\4\3\2WY\5\22\n\2XW\3\2\2\2YZ\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2"+
+ "[\3\3\2\2\2\\]\7\r\2\2]^\78\2\2^`\5\6\4\2_a\78\2\2`_\3\2\2\2`a\3\2\2\2"+
+ "ab\3\2\2\2bc\79\2\2ce\5\b\5\2df\5\n\6\2ed\3\2\2\2ef\3\2\2\2fh\3\2\2\2"+
+ "gi\5\f\7\2hg\3\2\2\2hi\3\2\2\2ik\3\2\2\2jl\5\16\b\2kj\3\2\2\2kl\3\2\2"+
+ "\2lm\3\2\2\2mq\7:\2\2np\7\13\2\2on\3\2\2\2ps\3\2\2\2qo\3\2\2\2qr\3\2\2"+
+ "\2r\5\3\2\2\2sq\3\2\2\2tu\t\2\2\2u\7\3\2\2\2vw\7\16\2\2wx\78\2\2xz\7."+
+ "\2\2y{\78\2\2zy\3\2\2\2z{\3\2\2\2{|\3\2\2\2|}\7\13\2\2}\t\3\2\2\2~\177"+
+ "\7\17\2\2\177\u0080\78\2\2\u0080\u0081\7/\2\2\u0081\u0082\78\2\2\u0082"+
+ "\u0084\7&\2\2\u0083\u0085\78\2\2\u0084\u0083\3\2\2\2\u0084\u0085\3\2\2"+
+ "\2\u0085\u0086\3\2\2\2\u0086\u0087\7\13\2\2\u0087\13\3\2\2\2\u0088\u0089"+
+ "\7\20\2\2\u0089\u008a\78\2\2\u008a\u008c\5\20\t\2\u008b\u008d\78\2\2\u008c"+
+ "\u008b\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\7\13"+
+ "\2\2\u008f\r\3\2\2\2\u0090\u0093\7\21\2\2\u0091\u0092\78\2\2\u0092\u0094"+
+ "\5\20\t\2\u0093\u0091\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0093\3\2\2\2"+
+ "\u0095\u0096\3\2\2\2\u0096\u0098\3\2\2\2\u0097\u0099\78\2\2\u0098\u0097"+
+ "\3\2\2\2\u0098\u0099\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009b\7\13\2\2"+
+ "\u009b\17\3\2\2\2\u009c\u009d\7\62\2\2\u009d\21\3\2\2\2\u009e\u00aa\5"+
+ "\32\16\2\u009f\u00aa\5\36\20\2\u00a0\u00aa\5 \21\2\u00a1\u00aa\5\64\33"+
+ "\2\u00a2\u00aa\5\"\22\2\u00a3\u00aa\58\35\2\u00a4\u00aa\5:\36\2\u00a5"+
+ "\u00aa\5@!\2\u00a6\u00aa\5<\37\2\u00a7\u00aa\5J&\2\u00a8\u00aa\5L\'\2"+
+ "\u00a9\u009e\3\2\2\2\u00a9\u009f\3\2\2\2\u00a9\u00a0\3\2\2\2\u00a9\u00a1"+
+ "\3\2\2\2\u00a9\u00a2\3\2\2\2\u00a9\u00a3\3\2\2\2\u00a9\u00a4\3\2\2\2\u00a9"+
+ "\u00a5\3\2\2\2\u00a9\u00a6\3\2\2\2\u00a9\u00a7\3\2\2\2\u00a9\u00a8\3\2"+
+ "\2\2\u00aa\23\3\2\2\2\u00ab\u00ad\5\30\r\2\u00ac\u00ae\78\2\2\u00ad\u00ac"+
+ "\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b1\7*\2\2\u00b0"+
+ "\u00b2\78\2\2\u00b1\u00b0\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\25\3\2\2\2"+
+ "\u00b3\u00b5\5\30\r\2\u00b4\u00b3\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5\u00b7"+
+ "\3\2\2\2\u00b6\u00b8\78\2\2\u00b7\u00b6\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8"+
+ "\u00b9\3\2\2\2\u00b9\u00bb\7\3\2\2\u00ba\u00bc\78\2\2\u00bb\u00ba\3\2"+
+ "\2\2\u00bb\u00bc\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00bf\5\20\t\2\u00be"+
+ "\u00c0\78\2\2\u00bf\u00be\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\3\2"+
+ "\2\2\u00c1\u00c3\7*\2\2\u00c2\u00c4\78\2\2\u00c3\u00c2\3\2\2\2\u00c3\u00c4"+
+ "\3\2\2\2\u00c4\27\3\2\2\2\u00c5\u00ca\5\20\t\2\u00c6\u00ca\7\63\2\2\u00c7"+
+ "\u00ca\7\65\2\2\u00c8\u00ca\7\66\2\2\u00c9\u00c5\3\2\2\2\u00c9\u00c6\3"+
+ "\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2\2\2\u00ca\31\3\2\2\2\u00cb"+
+ "\u00cd\5\24\13\2\u00cc\u00cb\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00ce\3"+
+ "\2\2\2\u00ce\u00cf\7\23\2\2\u00cf\u00d3\78\2\2\u00d0\u00d1\7\4\2\2\u00d1"+
+ "\u00d4\5\30\r\2\u00d2\u00d4\5\6\4\2\u00d3\u00d0\3\2\2\2\u00d3\u00d2\3"+
+ "\2\2\2\u00d4\u00d8\3\2\2\2\u00d5\u00d7\5(\25\2\u00d6\u00d5\3\2\2\2\u00d7"+
+ "\u00da\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00dc\3\2"+
+ "\2\2\u00da\u00d8\3\2\2\2\u00db\u00dd\78\2\2\u00dc\u00db\3\2\2\2\u00dc"+
+ "\u00dd\3\2\2\2\u00dd\u00e0\3\2\2\2\u00de\u00e1\5\34\17\2\u00df\u00e1\7"+
+ "\13\2\2\u00e0\u00de\3\2\2\2\u00e0\u00df\3\2\2\2\u00e1\33\3\2\2\2\u00e2"+
+ "\u00e3\79\2\2\u00e3\u00e4\7\31\2\2\u00e4\u00e5\78\2\2\u00e5\u00ea\7.\2"+
+ "\2\u00e6\u00e7\78\2\2\u00e7\u00e9\7.\2\2\u00e8\u00e6\3\2\2\2\u00e9\u00ec"+
+ "\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ee\3\2\2\2\u00ec"+
+ "\u00ea\3\2\2\2\u00ed\u00ef\78\2\2\u00ee\u00ed\3\2\2\2\u00ee\u00ef\3\2"+
+ "\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f1\7\13\2\2\u00f1\u00f2\7:\2\2\u00f2"+
+ "\35\3\2\2\2\u00f3\u00f6\5\24\13\2\u00f4\u00f6\5\26\f\2\u00f5\u00f3\3\2"+
+ "\2\2\u00f5\u00f4\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7"+
+ "\u00f8\7\24\2\2\u00f8\u00fb\78\2\2\u00f9\u00fc\5$\23\2\u00fa\u00fc\5&"+
+ "\24\2\u00fb\u00f9\3\2\2\2\u00fb\u00fa\3\2\2\2\u00fc\u00fe\3\2\2\2\u00fd"+
+ "\u00ff\78\2\2\u00fe\u00fd\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100\3\2"+
+ "\2\2\u0100\u0101\7\13\2\2\u0101\37\3\2\2\2\u0102\u0104\5\24\13\2\u0103"+
+ "\u0102\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0106\7\25"+
+ "\2\2\u0106\u0107\78\2\2\u0107\u010a\7.\2\2\u0108\u0109\78\2\2\u0109\u010b"+
+ "\5\30\r\2\u010a\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010e\3\2\2\2"+
+ "\u010c\u010d\78\2\2\u010d\u010f\7-\2\2\u010e\u010c\3\2\2\2\u010e\u010f"+
+ "\3\2\2\2\u010f\u0111\3\2\2\2\u0110\u0112\78\2\2\u0111\u0110\3\2\2\2\u0111"+
+ "\u0112\3\2\2\2\u0112\u0115\3\2\2\2\u0113\u0116\5P)\2\u0114\u0116\7\13"+
+ "\2\2\u0115\u0113\3\2\2\2\u0115\u0114\3\2\2\2\u0116!\3\2\2\2\u0117\u0119"+
+ "\7\22\2\2\u0118\u011a\5(\25\2\u0119\u0118\3\2\2\2\u011a\u011b\3\2\2\2"+
+ "\u011b\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011c\u011e\3\2\2\2\u011d\u011f"+
+ "\78\2\2\u011e\u011d\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120"+
+ "\u0121\7\13\2\2\u0121#\3\2\2\2\u0122\u0123\5\6\4\2\u0123\u0124\7\5\2\2"+
+ "\u0124\u0128\7\62\2\2\u0125\u0127\5(\25\2\u0126\u0125\3\2\2\2\u0127\u012a"+
+ "\3\2\2\2\u0128\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129%\3\2\2\2\u012a"+
+ "\u0128\3\2\2\2\u012b\u012c\5\30\r\2\u012c\u012d\78\2\2\u012d\u0131\7\62"+
+ "\2\2\u012e\u0130\5(\25\2\u012f\u012e\3\2\2\2\u0130\u0133\3\2\2\2\u0131"+
+ "\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\'\3\2\2\2\u0133\u0131\3\2\2\2"+
+ "\u0134\u0135\78\2\2\u0135\u0136\5*\26\2\u0136)\3\2\2\2\u0137\u013c\5,"+
+ "\27\2\u0138\u013c\5\30\r\2\u0139\u013a\7+\2\2\u013a\u013c\5\30\r\2\u013b"+
+ "\u0137\3\2\2\2\u013b\u0138\3\2\2\2\u013b\u0139\3\2\2\2\u013c+\3\2\2\2"+
+ "\u013d\u013e\t\3\2\2\u013e-\3\2\2\2\u013f\u0143\5\62\32\2\u0140\u0143"+
+ "\5\60\31\2\u0141\u0143\5*\26\2\u0142\u013f\3\2\2\2\u0142\u0140\3\2\2\2"+
+ "\u0142\u0141\3\2\2\2\u0143/\3\2\2\2\u0144\u0146\7\6\2\2\u0145\u0147\7"+
+ "8\2\2\u0146\u0145\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u014b\3\2\2\2\u0148"+
+ "\u014a\5.\30\2\u0149\u0148\3\2\2\2\u014a\u014d\3\2\2\2\u014b\u0149\3\2"+
+ "\2\2\u014b\u014c\3\2\2\2\u014c\u0152\3\2\2\2\u014d\u014b\3\2\2\2\u014e"+
+ "\u014f\7\67\2\2\u014f\u0151\5.\30\2\u0150\u014e\3\2\2\2\u0151\u0154\3"+
+ "\2\2\2\u0152\u0150\3\2\2\2\u0152\u0153\3\2\2\2\u0153\u0156\3\2\2\2\u0154"+
+ "\u0152\3\2\2\2\u0155\u0157\78\2\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2"+
+ "\2\2\u0157\u0158\3\2\2\2\u0158\u0159\7\7\2\2\u0159\61\3\2\2\2\u015a\u015c"+
+ "\7\b\2\2\u015b\u015d\78\2\2\u015c\u015b\3\2\2\2\u015c\u015d\3\2\2\2\u015d"+
+ "\u0161\3\2\2\2\u015e\u0160\5\66\34\2\u015f\u015e\3\2\2\2\u0160\u0163\3"+
+ "\2\2\2\u0161\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0168\3\2\2\2\u0163"+
+ "\u0161\3\2\2\2\u0164\u0165\7\67\2\2\u0165\u0167\5\66\34\2\u0166\u0164"+
+ "\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0169\3\2\2\2\u0169"+
+ "\u016c\3\2\2\2\u016a\u0168\3\2\2\2\u016b\u016d\78\2\2\u016c\u016b\3\2"+
+ "\2\2\u016c\u016d\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u016f\7\t\2\2\u016f"+
+ "\63\3\2\2\2\u0170\u0171\5\24\13\2\u0171\u0173\5.\30\2\u0172\u0174\78\2"+
+ "\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176"+
+ "\7\13\2\2\u0176\65\3\2\2\2\u0177\u0179\7\62\2\2\u0178\u017a\78\2\2\u0179"+
+ "\u0178\3\2\2\2\u0179\u017a\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\7\n"+
+ "\2\2\u017c\u017e\78\2\2\u017d\u017c\3\2\2\2\u017d\u017e\3\2\2\2\u017e"+
+ "\u017f\3\2\2\2\u017f\u0180\5.\30\2\u0180\67\3\2\2\2\u0181\u0183\5\24\13"+
+ "\2\u0182\u0181\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0185"+
+ "\7!\2\2\u0185\u0188\78\2\2\u0186\u0189\7.\2\2\u0187\u0189\5\30\r\2\u0188"+
+ "\u0186\3\2\2\2\u0188\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a\u018b\7\13"+
+ "\2\2\u018b9\3\2\2\2\u018c\u018d\7 \2\2\u018d\u0190\78\2\2\u018e\u0191"+
+ "\7-\2\2\u018f\u0191\5\30\r\2\u0190\u018e\3\2\2\2\u0190\u018f\3\2\2\2\u0191"+
+ "\u0193\3\2\2\2\u0192\u0194\78\2\2\u0193\u0192\3\2\2\2\u0193\u0194\3\2"+
+ "\2\2\u0194\u0195\3\2\2\2\u0195\u0196\7\13\2\2\u0196;\3\2\2\2\u0197\u0198"+
+ "\7\36\2\2\u0198\u0199\78\2\2\u0199\u019a\5*\26\2\u019a\u019b\78\2\2\u019b"+
+ "\u019d\7\'\2\2\u019c\u019e\78\2\2\u019d\u019c\3\2\2\2\u019d\u019e\3\2"+
+ "\2\2\u019e\u019f\3\2\2\2\u019f\u01a1\79\2\2\u01a0\u01a2\5> \2\u01a1\u01a0"+
+ "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4"+
+ "\u01a5\3\2\2\2\u01a5\u01a7\7:\2\2\u01a6\u01a8\5H%\2\u01a7\u01a6\3\2\2"+
+ "\2\u01a7\u01a8\3\2\2\2\u01a8=\3\2\2\2\u01a9\u01ab\5*\26\2\u01aa\u01ac"+
+ "\78\2\2\u01ab\u01aa\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad"+
+ "\u01af\79\2\2\u01ae\u01b0\5\22\n\2\u01af\u01ae\3\2\2\2\u01b0\u01b1\3\2"+
+ "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3"+
+ "\u01b4\7:\2\2\u01b4?\3\2\2\2\u01b5\u01b6\5B\"\2\u01b6\u01b8\79\2\2\u01b7"+
+ "\u01b9\5\22\n\2\u01b8\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01b8\3"+
+ "\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bc\3\2\2\2\u01bc\u01be\7:\2\2\u01bd"+
+ "\u01bf\5H%\2\u01be\u01bd\3\2\2\2\u01be\u01bf\3\2\2\2\u01bfA\3\2\2\2\u01c0"+
+ "\u01c1\7\32\2\2\u01c1\u01c2\78\2\2\u01c2\u01c6\5F$\2\u01c3\u01c5\5D#\2"+
+ "\u01c4\u01c3\3\2\2\2\u01c5\u01c8\3\2\2\2\u01c6\u01c4\3\2\2\2\u01c6\u01c7"+
+ "\3\2\2\2\u01c7C\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c9\u01cb\7\13\2\2\u01ca"+
+ "\u01c9\3\2\2\2\u01cb\u01ce\3\2\2\2\u01cc\u01ca\3\2\2\2\u01cc\u01cd\3\2"+
+ "\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01cc\3\2\2\2\u01cf\u01d1\t\4\2\2\u01d0"+
+ "\u01d2\78\2\2\u01d1\u01d0\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d6\3\2"+
+ "\2\2\u01d3\u01d5\7\13\2\2\u01d4\u01d3\3\2\2\2\u01d5\u01d8\3\2\2\2\u01d6"+
+ "\u01d4\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\3\2\2\2\u01d8\u01d6\3\2"+
+ "\2\2\u01d9\u01da\5F$\2\u01daE\3\2\2\2\u01db\u01dc\5*\26\2\u01dc\u01dd"+
+ "\78\2\2\u01dd\u01de\7\"\2\2\u01de\u01e1\78\2\2\u01df\u01e0\7#\2\2\u01e0"+
+ "\u01e2\78\2\2\u01e1\u01df\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\3\2"+
+ "\2\2\u01e3\u01e5\5*\26\2\u01e4\u01e6\78\2\2\u01e5\u01e4\3\2\2\2\u01e5"+
+ "\u01e6\3\2\2\2\u01e6G\3\2\2\2\u01e7\u01e9\7\33\2\2\u01e8\u01ea\78\2\2"+
+ "\u01e9\u01e8\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ed"+
+ "\79\2\2\u01ec\u01ee\5\22\n\2\u01ed\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef"+
+ "\u01ed\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7:"+
+ "\2\2\u01f2I\3\2\2\2\u01f3\u01f5\5\24\13\2\u01f4\u01f3\3\2\2\2\u01f4\u01f5"+
+ "\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f7\7\35\2\2\u01f7\u01f8\78\2\2\u01f8"+
+ "\u01f9\5\30\r\2\u01f9\u01fa\78\2\2\u01fa\u01fb\7)\2\2\u01fb\u01fc\78\2"+
+ "\2\u01fc\u01fd\5\20\t\2\u01fd\u01ff\79\2\2\u01fe\u0200\5\22\n\2\u01ff"+
+ "\u01fe\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u01ff\3\2\2\2\u0201\u0202\3\2"+
+ "\2\2\u0202\u0204\3\2\2\2\u0203\u0205\5N(\2\u0204\u0203\3\2\2\2\u0204\u0205"+
+ "\3\2\2\2\u0205\u0206\3\2\2\2\u0206\u0207\7:\2\2\u0207K\3\2\2\2\u0208\u020a"+
+ "\5\24\13\2\u0209\u0208\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\3\2\2\2"+
+ "\u020b\u020c\7\34\2\2\u020c\u020f\78\2\2\u020d\u0210\5\30\r\2\u020e\u0210"+
+ "\7/\2\2\u020f\u020d\3\2\2\2\u020f\u020e\3\2\2\2\u0210\u0211\3\2\2\2\u0211"+
+ "\u0212\78\2\2\u0212\u0214\7(\2\2\u0213\u0215\78\2\2\u0214\u0213\3\2\2"+
+ "\2\u0214\u0215\3\2\2\2\u0215\u0216\3\2\2\2\u0216\u0218\79\2\2\u0217\u0219"+
+ "\5\22\n\2\u0218\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\u0218\3\2\2\2"+
+ "\u021a\u021b\3\2\2\2\u021b\u021d\3\2\2\2\u021c\u021e\5N(\2\u021d\u021c"+
+ "\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0220\7:\2\2\u0220"+
+ "M\3\2\2\2\u0221\u0222\7\37\2\2\u0222\u0223\78\2\2\u0223\u0224\5B\"\2\u0224"+
+ "\u0228\7\13\2\2\u0225\u0227\5\22\n\2\u0226\u0225\3\2\2\2\u0227\u022a\3"+
+ "\2\2\2\u0228\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229O\3\2\2\2\u022a\u0228"+
+ "\3\2\2\2\u022b\u022c\79\2\2\u022c\u022e\7\26\2\2\u022d\u022f\78\2\2\u022e"+
+ "\u022d\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\79"+
+ "\2\2\u0231\u0233\5R*\2\u0232\u0234\5\36\20\2\u0233\u0232\3\2\2\2\u0233"+
+ "\u0234\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236\5T+\2\u0236\u0237\7:\2"+
+ "\2\u0237\u0238\7:\2\2\u0238Q\3\2\2\2\u0239\u023a\7\27\2\2\u023a\u023d"+
+ "\78\2\2\u023b\u023e\5\30\r\2\u023c\u023e\7/\2\2\u023d\u023b\3\2\2\2\u023d"+
+ "\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240\78\2\2\u0240\u0242\7&\2"+
+ "\2\u0241\u0243\78\2\2\u0242\u0241\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0244"+
+ "\3\2\2\2\u0244\u0245\7\13\2\2\u0245S\3\2\2\2\u0246\u0247\7\30\2\2\u0247"+
+ "\u0248\78\2\2\u0248\u024a\5B\"\2\u0249\u024b\78\2\2\u024a\u0249\3\2\2"+
+ "\2\u024a\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024d\7\13\2\2\u024d"+
+ "U\3\2\2\2WZ`ehkqz\u0084\u008c\u0095\u0098\u00a9\u00ad\u00b1\u00b4\u00b7"+
+ "\u00bb\u00bf\u00c3\u00c9\u00cc\u00d3\u00d8\u00dc\u00e0\u00ea\u00ee\u00f5"+
+ "\u00fb\u00fe\u0103\u010a\u010e\u0111\u0115\u011b\u011e\u0128\u0131\u013b"+
+ "\u0142\u0146\u014b\u0152\u0156\u015c\u0161\u0168\u016c\u0173\u0179\u017d"+
+ "\u0182\u0188\u0190\u0193\u019d\u01a3\u01a7\u01ab\u01b1\u01ba\u01be\u01c6"+
+ "\u01cc\u01d1\u01d6\u01e1\u01e5\u01e9\u01ef\u01f4\u0201\u0204\u0209\u020f"+
+ "\u0214\u021a\u021d\u0228\u022e\u0233\u023d\u0242\u024a";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java
index 82b7fe2324f..cf7bb37eb2a 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java
@@ -34,6 +34,12 @@ public interface AuthnFlowVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitBase(AuthnFlowParser.BaseContext ctx);
+ /**
+ * Visit a parse tree produced by {@link AuthnFlowParser#timeout}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitTimeout(AuthnFlowParser.TimeoutContext ctx);
/**
* Visit a parse tree produced by {@link AuthnFlowParser#configs}.
* @param ctx the parse tree
From 183f1e120932ccbcdd2a19a33d4c67b048bbc8aa Mon Sep 17 00:00:00 2001
From: Jose
Date: Wed, 25 May 2022 08:12:02 -0500
Subject: [PATCH 2/6] chore: refactor transpilation process and include flow
timeout #1446
---
.../io/jans/agama/timer/Transpilation.java | 19 ++---
.../io/jans/agama/model/FlowMetadata.java | 9 +++
.../jans/agama/dsl/TranspilationResult.java | 59 +++++++++++++++
.../java/io/jans/agama/dsl/Transpiler.java | 75 ++++++++-----------
4 files changed, 111 insertions(+), 51 deletions(-)
create mode 100644 agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java
diff --git a/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java b/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java
index bf128e634fe..1d3313cafbe 100644
--- a/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java
+++ b/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java
@@ -3,6 +3,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import io.jans.agama.dsl.TranspilationResult;
import io.jans.agama.dsl.Transpiler;
import io.jans.agama.dsl.TranspilerException;
import io.jans.agama.dsl.error.SyntaxException;
@@ -37,7 +38,7 @@
public class Transpilation {
private static final int DELAY = 10 + (int) (10 * Math.random()); //seconds
- private static final int INTERVAL = 30; //TODO: adjust seconds
+ private static final int INTERVAL = 45; // seconds
private static final double PR = 0.25;
@Inject
@@ -94,7 +95,8 @@ private Map makeSimpleMap(Map map) {
}
/**
- * This method assumes that when a flow is created, attribute revision is set to a negative value
+ * This method assumes that when a flow is created (eg. via an administrative tool),
+ * attribute revision is set to a negative value
* @throws IOException
*/
public void process() throws IOException {
@@ -158,15 +160,15 @@ public void process() throws IOException {
String error = null, shortError = null;
try {
- List strings = Transpiler.transpile(qname, map.keySet(), fl.getSource());
+ TranspilationResult result = Transpiler.transpile(qname, map.keySet(), fl.getSource());
logger.debug("Successful transpilation");
- String fname = strings.remove(0);
- String compiled = strings.remove(0);
FlowMetadata meta = fl.getMetadata();
- meta.setFuncName(fname);
- meta.setInputs(strings);
-
+ meta.setFuncName(result.getFuncName());
+ meta.setInputs(result.getInputs());
+ meta.setTimeout(result.getTimeout());
+
+ String compiled = result.getCode();
fl.setMetadata(meta);
fl.setTranspiled(compiled);
fl.setTransHash(futils.hash(compiled));
@@ -203,6 +205,5 @@ public void process() throws IOException {
traces = makeSimpleMap(map);
}
-
}
diff --git a/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java b/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java
index e0200e86a38..40a48474a33 100644
--- a/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java
+++ b/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java
@@ -10,6 +10,7 @@ public class FlowMetadata {
private String funcName;
private List inputs;
+ private Integer timeout;
private String displayName;
private String author;
private long timestamp;
@@ -33,6 +34,14 @@ public void setInputs(List inputs) {
this.inputs = inputs;
}
+ public Integer getTimeout() {
+ return timeout;
+ }
+
+ public void setTimeout(Integer timeout) {
+ this.timeout = timeout;
+ }
+
public String getDisplayName() {
return displayName;
}
diff --git a/agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java b/agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java
new file mode 100644
index 00000000000..fd62cc4f802
--- /dev/null
+++ b/agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java
@@ -0,0 +1,59 @@
+package io.jans.agama.dsl;
+
+import java.util.List;
+
+public class TranspilationResult {
+
+ /**
+ * Name of the javascript function generated
+ */
+ private String funcName;
+
+ /**
+ * Parameter names the function has (as passed in the Input directive of the flow in question)
+ */
+ private List inputs;
+
+ /**
+ * Number used in the Timeout directive (if present)
+ */
+ private Integer timeout;
+
+ /**
+ * Actual function code. Remaining items, if any, correspond to the input
+ */
+ private String code;
+
+ public String getFuncName() {
+ return funcName;
+ }
+
+ public void setFuncName(String funcName) {
+ this.funcName = funcName;
+ }
+
+ public List getInputs() {
+ return inputs;
+ }
+
+ public void setInputs(List inputs) {
+ this.inputs = inputs;
+ }
+
+ public Integer getTimeout() {
+ return timeout;
+ }
+
+ public void setTimeout(Integer timeout) {
+ this.timeout = timeout;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+}
\ No newline at end of file
diff --git a/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java b/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java
index 5e1aaa17033..38ac814fa02 100644
--- a/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java
+++ b/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java
@@ -25,6 +25,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -32,7 +33,6 @@
import net.sf.saxon.dom.NodeOverNodeInfo;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
-import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XPathCompiler;
import net.sf.saxon.s9api.XdmItem;
import net.sf.saxon.s9api.XdmNode;
@@ -125,7 +125,7 @@ private void loadFreeMarkerTemplate() throws TranspilerException {
}
- public SaplingDocument asXML(String DSLCode) throws SyntaxException, TranspilerException {
+ public XdmNode asXML(String DSLCode) throws SyntaxException, TranspilerException, SaxonApiException {
InputStream is = new ByteArrayInputStream(DSLCode.getBytes(UTF_8));
CharStream input = null;
@@ -167,7 +167,7 @@ public SaplingDocument asXML(String DSLCode) throws SyntaxException, TranspilerE
SaplingDocument document = Visitor.document(flowContext, AuthnFlowParser.RULE_flow, fanny);
applyValidations(document);
- return document;
+ return document.toXdmNode(processor);
} catch (RecognitionException re) {
Token offender = re.getOffendingToken();
@@ -177,23 +177,30 @@ public SaplingDocument asXML(String DSLCode) throws SyntaxException, TranspilerE
}
- public List getInputs(SaplingDocument doc) throws SaxonApiException {
+ public List getInputs(XdmNode node) throws SaxonApiException {
- return xpathCompiler
- .evaluate("/flow/header/inputs/short_var/text()", doc.toXdmNode(processor))
+ return xpathCompiler.evaluate("/flow/header/inputs/short_var/text()", node)
.stream().map(XdmItem::getStringValue).collect(Collectors.toList());
}
- public String generateJS(SaplingDocument doc) throws TranspilerException {
+ public Integer getTimeout(XdmNode node) throws SaxonApiException {
+
+ return Optional.ofNullable(
+ xpathCompiler.evaluateSingle("/flow/header/timeout/UINT/text()", node))
+ .map(XdmItem::getStringValue).map(Integer::valueOf).orElse(null);
+
+ }
+
+ public String generateJS(XdmNode node) throws TranspilerException {
try {
StringWriter sw = new StringWriter();
- NodeModel model = asNodeModel(doc);
+ NodeModel model = NodeModel.wrap(NodeOverNodeInfo.wrap(node.getUnderlyingNode()));
jsGenerator.process(model, sw);
return sw.toString();
- } catch (IOException | TemplateException | SaxonApiException e) {
+ } catch (IOException | TemplateException e) {
throw new TranspilerException("Transformation failed", e);
}
@@ -231,26 +238,9 @@ private void checkUnknownInvocation(String xpathExpr, Set known, XdmNode
}
- private void logXml(SaplingDocument doc) {
-
- try {
- StringWriter sw = new StringWriter();
- Serializer serializer = processor.newSerializer(sw);
- serializer.setOutputProperty(Serializer.Property.INDENT, "true");
-
- logger.debug("Serializing XML document");
- doc.serialize(serializer);
-
- logger.debug("\n{}", sw.toString());
- } catch (SaxonApiException e) {
- logger.error(e.getMessage(), e);
- }
-
- }
-
- private NodeModel asNodeModel(SaplingDocument doc) throws SaxonApiException {
- return NodeModel.wrap(NodeOverNodeInfo.wrap(
- doc.toXdmNode(processor).getUnderlyingNode()));
+ private void logXml(XdmNode node) {
+ logger.debug("\n{}", node.toString());
+ //System.out.println("\n" + node.toString());
}
private void generateFromXml(String fileName, OutputStream out) throws Exception {
@@ -266,29 +256,29 @@ private void generateFromXml(String fileName, OutputStream out) throws Exception
* triggered from the input flow (Trigger directive). Passing null disables the validation.
* Passing an empty list will make validation fail if any Trigger directive is found
* @param source Source code of input flow (written using Agama DSL)
- * @return A (modifiable) list with at least 2 elements: 1st item contains the name of the function generated,
- * 2nd item contents the actual function code. Remaining items, if any, correspond to the input
- * parameter names the function has (as passed in the Input directive).
+ * @return A TranspilerResult object holding the details of the generated function
* @throws SyntaxException When the input source has syntactic errors, details are contained
* in the exception thrown
* @throws TranspilerException When other kind of processing error occurred.
*/
- public static List transpile(String flowQname, Set flowQNames, String source)
+ public static TranspilationResult transpile(String flowQname, Set flowQNames, String source)
throws TranspilerException, SyntaxException {
-
- List result = new ArrayList<>();
+
Transpiler tr = new Transpiler(flowQname, flowQNames);
- SaplingDocument doc = tr.asXML(source);
-
- result.add(tr.getFanny());
- result.add(tr.generateJS(doc));
try {
- result.addAll(tr.getInputs(doc));
+ XdmNode doc = tr.asXML(source);
+
+ TranspilationResult result = new TranspilationResult();
+ result.setFuncName(tr.getFanny());
+ result.setCode(tr.generateJS(doc));
+ result.setInputs(tr.getInputs(doc));
+ result.setTimeout(tr.getTimeout(doc));
+
+ return result;
} catch (SaxonApiException e) {
throw new TranspilerException(e.getMessage(), e);
}
- return result;
}
public static void main(String... args) throws Exception {
@@ -310,9 +300,10 @@ public static void main(String... args) throws Exception {
Transpiler tr = new Transpiler(args[1], knownFlows);
String dslCode = new String(Files.readAllBytes(Paths.get(args[0])), UTF_8);
- SaplingDocument doc = tr.asXML(dslCode);
+ XdmNode doc = tr.asXML(dslCode);
tr.logXml(doc);
System.out.println("\nInputs: " + tr.getInputs(doc));
+ System.out.println("\nTimeout: " + tr.getTimeout(doc));
System.out.println("\n" + tr.generateJS(doc));
//tr.generateFromXml("Sample.xml", System.out);
From 0ba5f7110a516d8496988d1b30e3fe9ba5afbfc2 Mon Sep 17 00:00:00 2001
From: Jose
Date: Wed, 25 May 2022 08:13:01 -0500
Subject: [PATCH 3/6] chore: move script to proper location #1446
---
.../static/extension/person_authentication/AgamaBridge.py | 7 ++++---
.../jans_setup/templates/jetty}/agama_web_resources.xml | 2 +-
2 files changed, 5 insertions(+), 4 deletions(-)
rename agama/misc/bridge.py => jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py (97%)
rename {agama/misc => jans-linux-setup/jans_setup/templates/jetty}/agama_web_resources.xml (85%)
diff --git a/agama/misc/bridge.py b/jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py
similarity index 97%
rename from agama/misc/bridge.py
rename to jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py
index 31606ba30c1..9f68826d1bb 100644
--- a/agama/misc/bridge.py
+++ b/jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py
@@ -3,7 +3,8 @@
#
from io.jans.agama import NativeJansFlowBridge
from io.jans.agama.engine.misc import FlowUtils
-from io.jans.as.server.service import AuthenticationService, SessionIdService
+from io.jans.as.server.security import Identity
+from io.jans.as.server.service import AuthenticationService
from io.jans.jsf2.service import FacesService
from io.jans.jsf2.message import FacesMessages
from io.jans.model.custom.script.type.auth import PersonAuthenticationType
@@ -92,8 +93,8 @@ def prepareForStep(self, configurationAttributes, requestParameters, step):
if step == 1:
print "Agama. Prepare for Step 1"
-
- session = CdiUtil.bean(SessionIdService).getSessionId()
+
+ session = CdiUtil.bean(Identity).getSessionId()
if session == None:
print "Agama. Failed to retrieve session_id"
return False
diff --git a/agama/misc/agama_web_resources.xml b/jans-linux-setup/jans_setup/templates/jetty/agama_web_resources.xml
similarity index 85%
rename from agama/misc/agama_web_resources.xml
rename to jans-linux-setup/jans_setup/templates/jetty/agama_web_resources.xml
index 3aa6b3a0827..eac5154ee67 100644
--- a/agama/misc/agama_web_resources.xml
+++ b/jans-linux-setup/jans_setup/templates/jetty/agama_web_resources.xml
@@ -4,7 +4,7 @@
/jans-auth/fl
- /opt/jans/jetty/jans-auth/agama/fl
+ %(jetty_base)s/jans-auth/agama/fl
false
From 16de6b39dc1826e41b06e3ca2a33927f6f32deff Mon Sep 17 00:00:00 2001
From: Jose
Date: Wed, 25 May 2022 14:00:37 -0500
Subject: [PATCH 4/6] chore: update computation of effective flow timeout #1446
---
.../io/jans/agama/engine/misc/FlowUtils.java | 10 -------
.../service/AgamaPersistenceService.java | 26 +++++++++++++++----
.../agama/engine/service/ServicesFactory.java | 14 ----------
3 files changed, 21 insertions(+), 29 deletions(-)
diff --git a/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java b/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java
index c9d609b9e7d..2ecdc7e0989 100644
--- a/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java
+++ b/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java
@@ -41,16 +41,6 @@ public class FlowUtils {
@Inject
private EngineConfig engineConfig;
-
- private int effectiveInterruptionTime;
-
- public int getEffectiveInterruptionTime() {
- return effectiveInterruptionTime;
- }
-
- public void setEffectiveInterruptionTime(int effectiveInterruptionTime) {
- this.effectiveInterruptionTime = effectiveInterruptionTime;
- }
public boolean serviceEnabled() {
return engineConfig.isEnabled();
diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java b/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java
index 7b91ac27b0d..b0605a45739 100644
--- a/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java
+++ b/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java
@@ -8,6 +8,7 @@
import io.jans.agama.engine.serialize.ContinuationSerializer;
import io.jans.agama.model.Flow;
import io.jans.agama.model.ProtoFlow;
+import io.jans.as.model.configuration.AppConfiguration;
import io.jans.orm.PersistenceEntryManager;
import io.jans.orm.search.filter.Filter;
import io.jans.util.Pair;
@@ -18,6 +19,7 @@
import java.util.Base64;
import java.util.Date;
import java.util.List;
+import java.util.Optional;
import org.mozilla.javascript.NativeContinuation;
import org.mozilla.javascript.Scriptable;
@@ -45,6 +47,9 @@ public class AgamaPersistenceService {
@Inject
private FlowUtils flowUtils;
+ @Inject
+ private AppConfiguration appConfiguration;
+
public FlowStatus getFlowStatus(String sessionId) throws IOException {
try {
@@ -71,19 +76,17 @@ public void persistFlowStatus(String sessionId, FlowStatus fst) throws IOExcepti
} catch(Exception e) {
throw new IOException(e);
}
-
+
}
- public void createFlowRun(String id, FlowStatus fst) throws Exception {
+ public void createFlowRun(String id, FlowStatus fst, long expireAt) throws Exception {
- long expireAt = System.currentTimeMillis() + 1000L * flowUtils.getEffectiveInterruptionTime();
-
FlowRun fr = new FlowRun();
fr.setBaseDn(String.format("%s=%s,%s", FlowRun.ATTR_NAMES.ID, id, AGAMA_FLOWRUNS_BASE));
fr.setId(id);
fr.setStatus(fst);
fr.setDeletableAt(new Date(expireAt));
-
+
logger.info("Creating flow run");
entryManager.persist(fr);
@@ -108,6 +111,19 @@ public boolean flowEnabled(String flowName) {
}
+ public int getEffectiveFlowTimeout(String flowName) {
+
+ Flow fl = entryManager.findEntries(AGAMA_FLOWS_BASE, Flow.class,
+ Filter.createEqualityFilter(Flow.ATTR_NAMES.QNAME, flowName),
+ new String[]{ Flow.ATTR_NAMES.META }, 1).get(0);
+
+ int unauth = appConfiguration.getSessionIdUnauthenticatedUnusedLifetime();
+ Integer flowTimeout = fl.getMetadata().getTimeout();
+ int timeout = Optional.ofNullable(flowTimeout).map(Integer::intValue).orElse(unauth);
+ return Math.min(unauth, timeout);
+
+ }
+
public Flow getFlow(String flowName, boolean full) throws IOException {
try {
diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java b/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java
index 8fe2299ae10..18524b22649 100644
--- a/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java
+++ b/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java
@@ -2,7 +2,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
-import io.jans.agama.engine.misc.FlowUtils;
import io.jans.agama.model.EngineConfig;
import io.jans.as.model.configuration.AppConfiguration;
import io.jans.service.cdi.event.ConfigurationUpdate;
@@ -22,9 +21,6 @@ public class ServicesFactory {
@Inject
private Logger logger;
- @Inject
- private FlowUtils futils;
-
private ObjectMapper mapper;
private EngineConfig econfig;
@@ -45,16 +41,6 @@ public void updateConfiguration(@Observes @ConfigurationUpdate AppConfiguration
try {
logger.info("Refreshing Agama configuration...");
BeanUtils.copyProperties(econfig, appConfiguration.getAgamaConfiguration());
-
- int unauth = appConfiguration.getSessionIdUnauthenticatedUnusedLifetime();
- int effectiveInterruptionTime = econfig.getInterruptionTime();
- if (effectiveInterruptionTime == 0 || effectiveInterruptionTime > unauth) {
- //Ensure interruption time is lower than or equal to unauthenticated unused
- effectiveInterruptionTime = unauth;
- logger.warn("Agama flow interruption time modified to {}", unauth);
- }
- futils.setEffectiveInterruptionTime(effectiveInterruptionTime);
-
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
From 88b232b54e978499447b9561b3adb4ffd82256af Mon Sep 17 00:00:00 2001
From: Jose
Date: Wed, 25 May 2022 14:03:35 -0500
Subject: [PATCH 5/6] chore: use status bean to detect flow timeout #1446
---
.../java/io/jans/agama/NativeJansFlowBridge.java | 13 +++++++++++--
.../java/io/jans/agama/engine/model/FlowStatus.java | 9 +++++++++
.../io/jans/agama/engine/service/FlowService.java | 9 +--------
3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java b/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java
index c85d74faf20..6df66696dfe 100644
--- a/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java
+++ b/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java
@@ -6,6 +6,7 @@
import io.jans.agama.engine.service.FlowService;
import io.jans.agama.engine.service.WebContext;
import io.jans.agama.engine.servlet.ExecutionServlet;
+import io.jans.agama.engine.script.LogUtils;
import io.jans.agama.model.EngineConfig;
import jakarta.inject.Inject;
@@ -45,7 +46,7 @@ public Boolean prepareFlow(String sessionId, String qname, String jsonInput) thr
logger.info("Preparing flow '{}'", qname);
Boolean alreadyRunning = null;
- if (fs.isEnabled(qname)) {
+ if (aps.flowEnabled(qname)) {
FlowStatus st = aps.getFlowStatus(sessionId);
alreadyRunning = st != null;
@@ -56,11 +57,19 @@ public Boolean prepareFlow(String sessionId, String qname, String jsonInput) thr
st = null;
}
if (st == null) {
+
+ int timeout = aps.getEffectiveFlowTimeout(qname);
+ if (timeout <= 0) throw new Exception("Flow timeout negative or zero. " +
+ "Check your AS configuration or flow definition");
+ long expireAt = System.currentTimeMillis() + 1000L * timeout;
+
st = new FlowStatus();
st.setStartedAt(FlowStatus.PREPARED);
st.setQname(qname);
st.setJsonInput(jsonInput);
- aps.createFlowRun(sessionId, st);
+ st.setFinishBefore(expireAt);
+ aps.createFlowRun(sessionId, st, expireAt);
+ LogUtils.log("@w Effective timeout for this flow will be % seconds", timeout);
}
}
return alreadyRunning;
diff --git a/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java b/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java
index f2bbd941126..83240b3387b 100644
--- a/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java
+++ b/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java
@@ -13,6 +13,7 @@ public class FlowStatus {
private String qname;
private String templatePath;
private long startedAt;
+ private long finishBefore;
private Object templateDataModel;
private LinkedList parentsData = new LinkedList<>();
private String externalRedirectUrl;
@@ -45,6 +46,14 @@ public void setStartedAt(long startedAt) {
this.startedAt = startedAt;
}
+ public long getFinishBefore() {
+ return finishBefore;
+ }
+
+ public void setFinishBefore(long finishBefore) {
+ this.finishBefore = finishBefore;
+ }
+
public String getQname() {
return qname;
}
diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java b/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java
index f3a6015d981..507e0b9c24f 100644
--- a/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java
+++ b/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java
@@ -85,10 +85,6 @@ public FlowStatus getRunningFlowStatus() throws IOException {
return aps.getFlowStatus(sessionId);
}
- public boolean isEnabled(String flowName) {
- return aps.flowEnabled(flowName);
- }
-
public FlowStatus startFlow(FlowStatus status) throws FlowCrashException {
try {
@@ -208,13 +204,10 @@ public Pair prepareSubflow(String subflowName, Strin
public void ensureTimeNotExceeded(FlowStatus flstatus) throws FlowTimeoutException {
- int time = flowUtils.getEffectiveInterruptionTime();
//Use some seconds to account for the potential time difference due to redirections:
//jython script -> agama, agama -> jython script. This helps agama flows to timeout
//before the unauthenticated unused time
- if (time > 0 &&
- System.currentTimeMillis() - flstatus.getStartedAt() + TIMEOUT_SKEW > 1000 * time) {
-
+ if (System.currentTimeMillis() + TIMEOUT_SKEW > flstatus.getFinishBefore()) {
throw new FlowTimeoutException("You have exceeded the amount of time required " +
"to complete your authentication process", flstatus.getQname());
//"Your authentication attempt has run for more than " + time + " seconds"
From 533f9ec3f867da942a54fbc111580d328fd10262 Mon Sep 17 00:00:00 2001
From: Jose
Date: Wed, 25 May 2022 14:04:43 -0500
Subject: [PATCH 6/6] chore: remove property from agama configuration #1446
---
.../io/jans/agama/engine/servlet/RestartServlet.java | 5 +++--
.../main/java/io/jans/agama/model/EngineConfig.java | 12 ------------
jans-auth-server/server/conf/jans-config.json | 1 -
.../templates/jans-auth/jans-auth-config.json | 1 -
4 files changed, 3 insertions(+), 16 deletions(-)
diff --git a/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java b/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java
index 532553b5e87..53e34bf8eb9 100644
--- a/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java
+++ b/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java
@@ -52,8 +52,9 @@ public void doPost(HttpServletRequest request, HttpServletResponse response)
flowService.terminateFlow();
logger.debug("Sending user's browser for a flow start");
- //This relies on the (unathenticated) session id being still alive (so the
- //flow name and its inputs can be remembered
+ //This redirection relies on the (unauthenticated) session id being still alive
+ //(so the flow name and its inputs can be remembered in the bridge script)
+ //see AgamaBridge.py#prepareForStep
String url = bridge.scriptPageUrl().replaceFirst("\\.xhtml", ".htm");
response.sendRedirect(request.getContextPath() + "/" + url);
diff --git a/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java b/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java
index 9311abcfad4..73d44e0d39b 100644
--- a/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java
+++ b/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java
@@ -23,10 +23,6 @@ public class EngineConfig {
private String scriptsPath = "/scripts";
private Type serializerType = Type.KRYO;
-
- //Time used to determine if flow timeout has occurred in Agama. A negative
- //value means no timeout will ever occur
- private int interruptionTime;
private int maxItemsLoggedInCollections = 3;
@@ -96,14 +92,6 @@ public Type getSerializerType() {
public void setSerializerType(Type serializerType) {
this.serializerType = serializerType;
}
-
- public int getInterruptionTime() {
- return interruptionTime;
- }
-
- public void setInterruptionTime(int interruptionTime) {
- this.interruptionTime = interruptionTime;
- }
public String getInterruptionErrorPage() {
return interruptionErrorPage;
diff --git a/jans-auth-server/server/conf/jans-config.json b/jans-auth-server/server/conf/jans-config.json
index 1f1c6c47198..a78e6b072d2 100644
--- a/jans-auth-server/server/conf/jans-config.json
+++ b/jans-auth-server/server/conf/jans-config.json
@@ -430,7 +430,6 @@
"templatesPath": "/ftl",
"scriptsPath": "/scripts",
"serializerType": "KRYO",
- "interruptionTime": 0,
"maxItemsLoggedInCollections": 3,
"pageMismatchErrorPage": "mismatch.ftl",
"interruptionErrorPage": "timeout.ftl",
diff --git a/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json b/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json
index d67da72c696..3b107056266 100644
--- a/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json
+++ b/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json
@@ -451,7 +451,6 @@
"templatesPath": "/ftl",
"scriptsPath": "/scripts",
"serializerType": "KRYO",
- "interruptionTime": 0,
"maxItemsLoggedInCollections": 3,
"pageMismatchErrorPage": "mismatch.ftl",
"interruptionErrorPage": "timeout.ftl",