From 139797a1652538e9220859ab68720aa19a4beefa Mon Sep 17 00:00:00 2001 From: Simon Wisselink Date: Wed, 11 Feb 2026 00:02:52 +0100 Subject: Support for Laravel Collections style object chaining (#1168) * Support for Laravel Collections style object chaining for objects return from function calls implemented as modifiers Fixes #1151 * explain publishing docs --- CONTRIBUTING.md | 2 + changelog/1151.md | 1 + src/Parser/TemplateParser.php | 1469 ++++++++++---------- src/Parser/TemplateParser.y | 22 +- .../FunctionObjectChainTest.php | 208 +++ .../templates/test_function_chain.tpl | 4 + 6 files changed, 971 insertions(+), 735 deletions(-) create mode 100644 changelog/1151.md create mode 100644 tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php create mode 100644 tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8dfdf32b..9cba3624 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -115,5 +115,7 @@ If you are a maintainer, you can publish the document using [mike](https://githu mike deploy 5.x ``` +Then, push the `gh-pages` branch. + ## Attribution This guide is based on the **contributing.md**. [Make your own](https://contributing.md/)! diff --git a/changelog/1151.md b/changelog/1151.md new file mode 100644 index 00000000..3e3d91b0 --- /dev/null +++ b/changelog/1151.md @@ -0,0 +1 @@ +- Support for Laravel Collections style object chaining for objects return from function calls implemented as modifiers [#1151](https://github.com/smarty-php/smarty/issues/1151) \ No newline at end of file diff --git a/src/Parser/TemplateParser.php b/src/Parser/TemplateParser.php index 772df98d..1f47e3d4 100644 --- a/src/Parser/TemplateParser.php +++ b/src/Parser/TemplateParser.php @@ -263,579 +263,580 @@ class TemplateParser const TP_ARRAYOPEN = 57; const TP_QUOTE = 58; const TP_BACKTICK = 59; - const YY_NO_ACTION = 542; - const YY_ACCEPT_ACTION = 541; - const YY_ERROR_ACTION = 540; + const YY_NO_ACTION = 546; + const YY_ACCEPT_ACTION = 545; + const YY_ERROR_ACTION = 544; - const YY_SZ_ACTTAB = 2565; + const YY_SZ_ACTTAB = 2564; public static $yy_action = array( - 33, 106, 269, 306, 179, 305, 200, 247, 248, 249, - 1, 264, 138, 237, 202, 361, 6, 87, 284, 222, - 338, 361, 112, 107, 400, 321, 217, 261, 218, 130, - 224, 400, 21, 400, 49, 44, 400, 32, 45, 46, - 278, 226, 400, 282, 400, 203, 400, 53, 4, 139, - 302, 231, 28, 102, 225, 5, 54, 247, 248, 249, - 1, 20, 135, 192, 193, 271, 6, 87, 246, 222, - 216, 29, 112, 229, 7, 159, 217, 261, 218, 140, - 208, 272, 21, 509, 53, 44, 13, 302, 45, 46, - 278, 226, 149, 235, 153, 203, 257, 53, 4, 328, - 302, 302, 256, 304, 143, 5, 54, 247, 248, 249, - 1, 302, 100, 394, 86, 236, 6, 87, 3, 222, - 102, 257, 112, 144, 97, 394, 217, 261, 218, 102, - 224, 394, 21, 256, 446, 44, 178, 305, 45, 46, - 278, 226, 302, 282, 200, 203, 446, 53, 4, 115, - 302, 47, 22, 285, 41, 5, 54, 247, 248, 249, - 1, 139, 137, 267, 202, 141, 6, 87, 14, 222, - 541, 99, 112, 151, 15, 446, 217, 261, 218, 314, - 224, 216, 21, 256, 233, 44, 9, 446, 45, 46, - 278, 226, 325, 282, 268, 203, 53, 53, 4, 302, - 302, 152, 257, 361, 320, 5, 54, 247, 248, 249, - 1, 264, 137, 102, 194, 361, 6, 87, 37, 222, - 102, 361, 112, 257, 89, 316, 217, 261, 218, 314, - 224, 216, 21, 36, 49, 44, 200, 40, 45, 46, - 278, 226, 115, 282, 237, 203, 14, 53, 4, 115, - 302, 238, 15, 155, 107, 5, 54, 247, 248, 249, - 1, 466, 136, 256, 202, 200, 6, 87, 466, 222, - 255, 171, 112, 264, 446, 310, 217, 261, 218, 158, - 224, 257, 11, 142, 157, 44, 446, 183, 45, 46, - 278, 226, 26, 282, 256, 203, 49, 53, 4, 446, - 302, 184, 260, 323, 176, 5, 54, 247, 248, 249, - 1, 446, 137, 264, 189, 291, 6, 87, 183, 222, - 200, 302, 112, 253, 178, 305, 217, 261, 218, 263, - 213, 18, 21, 200, 184, 44, 49, 15, 45, 46, - 278, 226, 146, 282, 269, 203, 25, 53, 4, 220, - 302, 312, 107, 152, 290, 5, 54, 247, 248, 249, - 1, 219, 137, 147, 187, 130, 6, 87, 259, 222, - 16, 19, 112, 256, 167, 258, 217, 261, 218, 111, - 224, 173, 21, 96, 256, 44, 200, 23, 45, 46, - 278, 226, 177, 282, 227, 203, 335, 53, 4, 174, - 302, 180, 305, 170, 90, 5, 54, 247, 248, 249, - 1, 184, 137, 256, 202, 91, 6, 87, 482, 222, - 160, 482, 112, 214, 197, 482, 217, 261, 218, 184, - 188, 181, 21, 245, 302, 44, 164, 140, 45, 46, - 278, 226, 466, 282, 13, 203, 166, 53, 4, 466, - 302, 42, 43, 286, 12, 5, 54, 247, 248, 249, - 1, 264, 139, 447, 202, 40, 6, 87, 293, 294, - 295, 296, 112, 17, 311, 447, 217, 261, 218, 337, - 224, 183, 21, 260, 49, 48, 244, 245, 45, 46, - 278, 226, 24, 282, 303, 203, 8, 53, 4, 92, - 302, 42, 43, 286, 12, 5, 54, 247, 248, 249, - 1, 10, 139, 9, 202, 317, 6, 87, 293, 294, - 295, 296, 112, 116, 299, 35, 217, 261, 218, 225, - 224, 198, 21, 98, 34, 44, 329, 324, 45, 46, - 278, 226, 448, 282, 448, 203, 161, 53, 4, 172, - 302, 129, 175, 225, 232, 5, 54, 288, 215, 216, - 252, 101, 93, 109, 243, 191, 103, 85, 450, 162, - 450, 24, 101, 330, 182, 273, 274, 300, 298, 301, - 250, 251, 281, 204, 283, 113, 289, 262, 300, 298, - 301, 121, 288, 215, 216, 252, 270, 93, 109, 275, - 190, 103, 60, 277, 279, 225, 237, 101, 280, 297, - 273, 274, 129, 239, 199, 266, 107, 281, 204, 283, - 7, 289, 101, 300, 298, 301, 288, 88, 216, 254, - 163, 114, 109, 265, 191, 103, 85, 200, 300, 298, - 301, 101, 200, 259, 273, 274, 19, 165, 326, 362, - 258, 281, 204, 283, 396, 289, 234, 300, 298, 301, - 288, 362, 216, 327, 200, 114, 396, 362, 201, 119, - 72, 336, 396, 37, 259, 101, 393, 19, 273, 274, - 154, 258, 228, 339, 94, 281, 204, 283, 393, 289, - 256, 300, 298, 301, 393, 38, 314, 288, 314, 216, - 314, 314, 114, 207, 319, 201, 119, 72, 314, 314, - 314, 314, 101, 221, 184, 273, 274, 156, 314, 314, - 314, 95, 281, 204, 283, 314, 289, 256, 300, 298, - 301, 314, 314, 314, 288, 314, 216, 314, 314, 108, - 206, 319, 201, 122, 51, 314, 120, 314, 314, 101, - 314, 184, 273, 274, 314, 314, 314, 314, 314, 281, - 204, 283, 314, 289, 314, 300, 298, 301, 288, 314, - 216, 314, 314, 114, 314, 314, 201, 122, 67, 314, - 314, 314, 314, 101, 314, 314, 273, 274, 314, 314, - 314, 314, 314, 281, 204, 283, 314, 289, 314, 300, - 298, 301, 288, 314, 216, 314, 314, 114, 212, 314, - 201, 122, 67, 314, 314, 314, 314, 101, 314, 314, - 273, 274, 314, 314, 314, 314, 314, 281, 204, 283, - 314, 289, 314, 300, 298, 301, 288, 314, 216, 314, - 314, 114, 205, 314, 201, 119, 72, 314, 314, 314, - 314, 101, 314, 314, 273, 274, 314, 314, 314, 314, - 314, 281, 204, 283, 314, 289, 314, 300, 298, 301, - 314, 314, 314, 288, 314, 216, 314, 314, 114, 314, - 318, 201, 122, 78, 314, 314, 314, 314, 101, 314, - 482, 273, 274, 482, 314, 314, 314, 482, 281, 204, - 283, 314, 289, 209, 211, 298, 301, 288, 314, 216, - 314, 314, 108, 314, 314, 201, 122, 58, 314, 238, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 482, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 118, 64, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 196, 117, 59, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 104, 84, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 105, 83, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 55, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 66, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 104, 56, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 65, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 57, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 58, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 68, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 69, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 70, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 71, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 73, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 195, - 122, 61, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 62, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 63, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 74, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 75, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 76, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 77, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 79, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 210, 298, 301, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 122, 80, 314, 314, 314, 314, 101, 314, - 314, 273, 274, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 122, 81, 314, 314, - 314, 314, 101, 314, 314, 273, 274, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 122, 82, 314, 314, 314, 314, 101, 314, 314, 273, - 274, 314, 314, 314, 314, 314, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 288, 314, 216, 314, 314, - 114, 314, 314, 201, 122, 50, 314, 314, 314, 314, - 101, 314, 314, 273, 274, 314, 314, 314, 314, 314, - 281, 204, 283, 314, 289, 314, 300, 298, 301, 288, - 314, 216, 314, 314, 114, 314, 314, 201, 122, 52, - 314, 314, 314, 314, 101, 314, 314, 273, 274, 314, - 314, 314, 314, 314, 281, 204, 283, 314, 289, 314, - 300, 298, 301, 288, 314, 216, 168, 314, 114, 314, - 314, 201, 134, 314, 314, 314, 256, 314, 101, 47, - 22, 285, 41, 314, 314, 314, 314, 333, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 288, 314, 216, - 145, 314, 114, 314, 314, 201, 128, 314, 314, 314, - 256, 314, 101, 47, 22, 285, 41, 314, 314, 314, - 314, 287, 281, 204, 283, 315, 289, 314, 300, 298, - 301, 247, 248, 249, 2, 314, 313, 314, 314, 314, - 6, 87, 259, 314, 314, 19, 112, 314, 14, 258, - 217, 261, 218, 314, 15, 39, 314, 14, 14, 42, - 43, 286, 12, 15, 15, 314, 314, 314, 42, 43, - 286, 12, 314, 314, 314, 314, 293, 294, 295, 296, - 308, 27, 314, 314, 315, 293, 294, 295, 296, 314, - 247, 248, 249, 2, 314, 313, 314, 110, 314, 6, - 87, 314, 314, 314, 314, 112, 314, 314, 148, 217, - 261, 218, 314, 42, 43, 286, 12, 314, 42, 43, - 286, 12, 314, 314, 314, 314, 314, 314, 314, 314, - 293, 294, 295, 296, 314, 293, 294, 295, 296, 309, - 27, 314, 314, 240, 241, 242, 133, 223, 314, 247, - 248, 249, 1, 314, 482, 314, 314, 482, 6, 87, - 3, 482, 466, 314, 112, 314, 276, 314, 217, 261, - 218, 288, 314, 216, 314, 314, 114, 314, 314, 201, - 132, 314, 314, 314, 314, 314, 101, 314, 466, 314, - 314, 466, 314, 482, 314, 466, 281, 204, 283, 314, - 289, 314, 300, 298, 301, 314, 288, 314, 216, 314, - 200, 114, 314, 314, 201, 123, 314, 314, 314, 314, - 314, 101, 365, 314, 314, 314, 230, 314, 314, 314, - 314, 281, 204, 283, 14, 289, 314, 300, 298, 301, - 15, 314, 288, 446, 216, 314, 169, 114, 314, 314, - 201, 124, 314, 314, 314, 446, 256, 101, 314, 47, - 22, 285, 41, 314, 314, 314, 314, 281, 204, 283, - 314, 289, 314, 300, 298, 301, 314, 288, 314, 216, - 314, 314, 114, 314, 314, 201, 125, 314, 314, 314, - 314, 314, 101, 314, 314, 314, 314, 314, 314, 314, - 314, 314, 281, 204, 283, 314, 289, 314, 300, 298, - 301, 314, 314, 288, 314, 216, 314, 314, 114, 314, - 314, 201, 126, 314, 314, 314, 314, 314, 101, 314, - 314, 314, 314, 314, 314, 314, 314, 314, 281, 204, - 283, 314, 289, 314, 300, 298, 301, 314, 288, 314, - 216, 314, 314, 114, 314, 314, 201, 127, 314, 314, - 314, 314, 314, 101, 314, 314, 314, 314, 314, 314, - 314, 314, 314, 281, 204, 283, 314, 289, 314, 300, - 298, 301, 314, 314, 288, 314, 216, 223, 314, 114, - 314, 314, 201, 131, 482, 314, 314, 482, 314, 101, - 314, 482, 466, 314, 314, 314, 276, 314, 314, 281, - 204, 283, 314, 289, 314, 300, 298, 301, 314, 314, - 409, 314, 314, 314, 314, 314, 314, 314, 466, 314, - 314, 466, 314, 482, 223, 466, 292, 314, 314, 314, - 314, 482, 314, 314, 482, 314, 314, 36, 482, 466, - 314, 223, 446, 276, 409, 409, 409, 409, 482, 314, - 314, 482, 314, 314, 446, 482, 466, 314, 314, 30, - 276, 409, 409, 409, 409, 466, 482, 314, 466, 482, - 482, 314, 466, 482, 466, 314, 314, 314, 276, 314, - 314, 314, 466, 314, 314, 466, 332, 482, 314, 466, - 314, 314, 314, 314, 314, 331, 42, 43, 286, 12, - 466, 314, 314, 466, 314, 482, 314, 466, 314, 42, - 43, 286, 12, 293, 294, 295, 296, 307, 314, 42, - 43, 286, 12, 185, 314, 314, 293, 294, 295, 296, - 186, 314, 314, 314, 322, 314, 293, 294, 295, 296, - 42, 43, 286, 12, 31, 314, 42, 43, 286, 12, - 314, 334, 314, 42, 43, 286, 12, 293, 294, 295, - 296, 314, 314, 293, 294, 295, 296, 314, 314, 314, - 293, 294, 295, 296, 42, 43, 286, 12, 42, 43, - 286, 12, 482, 314, 314, 482, 314, 314, 314, 482, - 466, 293, 294, 295, 296, 293, 294, 295, 296, 314, - 314, 314, 259, 314, 314, 19, 314, 314, 314, 258, - 314, 314, 314, 314, 314, 314, 466, 314, 14, 466, - 150, 482, 314, 466, 15, + 33, 103, 271, 308, 180, 202, 307, 249, 250, 251, + 1, 266, 139, 202, 204, 363, 6, 87, 248, 224, + 218, 363, 113, 316, 402, 218, 219, 263, 220, 222, + 226, 402, 21, 402, 49, 44, 402, 32, 45, 46, + 280, 228, 402, 284, 402, 205, 402, 53, 4, 140, + 304, 233, 177, 103, 227, 5, 54, 249, 250, 251, + 1, 20, 136, 194, 195, 273, 6, 87, 14, 224, + 312, 29, 113, 231, 15, 160, 219, 263, 220, 141, + 210, 274, 21, 186, 53, 44, 13, 304, 45, 46, + 280, 228, 150, 237, 154, 205, 259, 53, 4, 330, + 304, 304, 258, 255, 144, 5, 54, 249, 250, 251, + 1, 304, 101, 396, 86, 238, 6, 87, 3, 224, + 103, 259, 113, 17, 97, 396, 219, 263, 220, 339, + 226, 396, 21, 153, 448, 44, 202, 40, 45, 46, + 280, 228, 304, 284, 202, 205, 448, 53, 4, 116, + 304, 47, 22, 287, 41, 5, 54, 249, 250, 251, + 1, 140, 138, 269, 204, 513, 6, 87, 14, 224, + 545, 100, 113, 152, 15, 448, 219, 263, 220, 107, + 226, 153, 21, 258, 235, 44, 143, 448, 45, 46, + 280, 228, 327, 284, 270, 205, 53, 53, 4, 304, + 304, 202, 259, 363, 323, 5, 54, 249, 250, 251, + 1, 266, 138, 364, 196, 363, 6, 87, 306, 224, + 103, 363, 113, 145, 304, 364, 219, 263, 220, 202, + 226, 364, 21, 258, 49, 44, 18, 174, 45, 46, + 280, 228, 15, 284, 37, 205, 103, 53, 4, 116, + 304, 179, 159, 307, 259, 5, 54, 249, 250, 251, + 1, 155, 137, 239, 204, 94, 6, 87, 186, 224, + 340, 258, 113, 108, 239, 116, 219, 263, 220, 293, + 226, 240, 11, 259, 108, 44, 142, 286, 45, 46, + 280, 228, 172, 284, 156, 205, 186, 53, 4, 131, + 304, 182, 331, 307, 258, 5, 54, 249, 250, 251, + 1, 157, 138, 266, 191, 95, 6, 87, 26, 224, + 257, 258, 113, 186, 262, 448, 219, 263, 220, 185, + 215, 178, 21, 229, 112, 44, 49, 448, 45, 46, + 280, 228, 148, 284, 158, 205, 186, 53, 4, 90, + 304, 314, 258, 292, 258, 5, 54, 249, 250, 251, + 1, 179, 138, 307, 189, 131, 6, 87, 261, 224, + 175, 19, 113, 147, 168, 260, 219, 263, 220, 185, + 226, 266, 21, 108, 258, 44, 202, 23, 45, 46, + 280, 228, 171, 284, 91, 205, 36, 53, 4, 271, + 304, 186, 258, 161, 49, 5, 54, 249, 250, 251, + 1, 325, 138, 181, 204, 307, 6, 87, 484, 224, + 202, 484, 113, 165, 468, 484, 219, 263, 220, 141, + 190, 468, 21, 216, 199, 44, 13, 337, 45, 46, + 280, 228, 468, 284, 167, 205, 25, 53, 4, 468, + 304, 42, 43, 288, 12, 5, 54, 249, 250, 251, + 1, 28, 140, 183, 204, 247, 6, 87, 295, 296, + 297, 298, 113, 266, 313, 304, 219, 263, 220, 16, + 226, 185, 21, 7, 40, 48, 246, 247, 45, 46, + 280, 228, 96, 284, 8, 205, 49, 53, 4, 265, + 304, 42, 43, 288, 12, 5, 54, 249, 250, 251, + 1, 24, 140, 305, 204, 262, 6, 87, 295, 296, + 297, 298, 113, 316, 448, 218, 219, 263, 220, 92, + 226, 221, 21, 301, 449, 44, 448, 10, 45, 46, + 280, 228, 9, 284, 319, 205, 449, 53, 4, 117, + 304, 130, 35, 9, 234, 5, 54, 290, 217, 218, + 254, 102, 93, 110, 245, 193, 104, 85, 200, 89, + 318, 322, 102, 162, 98, 275, 276, 302, 300, 303, + 227, 252, 283, 206, 285, 34, 291, 99, 302, 300, + 303, 227, 290, 217, 218, 254, 239, 93, 110, 326, + 192, 104, 60, 241, 201, 173, 108, 102, 184, 176, + 275, 276, 130, 163, 253, 268, 114, 283, 206, 285, + 264, 291, 102, 302, 300, 303, 290, 122, 218, 256, + 272, 115, 110, 267, 193, 104, 85, 202, 302, 300, + 303, 102, 202, 261, 275, 276, 19, 279, 227, 398, + 260, 283, 206, 285, 395, 291, 277, 302, 300, 303, + 290, 398, 218, 7, 202, 115, 395, 398, 203, 120, + 72, 450, 395, 450, 261, 102, 367, 19, 275, 276, + 232, 260, 230, 281, 282, 283, 206, 285, 14, 291, + 14, 302, 300, 303, 15, 299, 15, 448, 290, 452, + 218, 452, 88, 115, 209, 321, 203, 120, 72, 448, + 24, 164, 332, 102, 236, 328, 275, 276, 166, 261, + 338, 329, 19, 283, 206, 285, 260, 291, 37, 302, + 300, 303, 484, 38, 341, 484, 290, 317, 218, 484, + 317, 109, 208, 321, 203, 123, 51, 317, 121, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 223, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 484, 218, 317, 317, 115, 317, 317, 203, 123, + 67, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 214, 203, 123, 67, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 207, 203, 120, 72, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 302, + 300, 303, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 123, 78, 320, 317, 317, 317, 102, 317, 317, + 275, 276, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 211, 213, 300, 303, 290, 317, 218, 317, + 317, 109, 317, 317, 203, 123, 58, 317, 240, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 317, 218, 317, 317, 115, 317, 317, 203, 119, + 64, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 317, 198, 118, 59, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 317, 203, 105, 84, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 302, + 300, 303, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 106, 83, 317, 317, 317, 317, 102, 317, 317, + 275, 276, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 290, 317, 218, 317, + 317, 115, 317, 317, 203, 123, 55, 317, 317, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 317, 218, 317, 317, 115, 317, 317, 203, 123, + 66, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 317, 203, 105, 56, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 317, 203, 123, 65, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 302, + 300, 303, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 123, 57, 317, 317, 317, 317, 102, 317, 317, + 275, 276, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 290, 317, 218, 317, + 317, 115, 317, 317, 203, 123, 58, 317, 317, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 317, 218, 317, 317, 115, 317, 317, 203, 123, + 68, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 317, 203, 123, 69, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 317, 203, 123, 70, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 302, + 300, 303, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 123, 71, 317, 317, 317, 317, 102, 317, 317, + 275, 276, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 290, 317, 218, 317, + 317, 115, 317, 317, 203, 123, 73, 317, 317, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 317, 218, 317, 317, 115, 317, 317, 197, 123, + 61, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 317, 203, 123, 62, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 317, 203, 123, 63, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 302, + 300, 303, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 123, 74, 317, 317, 317, 317, 102, 317, 317, + 275, 276, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 290, 317, 218, 317, + 317, 115, 317, 317, 203, 123, 75, 317, 317, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 317, 218, 317, 317, 115, 317, 317, 203, 123, + 76, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 317, 203, 123, 77, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 317, 203, 123, 79, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 212, + 300, 303, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 123, 80, 317, 317, 317, 317, 102, 317, 317, + 275, 276, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 290, 317, 218, 317, + 317, 115, 317, 317, 203, 123, 81, 317, 317, 317, + 317, 102, 317, 317, 275, 276, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 290, 317, 218, 317, 317, 115, 317, 317, 203, 123, + 82, 317, 317, 317, 317, 102, 317, 317, 275, 276, + 317, 317, 317, 317, 317, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 290, 317, 218, 317, 317, 115, + 317, 317, 203, 123, 50, 317, 317, 317, 317, 102, + 317, 317, 275, 276, 317, 317, 317, 317, 317, 283, + 206, 285, 317, 291, 317, 302, 300, 303, 290, 317, + 218, 317, 317, 115, 317, 317, 203, 123, 52, 317, + 317, 317, 317, 102, 317, 317, 275, 276, 317, 317, + 317, 317, 317, 283, 206, 285, 317, 291, 317, 302, + 300, 303, 290, 317, 218, 169, 317, 115, 317, 317, + 203, 135, 317, 317, 317, 258, 317, 102, 47, 22, + 287, 41, 317, 317, 317, 317, 335, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 290, 317, 218, 146, + 317, 115, 317, 317, 203, 129, 317, 317, 317, 258, + 317, 102, 47, 22, 287, 41, 317, 317, 317, 317, + 289, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 249, 250, 251, 2, 317, 315, 317, 317, 317, 6, + 87, 317, 317, 317, 317, 113, 317, 14, 317, 219, + 263, 220, 317, 15, 39, 317, 14, 317, 42, 43, + 288, 12, 15, 317, 317, 317, 317, 42, 43, 288, + 12, 317, 317, 317, 317, 295, 296, 297, 298, 310, + 27, 317, 317, 317, 295, 296, 297, 298, 317, 249, + 250, 251, 2, 317, 315, 317, 111, 317, 6, 87, + 317, 317, 317, 317, 113, 317, 317, 149, 219, 263, + 220, 317, 42, 43, 288, 12, 317, 42, 43, 288, + 12, 317, 317, 317, 317, 317, 317, 317, 317, 295, + 296, 297, 298, 317, 295, 296, 297, 298, 311, 27, + 317, 317, 242, 243, 244, 134, 225, 317, 249, 250, + 251, 1, 317, 484, 317, 317, 484, 6, 87, 3, + 484, 468, 317, 113, 317, 278, 317, 219, 263, 220, + 290, 317, 218, 317, 317, 115, 317, 317, 203, 133, + 317, 317, 317, 317, 317, 102, 317, 468, 317, 317, + 468, 317, 484, 317, 468, 283, 206, 285, 317, 291, + 317, 302, 300, 303, 317, 290, 317, 218, 170, 317, + 115, 317, 317, 203, 124, 317, 317, 317, 258, 317, + 102, 47, 22, 287, 41, 317, 317, 317, 317, 317, + 283, 206, 285, 317, 291, 317, 302, 300, 303, 317, + 317, 290, 317, 218, 317, 317, 115, 317, 317, 203, + 125, 317, 317, 317, 317, 317, 102, 317, 317, 317, + 317, 317, 317, 317, 317, 317, 283, 206, 285, 317, + 291, 317, 302, 300, 303, 317, 290, 317, 218, 317, + 317, 115, 317, 317, 203, 126, 317, 317, 317, 317, + 317, 102, 317, 317, 317, 317, 317, 317, 317, 317, + 317, 283, 206, 285, 317, 291, 317, 302, 300, 303, + 317, 317, 290, 317, 218, 317, 317, 115, 317, 317, + 203, 127, 317, 317, 317, 317, 317, 102, 317, 317, + 317, 317, 317, 317, 317, 317, 317, 283, 206, 285, + 317, 291, 317, 302, 300, 303, 317, 290, 317, 218, + 317, 317, 115, 317, 317, 203, 128, 317, 317, 317, + 317, 317, 102, 317, 317, 317, 317, 317, 317, 317, + 317, 317, 283, 206, 285, 317, 291, 317, 302, 300, + 303, 317, 317, 290, 317, 218, 225, 317, 115, 317, + 317, 203, 132, 484, 317, 317, 484, 317, 102, 317, + 484, 468, 317, 317, 317, 278, 317, 317, 283, 206, + 285, 317, 291, 317, 302, 300, 303, 317, 317, 411, + 317, 317, 317, 317, 317, 317, 317, 468, 317, 317, + 468, 317, 484, 225, 468, 294, 317, 317, 317, 317, + 484, 317, 317, 484, 317, 317, 36, 484, 468, 317, + 225, 448, 278, 411, 411, 411, 411, 484, 317, 317, + 484, 317, 317, 448, 484, 468, 317, 317, 30, 278, + 411, 411, 411, 411, 468, 484, 317, 468, 484, 484, + 317, 468, 484, 468, 317, 317, 317, 278, 317, 317, + 317, 468, 317, 317, 468, 334, 484, 317, 468, 317, + 317, 317, 317, 317, 333, 42, 43, 288, 12, 468, + 317, 317, 468, 317, 484, 317, 468, 317, 42, 43, + 288, 12, 295, 296, 297, 298, 309, 317, 42, 43, + 288, 12, 187, 317, 317, 295, 296, 297, 298, 188, + 317, 317, 317, 324, 317, 295, 296, 297, 298, 42, + 43, 288, 12, 31, 317, 42, 43, 288, 12, 317, + 336, 317, 42, 43, 288, 12, 295, 296, 297, 298, + 317, 317, 295, 296, 297, 298, 317, 317, 317, 295, + 296, 297, 298, 42, 43, 288, 12, 42, 43, 288, + 12, 484, 317, 317, 484, 317, 317, 317, 484, 468, + 295, 296, 297, 298, 295, 296, 297, 298, 317, 317, + 317, 261, 317, 317, 19, 317, 317, 317, 260, 317, + 317, 317, 317, 317, 317, 468, 317, 14, 468, 151, + 484, 317, 468, 15, ); public static $yy_lookahead = array( - 2, 80, 100, 13, 102, 103, 1, 9, 10, 11, - 12, 21, 14, 70, 16, 25, 18, 19, 93, 21, - 77, 31, 24, 80, 13, 104, 28, 29, 30, 104, + 2, 17, 100, 13, 102, 1, 104, 9, 10, 11, + 12, 21, 14, 1, 16, 25, 18, 19, 65, 21, + 67, 31, 24, 65, 13, 67, 28, 29, 30, 17, 32, 20, 34, 22, 44, 37, 25, 39, 40, 41, 42, 43, 31, 45, 33, 47, 35, 49, 50, 14, - 52, 16, 12, 17, 43, 57, 58, 9, 10, 11, - 12, 12, 14, 14, 16, 16, 18, 19, 65, 21, - 67, 12, 24, 14, 34, 16, 28, 29, 30, 43, - 32, 32, 34, 1, 49, 37, 50, 52, 40, 41, + 52, 16, 76, 17, 43, 57, 58, 9, 10, 11, + 12, 12, 14, 14, 16, 16, 18, 19, 25, 21, + 112, 12, 24, 14, 31, 16, 28, 29, 30, 43, + 32, 32, 34, 107, 49, 37, 50, 52, 40, 41, 42, 43, 72, 45, 99, 47, 101, 49, 50, 51, 52, 52, 82, 69, 14, 57, 58, 9, 10, 11, 12, 52, 14, 13, 16, 15, 18, 19, 15, 21, - 17, 101, 24, 72, 34, 25, 28, 29, 30, 17, - 32, 31, 34, 82, 34, 37, 102, 103, 40, 41, + 17, 101, 24, 15, 34, 25, 28, 29, 30, 21, + 32, 31, 34, 99, 34, 37, 1, 2, 40, 41, 42, 43, 52, 45, 1, 47, 46, 49, 50, 46, 52, 85, 86, 87, 88, 57, 58, 9, 10, 11, - 12, 14, 14, 16, 16, 80, 18, 19, 25, 21, - 61, 62, 24, 72, 31, 34, 28, 29, 30, 65, - 32, 67, 34, 82, 43, 37, 33, 46, 40, 41, + 12, 14, 14, 16, 16, 1, 18, 19, 25, 21, + 61, 62, 24, 72, 31, 34, 28, 29, 30, 80, + 32, 99, 34, 82, 43, 37, 14, 46, 40, 41, 42, 43, 51, 45, 47, 47, 49, 49, 50, 52, - 52, 99, 101, 13, 51, 57, 58, 9, 10, 11, - 12, 21, 14, 17, 16, 25, 18, 19, 15, 21, - 17, 31, 24, 101, 110, 111, 28, 29, 30, 65, - 32, 67, 34, 15, 44, 37, 1, 2, 40, 41, - 42, 43, 46, 45, 70, 47, 25, 49, 50, 46, - 52, 77, 31, 72, 80, 57, 58, 9, 10, 11, - 12, 43, 14, 82, 16, 1, 18, 19, 50, 21, - 82, 76, 24, 21, 34, 111, 28, 29, 30, 99, - 32, 101, 34, 14, 72, 37, 46, 106, 40, 41, - 42, 43, 27, 45, 82, 47, 44, 49, 50, 34, - 52, 106, 107, 51, 76, 57, 58, 9, 10, 11, - 12, 46, 14, 21, 16, 51, 18, 19, 106, 21, - 1, 52, 24, 69, 102, 103, 28, 29, 30, 16, - 32, 25, 34, 1, 106, 37, 44, 31, 40, 41, - 42, 43, 70, 45, 100, 47, 27, 49, 50, 17, - 52, 59, 80, 99, 93, 57, 58, 9, 10, 11, - 12, 48, 14, 72, 16, 104, 18, 19, 9, 21, - 20, 12, 24, 82, 72, 16, 28, 29, 30, 79, - 32, 76, 34, 33, 82, 37, 1, 2, 40, 41, - 42, 43, 14, 45, 16, 47, 14, 49, 50, 76, - 52, 102, 103, 72, 80, 57, 58, 9, 10, 11, - 12, 106, 14, 82, 16, 80, 18, 19, 9, 21, - 99, 12, 24, 63, 64, 16, 28, 29, 30, 106, - 32, 6, 34, 8, 52, 37, 99, 43, 40, 41, - 42, 43, 43, 45, 50, 47, 99, 49, 50, 50, + 52, 1, 101, 13, 105, 57, 58, 9, 10, 11, + 12, 21, 14, 13, 16, 25, 18, 19, 69, 21, + 17, 31, 24, 72, 52, 25, 28, 29, 30, 1, + 32, 31, 34, 82, 44, 37, 25, 76, 40, 41, + 42, 43, 31, 45, 15, 47, 17, 49, 50, 46, + 52, 102, 99, 104, 101, 57, 58, 9, 10, 11, + 12, 72, 14, 70, 16, 76, 18, 19, 107, 21, + 77, 82, 24, 80, 70, 46, 28, 29, 30, 51, + 32, 77, 34, 101, 80, 37, 80, 93, 40, 41, + 42, 43, 76, 45, 72, 47, 107, 49, 50, 105, + 52, 102, 103, 104, 82, 57, 58, 9, 10, 11, + 12, 72, 14, 21, 16, 76, 18, 19, 27, 21, + 82, 82, 24, 107, 108, 34, 28, 29, 30, 107, + 32, 14, 34, 16, 79, 37, 44, 46, 40, 41, + 42, 43, 72, 45, 72, 47, 107, 49, 50, 80, + 52, 59, 82, 93, 82, 57, 58, 9, 10, 11, + 12, 102, 14, 104, 16, 105, 18, 19, 9, 21, + 76, 12, 24, 70, 72, 16, 28, 29, 30, 107, + 32, 21, 34, 80, 82, 37, 1, 2, 40, 41, + 42, 43, 72, 45, 80, 47, 15, 49, 50, 100, + 52, 107, 82, 99, 44, 57, 58, 9, 10, 11, + 12, 51, 14, 102, 16, 104, 18, 19, 9, 21, + 1, 12, 24, 99, 43, 16, 28, 29, 30, 43, + 32, 50, 34, 63, 64, 37, 50, 14, 40, 41, + 42, 43, 43, 45, 99, 47, 27, 49, 50, 50, 52, 36, 37, 38, 39, 57, 58, 9, 10, 11, - 12, 21, 14, 34, 16, 2, 18, 19, 53, 54, - 55, 56, 24, 15, 59, 46, 28, 29, 30, 21, - 32, 106, 34, 107, 44, 37, 7, 8, 40, 41, - 42, 43, 33, 45, 35, 47, 34, 49, 50, 99, + 12, 12, 14, 6, 16, 8, 18, 19, 53, 54, + 55, 56, 24, 21, 59, 52, 28, 29, 30, 20, + 32, 107, 34, 34, 2, 37, 7, 8, 40, 41, + 42, 43, 33, 45, 34, 47, 44, 49, 50, 16, 52, 36, 37, 38, 39, 57, 58, 9, 10, 11, - 12, 34, 14, 33, 16, 35, 18, 19, 53, 54, - 55, 56, 24, 46, 103, 15, 28, 29, 30, 43, - 32, 64, 34, 81, 33, 37, 35, 51, 40, 41, - 42, 43, 33, 45, 35, 47, 99, 49, 50, 81, - 52, 70, 81, 43, 73, 57, 58, 65, 66, 67, - 68, 80, 70, 71, 7, 73, 74, 75, 33, 99, - 35, 33, 80, 35, 16, 83, 84, 96, 97, 98, - 13, 13, 90, 91, 92, 16, 94, 16, 96, 97, - 98, 16, 65, 66, 67, 68, 16, 70, 71, 14, - 73, 74, 75, 16, 32, 43, 70, 80, 32, 16, - 83, 84, 70, 77, 78, 73, 80, 90, 91, 92, - 34, 94, 80, 96, 97, 98, 65, 16, 67, 68, - 49, 70, 71, 91, 73, 74, 75, 1, 96, 97, - 98, 80, 1, 9, 83, 84, 12, 49, 51, 13, - 16, 90, 91, 92, 13, 94, 16, 96, 97, 98, - 65, 25, 67, 51, 1, 70, 25, 31, 73, 74, - 75, 16, 31, 15, 9, 80, 13, 12, 83, 84, - 72, 16, 48, 35, 76, 90, 91, 92, 25, 94, - 82, 96, 97, 98, 31, 22, 112, 65, 112, 67, - 112, 112, 70, 108, 109, 73, 74, 75, 112, 112, - 112, 112, 80, 48, 106, 83, 84, 72, 112, 112, - 112, 76, 90, 91, 92, 112, 94, 82, 96, 97, - 98, 112, 112, 112, 65, 112, 67, 112, 112, 70, - 108, 109, 73, 74, 75, 112, 77, 112, 112, 80, - 112, 106, 83, 84, 112, 112, 112, 112, 112, 90, - 91, 92, 112, 94, 112, 96, 97, 98, 65, 112, - 67, 112, 112, 70, 112, 112, 73, 74, 75, 112, - 112, 112, 112, 80, 112, 112, 83, 84, 112, 112, - 112, 112, 112, 90, 91, 92, 112, 94, 112, 96, - 97, 98, 65, 112, 67, 112, 112, 70, 105, 112, - 73, 74, 75, 112, 112, 112, 112, 80, 112, 112, - 83, 84, 112, 112, 112, 112, 112, 90, 91, 92, - 112, 94, 112, 96, 97, 98, 65, 112, 67, 112, - 112, 70, 105, 112, 73, 74, 75, 112, 112, 112, - 112, 80, 112, 112, 83, 84, 112, 112, 112, 112, - 112, 90, 91, 92, 112, 94, 112, 96, 97, 98, - 112, 112, 112, 65, 112, 67, 112, 112, 70, 112, - 109, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 9, 83, 84, 12, 112, 112, 112, 16, 90, 91, - 92, 112, 94, 95, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 77, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 48, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 75, 112, 112, 112, 112, 80, 112, - 112, 83, 84, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 75, 112, 112, - 112, 112, 80, 112, 112, 83, 84, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 75, 112, 112, 112, 112, 80, 112, 112, 83, - 84, 112, 112, 112, 112, 112, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 65, 112, 67, 112, 112, - 70, 112, 112, 73, 74, 75, 112, 112, 112, 112, - 80, 112, 112, 83, 84, 112, 112, 112, 112, 112, - 90, 91, 92, 112, 94, 112, 96, 97, 98, 65, - 112, 67, 112, 112, 70, 112, 112, 73, 74, 75, - 112, 112, 112, 112, 80, 112, 112, 83, 84, 112, - 112, 112, 112, 112, 90, 91, 92, 112, 94, 112, - 96, 97, 98, 65, 112, 67, 72, 112, 70, 112, - 112, 73, 74, 112, 112, 112, 82, 112, 80, 85, - 86, 87, 88, 112, 112, 112, 112, 89, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 65, 112, 67, - 72, 112, 70, 112, 112, 73, 74, 112, 112, 112, - 82, 112, 80, 85, 86, 87, 88, 112, 112, 112, - 112, 89, 90, 91, 92, 3, 94, 112, 96, 97, - 98, 9, 10, 11, 12, 112, 14, 112, 112, 112, - 18, 19, 9, 112, 112, 12, 24, 112, 25, 16, - 28, 29, 30, 112, 31, 23, 112, 25, 25, 36, - 37, 38, 39, 31, 31, 112, 112, 112, 36, 37, - 38, 39, 112, 112, 112, 112, 53, 54, 55, 56, - 58, 59, 112, 112, 3, 53, 54, 55, 56, 112, - 9, 10, 11, 12, 112, 14, 112, 20, 112, 18, - 19, 112, 112, 112, 112, 24, 112, 112, 26, 28, - 29, 30, 112, 36, 37, 38, 39, 112, 36, 37, - 38, 39, 112, 112, 112, 112, 112, 112, 112, 112, - 53, 54, 55, 56, 112, 53, 54, 55, 56, 58, - 59, 112, 112, 3, 4, 5, 6, 2, 112, 9, - 10, 11, 12, 112, 9, 112, 112, 12, 18, 19, - 15, 16, 17, 112, 24, 112, 21, 112, 28, 29, - 30, 65, 112, 67, 112, 112, 70, 112, 112, 73, - 74, 112, 112, 112, 112, 112, 80, 112, 43, 112, - 112, 46, 112, 48, 112, 50, 90, 91, 92, 112, - 94, 112, 96, 97, 98, 112, 65, 112, 67, 112, - 1, 70, 112, 112, 73, 74, 112, 112, 112, 112, - 112, 80, 13, 112, 112, 112, 17, 112, 112, 112, - 112, 90, 91, 92, 25, 94, 112, 96, 97, 98, - 31, 112, 65, 34, 67, 112, 72, 70, 112, 112, - 73, 74, 112, 112, 112, 46, 82, 80, 112, 85, - 86, 87, 88, 112, 112, 112, 112, 90, 91, 92, - 112, 94, 112, 96, 97, 98, 112, 65, 112, 67, - 112, 112, 70, 112, 112, 73, 74, 112, 112, 112, - 112, 112, 80, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 90, 91, 92, 112, 94, 112, 96, 97, - 98, 112, 112, 65, 112, 67, 112, 112, 70, 112, - 112, 73, 74, 112, 112, 112, 112, 112, 80, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 90, 91, - 92, 112, 94, 112, 96, 97, 98, 112, 65, 112, - 67, 112, 112, 70, 112, 112, 73, 74, 112, 112, - 112, 112, 112, 80, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 90, 91, 92, 112, 94, 112, 96, - 97, 98, 112, 112, 65, 112, 67, 2, 112, 70, - 112, 112, 73, 74, 9, 112, 112, 12, 112, 80, - 112, 16, 17, 112, 112, 112, 21, 112, 112, 90, - 91, 92, 112, 94, 112, 96, 97, 98, 112, 112, - 2, 112, 112, 112, 112, 112, 112, 112, 43, 112, - 112, 46, 112, 48, 2, 50, 51, 112, 112, 112, - 112, 9, 112, 112, 12, 112, 112, 15, 16, 17, - 112, 2, 34, 21, 36, 37, 38, 39, 9, 112, - 112, 12, 112, 112, 46, 16, 17, 112, 112, 2, - 21, 53, 54, 55, 56, 43, 9, 112, 46, 12, - 48, 112, 50, 16, 17, 112, 112, 112, 21, 112, - 112, 112, 43, 112, 112, 46, 13, 48, 112, 50, - 112, 112, 112, 112, 112, 35, 36, 37, 38, 39, - 43, 112, 112, 46, 112, 48, 112, 50, 112, 36, - 37, 38, 39, 53, 54, 55, 56, 13, 112, 36, - 37, 38, 39, 13, 112, 112, 53, 54, 55, 56, - 13, 112, 112, 112, 51, 112, 53, 54, 55, 56, - 36, 37, 38, 39, 2, 112, 36, 37, 38, 39, - 112, 13, 112, 36, 37, 38, 39, 53, 54, 55, - 56, 112, 112, 53, 54, 55, 56, 112, 112, 112, - 53, 54, 55, 56, 36, 37, 38, 39, 36, 37, - 38, 39, 9, 112, 112, 12, 112, 112, 112, 16, - 17, 53, 54, 55, 56, 53, 54, 55, 56, 112, - 112, 112, 9, 112, 112, 12, 112, 112, 112, 16, - 112, 112, 112, 112, 112, 112, 43, 112, 25, 46, - 27, 48, 112, 50, 31, + 12, 33, 14, 35, 16, 108, 18, 19, 53, 54, + 55, 56, 24, 65, 34, 67, 28, 29, 30, 99, + 32, 48, 34, 104, 34, 37, 46, 34, 40, 41, + 42, 43, 33, 45, 35, 47, 46, 49, 50, 46, + 52, 70, 15, 33, 73, 57, 58, 65, 66, 67, + 68, 80, 70, 71, 7, 73, 74, 75, 64, 111, + 112, 51, 80, 99, 81, 83, 84, 96, 97, 98, + 43, 13, 90, 91, 92, 33, 94, 35, 96, 97, + 98, 43, 65, 66, 67, 68, 70, 70, 71, 51, + 73, 74, 75, 77, 78, 81, 80, 80, 16, 81, + 83, 84, 70, 99, 13, 73, 16, 90, 91, 92, + 16, 94, 80, 96, 97, 98, 65, 16, 67, 68, + 16, 70, 71, 91, 73, 74, 75, 1, 96, 97, + 98, 80, 1, 9, 83, 84, 12, 16, 43, 13, + 16, 90, 91, 92, 13, 94, 14, 96, 97, 98, + 65, 25, 67, 34, 1, 70, 25, 31, 73, 74, + 75, 33, 31, 35, 9, 80, 13, 12, 83, 84, + 17, 16, 48, 32, 32, 90, 91, 92, 25, 94, + 25, 96, 97, 98, 31, 16, 31, 34, 65, 33, + 67, 35, 16, 70, 109, 110, 73, 74, 75, 46, + 33, 49, 35, 80, 16, 51, 83, 84, 49, 9, + 16, 51, 12, 90, 91, 92, 16, 94, 15, 96, + 97, 98, 9, 22, 35, 12, 65, 113, 67, 16, + 113, 70, 109, 110, 73, 74, 75, 113, 77, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 48, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 48, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 106, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 106, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 75, 110, 113, 113, 113, 80, 113, 113, + 83, 84, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 95, 96, 97, 98, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 75, 113, 77, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 113, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 113, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 75, 113, 113, 113, 113, 80, 113, 113, + 83, 84, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 75, 113, 113, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 113, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 113, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 75, 113, 113, 113, 113, 80, 113, 113, + 83, 84, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 75, 113, 113, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 113, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 113, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 75, 113, 113, 113, 113, 80, 113, 113, + 83, 84, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 75, 113, 113, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 113, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 113, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 75, 113, 113, 113, 113, 80, 113, 113, + 83, 84, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 75, 113, 113, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 113, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 113, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 75, 113, 113, 113, 113, 80, 113, 113, + 83, 84, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 75, 113, 113, 113, + 113, 80, 113, 113, 83, 84, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 75, 113, 113, 113, 113, 80, 113, 113, 83, 84, + 113, 113, 113, 113, 113, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 65, 113, 67, 113, 113, 70, + 113, 113, 73, 74, 75, 113, 113, 113, 113, 80, + 113, 113, 83, 84, 113, 113, 113, 113, 113, 90, + 91, 92, 113, 94, 113, 96, 97, 98, 65, 113, + 67, 113, 113, 70, 113, 113, 73, 74, 75, 113, + 113, 113, 113, 80, 113, 113, 83, 84, 113, 113, + 113, 113, 113, 90, 91, 92, 113, 94, 113, 96, + 97, 98, 65, 113, 67, 72, 113, 70, 113, 113, + 73, 74, 113, 113, 113, 82, 113, 80, 85, 86, + 87, 88, 113, 113, 113, 113, 89, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 65, 113, 67, 72, + 113, 70, 113, 113, 73, 74, 113, 113, 113, 82, + 113, 80, 85, 86, 87, 88, 113, 113, 113, 113, + 89, 90, 91, 92, 3, 94, 113, 96, 97, 98, + 9, 10, 11, 12, 113, 14, 113, 113, 113, 18, + 19, 113, 113, 113, 113, 24, 113, 25, 113, 28, + 29, 30, 113, 31, 23, 113, 25, 113, 36, 37, + 38, 39, 31, 113, 113, 113, 113, 36, 37, 38, + 39, 113, 113, 113, 113, 53, 54, 55, 56, 58, + 59, 113, 113, 3, 53, 54, 55, 56, 113, 9, + 10, 11, 12, 113, 14, 113, 20, 113, 18, 19, + 113, 113, 113, 113, 24, 113, 113, 26, 28, 29, + 30, 113, 36, 37, 38, 39, 113, 36, 37, 38, + 39, 113, 113, 113, 113, 113, 113, 113, 113, 53, + 54, 55, 56, 113, 53, 54, 55, 56, 58, 59, + 113, 113, 3, 4, 5, 6, 2, 113, 9, 10, + 11, 12, 113, 9, 113, 113, 12, 18, 19, 15, + 16, 17, 113, 24, 113, 21, 113, 28, 29, 30, + 65, 113, 67, 113, 113, 70, 113, 113, 73, 74, + 113, 113, 113, 113, 113, 80, 113, 43, 113, 113, + 46, 113, 48, 113, 50, 90, 91, 92, 113, 94, + 113, 96, 97, 98, 113, 65, 113, 67, 72, 113, + 70, 113, 113, 73, 74, 113, 113, 113, 82, 113, + 80, 85, 86, 87, 88, 113, 113, 113, 113, 113, + 90, 91, 92, 113, 94, 113, 96, 97, 98, 113, + 113, 65, 113, 67, 113, 113, 70, 113, 113, 73, + 74, 113, 113, 113, 113, 113, 80, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 90, 91, 92, 113, + 94, 113, 96, 97, 98, 113, 65, 113, 67, 113, + 113, 70, 113, 113, 73, 74, 113, 113, 113, 113, + 113, 80, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 90, 91, 92, 113, 94, 113, 96, 97, 98, + 113, 113, 65, 113, 67, 113, 113, 70, 113, 113, + 73, 74, 113, 113, 113, 113, 113, 80, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 90, 91, 92, + 113, 94, 113, 96, 97, 98, 113, 65, 113, 67, + 113, 113, 70, 113, 113, 73, 74, 113, 113, 113, + 113, 113, 80, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 90, 91, 92, 113, 94, 113, 96, 97, + 98, 113, 113, 65, 113, 67, 2, 113, 70, 113, + 113, 73, 74, 9, 113, 113, 12, 113, 80, 113, + 16, 17, 113, 113, 113, 21, 113, 113, 90, 91, + 92, 113, 94, 113, 96, 97, 98, 113, 113, 2, + 113, 113, 113, 113, 113, 113, 113, 43, 113, 113, + 46, 113, 48, 2, 50, 51, 113, 113, 113, 113, + 9, 113, 113, 12, 113, 113, 15, 16, 17, 113, + 2, 34, 21, 36, 37, 38, 39, 9, 113, 113, + 12, 113, 113, 46, 16, 17, 113, 113, 2, 21, + 53, 54, 55, 56, 43, 9, 113, 46, 12, 48, + 113, 50, 16, 17, 113, 113, 113, 21, 113, 113, + 113, 43, 113, 113, 46, 13, 48, 113, 50, 113, + 113, 113, 113, 113, 35, 36, 37, 38, 39, 43, + 113, 113, 46, 113, 48, 113, 50, 113, 36, 37, + 38, 39, 53, 54, 55, 56, 13, 113, 36, 37, + 38, 39, 13, 113, 113, 53, 54, 55, 56, 13, + 113, 113, 113, 51, 113, 53, 54, 55, 56, 36, + 37, 38, 39, 2, 113, 36, 37, 38, 39, 113, + 13, 113, 36, 37, 38, 39, 53, 54, 55, 56, + 113, 113, 53, 54, 55, 56, 113, 113, 113, 53, + 54, 55, 56, 36, 37, 38, 39, 36, 37, 38, + 39, 9, 113, 113, 12, 113, 113, 113, 16, 17, + 53, 54, 55, 56, 53, 54, 55, 56, 113, 113, + 113, 9, 113, 113, 12, 113, 113, 113, 16, 113, + 113, 113, 113, 113, 113, 43, 113, 25, 46, 27, + 48, 113, 50, 31, ); - const YY_SHIFT_USE_DFLT = -11; - const YY_SHIFT_MAX = 239; + const YY_SHIFT_USE_DFLT = -17; + const YY_SHIFT_MAX = 241; public static $yy_shift_ofst = array( - -11, 98, 98, 148, 198, 198, 248, 148, 148, 198, + -17, 98, 98, 148, 198, 198, 248, 148, 148, 198, 148, 248, -2, 48, 298, 148, 148, 148, 298, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 348, 148, 148, 148, 148, 148, 398, 148, 148, 148, 448, 498, 498, 498, 498, 498, 498, 498, 498, 147, - 1962, 1953, 1953, 35, 1952, 2007, 2012, 2413, 2400, 2423, - 2444, 415, 2450, 2457, 2482, 2478, 465, 465, 465, 465, + 1961, 1952, 1952, 35, 1951, 2006, 2011, 2412, 2399, 2422, + 2443, 415, 2449, 2456, 2481, 2477, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, - 465, 465, 465, 465, 465, 465, 2139, 90, 143, 2011, - 2533, 1963, 36, 103, 143, 143, 90, 90, 235, 2070, - 2075, 634, 59, 636, 641, 663, 359, 359, 203, 221, - 269, 221, 306, 332, 196, 378, 378, 264, 385, 319, - 221, 5, 5, 5, 5, 5, 5, 5, 5, 112, - 112, 82, 5, -11, -11, 2315, 2362, 2379, 2397, 2513, - 49, 665, 409, 218, 221, 221, 458, 221, 382, 221, - 382, 221, 394, 394, 221, 221, 221, 221, 394, 40, - 394, 394, 394, 399, 394, 399, 394, 221, 221, 221, - 221, 5, 463, 5, 5, 463, 5, 462, 112, 112, - 112, -11, -11, -11, -11, -11, -11, 2348, 11, 100, - -10, 190, 881, 141, 265, 292, 252, 425, 479, 350, - 313, 440, 240, 429, 477, 459, 480, 153, 486, 501, - 509, 535, 538, 510, 557, 567, 568, 558, 569, 571, - 575, 580, 585, 587, 562, 572, 576, 586, 593, 462, - 611, 581, 598, 640, 597, 612, 655, 658, 648, 673, + 465, 465, 465, 465, 465, 465, 663, 90, 143, 2010, + 2532, 665, 36, 103, 143, 143, 90, 90, 135, -16, + 2069, 2074, 634, 59, 200, 636, 641, 359, 359, 229, + 43, 172, 43, 211, 12, 203, 317, 317, 228, 385, + 419, 43, 4, 4, 4, 4, 4, 4, 4, 4, + -16, -16, 164, 4, -17, -17, 2314, 2361, 2378, 2396, + 2512, 49, 710, 409, 381, 43, 43, 108, 43, 423, + 43, 423, 43, 386, 386, 43, 43, 43, 43, 386, + 449, 386, 386, 386, 399, 386, 399, 386, 43, 43, + 43, 43, 4, 482, 4, 4, 482, 4, 460, -16, + -16, -16, -16, -17, -17, -17, -17, -17, -17, 2347, + 11, 100, -10, 190, 723, 141, 291, 292, 360, 457, + 479, 459, 483, 452, 490, 500, 503, 478, 509, 520, + 548, 552, 638, 666, 677, 537, 557, 568, 601, 592, + 600, 604, 611, 614, 642, 631, 605, 651, 652, 629, + 679, 460, 686, 662, 669, 698, 664, 670, 704, 713, + 699, 711, ); const YY_REDUCE_USE_DFLT = -99; - const YY_REDUCE_MAX = 186; + const YY_REDUCE_MAX = 188; public static $yy_reduce_ofst = array( - 109, 492, 527, 561, 595, 632, 669, 703, 737, 771, - 808, 842, 876, 910, 944, 978, 1012, 1046, 1080, 1114, - 1148, 1182, 1216, 1250, 1284, 1318, 1352, 1386, 1420, 1454, - 1488, 1522, 1556, 1590, 1624, 1658, 1692, 1726, 1760, 1794, - 1828, 1862, 2036, 2071, 2107, 2142, 2178, 2213, 2249, 542, - 1824, 1858, 2104, 481, 114, 66, 66, 66, 66, 66, + 109, 492, 527, 561, 595, 633, 671, 705, 739, 773, + 807, 841, 875, 909, 943, 977, 1011, 1045, 1079, 1113, + 1147, 1181, 1215, 1249, 1283, 1317, 1351, 1385, 1419, 1453, + 1487, 1521, 1555, 1589, 1623, 1657, 1691, 1725, 1759, 1793, + 1827, 1861, 2035, 2070, 2106, 2141, 2177, 2212, 2248, 542, + 1823, 1857, 2066, 481, 458, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 608, 536, 645, 164, - 20, 101, -98, 34, 181, 212, -57, 174, 195, 3, - 254, -5, -79, 228, 228, 228, 180, -5, 222, 51, - 272, 291, 302, 305, 222, -75, 261, 228, 228, 228, - 331, 323, 228, 228, 228, 228, 228, 228, 228, 222, - 299, 228, 228, 360, 228, 102, 102, 102, 102, 102, - 85, 122, 102, 102, 188, 188, 300, 188, 324, 188, - 335, 188, 244, 244, 188, 188, 188, 188, 244, 321, - 244, 244, 244, 337, 244, 347, 244, 188, 188, 188, - 188, 375, 376, 375, 375, 376, 375, 400, 421, 421, - 421, 467, 452, 468, 471, 447, 470, + 66, 66, 66, 66, 66, 66, 189, 526, 239, -42, + 20, 101, -98, 149, 222, 272, 193, 204, 216, 199, + -47, 34, -5, 99, -24, -24, -24, 153, -5, 259, + 151, 303, 270, 302, 161, 259, 194, 260, -24, -24, + -24, 320, 294, -24, -24, -24, -24, -24, -24, -24, + 259, 311, -24, -24, 370, -24, 82, 82, 82, 82, + 82, 206, 182, 82, 82, 238, 238, 255, 238, 269, + 238, 314, 238, 299, 299, 238, 238, 238, 238, 299, + 304, 299, 299, 299, 324, 299, 345, 299, 238, 238, + 238, 238, 374, 407, 374, 374, 407, 374, 430, 429, + 429, 429, 429, 504, 493, 524, 528, 474, 514, ); public static $yyExpectedTokens = array( array(), @@ -937,6 +938,7 @@ public static $yy_action = array( array(14, 34, 52, ), array(14, 34, 52, ), array(1, 2, ), + array(17, ), array(3, 4, 5, 6, 9, 10, 11, 12, 18, 19, 24, 28, 29, 30, ), array(2, 9, 12, 15, 16, 17, 21, 43, 46, 48, 50, ), array(9, 12, 16, 48, ), @@ -1019,6 +1021,7 @@ public static $yy_action = array( array(17, ), array(17, ), array(17, ), + array(17, ), array(), array(), array(), @@ -1180,45 +1183,46 @@ public static $yy_action = array( array(), ); public static $yy_default = array( - 350, 540, 540, 540, 525, 525, 540, 501, 501, 524, - 452, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, - 390, 369, 390, 540, 540, 540, 395, 540, 540, 540, - 363, 540, 540, 540, 540, 540, 374, 500, 413, 420, - 499, 526, 528, 527, 419, 421, 418, 422, 451, 449, - 397, 401, 402, 392, 395, 363, 433, 540, 390, 540, - 390, 390, 514, 454, 390, 390, 540, 540, 381, 340, - 453, 466, 540, 404, 404, 404, 466, 466, 454, 390, - 540, 390, 390, 384, 454, 540, 540, 404, 404, 404, - 371, 386, 404, 411, 424, 425, 426, 412, 417, 454, - 511, 424, 410, 348, 508, 453, 453, 453, 453, 453, - 540, 468, 466, 482, 360, 370, 540, 373, 540, 378, - 540, 379, 463, 464, 364, 366, 367, 368, 492, 466, - 491, 494, 493, 457, 458, 459, 460, 380, 376, 377, - 372, 382, 502, 385, 387, 503, 442, 466, 488, 515, - 512, 348, 507, 507, 507, 466, 466, 433, 429, 433, - 423, 423, 467, 433, 433, 423, 423, 346, 540, 540, - 540, 423, 433, 443, 540, 540, 540, 540, 429, 540, - 461, 461, 540, 429, 540, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 429, 431, 540, 513, 540, 482, - 540, 540, 540, 540, 540, 438, 540, 540, 540, 398, - 341, 342, 343, 344, 345, 347, 349, 351, 352, 353, - 354, 355, 356, 357, 359, 388, 389, 484, 485, 486, - 506, 383, 504, 505, 427, 436, 437, 446, 447, 465, - 469, 470, 471, 405, 406, 407, 408, 409, 428, 430, - 432, 434, 438, 439, 440, 414, 415, 416, 441, 444, - 445, 479, 477, 516, 517, 518, 519, 455, 456, 490, - 461, 462, 483, 498, 358, 489, 536, 537, 529, 530, - 531, 534, 533, 535, 538, 539, 532, 521, 523, 522, - 520, 495, 480, 478, 476, 473, 474, 475, 481, 496, - 497, 435, 472, 510, 487, 482, 391, 375, 399, 403, + 352, 544, 544, 544, 529, 529, 544, 505, 505, 528, + 454, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 392, 371, 392, 544, 544, 544, 397, 544, 544, 544, + 365, 544, 544, 544, 544, 544, 376, 504, 415, 422, + 503, 530, 532, 531, 421, 423, 420, 424, 453, 451, + 399, 403, 404, 394, 397, 365, 435, 544, 392, 544, + 392, 392, 518, 456, 392, 392, 544, 544, 383, 491, + 342, 455, 468, 544, 406, 406, 406, 468, 468, 456, + 392, 544, 392, 392, 386, 456, 544, 544, 406, 406, + 406, 373, 388, 406, 413, 426, 427, 428, 414, 419, + 456, 515, 426, 412, 350, 512, 455, 455, 455, 455, + 455, 544, 470, 468, 484, 362, 372, 544, 375, 544, + 380, 544, 381, 465, 466, 366, 368, 369, 370, 496, + 468, 495, 498, 497, 459, 460, 461, 462, 382, 378, + 379, 374, 384, 506, 387, 389, 507, 444, 468, 490, + 519, 516, 492, 350, 511, 511, 511, 468, 468, 435, + 431, 435, 425, 425, 469, 435, 435, 425, 425, 348, + 544, 544, 544, 425, 435, 445, 544, 544, 544, 544, + 431, 544, 463, 463, 544, 431, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 431, 433, 544, 517, + 544, 484, 544, 544, 544, 544, 544, 440, 544, 544, + 544, 400, 343, 344, 345, 346, 347, 349, 351, 353, + 354, 355, 356, 357, 358, 359, 361, 390, 391, 486, + 487, 488, 510, 385, 508, 509, 429, 438, 439, 448, + 449, 467, 471, 472, 473, 407, 408, 409, 410, 411, + 430, 432, 434, 436, 440, 441, 442, 416, 417, 418, + 443, 446, 447, 481, 479, 520, 521, 522, 523, 457, + 458, 494, 463, 464, 485, 502, 360, 493, 540, 541, + 533, 534, 535, 538, 537, 539, 542, 543, 536, 525, + 527, 526, 524, 499, 482, 480, 478, 475, 476, 477, + 483, 500, 501, 437, 474, 514, 489, 484, 393, 377, + 401, 405, ); - const YYNOCODE = 113; + const YYNOCODE = 114; const YYSTACKDEPTH = 500; - const YYNSTATE = 340; - const YYNRULE = 200; + const YYNSTATE = 342; + const YYNRULE = 202; const YYERRORSYMBOL = 60; const YYERRSYMDT = 'yy0'; const YYFALLBACK = 0; @@ -1273,9 +1277,10 @@ public static $yy_action = array( 'isin', 'array', 'function', 'ns1', 'doublequoted_with_quotes', 'static_class_access', 'arraydef', 'variablelist', 'variable', 'object', 'configvariable', 'arrayindex', - 'indexdef', 'varvarele', 'objectchain', 'objectelement', - 'method', 'params', 'modifier', 'modparameter', - 'arrayelements', 'arrayelement', 'doublequoted', 'doublequotedcontent', + 'indexdef', 'varvarele', 'objectchain', 'optobjectchain', + 'objectelement', 'method', 'params', 'modifier', + 'modparameter', 'arrayelements', 'arrayelement', 'doublequoted', + 'doublequotedcontent', ); public static $yyRuleName = array( @@ -1428,6 +1433,8 @@ public static $yy_action = array( 'varvarele ::= SIMPELOUTPUT', 'varvarele ::= LDEL expr RDEL', 'object ::= varindexed objectchain', + 'optobjectchain ::=', + 'optobjectchain ::= objectchain', 'objectchain ::= objectelement', 'objectchain ::= objectchain objectelement', 'objectelement ::= PTR ID arrayindex', @@ -1435,7 +1442,7 @@ public static $yy_action = array( 'objectelement ::= PTR LDEL expr RDEL arrayindex', 'objectelement ::= PTR ID LDEL expr RDEL arrayindex', 'objectelement ::= PTR method', - 'function ::= ns1 OPENP variablelist CLOSEP', + 'function ::= ns1 OPENP variablelist CLOSEP optobjectchain', 'method ::= ID OPENP params CLOSEP', 'method ::= DOLLARID OPENP params CLOSEP', 'params ::= params COMMA expr', @@ -1943,28 +1950,30 @@ public static $yy_action = array( array( 0 => 101, 1 => 1 ), array( 0 => 101, 1 => 3 ), array( 0 => 97, 1 => 2 ), + array( 0 => 103, 1 => 0 ), + array( 0 => 103, 1 => 1 ), array( 0 => 102, 1 => 1 ), array( 0 => 102, 1 => 2 ), - array( 0 => 103, 1 => 3 ), - array( 0 => 103, 1 => 3 ), - array( 0 => 103, 1 => 5 ), - array( 0 => 103, 1 => 6 ), - array( 0 => 103, 1 => 2 ), - array( 0 => 90, 1 => 4 ), - array( 0 => 104, 1 => 4 ), - array( 0 => 104, 1 => 4 ), - array( 0 => 105, 1 => 3 ), - array( 0 => 105, 1 => 1 ), - array( 0 => 105, 1 => 0 ), + array( 0 => 104, 1 => 3 ), + array( 0 => 104, 1 => 3 ), + array( 0 => 104, 1 => 5 ), + array( 0 => 104, 1 => 6 ), + array( 0 => 104, 1 => 2 ), + array( 0 => 90, 1 => 5 ), + array( 0 => 105, 1 => 4 ), + array( 0 => 105, 1 => 4 ), + array( 0 => 106, 1 => 3 ), + array( 0 => 106, 1 => 1 ), + array( 0 => 106, 1 => 0 ), array( 0 => 76, 1 => 3 ), array( 0 => 76, 1 => 2 ), - array( 0 => 106, 1 => 3 ), - array( 0 => 106, 1 => 2 ), - array( 0 => 81, 1 => 2 ), - array( 0 => 81, 1 => 0 ), - array( 0 => 107, 1 => 2 ), array( 0 => 107, 1 => 3 ), array( 0 => 107, 1 => 2 ), + array( 0 => 81, 1 => 2 ), + array( 0 => 81, 1 => 0 ), + array( 0 => 108, 1 => 2 ), + array( 0 => 108, 1 => 3 ), + array( 0 => 108, 1 => 2 ), array( 0 => 93, 1 => 1 ), array( 0 => 93, 1 => 2 ), array( 0 => 93, 1 => 1 ), @@ -1976,24 +1985,24 @@ public static $yy_action = array( array( 0 => 87, 1 => 1 ), array( 0 => 94, 1 => 3 ), array( 0 => 94, 1 => 3 ), - array( 0 => 108, 1 => 1 ), - array( 0 => 108, 1 => 3 ), - array( 0 => 108, 1 => 2 ), - array( 0 => 108, 1 => 0 ), - array( 0 => 109, 1 => 3 ), - array( 0 => 109, 1 => 3 ), array( 0 => 109, 1 => 1 ), + array( 0 => 109, 1 => 3 ), + array( 0 => 109, 1 => 2 ), + array( 0 => 109, 1 => 0 ), + array( 0 => 110, 1 => 3 ), + array( 0 => 110, 1 => 3 ), + array( 0 => 110, 1 => 1 ), array( 0 => 92, 1 => 2 ), array( 0 => 92, 1 => 3 ), - array( 0 => 110, 1 => 2 ), - array( 0 => 110, 1 => 1 ), - array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 1 ), - array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 3 ), - array( 0 => 111, 1 => 1 ), + array( 0 => 111, 1 => 2 ), array( 0 => 111, 1 => 1 ), + array( 0 => 112, 1 => 3 ), + array( 0 => 112, 1 => 3 ), + array( 0 => 112, 1 => 1 ), + array( 0 => 112, 1 => 3 ), + array( 0 => 112, 1 => 3 ), + array( 0 => 112, 1 => 1 ), + array( 0 => 112, 1 => 1 ), ); public static $yyReduceMap = array( @@ -2023,10 +2032,12 @@ public static $yy_action = array( 104 => 6, 106 => 6, 122 => 6, - 182 => 6, - 188 => 6, + 150 => 6, + 184 => 6, + 190 => 6, 7 => 7, 8 => 8, + 149 => 8, 9 => 9, 11 => 11, 12 => 12, @@ -2066,14 +2077,14 @@ public static $yy_action = array( 58 => 49, 110 => 49, 111 => 49, - 160 => 49, - 164 => 49, - 168 => 49, + 162 => 49, + 166 => 49, 170 => 49, + 172 => 49, 50 => 50, 112 => 50, - 161 => 50, - 167 => 50, + 163 => 50, + 169 => 50, 51 => 51, 52 => 52, 53 => 52, @@ -2120,7 +2131,7 @@ public static $yy_action = array( 107 => 107, 108 => 108, 109 => 108, - 159 => 108, + 161 => 108, 113 => 113, 114 => 114, 115 => 115, @@ -2133,7 +2144,7 @@ public static $yy_action = array( 123 => 123, 124 => 124, 126 => 126, - 185 => 126, + 187 => 126, 127 => 127, 128 => 128, 129 => 129, @@ -2151,13 +2162,11 @@ public static $yy_action = array( 141 => 141, 142 => 142, 143 => 143, - 189 => 143, + 191 => 143, 144 => 144, 146 => 146, 147 => 147, 148 => 148, - 149 => 149, - 150 => 150, 151 => 151, 152 => 152, 153 => 153, @@ -2166,13 +2175,13 @@ public static $yy_action = array( 156 => 156, 157 => 157, 158 => 158, - 162 => 162, - 163 => 163, + 159 => 159, + 160 => 160, + 164 => 164, 165 => 165, - 166 => 166, - 169 => 169, + 167 => 167, + 168 => 168, 171 => 171, - 172 => 172, 173 => 173, 174 => 174, 175 => 175, @@ -2181,21 +2190,23 @@ public static $yy_action = array( 178 => 178, 179 => 179, 180 => 180, - 181 => 180, - 183 => 183, - 184 => 184, + 181 => 181, + 182 => 182, + 183 => 182, + 185 => 185, 186 => 186, - 187 => 187, - 190 => 190, - 191 => 191, + 188 => 188, + 189 => 189, 192 => 192, 193 => 193, - 196 => 193, 194 => 194, - 197 => 194, 195 => 195, - 198 => 198, - 199 => 199, + 198 => 195, + 196 => 196, + 199 => 196, + 197 => 197, + 200 => 200, + 201 => 201, ); // line 245 "src/Parser/TemplateParser.y" public function yy_r0(){ @@ -2773,93 +2784,93 @@ public static $yy_action = array( $this->_retvalue = '$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -1]->minor['var'] . ')'.$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor; } } -// line 1066 "src/Parser/TemplateParser.y" - public function yy_r149(){ +// line 1076 "src/Parser/TemplateParser.y" + public function yy_r151(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -// line 1071 "src/Parser/TemplateParser.y" - public function yy_r150(){ +// line 1081 "src/Parser/TemplateParser.y" + public function yy_r152(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -// line 1076 "src/Parser/TemplateParser.y" - public function yy_r151(){ +// line 1086 "src/Parser/TemplateParser.y" + public function yy_r153(){ if ($this->security && substr($this->yystack[$this->yyidx + -1]->minor,0,1) === '_') { $this->compiler->trigger_template_error (self::ERR1); } $this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor; } -// line 1083 "src/Parser/TemplateParser.y" - public function yy_r152(){ +// line 1093 "src/Parser/TemplateParser.y" + public function yy_r154(){ if ($this->security) { $this->compiler->trigger_template_error (self::ERR2); } $this->compiler->triggerTagNoCache($this->yystack[$this->yyidx + -1]->minor); $this->_retvalue = '->{$_smarty_tpl->getValue(' . $this->yystack[$this->yyidx + -1]->minor . ')'.$this->yystack[$this->yyidx + 0]->minor.'}'; } -// line 1091 "src/Parser/TemplateParser.y" - public function yy_r153(){ +// line 1101 "src/Parser/TemplateParser.y" + public function yy_r155(){ if ($this->security) { $this->compiler->trigger_template_error (self::ERR2); } $this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}'; } -// line 1098 "src/Parser/TemplateParser.y" - public function yy_r154(){ +// line 1108 "src/Parser/TemplateParser.y" + public function yy_r156(){ if ($this->security) { $this->compiler->trigger_template_error (self::ERR2); } $this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}'; } -// line 1106 "src/Parser/TemplateParser.y" - public function yy_r155(){ +// line 1116 "src/Parser/TemplateParser.y" + public function yy_r157(){ $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1114 "src/Parser/TemplateParser.y" - public function yy_r156(){ +// line 1124 "src/Parser/TemplateParser.y" + public function yy_r158(){ - if ($this->yystack[$this->yyidx + -3]->minor == 'isset') { + if ($this->yystack[$this->yyidx + -4]->minor == 'isset') { $this->_retvalue = '(true'; - if (count($this->yystack[$this->yyidx + -1]->minor) == 0) { + if (count($this->yystack[$this->yyidx + -2]->minor) == 0) { throw new CompilerException("Invalid number of arguments for isset. isset expects at least one parameter."); } - foreach ($this->yystack[$this->yyidx + -1]->minor as $value) { + foreach ($this->yystack[$this->yyidx + -2]->minor as $value) { if (is_array($value)) { $this->_retvalue .= ' && (' . $value[0] . ' && null !== (' . $value[1] . ' ?? null))'; } else { $this->_retvalue .= ' && (' . $value . ' !== null)'; } } - $this->_retvalue .= ')'; - } elseif ($this->yystack[$this->yyidx + -3]->minor == 'empty') { - if (count($this->yystack[$this->yyidx + -1]->minor) != 1) { + $this->_retvalue .= ')' . $this->yystack[$this->yyidx + 0]->minor; + } elseif ($this->yystack[$this->yyidx + -4]->minor == 'empty') { + if (count($this->yystack[$this->yyidx + -2]->minor) != 1) { throw new CompilerException("Invalid number of arguments for empty. empty expects at exactly one parameter."); } - if (is_array($this->yystack[$this->yyidx + -1]->minor[0])) { - $this->_retvalue .= '( !' . $this->yystack[$this->yyidx + -1]->minor[0][0] . ' || empty(' . $this->yystack[$this->yyidx + -1]->minor[0][1] . '))'; + if (is_array($this->yystack[$this->yyidx + -2]->minor[0])) { + $this->_retvalue = '( !' . $this->yystack[$this->yyidx + -2]->minor[0][0] . ' || empty(' . $this->yystack[$this->yyidx + -2]->minor[0][1] . '))' . $this->yystack[$this->yyidx + 0]->minor; } else { - $this->_retvalue = 'false == ' . $this->yystack[$this->yyidx + -1]->minor[0]; + $this->_retvalue = 'false == ' . $this->yystack[$this->yyidx + -2]->minor[0] . $this->yystack[$this->yyidx + 0]->minor; } } else { $p = array(); - foreach ($this->yystack[$this->yyidx + -1]->minor as $value) { + foreach ($this->yystack[$this->yyidx + -2]->minor as $value) { if (is_array($value)) { $p[] = $value[1]; } else { $p[] = $value; } } - $this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -3]->minor, $p); + $this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -4]->minor, $p) . $this->yystack[$this->yyidx + 0]->minor; } } -// line 1155 "src/Parser/TemplateParser.y" - public function yy_r157(){ +// line 1165 "src/Parser/TemplateParser.y" + public function yy_r159(){ if ($this->security && substr($this->yystack[$this->yyidx + -3]->minor,0,1) === '_') { $this->compiler->trigger_template_error (self::ERR1); } $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . '('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')'; } -// line 1162 "src/Parser/TemplateParser.y" - public function yy_r158(){ +// line 1172 "src/Parser/TemplateParser.y" + public function yy_r160(){ if ($this->security) { $this->compiler->trigger_template_error (self::ERR2); } @@ -2868,52 +2879,52 @@ public static $yy_action = array( $this->compiler->appendPrefixCode("getValue('".substr($this->yystack[$this->yyidx + -3]->minor,1).'\')'.';?>'); $this->_retvalue = $prefixVar .'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')'; } -// line 1191 "src/Parser/TemplateParser.y" - public function yy_r162(){ +// line 1201 "src/Parser/TemplateParser.y" + public function yy_r164(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor))); } -// line 1195 "src/Parser/TemplateParser.y" - public function yy_r163(){ +// line 1205 "src/Parser/TemplateParser.y" + public function yy_r165(){ $this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)); } -// line 1203 "src/Parser/TemplateParser.y" - public function yy_r165(){ +// line 1213 "src/Parser/TemplateParser.y" + public function yy_r167(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -// line 1211 "src/Parser/TemplateParser.y" - public function yy_r166(){ +// line 1221 "src/Parser/TemplateParser.y" + public function yy_r168(){ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor); } -// line 1224 "src/Parser/TemplateParser.y" - public function yy_r169(){ - $this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor); - } -// line 1233 "src/Parser/TemplateParser.y" +// line 1234 "src/Parser/TemplateParser.y" public function yy_r171(){ - $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method'); - } -// line 1238 "src/Parser/TemplateParser.y" - public function yy_r172(){ - $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'method'); + $this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor); } // line 1243 "src/Parser/TemplateParser.y" public function yy_r173(){ - $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, ''); + $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method'); } // line 1248 "src/Parser/TemplateParser.y" public function yy_r174(){ - $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'property'); + $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'method'); } // line 1253 "src/Parser/TemplateParser.y" public function yy_r175(){ - $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor, 'property'); + $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, ''); } -// line 1259 "src/Parser/TemplateParser.y" +// line 1258 "src/Parser/TemplateParser.y" public function yy_r176(){ - $this->_retvalue = ' '. trim($this->yystack[$this->yyidx + 0]->minor) . ' '; + $this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'property'); } // line 1263 "src/Parser/TemplateParser.y" public function yy_r177(){ + $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor, 'property'); + } +// line 1269 "src/Parser/TemplateParser.y" + public function yy_r178(){ + $this->_retvalue = ' '. trim($this->yystack[$this->yyidx + 0]->minor) . ' '; + } +// line 1273 "src/Parser/TemplateParser.y" + public function yy_r179(){ static $lops = array( 'eq' => ' == ', 'ne' => ' != ', @@ -2932,8 +2943,8 @@ public static $yy_action = array( $op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = $lops[$op]; } -// line 1282 "src/Parser/TemplateParser.y" - public function yy_r178(){ +// line 1292 "src/Parser/TemplateParser.y" + public function yy_r180(){ static $tlops = array( 'isdivby' => array('op' => ' % ', 'pre' => '!('), 'isnotdivby' => array('op' => ' % ', 'pre' => '('), @@ -2945,8 +2956,8 @@ public static $yy_action = array( $op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = $tlops[$op]; } -// line 1295 "src/Parser/TemplateParser.y" - public function yy_r179(){ +// line 1305 "src/Parser/TemplateParser.y" + public function yy_r181(){ static $scond = array ( 'iseven' => '!(1 & ', 'isnoteven' => '(1 & ', @@ -2956,58 +2967,58 @@ public static $yy_action = array( $op = strtolower(str_replace(' ', '', $this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = $scond[$op]; } -// line 1309 "src/Parser/TemplateParser.y" - public function yy_r180(){ +// line 1319 "src/Parser/TemplateParser.y" + public function yy_r182(){ $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')'; } -// line 1320 "src/Parser/TemplateParser.y" - public function yy_r183(){ +// line 1330 "src/Parser/TemplateParser.y" + public function yy_r185(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor; } -// line 1324 "src/Parser/TemplateParser.y" - public function yy_r184(){ +// line 1334 "src/Parser/TemplateParser.y" + public function yy_r186(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.','; } -// line 1332 "src/Parser/TemplateParser.y" - public function yy_r186(){ +// line 1342 "src/Parser/TemplateParser.y" + public function yy_r188(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1336 "src/Parser/TemplateParser.y" - public function yy_r187(){ +// line 1346 "src/Parser/TemplateParser.y" + public function yy_r189(){ $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor; } -// line 1352 "src/Parser/TemplateParser.y" - public function yy_r190(){ +// line 1362 "src/Parser/TemplateParser.y" + public function yy_r192(){ $this->compiler->leaveDoubleQuote(); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php($this); } -// line 1358 "src/Parser/TemplateParser.y" - public function yy_r191(){ +// line 1368 "src/Parser/TemplateParser.y" + public function yy_r193(){ $this->yystack[$this->yyidx + -1]->minor->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -// line 1363 "src/Parser/TemplateParser.y" - public function yy_r192(){ +// line 1373 "src/Parser/TemplateParser.y" + public function yy_r194(){ $this->_retvalue = new Dq($this, $this->yystack[$this->yyidx + 0]->minor); } -// line 1367 "src/Parser/TemplateParser.y" - public function yy_r193(){ +// line 1377 "src/Parser/TemplateParser.y" + public function yy_r195(){ $this->_retvalue = new Code('(string)'.$this->yystack[$this->yyidx + -1]->minor); } -// line 1371 "src/Parser/TemplateParser.y" - public function yy_r194(){ +// line 1381 "src/Parser/TemplateParser.y" + public function yy_r196(){ $this->_retvalue = new Code('(string)('.$this->yystack[$this->yyidx + -1]->minor.')'); } -// line 1375 "src/Parser/TemplateParser.y" - public function yy_r195(){ +// line 1385 "src/Parser/TemplateParser.y" + public function yy_r197(){ $this->_retvalue = new Code('(string)$_smarty_tpl->getValue(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')'); } -// line 1387 "src/Parser/TemplateParser.y" - public function yy_r198(){ +// line 1397 "src/Parser/TemplateParser.y" + public function yy_r200(){ $this->_retvalue = new Tag($this, $this->yystack[$this->yyidx + 0]->minor); } -// line 1391 "src/Parser/TemplateParser.y" - public function yy_r199(){ +// line 1401 "src/Parser/TemplateParser.y" + public function yy_r201(){ $this->_retvalue = new DqContent($this->yystack[$this->yyidx + 0]->minor); } diff --git a/src/Parser/TemplateParser.y b/src/Parser/TemplateParser.y index 544148f1..7ca4a252 100644 --- a/src/Parser/TemplateParser.y +++ b/src/Parser/TemplateParser.y @@ -1062,12 +1062,22 @@ object(res) ::= varindexed(vi) objectchain(oc). { } } + // optional objectchain - empty +optobjectchain(res) ::= . { + res = ''; +} + + // optional objectchain - present +optobjectchain(res) ::= objectchain(oc). { + res = oc; +} + // single element objectchain(res) ::= objectelement(oe). { res = oe; } - // chain of elements + // chain of elements objectchain(res) ::= objectchain(oc) objectelement(oe). { res = oc.oe; } @@ -1111,7 +1121,7 @@ objectelement(res)::= PTR method(f). { // // function // -function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. { +function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP optobjectchain(oc). { if (f == 'isset') { res = '(true'; @@ -1125,15 +1135,15 @@ function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. { res .= ' && (' . $value . ' !== null)'; } } - res .= ')'; + res .= ')' . oc; } elseif (f == 'empty') { if (count(v) != 1) { throw new CompilerException("Invalid number of arguments for empty. empty expects at exactly one parameter."); } if (is_array(v[0])) { - res .= '( !' . v[0][0] . ' || empty(' . v[0][1] . '))'; + res = '( !' . v[0][0] . ' || empty(' . v[0][1] . '))' . oc; } else { - res = 'false == ' . v[0]; + res = 'false == ' . v[0] . oc; } } else { $p = array(); @@ -1144,7 +1154,7 @@ function(res) ::= ns1(f) OPENP variablelist(v) CLOSEP. { $p[] = $value; } } - res = $this->compiler->compileModifierInExpression(f, $p); + res = $this->compiler->compileModifierInExpression(f, $p) . oc; } } diff --git a/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php new file mode 100644 index 00000000..c1e34bdd --- /dev/null +++ b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/FunctionObjectChainTest.php @@ -0,0 +1,208 @@ +filter()->values()->toJson()} + * + * @author Smarty Vibe + */ + +/** + * Helper class to simulate a chainable collection object + */ +class ChainableCollection +{ + private $data; + + public function __construct($data) + { + $this->data = $data; + } + + public function filter() + { + $this->data = array_filter($this->data); + return $this; + } + + public function values() + { + $this->data = array_values($this->data); + return $this; + } + + public function toJson() + { + return json_encode($this->data); + } + + public function toArray() + { + return $this->data; + } + + public function count() + { + return count($this->data); + } +} + +/** + * Modifier plugin that returns a chainable object (simulates collect()) + */ +function smarty_modifier_collect($data) +{ + return new ChainableCollection($data); +} + +/** + * Modifier plugin that returns an object with methods + */ +function smarty_modifier_create_object($value = null) +{ + return new class { + public function getName() { + return 'TestObject'; + } + + public function getNext() { + return new class { + public function getValue() { + return 'ChainedValue'; + } + }; + } + }; +} + +/** + * class for function object chain tests + * + * @preserveGlobalState disabled + * + */ +class FunctionObjectChainTest extends PHPUnit_Smarty +{ + public function setUp(): void + { + $this->setUpSmarty(__DIR__); + + // Register modifier plugins that return chainable objects + // These are called like functions: {collect($data)} + $this->smarty->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'collect', 'smarty_modifier_collect'); + $this->smarty->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'create_object', 'smarty_modifier_create_object'); + } + + public function testInit() + { + $this->cleanDirs(); + } + + /** + * Test the NEW feature: function call followed by method chain + * This is the core test for: {$x = collect($data)->filter()->values()->toJson()} + */ + public function testFunctionCallWithMethodChain() + { + $data = [1, 2, 0, 3, null, 4, '', 5]; + $this->smarty->assign('data', $data); + + // Test the new syntax: function()->method()->method()->method() + $result = $this->smarty->fetch('string:{collect($data)->filter()->values()->toJson()}'); + $this->assertEquals('[1,2,3,4,5]', $result); + } + + /** + * Test function call with method chain assigned to a variable + * This tests: {$x = collect($data)->filter()->values()->toJson()} + */ + public function testFunctionCallWithMethodChainAssignment() + { + $data = ['a', 'b', '', 'c', null, 'd']; + $this->smarty->assign('data', $data); + + // Test assignment with chained methods + $result = $this->smarty->fetch('string:{$result = collect($data)->filter()->values()->toJson()}{$result}'); + $this->assertEquals('["a","b","c","d"]', $result); + } + + /** + * Test function call with single method chain + */ + public function testFunctionCallWithSingleMethod() + { + $data = [1, 2, 3]; + $this->smarty->assign('data', $data); + + $result = $this->smarty->fetch('string:{collect($data)->count()}'); + $this->assertEquals('3', $result); + } + + /** + * Test function call with nested method chains + */ + public function testFunctionCallWithNestedChain() + { + $result = $this->smarty->fetch('string:{create_object("")->getNext()->getValue()}'); + $this->assertEquals('ChainedValue', $result); + } + + /** + * Test that old syntax still works (two-step process) + */ + public function testOldSyntaxStillWorks() + { + $data = [1, 2, 0, 3]; + $this->smarty->assign('data', $data); + + // Old syntax: assign to variable first, then chain + $result = $this->smarty->fetch('string:{$x = collect($data)}{$x->filter()->values()->toJson()}'); + $this->assertEquals('[1,2,3]', $result); + } + + /** + * Test object chain functionality using template file + */ + public function testFunctionObjectChainFromTemplateFile() + { + $data = ['foo', '', 'bar', null, 'baz']; + $this->smarty->assign('data', $data); + + $result = $this->smarty->fetch('test_function_chain.tpl'); + // Expected: JSON of filtered array and count + $this->assertStringContainsString('["foo","bar","baz"]', $result); + $this->assertStringContainsString('3', $result); + } + + /** + * Test complex chaining with multiple operations + * This demonstrates the power of the new feature + */ + public function testComplexChaining() + { + $data = [1, 2, 0, 3, '', 4, null, 5, false, 6]; + $this->smarty->assign('data', $data); + + // Complex chain: collect -> filter -> values -> toArray + $result = $this->smarty->fetch('string:{$filtered = collect($data)->filter()->values()->toArray()}{$filtered|@json_encode}'); + $this->assertEquals('[1,2,3,4,5,6]', $result); + } + + /** + * Test that demonstrates the benefit: one line vs multiple lines + */ + public function testNewSyntaxVsOldSyntax() + { + $data = [10, 20, 0, 30]; + $this->smarty->assign('data', $data); + + // NEW syntax (single line) + $new = $this->smarty->fetch('string:{collect($data)->filter()->count()}'); + + // OLD syntax (multiple steps) + $old = $this->smarty->fetch('string:{$temp = collect($data)}{$temp = $temp->filter()}{$temp->count()}'); + + // Both should produce the same result + $this->assertEquals('3', $new); + $this->assertEquals($new, $old); + } +} \ No newline at end of file diff --git a/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl new file mode 100644 index 00000000..5d576834 --- /dev/null +++ b/tests/UnitTests/TemplateSource/TagTests/FunctionObjectChain/templates/test_function_chain.tpl @@ -0,0 +1,4 @@ +{* Test template for NEW function object chain feature *} +{* Test: function()->method()->method()->method() *} +{collect($data)->filter()->values()->toJson()} +{collect($data)->filter()->count()} \ No newline at end of file -- cgit v1.3