From 4743c8fa36a16d1ab46afdedf4e3972b9c0bce30 Mon Sep 17 00:00:00 2001 From: Ulya Trofimovich Date: Mon, 22 Feb 2016 10:22:43 +0000 Subject: [PATCH] Code cleanup: factored RuleInfo out of RuleOp. Rule information (line, attached code block, rank, shadowing set, etc.) is used throughout the program. Before this patch, rule information was inlined in RuleOp. It was inconvenient because RuleOp belongs to early stages of compilation (AST, prior to NFA), but it had to live throughout the whole program. --- re2c/bootstrap/src/parse/lex.cc | 189 +++++++++--------- re2c/bootstrap/src/parse/parser.cc | 11 +- re2c/src/codegen/emit_action.cc | 5 +- re2c/src/conf/warn.cc | 14 +- re2c/src/conf/warn.h | 2 +- re2c/src/ir/adfa/action.h | 6 +- re2c/src/ir/adfa/adfa.h | 2 +- re2c/src/ir/adfa/prepare.cc | 1 - re2c/src/ir/compile.cc | 2 +- re2c/src/ir/dfa/determinization.cc | 17 +- re2c/src/ir/dfa/dfa.h | 4 +- re2c/src/ir/dfa/minimization.cc | 7 +- re2c/src/ir/nfa/nfa.cc | 6 +- re2c/src/ir/nfa/nfa.h | 6 +- re2c/src/ir/regexp/nullable.cc | 8 +- re2c/src/ir/regexp/regexp.h | 4 +- re2c/src/ir/regexp/regexp_alt.h | 2 +- re2c/src/ir/regexp/regexp_rule.h | 37 ++-- re2c/src/ir/skeleton/control_flow.cc | 2 +- re2c/src/ir/skeleton/path.h | 49 ++--- re2c/src/ir/skeleton/skeleton.cc | 14 +- re2c/src/ir/skeleton/skeleton.h | 10 +- re2c/src/ir/skeleton/unreachable_nullable.cc | 33 +-- re2c/src/parse/parser.h | 1 + re2c/src/parse/parser.ypp | 11 +- re2c/src/parse/rules.h | 41 +++- re2c/src/parse/spec.h | 13 +- ...cd--skeleton--flex-syntax--case-inverted.c | 18 +- re2c/test/repeat-01.cgir--skeleton.c | 6 +- re2c/test/repeat-02.cgir--skeleton.c | 6 +- re2c/test/repeat-03.cgir--skeleton.c | 12 +- .../reuse_conds_default_0.cgir--skeleton.c | 12 +- .../reuse_conds_default_1.cgir--skeleton.c | 12 +- 33 files changed, 288 insertions(+), 275 deletions(-) diff --git a/re2c/bootstrap/src/parse/lex.cc b/re2c/bootstrap/src/parse/lex.cc index 9c7e0143..514e1f5c 100644 --- a/re2c/bootstrap/src/parse/lex.cc +++ b/re2c/bootstrap/src/parse/lex.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 on Thu Jan 21 10:47:47 2016 */ +/* Generated by re2c 0.16 on Sat Feb 20 16:51:22 2016 */ #line 1 "../src/parse/lex.re" #include "src/util/c99_stdint.h" #include @@ -912,7 +912,6 @@ yy134: goto yy159; yy135: yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; if (yych == '=') goto yy160; goto yy113; yy136: @@ -926,7 +925,7 @@ yy137: if ((yych = (YYCTYPE)*YYCURSOR) == '^') goto yy165; #line 266 "../src/parse/lex.re" { yylval.regexp = lex_cls(false); return TOKEN_REGEXP; } -#line 930 "src/parse/lex.cc" +#line 929 "src/parse/lex.cc" yy139: yych = (YYCTYPE)*++YYCURSOR; YYCTXMARKER = YYCURSOR; @@ -955,7 +954,7 @@ yy141: depth = 1; goto code; } -#line 959 "src/parse/lex.cc" +#line 958 "src/parse/lex.cc" yy142: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1000,7 +999,7 @@ yy147: tok = cur; return 0; } -#line 1004 "src/parse/lex.cc" +#line 1003 "src/parse/lex.cc" yy149: ++YYCURSOR; #line 253 "../src/parse/lex.re" @@ -1008,17 +1007,17 @@ yy149: depth = 1; goto comment; } -#line 1012 "src/parse/lex.cc" +#line 1011 "src/parse/lex.cc" yy151: ++YYCURSOR; #line 250 "../src/parse/lex.re" { goto nextLine; } -#line 1019 "src/parse/lex.cc" +#line 1018 "src/parse/lex.cc" yy153: ++YYCURSOR; - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 351 "../src/parse/lex.re" { if (!opts->FFlag) { @@ -1035,7 +1034,7 @@ yy153: return TOKEN_REGEXP; } } -#line 1039 "src/parse/lex.cc" +#line 1038 "src/parse/lex.cc" yy155: yych = (YYCTYPE)*++YYCURSOR; goto yy178; @@ -1047,7 +1046,7 @@ yy156: yylval.str = new std::string (tok, tok_len ()); return TOKEN_ID; } -#line 1051 "src/parse/lex.cc" +#line 1050 "src/parse/lex.cc" yy158: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -1080,14 +1079,14 @@ yy160: depth = 0; goto code; } -#line 1084 "src/parse/lex.cc" +#line 1083 "src/parse/lex.cc" yy162: ++YYCURSOR; #line 272 "../src/parse/lex.re" { return TOKEN_SETUP; } -#line 1091 "src/parse/lex.cc" +#line 1090 "src/parse/lex.cc" yy164: yych = (YYCTYPE)*++YYCURSOR; YYCTXMARKER = YYCURSOR; @@ -1096,7 +1095,7 @@ yy165: ++YYCURSOR; #line 267 "../src/parse/lex.re" { yylval.regexp = lex_cls(true); return TOKEN_REGEXP; } -#line 1100 "src/parse/lex.cc" +#line 1099 "src/parse/lex.cc" yy167: yych = (YYCTYPE)*++YYCURSOR; YYCTXMARKER = YYCURSOR; @@ -1109,7 +1108,7 @@ yy169: { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } -#line 1113 "src/parse/lex.cc" +#line 1112 "src/parse/lex.cc" yy170: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -1175,7 +1174,7 @@ yy175: return TOKEN_ID; } } -#line 1179 "src/parse/lex.cc" +#line 1178 "src/parse/lex.cc" yy177: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1197,12 +1196,12 @@ yy178: } yy179: ++YYCURSOR; - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 2; #line 240 "../src/parse/lex.re" { return *tok; } -#line 1206 "src/parse/lex.cc" +#line 1205 "src/parse/lex.cc" yy181: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -1240,7 +1239,7 @@ yy185: { return TOKEN_NOCOND; } -#line 1244 "src/parse/lex.cc" +#line 1243 "src/parse/lex.cc" yy187: yych = (YYCTYPE)*++YYCURSOR; YYCTXMARKER = YYCURSOR; @@ -1264,7 +1263,7 @@ yy189: yylval.extop.max = yylval.extop.min; return TOKEN_CLOSESIZE; } -#line 1268 "src/parse/lex.cc" +#line 1267 "src/parse/lex.cc" yy191: ++YYCURSOR; #line 323 "../src/parse/lex.re" @@ -1275,7 +1274,7 @@ yy191: yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces return TOKEN_ID; } -#line 1279 "src/parse/lex.cc" +#line 1278 "src/parse/lex.cc" yy193: yych = (YYCTYPE)*++YYCURSOR; if (yych == 'n') goto yy199; @@ -1304,7 +1303,7 @@ yy197: yylval.extop.max = std::numeric_limits::max(); return TOKEN_CLOSESIZE; } -#line 1308 "src/parse/lex.cc" +#line 1307 "src/parse/lex.cc" yy199: yych = (YYCTYPE)*++YYCURSOR; if (yych == 'e') goto yy204; @@ -1313,7 +1312,7 @@ yy200: ++YYCURSOR; #line 331 "../src/parse/lex.re" { lex_conf (); return TOKEN_CONF; } -#line 1317 "src/parse/lex.cc" +#line 1316 "src/parse/lex.cc" yy202: ++YYCURSOR; #line 297 "../src/parse/lex.re" @@ -1329,7 +1328,7 @@ yy202: } return TOKEN_CLOSESIZE; } -#line 1333 "src/parse/lex.cc" +#line 1332 "src/parse/lex.cc" yy204: yych = (YYCTYPE)*++YYCURSOR; if (yych <= '0') goto yy206; @@ -1390,7 +1389,7 @@ yy211: set_sourceline (); goto scan; } -#line 1394 "src/parse/lex.cc" +#line 1393 "src/parse/lex.cc" yy213: yych = (YYCTYPE)*++YYCURSOR; if (yych == '\n') goto yy211; @@ -1420,7 +1419,7 @@ yy217: flex_name: -#line 1424 "src/parse/lex.cc" +#line 1423 "src/parse/lex.cc" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -1434,7 +1433,7 @@ yy221: YYCURSOR = tok; goto start; } -#line 1438 "src/parse/lex.cc" +#line 1437 "src/parse/lex.cc" yy222: ++YYCURSOR; #line 397 "../src/parse/lex.re" @@ -1443,7 +1442,7 @@ yy222: lexer_state = LEX_NORMAL; return TOKEN_FID_END; } -#line 1447 "src/parse/lex.cc" +#line 1446 "src/parse/lex.cc" yy224: ++YYCURSOR; if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy222; @@ -1454,7 +1453,7 @@ yy224: code: -#line 1458 "src/parse/lex.cc" +#line 1457 "src/parse/lex.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1527,7 +1526,7 @@ yy227: } goto code; } -#line 1531 "src/parse/lex.cc" +#line 1530 "src/parse/lex.cc" yy229: ++YYCURSOR; yy230: @@ -1535,11 +1534,10 @@ yy230: { goto code; } -#line 1539 "src/parse/lex.cc" +#line 1538 "src/parse/lex.cc" yy231: yyaccept = 0; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - YYCTXMARKER = YYCURSOR; if (yych <= '\r') { if (yych <= '\t') { if (yych >= '\t') goto yy239; @@ -1575,7 +1573,7 @@ yy232: cline++; goto code; } -#line 1579 "src/parse/lex.cc" +#line 1577 "src/parse/lex.cc" yy233: yyaccept = 1; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -1600,7 +1598,7 @@ yy235: } goto code; } -#line 1604 "src/parse/lex.cc" +#line 1602 "src/parse/lex.cc" yy237: ++YYCURSOR; #line 411 "../src/parse/lex.re" @@ -1616,7 +1614,7 @@ yy237: } goto code; } -#line 1620 "src/parse/lex.cc" +#line 1618 "src/parse/lex.cc" yy239: yyaccept = 2; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -1627,7 +1625,7 @@ yy239: if (yych == '#') goto yy242; } yy240: - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 438 "../src/parse/lex.re" { if (depth == 0) @@ -1642,7 +1640,7 @@ yy240: cline++; goto code; } -#line 1646 "src/parse/lex.cc" +#line 1644 "src/parse/lex.cc" yy241: yych = (YYCTYPE)*++YYCURSOR; goto yy240; @@ -1681,7 +1679,7 @@ yy247: { goto code; } -#line 1685 "src/parse/lex.cc" +#line 1683 "src/parse/lex.cc" yy249: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1776,7 +1774,7 @@ yy265: set_sourceline (); goto code; } -#line 1780 "src/parse/lex.cc" +#line 1778 "src/parse/lex.cc" yy267: yych = (YYCTYPE)*++YYCURSOR; if (yych == '\n') goto yy265; @@ -1810,7 +1808,7 @@ yy271: comment: -#line 1814 "src/parse/lex.cc" +#line 1812 "src/parse/lex.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -1865,7 +1863,7 @@ yy275: } goto comment; } -#line 1869 "src/parse/lex.cc" +#line 1867 "src/parse/lex.cc" yy276: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { @@ -1883,7 +1881,7 @@ yy277: cline++; goto comment; } -#line 1887 "src/parse/lex.cc" +#line 1885 "src/parse/lex.cc" yy278: yych = (YYCTYPE)*++YYCURSOR; if (yych == '/') goto yy285; @@ -1928,7 +1926,7 @@ yy285: goto comment; } } -#line 1932 "src/parse/lex.cc" +#line 1930 "src/parse/lex.cc" yy287: ++YYCURSOR; #line 501 "../src/parse/lex.re" @@ -1937,7 +1935,7 @@ yy287: fatal("ambiguous /* found"); goto comment; } -#line 1941 "src/parse/lex.cc" +#line 1939 "src/parse/lex.cc" yy289: yych = (YYCTYPE)*++YYCURSOR; if (yych != 'i') goto yy282; @@ -1999,7 +1997,7 @@ yy299: set_sourceline (); goto comment; } -#line 2003 "src/parse/lex.cc" +#line 2001 "src/parse/lex.cc" yy301: yych = (YYCTYPE)*++YYCURSOR; if (yych == '\n') goto yy299; @@ -2029,7 +2027,7 @@ yy305: nextLine: -#line 2033 "src/parse/lex.cc" +#line 2031 "src/parse/lex.cc" { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -2042,7 +2040,7 @@ nextLine: } goto nextLine; } -#line 2046 "src/parse/lex.cc" +#line 2044 "src/parse/lex.cc" yy310: ++YYCURSOR; #line 530 "../src/parse/lex.re" @@ -2053,7 +2051,7 @@ yy310: cline++; goto scan; } -#line 2057 "src/parse/lex.cc" +#line 2055 "src/parse/lex.cc" } #line 542 "../src/parse/lex.re" @@ -2079,7 +2077,7 @@ RegExp *Scanner::lex_cls(bool neg) uint32_t u, l; fst: -#line 2083 "src/parse/lex.cc" +#line 2081 "src/parse/lex.cc" { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -2087,18 +2085,18 @@ fst: if (yych == ']') goto yy315; #line 566 "../src/parse/lex.re" { l = lex_cls_chr(); goto snd; } -#line 2091 "src/parse/lex.cc" +#line 2089 "src/parse/lex.cc" yy315: ++YYCURSOR; #line 565 "../src/parse/lex.re" { goto end; } -#line 2096 "src/parse/lex.cc" +#line 2094 "src/parse/lex.cc" } #line 567 "../src/parse/lex.re" snd: -#line 2102 "src/parse/lex.cc" +#line 2100 "src/parse/lex.cc" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -2107,16 +2105,15 @@ snd: yy319: #line 570 "../src/parse/lex.re" { u = l; goto add; } -#line 2111 "src/parse/lex.cc" +#line 2109 "src/parse/lex.cc" yy320: yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; if (yych != ']') goto yy322; YYCURSOR = YYMARKER; goto yy319; yy322: ++YYCURSOR; - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 571 "../src/parse/lex.re" { u = lex_cls_chr(); @@ -2126,7 +2123,7 @@ yy322: } goto add; } -#line 2130 "src/parse/lex.cc" +#line 2127 "src/parse/lex.cc" } #line 579 "../src/parse/lex.re" @@ -2147,7 +2144,7 @@ uint32_t Scanner::lex_cls_chr() { tok = cur; -#line 2151 "src/parse/lex.cc" +#line 2148 "src/parse/lex.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -2158,12 +2155,12 @@ uint32_t Scanner::lex_cls_chr() ++YYCURSOR; #line 602 "../src/parse/lex.re" { return static_cast(tok[0]); } -#line 2162 "src/parse/lex.cc" +#line 2159 "src/parse/lex.cc" yy328: ++YYCURSOR; #line 597 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error"); } -#line 2167 "src/parse/lex.cc" +#line 2164 "src/parse/lex.cc" yy330: ++YYCURSOR; if ((yych = (YYCTYPE)*YYCURSOR) <= '`') { @@ -2214,7 +2211,7 @@ yy330: } #line 600 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); } -#line 2218 "src/parse/lex.cc" +#line 2215 "src/parse/lex.cc" yy332: ++YYCURSOR; #line 615 "../src/parse/lex.re" @@ -2222,12 +2219,12 @@ yy332: warn.useless_escape(tline, tok - pos, tok[1]); return static_cast(tok[1]); } -#line 2226 "src/parse/lex.cc" +#line 2223 "src/parse/lex.cc" yy334: ++YYCURSOR; #line 613 "../src/parse/lex.re" { return static_cast('-'); } -#line 2231 "src/parse/lex.cc" +#line 2228 "src/parse/lex.cc" yy336: yyaccept = 0; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -2236,7 +2233,7 @@ yy336: yy337: #line 599 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); } -#line 2240 "src/parse/lex.cc" +#line 2237 "src/parse/lex.cc" yy338: yych = (YYCTYPE)*++YYCURSOR; goto yy337; @@ -2254,7 +2251,7 @@ yy339: yy340: #line 598 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); } -#line 2258 "src/parse/lex.cc" +#line 2255 "src/parse/lex.cc" yy341: yyaccept = 1; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -2272,47 +2269,47 @@ yy342: ++YYCURSOR; #line 612 "../src/parse/lex.re" { return static_cast('\\'); } -#line 2276 "src/parse/lex.cc" +#line 2273 "src/parse/lex.cc" yy344: ++YYCURSOR; #line 614 "../src/parse/lex.re" { return static_cast(']'); } -#line 2281 "src/parse/lex.cc" +#line 2278 "src/parse/lex.cc" yy346: ++YYCURSOR; #line 605 "../src/parse/lex.re" { return static_cast('\a'); } -#line 2286 "src/parse/lex.cc" +#line 2283 "src/parse/lex.cc" yy348: ++YYCURSOR; #line 606 "../src/parse/lex.re" { return static_cast('\b'); } -#line 2291 "src/parse/lex.cc" +#line 2288 "src/parse/lex.cc" yy350: ++YYCURSOR; #line 607 "../src/parse/lex.re" { return static_cast('\f'); } -#line 2296 "src/parse/lex.cc" +#line 2293 "src/parse/lex.cc" yy352: ++YYCURSOR; #line 608 "../src/parse/lex.re" { return static_cast('\n'); } -#line 2301 "src/parse/lex.cc" +#line 2298 "src/parse/lex.cc" yy354: ++YYCURSOR; #line 609 "../src/parse/lex.re" { return static_cast('\r'); } -#line 2306 "src/parse/lex.cc" +#line 2303 "src/parse/lex.cc" yy356: ++YYCURSOR; #line 610 "../src/parse/lex.re" { return static_cast('\t'); } -#line 2311 "src/parse/lex.cc" +#line 2308 "src/parse/lex.cc" yy358: ++YYCURSOR; #line 611 "../src/parse/lex.re" { return static_cast('\v'); } -#line 2316 "src/parse/lex.cc" +#line 2313 "src/parse/lex.cc" yy360: yyaccept = 1; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -2377,7 +2374,7 @@ yy366: ++YYCURSOR; #line 604 "../src/parse/lex.re" { return unesc_oct(tok, cur); } -#line 2381 "src/parse/lex.cc" +#line 2378 "src/parse/lex.cc" yy368: yych = (YYCTYPE)*++YYCURSOR; if (yych <= '@') { @@ -2406,7 +2403,7 @@ yy370: ++YYCURSOR; #line 603 "../src/parse/lex.re" { return unesc_hex(tok, cur); } -#line 2410 "src/parse/lex.cc" +#line 2407 "src/parse/lex.cc" yy372: yych = (YYCTYPE)*++YYCURSOR; if (yych <= '@') { @@ -2439,7 +2436,7 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end) end = false; tok = cur; -#line 2443 "src/parse/lex.cc" +#line 2440 "src/parse/lex.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -2453,12 +2450,12 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end) end = tok[0] == quote; return static_cast(tok[0]); } -#line 2457 "src/parse/lex.cc" +#line 2454 "src/parse/lex.cc" yy378: ++YYCURSOR; #line 627 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error"); } -#line 2462 "src/parse/lex.cc" +#line 2459 "src/parse/lex.cc" yy380: ++YYCURSOR; if ((yych = (YYCTYPE)*YYCURSOR) <= 'a') { @@ -2506,7 +2503,7 @@ yy380: } #line 630 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); } -#line 2510 "src/parse/lex.cc" +#line 2507 "src/parse/lex.cc" yy382: ++YYCURSOR; #line 646 "../src/parse/lex.re" @@ -2516,7 +2513,7 @@ yy382: } return static_cast(tok[1]); } -#line 2520 "src/parse/lex.cc" +#line 2517 "src/parse/lex.cc" yy384: yyaccept = 0; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -2525,7 +2522,7 @@ yy384: yy385: #line 629 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); } -#line 2529 "src/parse/lex.cc" +#line 2526 "src/parse/lex.cc" yy386: yych = (YYCTYPE)*++YYCURSOR; goto yy385; @@ -2543,7 +2540,7 @@ yy387: yy388: #line 628 "../src/parse/lex.re" { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); } -#line 2547 "src/parse/lex.cc" +#line 2544 "src/parse/lex.cc" yy389: yyaccept = 1; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -2561,42 +2558,42 @@ yy390: ++YYCURSOR; #line 645 "../src/parse/lex.re" { return static_cast('\\'); } -#line 2565 "src/parse/lex.cc" +#line 2562 "src/parse/lex.cc" yy392: ++YYCURSOR; #line 638 "../src/parse/lex.re" { return static_cast('\a'); } -#line 2570 "src/parse/lex.cc" +#line 2567 "src/parse/lex.cc" yy394: ++YYCURSOR; #line 639 "../src/parse/lex.re" { return static_cast('\b'); } -#line 2575 "src/parse/lex.cc" +#line 2572 "src/parse/lex.cc" yy396: ++YYCURSOR; #line 640 "../src/parse/lex.re" { return static_cast('\f'); } -#line 2580 "src/parse/lex.cc" +#line 2577 "src/parse/lex.cc" yy398: ++YYCURSOR; #line 641 "../src/parse/lex.re" { return static_cast('\n'); } -#line 2585 "src/parse/lex.cc" +#line 2582 "src/parse/lex.cc" yy400: ++YYCURSOR; #line 642 "../src/parse/lex.re" { return static_cast('\r'); } -#line 2590 "src/parse/lex.cc" +#line 2587 "src/parse/lex.cc" yy402: ++YYCURSOR; #line 643 "../src/parse/lex.re" { return static_cast('\t'); } -#line 2595 "src/parse/lex.cc" +#line 2592 "src/parse/lex.cc" yy404: ++YYCURSOR; #line 644 "../src/parse/lex.re" { return static_cast('\v'); } -#line 2600 "src/parse/lex.cc" +#line 2597 "src/parse/lex.cc" yy406: yyaccept = 1; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); @@ -2661,7 +2658,7 @@ yy412: ++YYCURSOR; #line 637 "../src/parse/lex.re" { return unesc_oct(tok, cur); } -#line 2665 "src/parse/lex.cc" +#line 2662 "src/parse/lex.cc" yy414: yych = (YYCTYPE)*++YYCURSOR; if (yych <= '@') { @@ -2690,7 +2687,7 @@ yy416: ++YYCURSOR; #line 636 "../src/parse/lex.re" { return unesc_hex(tok, cur); } -#line 2694 "src/parse/lex.cc" +#line 2691 "src/parse/lex.cc" yy418: yych = (YYCTYPE)*++YYCURSOR; if (yych <= '@') { @@ -2735,7 +2732,7 @@ void Scanner::set_sourceline () sourceline: tok = cur; -#line 2739 "src/parse/lex.cc" +#line 2736 "src/parse/lex.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -2788,7 +2785,7 @@ yy423: { goto sourceline; } -#line 2792 "src/parse/lex.cc" +#line 2789 "src/parse/lex.cc" yy424: ++YYCURSOR; #line 683 "../src/parse/lex.re" @@ -2804,7 +2801,7 @@ yy424: tok = cur; return; } -#line 2808 "src/parse/lex.cc" +#line 2805 "src/parse/lex.cc" yy426: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); if (yych == '\n') goto yy423; @@ -2824,7 +2821,7 @@ yy427: } goto sourceline; } -#line 2828 "src/parse/lex.cc" +#line 2825 "src/parse/lex.cc" yy430: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -2846,7 +2843,7 @@ yy433: escape (in.file_name, std::string (tok + 1, tok_len () - 2)); // -2 to omit quotes goto sourceline; } -#line 2850 "src/parse/lex.cc" +#line 2847 "src/parse/lex.cc" yy435: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); diff --git a/re2c/bootstrap/src/parse/parser.cc b/re2c/bootstrap/src/parse/parser.cc index 8a795325..831c74c1 100644 --- a/re2c/bootstrap/src/parse/parser.cc +++ b/re2c/bootstrap/src/parse/parser.cc @@ -2336,18 +2336,13 @@ void parse(Scanner& i, Output & o) if (parseMode != Scanner::Reuse) { - // <*> rules must have the lowest priority - // now that all rules have been parsed, we can fix it - for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) - { - (*itOp)->rank = rank_counter.next (); - } - // merge <*> rules to all conditions + // merge <*> rules to all conditions with lowest priority for (it = specMap.begin(); it != specMap.end(); ++it) { for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) { - it->second.add (*itOp); + RuleOp *r = new RuleOp(*itOp, rank_counter.next()); + it->second.add (r); } if (star_default) { diff --git a/re2c/src/codegen/emit_action.cc b/re2c/src/codegen/emit_action.cc index 6957fea0..d091c55a 100644 --- a/re2c/src/codegen/emit_action.cc +++ b/re2c/src/codegen/emit_action.cc @@ -11,7 +11,6 @@ #include "src/ir/adfa/action.h" #include "src/ir/adfa/adfa.h" #include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" #include "src/ir/skeleton/skeleton.h" #include "src/parse/code.h" #include "src/parse/loc.h" @@ -27,7 +26,7 @@ static void emit_initial (OutputFile & o, uint32_t ind, bool & readCh, con static void emit_save (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, uint32_t save, bool save_yyaccept); static void emit_accept_binary (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accept, size_t l, size_t r); static void emit_accept (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accept); -static void emit_rule (OutputFile & o, uint32_t ind, const State * const s, const RuleOp * const rule, const std::string & condName, const Skeleton * skeleton); +static void emit_rule (OutputFile & o, uint32_t ind, const State * const s, const RuleInfo * const rule, const std::string & condName, const Skeleton * skeleton); static void genYYFill (OutputFile & o, size_t need); static void genSetCondition (OutputFile & o, uint32_t ind, const std::string & newcond); static void genSetState (OutputFile & o, uint32_t ind, uint32_t fillIndex); @@ -249,7 +248,7 @@ void emit_accept (OutputFile & o, uint32_t ind, bool & readCh, const State * con } } -void emit_rule (OutputFile & o, uint32_t ind, const State * const s, const RuleOp * const rule, const std::string & condName, const Skeleton * skeleton) +void emit_rule (OutputFile & o, uint32_t ind, const State * const s, const RuleInfo * const rule, const std::string & condName, const Skeleton * skeleton) { if (opts->target == opt_t::DOT) { diff --git a/re2c/src/conf/warn.cc b/re2c/src/conf/warn.cc index e309f26d..181b34ff 100644 --- a/re2c/src/conf/warn.cc +++ b/re2c/src/conf/warn.cc @@ -161,25 +161,25 @@ void Warn::undefined_control_flow (uint32_t line, const std::string & cond, std: } } -void Warn::unreachable_rule (const std::string & cond, const rule_info_t & rule, const rules_t & rules) +void Warn::unreachable_rule (const std::string & cond, const RuleInfo *rule) { if (mask[UNREACHABLE_RULES] & WARNING) { const bool e = mask[UNREACHABLE_RULES] & ERROR; error_accuml |= e; - warning_start (rule.line, e); + warning_start (rule->loc.line, e); fprintf (stderr, "unreachable rule %s", incond (cond).c_str ()); - const size_t shadows = rule.shadow.size (); + const size_t shadows = rule->shadow.size (); if (shadows > 0) { const char * pl = shadows > 1 ? "s" : ""; - std::set::const_iterator i = rule.shadow.begin (); - fprintf (stderr, "(shadowed by rule%s at line%s %u", pl, pl, rules.find (*i)->second.line); - for (++i; i != rule.shadow.end (); ++i) + std::set::const_iterator i = rule->shadow.begin(); + fprintf (stderr, "(shadowed by rule%s at line%s %u", pl, pl, *i); + for (++i; i != rule->shadow.end(); ++i) { - fprintf (stderr, ", %u", rules.find (*i)->second.line); + fprintf (stderr, ", %u", *i); } fprintf (stderr, ")"); } diff --git a/re2c/src/conf/warn.h b/re2c/src/conf/warn.h index fb313b01..b9e6b2b7 100644 --- a/re2c/src/conf/warn.h +++ b/re2c/src/conf/warn.h @@ -58,7 +58,7 @@ public: void match_empty_string (uint32_t line); void swapped_range (uint32_t line, uint32_t l, uint32_t u); void undefined_control_flow (uint32_t line, const std::string & cond, std::vector & ways, bool overflow); - void unreachable_rule (const std::string & cond, const rule_info_t & rule, const rules_t & rules); + void unreachable_rule (const std::string & cond, const RuleInfo *rule); void useless_escape (uint32_t line, uint32_t col, char c); }; diff --git a/re2c/src/ir/adfa/action.h b/re2c/src/ir/adfa/action.h index abc2d990..c57d7a6c 100644 --- a/re2c/src/ir/adfa/action.h +++ b/re2c/src/ir/adfa/action.h @@ -11,7 +11,7 @@ namespace re2c { struct OutputFile; -class RuleOp; +class RuleInfo; class State; struct Initial @@ -44,7 +44,7 @@ public: Initial * initial; uint32_t save; const accept_t * accepts; - const RuleOp * rule; + const RuleInfo * rule; } info; public: @@ -79,7 +79,7 @@ public: type = ACCEPT; info.accepts = accepts; } - void set_rule (const RuleOp * const rule) + void set_rule (const RuleInfo * const rule) { clear (); type = RULE; diff --git a/re2c/src/ir/adfa/adfa.h b/re2c/src/ir/adfa/adfa.h index 95f512d6..e4b7e4ab 100644 --- a/re2c/src/ir/adfa/adfa.h +++ b/re2c/src/ir/adfa/adfa.h @@ -23,7 +23,7 @@ struct dfa_t; struct State { label_t label; - RuleOp * rule; + const RuleInfo * rule; State * next; size_t fill; diff --git a/re2c/src/ir/adfa/prepare.cc b/re2c/src/ir/adfa/prepare.cc index 39cf65c1..bd51bb90 100644 --- a/re2c/src/ir/adfa/prepare.cc +++ b/re2c/src/ir/adfa/prepare.cc @@ -7,7 +7,6 @@ #include "src/globals.h" #include "src/ir/adfa/action.h" #include "src/ir/adfa/adfa.h" -#include "src/ir/regexp/regexp_rule.h" #include "src/ir/rule_rank.h" #include "src/util/allocate.h" diff --git a/re2c/src/ir/compile.cc b/re2c/src/ir/compile.cc index f15d750d..274be97e 100644 --- a/re2c/src/ir/compile.cc +++ b/re2c/src/ir/compile.cc @@ -49,7 +49,7 @@ smart_ptr compile (Spec & spec, Output & output, const std::string & cond, nfa_t nfa(spec.re); - dfa_t dfa(nfa, cs, spec.rules); + dfa_t dfa(nfa, cs); // skeleton must be constructed after DFA construction // but prior to any other DFA transformations diff --git a/re2c/src/ir/dfa/determinization.cc b/re2c/src/ir/dfa/determinization.cc index 01a04cc7..83f795d5 100644 --- a/re2c/src/ir/dfa/determinization.cc +++ b/re2c/src/ir/dfa/determinization.cc @@ -7,7 +7,6 @@ #include "src/ir/dfa/dfa.h" #include "src/ir/nfa/nfa.h" #include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" #include "src/ir/rule_rank.h" #include "src/parse/rules.h" #include "src/util/ord_hash_set.h" @@ -91,11 +90,11 @@ static size_t find_state return kernels.insert(kernel, size); } -dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules) +dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset) : states() , nchars(charset.size() - 1) // (n + 1) bounds for n ranges { - std::map > s2rules; + std::map > s2rules; ord_hash_set_t kernels; nfa_state_t **const buffer = new nfa_state_t*[nfa.size]; std::vector > arcs(nchars); @@ -160,23 +159,23 @@ dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules) for (size_t i = 0; i < count; ++i) { dfa_state_t *s = states[i]; - std::set &rs = s2rules[i]; + std::set &rs = s2rules[i]; // for each final state: choose the rule with the smallest rank - for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) + for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) { - RuleOp *rule = *j; + RuleInfo *rule = *j; if (!s->rule || rule->rank < s->rule->rank) { s->rule = rule; } } // other rules are shadowed by the chosen rule - for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) + for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) { - RuleOp *rule = *j; + RuleInfo *rule = *j; if (s->rule != rule) { - rules[rule->rank].shadow.insert(s->rule->rank); + rule->shadow.insert(s->rule->loc.line); } } } diff --git a/re2c/src/ir/dfa/dfa.h b/re2c/src/ir/dfa/dfa.h index 459ed4ab..32ea6f85 100644 --- a/re2c/src/ir/dfa/dfa.h +++ b/re2c/src/ir/dfa/dfa.h @@ -17,7 +17,7 @@ class RuleOp; struct dfa_state_t { size_t *arcs; - RuleOp *rule; + RuleInfo *rule; bool ctx; dfa_state_t() @@ -40,7 +40,7 @@ struct dfa_t std::vector states; const size_t nchars; - dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules); + dfa_t(const nfa_t &nfa, const charset_t &charset); ~dfa_t(); }; diff --git a/re2c/src/ir/dfa/minimization.cc b/re2c/src/ir/dfa/minimization.cc index 79c93e49..8b6cc039 100644 --- a/re2c/src/ir/dfa/minimization.cc +++ b/re2c/src/ir/dfa/minimization.cc @@ -1,3 +1,4 @@ +#include #include #include #include @@ -9,7 +10,7 @@ namespace re2c { -class RuleOp; +class RuleInfo; /* * note [DFA minimization: table filling algorithm] @@ -119,11 +120,11 @@ static void minimization_moore( size_t *next = new size_t[count]; - std::map, size_t> init; + std::map, size_t> init; for (size_t i = 0; i < count; ++i) { dfa_state_t *s = states[i]; - std::pair key(s->rule, s->ctx); + std::pair key(s->rule, s->ctx); if (init.insert(std::make_pair(key, i)).second) { part[i] = i; diff --git a/re2c/src/ir/nfa/nfa.cc b/re2c/src/ir/nfa/nfa.cc index 532962a4..c1ed2409 100644 --- a/re2c/src/ir/nfa/nfa.cc +++ b/re2c/src/ir/nfa/nfa.cc @@ -58,15 +58,15 @@ nfa_state_t *NullOp::compile(nfa_t &, nfa_state_t *t) nfa_state_t *RuleOp::compile(nfa_t &nfa, nfa_state_t *) { nfa_state_t *s3 = &nfa.states[nfa.size++]; - s3->fin(this); + s3->fin(info); - if (ctx_len == ~0u) + if (info->ctx_len == ~0u) { nfa_state_t *s2 = &nfa.states[nfa.size++]; s2->ctx(ctx->compile(nfa, s3)); s3 = s2; } - else if (ctx_len > 0) + else if (info->ctx_len > 0) { s3 = ctx->compile(nfa, s3); } diff --git a/re2c/src/ir/nfa/nfa.h b/re2c/src/ir/nfa/nfa.h index 28587f41..aebf0d46 100644 --- a/re2c/src/ir/nfa/nfa.h +++ b/re2c/src/ir/nfa/nfa.h @@ -10,7 +10,7 @@ namespace re2c struct Range; struct RegExp; -struct RuleOp; +struct RuleInfo; struct nfa_state_t { @@ -39,7 +39,7 @@ struct nfa_state_t } ctx; struct { - RuleOp *rule; + RuleInfo *rule; } fin; } value; bool mark; @@ -64,7 +64,7 @@ struct nfa_state_t value.ctx.out = s; mark = false; } - void fin(RuleOp *r) + void fin(RuleInfo *r) { type = FIN; value.fin.rule = r; diff --git a/re2c/src/ir/regexp/nullable.cc b/re2c/src/ir/regexp/nullable.cc index f7eaba84..727c47e8 100644 --- a/re2c/src/ir/regexp/nullable.cc +++ b/re2c/src/ir/regexp/nullable.cc @@ -41,19 +41,19 @@ bool RuleOp::nullable() const return exp->nullable(); } -void RegExp::nullable_rules(std::set&) const {} +void RegExp::nullable_rules(std::vector&) const {} -void AltOp::nullable_rules(std::set &rs) const +void AltOp::nullable_rules(std::vector &rs) const { exp1->nullable_rules(rs); exp2->nullable_rules(rs); } -void RuleOp::nullable_rules(std::set &rs) const +void RuleOp::nullable_rules(std::vector &rs) const { if (exp->nullable()) { - rs.insert(rank); + rs.push_back(info); } } diff --git a/re2c/src/ir/regexp/regexp.h b/re2c/src/ir/regexp/regexp.h index bc927e1c..5d999c2f 100644 --- a/re2c/src/ir/regexp/regexp.h +++ b/re2c/src/ir/regexp/regexp.h @@ -6,7 +6,7 @@ #include #include -#include "src/ir/rule_rank.h" +#include "src/parse/rules.h" #include "src/util/free_list.h" #include "src/util/forbid_copy.h" @@ -35,7 +35,7 @@ public: virtual uint32_t calc_size() const = 0; virtual uint32_t fixedLength (); virtual bool nullable() const = 0; - virtual void nullable_rules(std::set&) const; + virtual void nullable_rules(std::vector&) const; virtual nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n) = 0; virtual void display (std::ostream &) const = 0; friend std::ostream & operator << (std::ostream & o, const RegExp & re); diff --git a/re2c/src/ir/regexp/regexp_alt.h b/re2c/src/ir/regexp/regexp_alt.h index d7261a68..267e469d 100644 --- a/re2c/src/ir/regexp/regexp_alt.h +++ b/re2c/src/ir/regexp/regexp_alt.h @@ -20,7 +20,7 @@ public: uint32_t calc_size() const; uint32_t fixedLength (); bool nullable() const; - void nullable_rules(std::set&) const; + void nullable_rules(std::vector&) const; nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); void display (std::ostream & o) const; friend RegExp * mkAlt (RegExp *, RegExp *); diff --git a/re2c/src/ir/regexp/regexp_rule.h b/re2c/src/ir/regexp/regexp_rule.h index 6651fcd0..65df447d 100644 --- a/re2c/src/ir/regexp/regexp_rule.h +++ b/re2c/src/ir/regexp/regexp_rule.h @@ -4,7 +4,6 @@ #include #include "src/ir/regexp/regexp.h" -#include "src/parse/code.h" #include "src/globals.h" namespace re2c @@ -12,22 +11,11 @@ namespace re2c class RuleOp: public RegExp { -public: - const Loc loc; - -private: RegExp * exp; public: RegExp * ctx; - // ~0u - dynamic length - // (0; ~0u) - static length - // 0 - no context - uint32_t ctx_len; - - rule_rank_t rank; - const Code * code; - const std::string newcond; + RuleInfo *info; inline RuleOp ( const Loc & l @@ -37,23 +25,32 @@ public: , const Code * c , const std::string * cond ) - : loc (l) - , exp (r1) + : exp (r1) , ctx (r2) - , ctx_len (ctx->fixedLength()) - , rank (r) - , code (c) - , newcond (cond ? *cond : "") + , info (NULL) + { + uint32_t ctx_len = r2->fixedLength(); // cannot emulate 'YYCURSOR -= N' operation with generic API if (ctx_len != 0 && opts->input_api.type() == InputAPI::CUSTOM) { ctx_len = ~0u; } + info = new RuleInfo(l, r, c, cond, ctx_len); + } + RuleOp(RuleOp *rule, rule_rank_t r) + : exp(rule->exp) + , ctx(rule->ctx) + , info(new RuleInfo(rule->info->loc, r, rule->info->code, + &rule->info->newcond, rule->info->ctx_len)) + {} + ~RuleOp() + { + delete info; } bool nullable() const; - void nullable_rules(std::set&) const; + void nullable_rules(std::vector&) const; void display (std::ostream & o) const; void split (std::set &); uint32_t calc_size() const; diff --git a/re2c/src/ir/skeleton/control_flow.cc b/re2c/src/ir/skeleton/control_flow.cc index 74166865..fd892397 100644 --- a/re2c/src/ir/skeleton/control_flow.cc +++ b/re2c/src/ir/skeleton/control_flow.cc @@ -18,7 +18,7 @@ namespace re2c // See also note [counting skeleton edges]. void Node::naked_ways (way_t & prefix, std::vector & ways, nakeds_t &size) { - if (!rule.rank.is_none ()) + if (rule) { return; } diff --git a/re2c/src/ir/skeleton/path.h b/re2c/src/ir/skeleton/path.h index d09861e5..5cb83d1a 100644 --- a/re2c/src/ir/skeleton/path.h +++ b/re2c/src/ir/skeleton/path.h @@ -1,33 +1,14 @@ #ifndef _RE2C_IR_SKELETON_PATH_ #define _RE2C_IR_SKELETON_PATH_ +#include "src/util/c99_stdint.h" #include -#include "src/ir/rule_rank.h" -#include "src/util/c99_stdint.h" +#include "src/parse/rules.h" namespace re2c { -struct rule_t -{ - rule_rank_t rank; - bool restorectx; - - rule_t (rule_rank_t r, bool c) - : rank (r) - , restorectx (c) - {} - - // needed by STL containers - // same as 'std::pair' comparator - bool operator < (const rule_t & r) const - { - return rank < r.rank - || (!(r.rank < rank) && restorectx < r.restorectx); - } -}; - class path_t { public: @@ -36,42 +17,54 @@ public: private: std::vector arcs; - rule_t rule; + const RuleInfo *rule; size_t rule_pos; bool ctx; size_t ctx_pos; public: - explicit path_t (rule_t r, bool c) + explicit path_t (const RuleInfo *r, bool c) : arcs () , rule (r) , rule_pos (0) , ctx (c) , ctx_pos (0) {} + path_t(const path_t &p) + : arcs(p.arcs) + , rule(p.rule) + , rule_pos(p.rule_pos) + , ctx(p.ctx) + , ctx_pos(p.ctx_pos) + {} + path_t &operator=(const path_t &p) + { + new (this) path_t(p); + return *this; + } size_t len () const { return arcs.size (); } size_t len_matching () const { - return rule.restorectx + return rule && rule->ctx_len == ~0u ? ctx_pos : rule_pos; } rule_rank_t match () const { - return rule.rank; + return rule ? rule->rank : rule_rank_t::none(); } const arc_t * operator [] (size_t i) const { return arcs[i]; } - void extend (rule_t r, bool c, const arc_t * a) + void extend (const RuleInfo *r, bool c, const arc_t * a) { arcs.push_back (a); - if (!r.rank.is_none ()) + if (r) { rule = r; rule_pos = arcs.size (); @@ -84,7 +77,7 @@ public: } void append (const path_t * p) { - if (!p->rule.rank.is_none ()) + if (p->rule) { rule = p->rule; rule_pos = arcs.size () + p->rule_pos; diff --git a/re2c/src/ir/skeleton/skeleton.cc b/re2c/src/ir/skeleton/skeleton.cc index 81c2f0e7..a678246e 100644 --- a/re2c/src/ir/skeleton/skeleton.cc +++ b/re2c/src/ir/skeleton/skeleton.cc @@ -6,7 +6,6 @@ #include "src/conf/msg.h" #include "src/ir/dfa/dfa.h" #include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" #include "src/ir/skeleton/skeleton.h" namespace re2c @@ -16,19 +15,18 @@ Node::Node () : arcs () , arcsets () , loop (0) - , rule (rule_rank_t::none (), false) + , rule (NULL) , ctx (false) , dist (DIST_ERROR) , reachable () , suffix (NULL) {} -void Node::init(bool c, RuleOp *r, const std::vector > &a) +void Node::init(bool c, RuleInfo *r, const std::vector > &a) { if (r) { - rule.rank = r->rank; - rule.restorectx = r->ctx_len > 0; + rule = r; } ctx = c; @@ -124,10 +122,10 @@ Skeleton::Skeleton uint32_t maxrule = 0; for (uint32_t i = 0; i < nodes_count; ++i) { - const rule_rank_t r = nodes[i].rule.rank; - if (!r.is_none () && !r.is_def ()) + const RuleInfo *r = nodes[i].rule; + if (r && !r->rank.is_def()) { - maxrule = std::max (maxrule, r.uint32 ()); + maxrule = std::max (maxrule, r->rank.uint32 ()); } } // two upper values reserved for default and none rules) diff --git a/re2c/src/ir/skeleton/skeleton.h b/re2c/src/ir/skeleton/skeleton.h index 13b3f366..bbda6b23 100644 --- a/re2c/src/ir/skeleton/skeleton.h +++ b/re2c/src/ir/skeleton/skeleton.h @@ -25,7 +25,7 @@ namespace re2c struct dfa_t; struct OutputFile; -class RuleOp; +class RuleInfo; struct Node { @@ -75,7 +75,7 @@ struct Node uint8_t loop; // rule for corresponding DFA state (if any) - rule_t rule; + RuleInfo *rule; // start of trailing context bool ctx; @@ -86,13 +86,13 @@ struct Node uint32_t dist; // rules reachable from this node (including absent rule) - std::set reachable; + std::set reachable; // path to end node (for constructing path cover) path_t * suffix; Node (); - void init(bool b, RuleOp *r, const std::vector > &arcs); + void init(bool b, RuleInfo *r, const std::vector > &arcs); ~Node (); bool end () const; void calc_dist (); @@ -114,7 +114,7 @@ struct Skeleton Node * nodes; size_t sizeof_key; rules_t rules; - std::set nullable_rules; + std::vector nullable_rules; Skeleton ( const dfa_t &dfa diff --git a/re2c/src/ir/skeleton/unreachable_nullable.cc b/re2c/src/ir/skeleton/unreachable_nullable.cc index b4a396a6..a46c51b6 100644 --- a/re2c/src/ir/skeleton/unreachable_nullable.cc +++ b/re2c/src/ir/skeleton/unreachable_nullable.cc @@ -21,7 +21,7 @@ void Node::calc_reachable () } else if (end ()) { - reachable.insert (rule.rank); + reachable.insert (rule); } else if (loop < 2) { @@ -40,18 +40,21 @@ void Skeleton::warn_unreachable_nullable_rules () nodes->calc_reachable(); for (uint32_t i = 0; i < nodes_count; ++i) { - const rule_rank_t r1 = nodes[i].rule.rank; - const std::set & rs = nodes[i].reachable; - for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) + RuleInfo *r1 = nodes[i].rule; + if (!r1) { + continue; + } + const std::set & rs = nodes[i].reachable; + for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) { - const rule_rank_t r2 = *j; - if (r1 == r2 || r2.is_none()) + RuleInfo* r2 = *j; + if (!r2 || r1->rank == r2->rank) { - rules[r1].reachable = true; + r1->reachable = true; } else { - rules[r1].shadow.insert(r2); + r1->shadow.insert(r2->loc.line); } } } @@ -63,10 +66,10 @@ void Skeleton::warn_unreachable_nullable_rules () // default rule '*' should not be reported for (rules_t::const_iterator i = rules.begin(); i != rules.end(); ++i) { - const rule_rank_t r = i->first; - if (!r.is_none() && !r.is_def() && !rules[r].reachable) + const RuleInfo *r = *i; + if (!r->rank.is_def() && !r->reachable) { - warn.unreachable_rule(cond, i->second, rules); + warn.unreachable_rule(cond, r); } } @@ -75,13 +78,13 @@ void Skeleton::warn_unreachable_nullable_rules () // - rules that match empty strins with nonempty trailing context // false positives on partially shadowed (yet reachable) rules, e.g.: // [^]? - for (std::set::const_iterator i = nullable_rules.begin(); + for (std::vector::const_iterator i = nullable_rules.begin(); i != nullable_rules.end(); ++i) { - const rule_info_t &ri = rules[*i]; - if (ri.reachable) + const RuleInfo *ri = *i; + if (ri->reachable) { - warn.match_empty_string(ri.line); + warn.match_empty_string(ri->loc.line); } } } diff --git a/re2c/src/parse/parser.h b/re2c/src/parse/parser.h index 8901d792..965a8a52 100644 --- a/re2c/src/parse/parser.h +++ b/re2c/src/parse/parser.h @@ -1,6 +1,7 @@ #ifndef _RE2C_PARSE_PARSER_ #define _RE2C_PARSE_PARSER_ +#include #include #include diff --git a/re2c/src/parse/parser.ypp b/re2c/src/parse/parser.ypp index 76540ecc..47a3f8a9 100644 --- a/re2c/src/parse/parser.ypp +++ b/re2c/src/parse/parser.ypp @@ -648,18 +648,13 @@ void parse(Scanner& i, Output & o) if (parseMode != Scanner::Reuse) { - // <*> rules must have the lowest priority - // now that all rules have been parsed, we can fix it - for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) - { - (*itOp)->rank = rank_counter.next (); - } - // merge <*> rules to all conditions + // merge <*> rules to all conditions with lowest priority for (it = specMap.begin(); it != specMap.end(); ++it) { for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) { - it->second.add (*itOp); + RuleOp *r = new RuleOp(*itOp, rank_counter.next()); + it->second.add (r); } if (star_default) { diff --git a/re2c/src/parse/rules.h b/re2c/src/parse/rules.h index 7815372e..952e7321 100644 --- a/re2c/src/parse/rules.h +++ b/re2c/src/parse/rules.h @@ -1,28 +1,55 @@ #ifndef _RE2C_PARSE_RULES_ #define _RE2C_PARSE_RULES_ -#include +#include "src/util/c99_stdint.h" #include +#include +#include #include "src/ir/rule_rank.h" +#include "src/parse/code.h" +#include "src/parse/loc.h" +#include "src/util/forbid_copy.h" namespace re2c { -struct rule_info_t +struct RuleInfo { - uint32_t line; - std::set shadow; + const Loc loc; + + // ~0u - dynamic length + // (0; ~0u) - static length + // 0 - no context + uint32_t ctx_len; + + rule_rank_t rank; + const Code *code; + const std::string newcond; + + std::set shadow; bool reachable; - rule_info_t () - : line (0) + RuleInfo + ( const Loc & l + , rule_rank_t r + , const Code * c + , const std::string * cond + , uint32_t cl + ) + : loc (l) + , ctx_len (cl) + , rank (r) + , code (c) + , newcond (cond ? *cond : "") , shadow () , reachable (false) {} + + FORBID_COPY(RuleInfo); }; -typedef std::map rules_t; +typedef std::vector rules_t; } // namespace re2c diff --git a/re2c/src/parse/spec.h b/re2c/src/parse/spec.h index 0b68af74..27ee264b 100644 --- a/re2c/src/parse/spec.h +++ b/re2c/src/parse/spec.h @@ -1,12 +1,21 @@ #ifndef _RE2C_PARSE_SPEC_ #define _RE2C_PARSE_SPEC_ +#include + +#include "src/ir/regexp/regexp.h" #include "src/ir/regexp/regexp_rule.h" #include "src/parse/rules.h" namespace re2c { +// for std::find_if +static bool is_def(const RuleInfo *r) +{ + return r->rank.is_def(); +} + struct Spec { RegExp * re; @@ -28,7 +37,7 @@ struct Spec } bool add_def (RuleOp * r) { - if (rules.find (rule_rank_t::def ()) != rules.end ()) + if (std::find_if(rules.begin(), rules.end(), is_def) != rules.end()) { return false; } @@ -40,7 +49,7 @@ struct Spec } void add (RuleOp * r) { - rules[r->rank].line = r->loc.line; + rules.push_back(r->info); re = mkAlt (re, r); } void clear () diff --git a/re2c/test/php20150211_zend_ini_scanner.igcd--skeleton--flex-syntax--case-inverted.c b/re2c/test/php20150211_zend_ini_scanner.igcd--skeleton--flex-syntax--case-inverted.c index c0abe029..db92f4f0 100644 --- a/re2c/test/php20150211_zend_ini_scanner.igcd--skeleton--flex-syntax--case-inverted.c +++ b/re2c/test/php20150211_zend_ini_scanner.igcd--skeleton--flex-syntax--case-inverted.c @@ -1188,7 +1188,7 @@ yy78: yy80: YYSKIP (); yy81: - status = action_line652_ST_OFFSET(i, keys, input, token, &cursor, 55); + status = action_line652_ST_OFFSET(i, keys, input, token, &cursor, 57); continue; yy82: YYSKIP (); @@ -1888,7 +1888,7 @@ yy132: continue; yy135: YYSKIP (); - status = action_line652_ST_SECTION_RAW(i, keys, input, token, &cursor, 55); + status = action_line652_ST_SECTION_RAW(i, keys, input, token, &cursor, 59); continue; yy137: YYSKIP (); @@ -2172,7 +2172,7 @@ yy148: yy150: YYSKIP (); yy151: - status = action_line652_ST_SECTION_VALUE(i, keys, input, token, &cursor, 55); + status = action_line652_ST_SECTION_VALUE(i, keys, input, token, &cursor, 60); continue; yy152: YYSKIP (); @@ -4007,7 +4007,7 @@ yy263: continue; yy264: YYSKIP (); - status = action_line652_ST_VARNAME(i, keys, input, token, &cursor, 55); + status = action_line652_ST_VARNAME(i, keys, input, token, &cursor, 62); continue; yy266: YYSKIP (); @@ -5179,7 +5179,7 @@ e f"g'h;i]j k l"m'n;o]p q r"s't;u]v w x"y'z;\$\${\$\${\$\${\$\${\$\ ${\ -$\ ${\ $\ ${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\ $\!${\"$\#${\$$\%${\&$\'${\($\)${\*$\+${\,$\-${\.$\/${\0$\1${\2$\3${\4$\5${\6$\7${\8$\9${\:$\;${\<$\=${\>$\?${\@$\A${\B$\C${\D$\E${\F$\G${\H$\I${\J$\K${\L$\M${\N$\O${\P$\Q${\R$\S${\T$\U${\V$\W${\X$\Y${\Z$\[${\\$\]${\^$\_${\`$\a${\b$\c${\d$\e${\f$\g${\h$\i${\j$\k${\l$\m${\n$\o${\p$\q${\r$\s${\t$\u${\v$\w${\x$\y${\z$\{${\|$\}${\~$\${\€$\${\‚$\ƒ${\„$\…${\†$\‡${\ˆ$\‰${\Š$\‹${\Œ$\${\Ž$\${\$\‘${\’$\“${\”$\•${\–$\—${\˜$\™${\š$\›${\œ$\${\ž$\Ÿ${\ $\¡${\¢$\£${\¤$\¥${\¦$\§${\¨$\©${\ª$\«${\¬$\­${\®$\¯${\°$\±${\²$\³${\´$\µ${\¶$\·${\¸$\¹${\º$\»${\¼$\½${\¾$\¿${\À$\Á${\Â$\Ã${\Ä$\Å${\Æ$\Ç${\È$\É${\Ê$\Ë${\Ì$\Í${\Î$\Ï${\Ð$\Ñ${\Ò$\Ó${\Ô$\Õ${\Ö$\×${\Ø$\Ù${\Ú$\Û${\Ü$\Ý${\Þ$\ß${\à$\á${\â$\ã${\ä$\å${\æ$\ç${\è$\é${\ê$\ë${\ì$\í${\î$\ï${\ð$\ñ${\ò$\ó${\ô$\õ${\ö$\÷${\ø$\ù${\ú$\û${\ü$\ý${\þ$\ÿ${]$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&&$$$$&&$$$$777&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 77$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ !"#$%&'()*+,-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +$\ ${\ $\ ${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\ $\!${\"$\#${\$$\%${\&$\'${\($\)${\*$\+${\,$\-${\.$\/${\0$\1${\2$\3${\4$\5${\6$\7${\8$\9${\:$\;${\<$\=${\>$\?${\@$\A${\B$\C${\D$\E${\F$\G${\H$\I${\J$\K${\L$\M${\N$\O${\P$\Q${\R$\S${\T$\U${\V$\W${\X$\Y${\Z$\[${\\$\]${\^$\_${\`$\a${\b$\c${\d$\e${\f$\g${\h$\i${\j$\k${\l$\m${\n$\o${\p$\q${\r$\s${\t$\u${\v$\w${\x$\y${\z$\{${\|$\}${\~$\${\€$\${\‚$\ƒ${\„$\…${\†$\‡${\ˆ$\‰${\Š$\‹${\Œ$\${\Ž$\${\$\‘${\’$\“${\”$\•${\–$\—${\˜$\™${\š$\›${\œ$\${\ž$\Ÿ${\ $\¡${\¢$\£${\¤$\¥${\¦$\§${\¨$\©${\ª$\«${\¬$\­${\®$\¯${\°$\±${\²$\³${\´$\µ${\¶$\·${\¸$\¹${\º$\»${\¼$\½${\¾$\¿${\À$\Á${\Â$\Ã${\Ä$\Å${\Æ$\Ç${\È$\É${\Ê$\Ë${\Ì$\Í${\Î$\Ï${\Ð$\Ñ${\Ò$\Ó${\Ô$\Õ${\Ö$\×${\Ø$\Ù${\Ú$\Û${\Ü$\Ý${\Þ$\ß${\à$\á${\â$\ã${\ä$\å${\æ$\ç${\è$\é${\ê$\ë${\ì$\í${\î$\ï${\ð$\ñ${\ò$\ó${\ô$\õ${\ö$\÷${\ø$\ù${\ú$\û${\ü$\ý${\þ$\ÿ${]$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&&$$$$&&$$$$999&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ !"#$%&'()*+,-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ @@ -6231,7 +6231,7 @@ y z]{ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] !] "] #] $] %] &] '] (] )] *] +] ,] -] .] /] 0] 1] 2] 3] 4] 5] 6] 7] 8] 9] :] ;] <] =] >] ?] @] A] B] C] D] E] F] G] H] I] J] K] L] M] N] O] P] Q] R] S] T] U] V] W] X] Y] Z] [] \] ]] ^] _] `] a] b] c] d] e] f] g] h] i] j] k] l] m] n] o] p] q] r] s] t] u] v] w] x] y] z] {] |] }] ~] ] €] ] ‚] ƒ] „] …] †] ‡] ˆ] ‰] Š] ‹] Œ] ] Ž] ] ] ‘] ’] “] ”] •] –] —] ˜] ™] š] ›] œ] ] ž] Ÿ]  ] ¡] ¢] £] ¤] ¥] ¦] §] ¨] ©] ª] «] ¬] ­] ®] ¯] °] ±] ²] ³] ´] µ] ¶] ·] ¸] ¹] º] »] ¼] ½] ¾] ¿] À] Á] Â] Ã] Ä] Å] Æ] Ç] È] É] Ê] Ë] Ì] Í] Î] Ï] Ð] Ñ] Ò] Ó] Ô] Õ] Ö] ×] Ø] Ù] Ú] Û] Ü] Ý] Þ] ß] à] á] â] ã] ä] å] æ] ç] è] é] ê] ë] ì] í] î] ï] ð] ñ] ò] ó] ô] õ] ö] ÷] ø] ù] ú] û] ü] ý] þ] ÿ] ] -]]]]]]]]]] ] ]]]]]]]]]]]]]]]]]]]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g]h]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]€]]‚]ƒ]„]…]†]‡]ˆ]‰]Š]‹]Œ]]Ž]]]‘]’]“]”]•]–]—]˜]™]š]›]œ]]ž]Ÿ] ]¡]¢]£]¤]¥]¦]§]¨]©]ª]«]¬]­]®]¯]°]±]²]³]´]µ]¶]·]¸]¹]º]»]¼]½]¾]¿]À]Á]Â]Ã]Ä]Å]Æ]Ç]È]É]Ê]Ë]Ì]Í]Î]Ï]Ð]Ñ]Ò]Ó]Ô]Õ]Ö]×]Ø]Ù]Ú]Û]Ü]Ý]Þ]ß]à]á]â]ã]ä]å]æ]ç]è]é]ê]ë]ì]í]î]ï]ð]ñ]ò]ó]ô]õ]ö]÷]ø]ù]ú]û]ü]ý]þ]ÿ77$${$${$${$${$ ${ $ ${$${$${$${$${$${$${$${$${$!${# $%!!${&##$(%%${)&&$*((${+))$,**${/++$:,,${<--$=..${>//$?00${@11$[22${^33$`44${{55$|66${}77$~88${99$€::${<<$‚==${ƒ>>$„??${…@@$†AA${‡BB$ˆCC${‰DD$ŠEE${‹FF$ŒGG${HH$ŽII${JJ$KK${‘LL$’MM${“NN$”OO${•PP$–QQ${—RR$˜SS${™TT$šUU${›VV$œWW${XX$žYY${ŸZZ$ [[${¡^^$¢__${£``$¤aa${¥bb$¦cc${§dd$¨ee${©ff$ªgg${«hh$¬ii${­jj$®kk${¯ll$°mm${±nn$²oo${³pp$´qq${µrr$¶ss${·tt$¸uu${¹vv$ºww${»xx$¼yy${½zz$¾{{${¿||$À}}${Á~~$Â${À€$ā${ł‚$ƃƒ${DŽ„$ȅ…${Ɇ†$ʇ‡${ˈˆ$̉‰${͊Š$΋‹${όŒ$Ѝ${юŽ$ҏ${Ӑ$ԑ‘${Ւ’$֓“${ה”$ؕ•${ٖ–$ڗ—${ۘ˜$ܙ™${ݚš$ޛ›${ߜœ$à${ឞ$⟟${ã  $ä¡¡${墢$棣${礤$襥${馦$ꧧ${먨$ì©©${íªª$î««${שּׁ$ð­­${ñ®®$ò¯¯${ó°°$ô±±${õ²²$ö³³${÷´´$øµµ${ù¶¶$ú··${û¸¸$ü¹¹${ýºº$þ»»${ÿ¼¼$½½${¾¾$¿¿${ÀÀ$ÁÁ${ÂÂ$ÃÃ${ÄÄ$ÅÅ${ ÆÆ$ ÇÇ${ÈÈ$ÉÉ${ÊÊ$ËË${ÌÌ$ÍÍ${ÎÎ$ÏÏ${ÐÐ$ÑÑ${ÒÒ$ÓÓ${ÔÔ$ÕÕ${ÖÖ$××${ØØ$ÙÙ${!ÚÚ$#ÛÛ${%ÜÜ$&ÝÝ${(ÞÞ$)ßß${*àà$+áá${,ââ$/ãã${:ää$<åå${=ææ$>çç${?èè$@éé${[êê$^ëë${`ìì${íí${|îî$}ïï${~ðð$ññ${€òò$óó${‚ôô$ƒõõ${„öö$…÷÷${†øø$‡ùù${ˆúú$‰ûû${Šüü$‹ýý${Œþþ$ÿÿ${\$\${\$\${\$\${\$\${\$ \ ${ \ +]]]]]]]]]] ] ]]]]]]]]]]]]]]]]]]]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g]h]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]€]]‚]ƒ]„]…]†]‡]ˆ]‰]Š]‹]Œ]]Ž]]]‘]’]“]”]•]–]—]˜]™]š]›]œ]]ž]Ÿ] ]¡]¢]£]¤]¥]¦]§]¨]©]ª]«]¬]­]®]¯]°]±]²]³]´]µ]¶]·]¸]¹]º]»]¼]½]¾]¿]À]Á]Â]Ã]Ä]Å]Æ]Ç]È]É]Ê]Ë]Ì]Í]Î]Ï]Ð]Ñ]Ò]Ó]Ô]Õ]Ö]×]Ø]Ù]Ú]Û]Ü]Ý]Þ]ß]à]á]â]ã]ä]å]æ]ç]è]é]ê]ë]ì]í]î]ï]ð]ñ]ò]ó]ô]õ]ö]÷]ø]ù]ú]û]ü]ý]þ]ÿ;;$${$${$${$${$ ${ $ ${$${$${$${$${$${$${$${$${$!${# $%!!${&##$(%%${)&&$*((${+))$,**${/++$:,,${<--$=..${>//$?00${@11$[22${^33$`44${{55$|66${}77$~88${99$€::${<<$‚==${ƒ>>$„??${…@@$†AA${‡BB$ˆCC${‰DD$ŠEE${‹FF$ŒGG${HH$ŽII${JJ$KK${‘LL$’MM${“NN$”OO${•PP$–QQ${—RR$˜SS${™TT$šUU${›VV$œWW${XX$žYY${ŸZZ$ [[${¡^^$¢__${£``$¤aa${¥bb$¦cc${§dd$¨ee${©ff$ªgg${«hh$¬ii${­jj$®kk${¯ll$°mm${±nn$²oo${³pp$´qq${µrr$¶ss${·tt$¸uu${¹vv$ºww${»xx$¼yy${½zz$¾{{${¿||$À}}${Á~~$Â${À€$ā${ł‚$ƃƒ${DŽ„$ȅ…${Ɇ†$ʇ‡${ˈˆ$̉‰${͊Š$΋‹${όŒ$Ѝ${юŽ$ҏ${Ӑ$ԑ‘${Ւ’$֓“${ה”$ؕ•${ٖ–$ڗ—${ۘ˜$ܙ™${ݚš$ޛ›${ߜœ$à${ឞ$⟟${ã  $ä¡¡${墢$棣${礤$襥${馦$ꧧ${먨$ì©©${íªª$î««${שּׁ$ð­­${ñ®®$ò¯¯${ó°°$ô±±${õ²²$ö³³${÷´´$øµµ${ù¶¶$ú··${û¸¸$ü¹¹${ýºº$þ»»${ÿ¼¼$½½${¾¾$¿¿${ÀÀ$ÁÁ${ÂÂ$ÃÃ${ÄÄ$ÅÅ${ ÆÆ$ ÇÇ${ÈÈ$ÉÉ${ÊÊ$ËË${ÌÌ$ÍÍ${ÎÎ$ÏÏ${ÐÐ$ÑÑ${ÒÒ$ÓÓ${ÔÔ$ÕÕ${ÖÖ$××${ØØ$ÙÙ${!ÚÚ$#ÛÛ${%ÜÜ$&ÝÝ${(ÞÞ$)ßß${*àà$+áá${,ââ$/ãã${:ää$<åå${=ææ$>çç${?èè$@éé${[êê$^ëë${`ìì${íí${|îî$}ïï${~ðð$ññ${€òò$óó${‚ôô$ƒõõ${„öö$…÷÷${†øø$‡ùù${ˆúú$‰ûû${Šüü$‹ýý${Œþþ$ÿÿ${\$\${\$\${\$\${\$\${\$ \ ${ \ $ \ ${\ $\ ${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\$!\${# \$%!!\${&##\ $(%%\!${)&&\"$*((\#${+))\$$,**\%${/++\&$:,,\'${<--\($=..\)${>//\*$?00\+${@11\,$[22\-${^33\.$`44\/${{55\0$|66\1${}77\2$~88\3${99\4$€::\5${<<\6$‚==\7${ƒ>>\8$„??\9${…@@\:$†AA\;${‡BB\<$ˆCC\=${‰DD\>$ŠEE\?${‹FF\@$ŒGG\A${HH\B$ŽII\C${JJ\D$KK\E${‘LL\F$’MM\G${“NN\H$”OO\I${•PP\J$–QQ\K${—RR\L$˜SS\M${™TT\N$šUU\O${›VV\P$œWW\Q${XX\R$žYY\S${ŸZZ\T$ [[\U${¡^^\V$¢__\W${£``\X$¤aa\Y${¥bb\Z$¦cc\[${§dd\\$¨ee\]${©ff\^$ªgg\_${«hh\`$¬ii\a${­jj\b$®kk\c${¯ll\d$°mm\e${±nn\f$²oo\g${³pp\h$´qq\i${µrr\j$¶ss\k${·tt\l$¸uu\m${¹vv\n$ºww\o${»xx\p$¼yy\q${½zz\r$¾{{\s${¿||\t$À}}\u${Á~~\v$Â\w${À€\x$ā\y${ł‚\z$ƃƒ\{${DŽ„\|$ȅ…\}${Ɇ†\~$ʇ‡\${ˈˆ\€$̉‰\${͊Š\‚$΋‹\ƒ${όŒ\„$Ѝ\…${юŽ\†$ҏ\‡${Ӑ\ˆ$ԑ‘\‰${Ւ’\Š$֓“\‹${ה”\Œ$ؕ•\${ٖ–\Ž$ڗ—\${ۘ˜\$ܙ™\‘${ݚš\’$ޛ›\“${ߜœ\”$à\•${ឞ\–$⟟\—${ã  \˜$ä¡¡\™${墢\š$棣\›${礤\œ$襥\${馦\ž$ꧧ\Ÿ${먨\ $ì©©\¡${íªª\¢$î««\£${שּׁ\¤$ð­­\¥${ñ®®\¦$ò¯¯\§${ó°°\¨$ô±±\©${õ²²\ª$ö³³\«${÷´´\¬$øµµ\­${ù¶¶\®$ú··\¯${û¸¸\°$ü¹¹\±${ýºº\²$þ»»\³${ÿ¼¼\´$½½\µ${¾¾\¶$¿¿\·${ÀÀ\¸$ÁÁ\¹${ÂÂ\º$ÃÃ\»${ÄÄ\¼$ÅÅ\½${ ÆÆ\¾$ ÇÇ\¿${ÈÈ\À$ÉÉ\Á${ÊÊ\Â$ËË\Ã${ÌÌ\Ä$ÍÍ\Å${ÎÎ\Æ$ÏÏ\Ç${ÐÐ\È$ÑÑ\É${ÒÒ\Ê$ÓÓ\Ë${ÔÔ\Ì$ÕÕ\Í${ÖÖ\Î$××\Ï${ØØ\Ð$ÙÙ\Ñ${!ÚÚ\Ò$#ÛÛ\Ó${%ÜÜ\Ô$&ÝÝ\Õ${(ÞÞ\Ö$)ßß\×${*àà\Ø$+áá\Ù${,ââ\Ú$/ãã\Û${:ää\Ü$<åå\Ý${=ææ\Þ$>çç\ß${?èè\à$@éé\á${[êê\â$^ëë\ã${`ìì\ä${íí\å${|îî\æ$}ïï\ç${~ðð\è$ññ\é${€òò\ê$óó\ë${‚ôô\ì$ƒõõ\í${„öö\î$…÷÷\ï${†øø\ð$‡ùù\ñ${ˆúú\ò$‰ûû\ó${Šüü\ô$‹ýý\õ${Œþþ\ö$ÿÿ\÷${Ž\ø$\ù${\ú$‘\û${’\ü$“\ý${”\þ$•\ÿ${  "';]  " ' ; ] @@ -6419,8 +6419,8 @@ $\ ${\ $\ ${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\$\${\ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] !] "] #] $] %] &] '] (] )] *] +] ,] -] .] /] 0] 1] 2] 3] 4] 5] 6] 7] 8] 9] :] ;] <] =] >] ?] @] A] B] C] D] E] F] G] H] I] J] K] L] M] N] O] P] Q] R] S] T] U] V] W] X] Y] Z] [] \] ]] ^] _] `] a] b] c] d] e] f] g] h] i] j] k] l] m] n] o] p] q] r] s] t] u] v] w] x] y] z] {] |] }] ~] ] €] ] ‚] ƒ] „] …] †] ‡] ˆ] ‰] Š] ‹] Œ] ] Ž] ] ] ‘] ’] “] ”] •] –] —] ˜] ™] š] ›] œ] ] ž] Ÿ]  ] ¡] ¢] £] ¤] ¥] ¦] §] ¨] ©] ª] «] ¬] ­] ®] ¯] °] ±] ²] ³] ´] µ] ¶] ·] ¸] ¹] º] »] ¼] ½] ¾] ¿] À] Á] Â] Ã] Ä] Å] Æ] Ç] È] É] Ê] Ë] Ì] Í] Î] Ï] Ð] Ñ] Ò] Ó] Ô] Õ] Ö] ×] Ø] Ù] Ú] Û] Ü] Ý] Þ] ß] à] á] â] ã] ä] å] æ] ç] è] é] ê] ë] ì] í] î] ï] ð] ñ] ò] ó] ô] õ] ö] ÷] ø] ù] ú] û] ü] ý] þ] ÿ] ] -]]]]]]]]]] ] ]]]]]]]]]]]]]]]]]]]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g]h]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]€]]‚]ƒ]„]…]†]‡]ˆ]‰]Š]‹]Œ]]Ž]]]‘]’]“]”]•]–]—]˜]™]š]›]œ]]ž]Ÿ] ]¡]¢]£]¤]¥]¦]§]¨]©]ª]«]¬]­]®]¯]°]±]²]³]´]µ]¶]·]¸]¹]º]»]¼]½]¾]¿]À]Á]Â]Ã]Ä]Å]Æ]Ç]È]É]Ê]Ë]Ì]Í]Î]Ï]Ð]Ñ]Ò]Ó]Ô]Õ]Ö]×]Ø]Ù]Ú]Û]Ü]Ý]Þ]ß]à]á]â]ã]ä]å]æ]ç]è]é]ê]ë]ì]í]î]ï]ð]ñ]ò]ó]ô]õ]ö]÷]ø]ù]ú]û]ü]ý]þ]ÿ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''%%%%%''%%%%%777'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -77%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$ $\$\$ $\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$###$\$\$%%%$\$\$***$\$\$+++$\$\$,,,$\$\$/--$\$\$:..$\$\$00$\$\$?11$\$\$@22$\$\$[33$\$\$\44$\$\$]55$\$\$`66$\$\${77$\$\$}88$\$\$99$\$\$€::$\$\$<<$\$\$‚>>$\$\$ƒ??$\$\$„@@$\$\$…AA$\$\$†BB$\$\$‡CC$\$\$ˆDD$\$\$‰EE$\$\$ŠFF$\$\$‹GG$\$\$ŒHH$\$\$II$\$\$ŽJJ$\$\$KK$\$\$LL$\$\$‘MM$\$\$’NN$\$\$“OO$\$\$”PP$\$\$•QQ$\$\$–RR$\$\$—SS$\$\$˜TT$\$\$™UU$\$\$šVV$\$\$›WW$\$\$œXX$\$\$YY$\$\$žZZ$\$\$Ÿ[[$\$\$ \\$\$\$¡]]$\$\$¢__$\$\$£``$\$\$¤aa$\$\$¥bb$\$\$¦cc$\$\$§dd$\$\$¨ee$\$\$©ff$\$\$ªgg$\$\$«hh$\$\$¬ii$\$\$­jj$\$\$®kk$\$\$¯ll$\$\$°mm$\$\$±nn$\$\$²oo$\$\$³pp$\$\$´qq$\$\$µrr$\$\$¶ss$\$\$·tt$\$\$¸uu$\$\$¹vv$\$\$ºww$\$\$»xx$\$\$¼yy$\$\$½zz$\$\$¾{{$\$\$¿}}$\$\$À$\$\$Á€€$\$\$$\$\$‚$\$\$ăƒ$\$\$ń„$\$\$ƅ…$\$\$dž†$\$\$ȇ‡$\$\$Ɉˆ$\$\$ʉ‰$\$\$ˊŠ$\$\$̋‹$\$\$͌Œ$\$\$΍$\$\$ώŽ$\$\$Џ$\$\$ѐ$\$\$ґ‘$\$\$Ӓ’$\$\$ԓ“$\$\$Ք”$\$\$֕•$\$\$ז–$\$\$ؗ—$\$\$٘˜$\$\$ڙ™$\$\$ۚš$\$\$ܛ›$\$\$ݜœ$\$\$ޝ$\$\$ߞž$\$\$àŸŸ$\$\$á  $\$\$â¡¡$\$\$㢢$\$\$䣣$\$\$夤$\$\$楥$\$\$禦$\$\$觧$\$\$騨$\$\$ê©©$\$\$몪$\$\$ì««$\$\$í¬¬$\$\$î­­$\$\$ï®®$\$\$ð¯¯$\$\$ñ°°$\$\$ò±±$\$\$ó²²$\$\$ô³³$\$\$õ´´$\$\$öµµ$\$\$÷¶¶$\$\$ø··$\$\$ù¸¸$\$\$ú¹¹$\$\$ûºº$\$\$ü»»$\$\$ý¼¼$\$\$þ½½$\$\$ÿ¾¾$\$\$¿¿$\$\$ÀÀ$\$\$ÁÁ$\$\$ÂÂ$\$\$ÃÃ$\$\$ÄÄ$\$\$ÅÅ$\$\$ÆÆ$\$\$ ÇÇ$\$\$ ÈÈ$\$\$ÉÉ$\$\$ÊÊ$\$\$ËË$\$\$ÌÌ$\$\$ÍÍ$\$\$ÎÎ$\$\$ÏÏ$\$\$ÐÐ$\$\$ÑÑ$\$\$ÒÒ$\$\$ÓÓ$\$\$ÔÔ$\$\$ÕÕ$\$\$ÖÖ$\$\$××$\$\$ØØ$\$\$ÙÙ$\$\$ÚÚ$\$\$#ÛÛ$\$\$%ÜÜ$\$\$*ÝÝ$\$\$+ÞÞ$\$\$,ßß$\$\$/àà$\$\$:áá$\$\$<ââ$\$\$>ãã$\$\$?ää$\$\$@åå$\$\$[ææ$\$\$\çç$\$\$]èè$\$\$`éé$\$\${êê$\$\$}ëë$\$\$ìì$\$\$€íí$\$\$îî$\$\$‚ïï$\$\$ƒðð$\$\$„ññ$\$\$…òò$\$\$†óó$\$\$‡ôô$\$\$ˆõõ$\$\$‰öö$\$\$Š÷÷$\$\$‹øø$\$\$Œùù$\$\$úú$\$\$Žûû$\$\$üü$\$\$ýý$\$\$‘þþ$\$\$’ÿÿ$\$\$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$ $\$$ $\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$###$\$$%%%$\$$***$\$$+++$\$$,,,$\$$/--$\$$:..$\$$00$\$$?11$\$$@22$\$$[33$\$$\44$\$$]55$\$$`66$\$${77$\$$}88$\$$99$\$$€::$\$$<<$\$$‚>>$\$$ƒ??$\$$„@@$\$$…AA$\$$†BB$\$$‡CC$\$$ˆDD$\$$‰EE$\$$ŠFF$\$$‹GG$\$$ŒHH$\$$II$\$$ŽJJ$\$$KK$\$$LL$\$$‘MM$\$$’NN$\$$“OO$\$$”PP$\$$•QQ$\$$–RR$\$$—SS$\$$˜TT$\$$™UU$\$$šVV$\$$›WW$\$$œXX$\$$YY$\$$žZZ$\$$Ÿ[[$\$$ \\$\$$¡]]$\$$¢__$\$$£``$\$$¤aa$\$$¥bb$\$$¦cc$\$$§dd$\$$¨ee$\$$©ff$\$$ªgg$\$$«hh$\$$¬ii$\$$­jj$\$$®kk$\$$¯ll$\$$°mm$\$$±nn$\$$²oo$\$$³pp$\$$´qq$\$$µrr$\$$¶ss$\$$·tt$\$$¸uu$\$$¹vv$\$$ºww$\$$»xx$\$$¼yy$\$$½zz$\$$¾{{$\$$¿}}$\$$À$\$$Á€€$\$$$\$$‚$\$$ăƒ$\$$ń„$\$$ƅ…$\$$dž†$\$$ȇ‡$\$$Ɉˆ$\$$ʉ‰$\$$ˊŠ$\$$̋‹$\$$͌Œ$\$$΍$\$$ώŽ$\$$Џ$\$$ѐ$\$$ґ‘$\$$Ӓ’$\$$ԓ“$\$$Ք”$\$$֕•$\$$ז–$\$$ؗ—$\$$٘˜$\$$ڙ™$\$$ۚš$\$$ܛ›$\$$ݜœ$\$$ޝ$\$$ߞž$\$$àŸŸ$\$$á  $\$$â¡¡$\$$㢢$\$$䣣$\$$夤$\$$楥$\$$禦$\$$觧$\$$騨$\$$ê©©$\$$몪$\$$ì««$\$$í¬¬$\$$î­­$\$$ï®®$\$$ð¯¯$\$$ñ°°$\$$ò±±$\$$ó²²$\$$ô³³$\$$õ´´$\$$öµµ$\$$÷¶¶$\$$ø··$\$$ù¸¸$\$$ú¹¹$\$$ûºº$\$$ü»»$\$$ý¼¼$\$$þ½½$\$$ÿ¾¾$\$$¿¿$\$$ÀÀ$\$$ÁÁ$\$$ÂÂ$\$$ÃÃ$\$$ÄÄ$\$$ÅÅ$\$$ÆÆ$\$$ ÇÇ$\$$ ÈÈ$\$$ÉÉ$\$$ÊÊ$\$$ËË$\$$ÌÌ$\$$ÍÍ$\$$ÎÎ$\$$ÏÏ$\$$ÐÐ$\$$ÑÑ$\$$ÒÒ$\$$ÓÓ$\$$ÔÔ$\$$ÕÕ$\$$ÖÖ$\$$××$\$$ØØ$\$$ÙÙ$\$$ÚÚ$\$$#ÛÛ$\$$%ÜÜ$\$$*ÝÝ$\$$+ÞÞ$\$$,ßß$\$$/àà$\$$:áá$\$$<ââ$\$$>ãã$\$$?ää$\$$@åå$\$$[ææ$\$$\çç$\$$]èè$\$$`éé$\$${êê$\$$}ëë$\$$ìì$\$$€íí$\$$îî$\$$‚ïï$\$$ƒðð$\$$„ññ$\$$…òò$\$$†óó$\$$‡ôô$\$$ˆõõ$\$$‰öö$\$$Š÷÷$\$$‹øø$\$$Œùù$\$$úú$\$$Žûû$\$$üü$\$$ýý$\$$‘þþ$\$$’ÿÿ$\$$$\$$\$$\$$\$$\$$\$$\$$\$ $\$ $\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$###$\$%%%$\$***$\$+++$\$,,,$\$/--$\$:..$\$00$\$?11$\$@22$\$[33$\$\44$\$]55$\$`66$\${77$\$}88$\$99$\$€::$\$<<$\$‚>>$\$ƒ??$\$„@@$\$…AA$\$†BB$\$‡CC$\$ˆDD$\$‰EE$\$ŠFF$\$‹GG$\$ŒHH$\$II$\$ŽJJ$\$KK$\$LL$\$‘MM$\$’NN$\$“OO$\$”PP$\$•QQ$\$–RR$\$—SS$\$˜TT$\$™UU$\$šVV$\$›WW$\$œXX$\$YY$\$žZZ$\$Ÿ[[$\$ \\$\$¡]]$\$¢__$\$£``$\$¤aa$\$¥bb$\$¦cc$\$§dd$\$¨ee$\$©ff$\$ªgg$\$«hh$\$¬ii$\$­jj$\$®kk$\$¯ll$\$°mm$\$±nn$\$²oo$\$³pp$\$´qq$\$µrr$\$¶ss$\$·tt$\$¸uu$\$¹vv$\$ºww$\$»xx$\$¼yy$\$½zz$\$¾{{$\$¿}}$\$À$\$Á€€$\$$\$‚$\$ăƒ$\$ń„$\$ƅ…$\$dž†$\$ȇ‡$\$Ɉˆ$\$ʉ‰$\$ˊŠ$\$̋‹$\$͌Œ$\$΍$\$ώŽ$\$Џ$\$ѐ$\$ґ‘$\$Ӓ’$\$ԓ“$\$Ք”$\$֕•$\$ז–$\$ؗ—$\$٘˜$\$ڙ™$\$ۚš$\$ܛ›$\$ݜœ$\$ޝ$\$ߞž$\$àŸŸ$\$á  $\$â¡¡$\$㢢$\$䣣$\$夤$\$楥$\$禦$\$觧$\$騨$\$ê©©$\$몪$\$ì««$\$í¬¬$\$î­­$\$ï®®$\$ð¯¯$\$ñ°°$\$ò±±$\$ó²²$\$ô³³$\$õ´´$\$öµµ$\$÷¶¶$\$ø··$\$ù¸¸$\$ú¹¹$\$ûºº$\$ü»»$\$ý¼¼$\$þ½½$\$ÿ¾¾$\$¿¿$\$ÀÀ$\$ÁÁ$\$ÂÂ$\$ÃÃ$\$ÄÄ$\$ÅÅ$\$ÆÆ$\$ ÇÇ$\$ ÈÈ$\$ÉÉ$\$ÊÊ$\$ËË$\$ÌÌ$\$ÍÍ$\$ÎÎ$\$ÏÏ$\$ÐÐ$\$ÑÑ$\$ÒÒ$\$ÓÓ$\$ÔÔ$\$ÕÕ$\$ÖÖ$\$××$\$ØØ$\$ÙÙ$\$ÚÚ$\$#ÛÛ$\$%ÜÜ$\$*ÝÝ$\$+ÞÞ$\$,ßß$\$/àà$\$:áá$\$<ââ$\$>ãã$\$?ää$\$@åå$\$[ææ$\$\çç$\$]èè$\$`éé$\${êê$\$}ëë$\$ìì$\$€íí$\$îî$\$‚ïï$\$ƒðð$\$„ññ$\$…òò$\$†óó$\$‡ôô$\$ˆõõ$\$‰öö$\$Š÷÷$\$‹øø$\$Œùù$\$úú$\$Žûû$\$üü$\$ýý$\$‘þþ$\$’ÿÿ$\$$${$${$${$${ $ ${$${$${$${$${$${$${$${$${$${###$%%%${***$+++${,,,$/--${:..$00$?11${@22$[33${\44$]55${`66${77${}88$99${€::$<<${‚>>$ƒ??${„@@$…AA${†BB$‡CC${ˆDD$‰EE${ŠFF$‹GG${ŒHH$II${ŽJJ$KK${LL$‘MM${’NN$“OO${”PP$•QQ${–RR$—SS${˜TT$™UU${šVV$›WW${œXX$YY${žZZ$Ÿ[[${ \\$¡]]${¢__$£``${¤aa$¥bb${¦cc$§dd${¨ee$©ff${ªgg$«hh${¬ii$­jj${®kk$¯ll${°mm$±nn${²oo$³pp${´qq$µrr${¶ss$·tt${¸uu$¹vv${ºww$»xx${¼yy$½zz${¾{{$¿}}${À$Á€€${$‚${ăƒ$ń„${ƅ…$dž†${ȇ‡$Ɉˆ${ʉ‰$ˊŠ${̋‹$͌Œ${΍$ώŽ${Џ$ѐ${ґ‘$Ӓ’${ԓ“$Ք”${֕•$ז–${ؗ—$٘˜${ڙ™$ۚš${ܛ›$ݜœ${ޝ$ߞž${àŸŸ$á  ${â¡¡$㢢${䣣$夤${楥$禦${觧$騨${ê©©$몪${ì««$í¬¬${î­­$ï®®${ð¯¯$ñ°°${ò±±$ó²²${ô³³$õ´´${öµµ$÷¶¶${ø··$ù¸¸${ú¹¹$ûºº${ü»»$ý¼¼${þ½½$ÿ¾¾${¿¿$ÀÀ${ÁÁ$ÂÂ${ÃÃ$ÄÄ${ÅÅ$ÆÆ${ ÇÇ$ ÈÈ${ÉÉ$ÊÊ${ËË$ÌÌ${ÍÍ$ÎÎ${ÏÏ$ÐÐ${ÑÑ$ÒÒ${ÓÓ$ÔÔ${ÕÕ$ÖÖ${××$ØØ${ÙÙ$ÚÚ${#ÛÛ$%ÜÜ${*ÝÝ$+ÞÞ${,ßß$/àà${:áá$<ââ${>ãã$?ää${@åå$[ææ${\çç$]èè${`éé${êê${}ëë$ìì${€íí$îî${‚ïï$ƒðð${„ññ$…òò${†óó$‡ôô${ˆõõ$‰öö${Š÷÷$‹øø${Œùù$úú${Žûû$üü${ýý$‘þþ${’ÿÿ$  +]]]]]]]]]] ] ]]]]]]]]]]]]]]]]]]]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g]h]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]€]]‚]ƒ]„]…]†]‡]ˆ]‰]Š]‹]Œ]]Ž]]]‘]’]“]”]•]–]—]˜]™]š]›]œ]]ž]Ÿ] ]¡]¢]£]¤]¥]¦]§]¨]©]ª]«]¬]­]®]¯]°]±]²]³]´]µ]¶]·]¸]¹]º]»]¼]½]¾]¿]À]Á]Â]Ã]Ä]Å]Æ]Ç]È]É]Ê]Ë]Ì]Í]Î]Ï]Ð]Ñ]Ò]Ó]Ô]Õ]Ö]×]Ø]Ù]Ú]Û]Ü]Ý]Þ]ß]à]á]â]ã]ä]å]æ]ç]è]é]ê]ë]ì]í]î]ï]ð]ñ]ò]ó]ô]õ]ö]÷]ø]ù]ú]û]ü]ý]þ]ÿ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''%%%%%''%%%%%<<<'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +<<%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$ $\$\$ $\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$$\$\$###$\$\$%%%$\$\$***$\$\$+++$\$\$,,,$\$\$/--$\$\$:..$\$\$00$\$\$?11$\$\$@22$\$\$[33$\$\$\44$\$\$]55$\$\$`66$\$\${77$\$\$}88$\$\$99$\$\$€::$\$\$<<$\$\$‚>>$\$\$ƒ??$\$\$„@@$\$\$…AA$\$\$†BB$\$\$‡CC$\$\$ˆDD$\$\$‰EE$\$\$ŠFF$\$\$‹GG$\$\$ŒHH$\$\$II$\$\$ŽJJ$\$\$KK$\$\$LL$\$\$‘MM$\$\$’NN$\$\$“OO$\$\$”PP$\$\$•QQ$\$\$–RR$\$\$—SS$\$\$˜TT$\$\$™UU$\$\$šVV$\$\$›WW$\$\$œXX$\$\$YY$\$\$žZZ$\$\$Ÿ[[$\$\$ \\$\$\$¡]]$\$\$¢__$\$\$£``$\$\$¤aa$\$\$¥bb$\$\$¦cc$\$\$§dd$\$\$¨ee$\$\$©ff$\$\$ªgg$\$\$«hh$\$\$¬ii$\$\$­jj$\$\$®kk$\$\$¯ll$\$\$°mm$\$\$±nn$\$\$²oo$\$\$³pp$\$\$´qq$\$\$µrr$\$\$¶ss$\$\$·tt$\$\$¸uu$\$\$¹vv$\$\$ºww$\$\$»xx$\$\$¼yy$\$\$½zz$\$\$¾{{$\$\$¿}}$\$\$À$\$\$Á€€$\$\$$\$\$‚$\$\$ăƒ$\$\$ń„$\$\$ƅ…$\$\$dž†$\$\$ȇ‡$\$\$Ɉˆ$\$\$ʉ‰$\$\$ˊŠ$\$\$̋‹$\$\$͌Œ$\$\$΍$\$\$ώŽ$\$\$Џ$\$\$ѐ$\$\$ґ‘$\$\$Ӓ’$\$\$ԓ“$\$\$Ք”$\$\$֕•$\$\$ז–$\$\$ؗ—$\$\$٘˜$\$\$ڙ™$\$\$ۚš$\$\$ܛ›$\$\$ݜœ$\$\$ޝ$\$\$ߞž$\$\$àŸŸ$\$\$á  $\$\$â¡¡$\$\$㢢$\$\$䣣$\$\$夤$\$\$楥$\$\$禦$\$\$觧$\$\$騨$\$\$ê©©$\$\$몪$\$\$ì««$\$\$í¬¬$\$\$î­­$\$\$ï®®$\$\$ð¯¯$\$\$ñ°°$\$\$ò±±$\$\$ó²²$\$\$ô³³$\$\$õ´´$\$\$öµµ$\$\$÷¶¶$\$\$ø··$\$\$ù¸¸$\$\$ú¹¹$\$\$ûºº$\$\$ü»»$\$\$ý¼¼$\$\$þ½½$\$\$ÿ¾¾$\$\$¿¿$\$\$ÀÀ$\$\$ÁÁ$\$\$ÂÂ$\$\$ÃÃ$\$\$ÄÄ$\$\$ÅÅ$\$\$ÆÆ$\$\$ ÇÇ$\$\$ ÈÈ$\$\$ÉÉ$\$\$ÊÊ$\$\$ËË$\$\$ÌÌ$\$\$ÍÍ$\$\$ÎÎ$\$\$ÏÏ$\$\$ÐÐ$\$\$ÑÑ$\$\$ÒÒ$\$\$ÓÓ$\$\$ÔÔ$\$\$ÕÕ$\$\$ÖÖ$\$\$××$\$\$ØØ$\$\$ÙÙ$\$\$ÚÚ$\$\$#ÛÛ$\$\$%ÜÜ$\$\$*ÝÝ$\$\$+ÞÞ$\$\$,ßß$\$\$/àà$\$\$:áá$\$\$<ââ$\$\$>ãã$\$\$?ää$\$\$@åå$\$\$[ææ$\$\$\çç$\$\$]èè$\$\$`éé$\$\${êê$\$\$}ëë$\$\$ìì$\$\$€íí$\$\$îî$\$\$‚ïï$\$\$ƒðð$\$\$„ññ$\$\$…òò$\$\$†óó$\$\$‡ôô$\$\$ˆõõ$\$\$‰öö$\$\$Š÷÷$\$\$‹øø$\$\$Œùù$\$\$úú$\$\$Žûû$\$\$üü$\$\$ýý$\$\$‘þþ$\$\$’ÿÿ$\$\$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$ $\$$ $\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$$\$$###$\$$%%%$\$$***$\$$+++$\$$,,,$\$$/--$\$$:..$\$$00$\$$?11$\$$@22$\$$[33$\$$\44$\$$]55$\$$`66$\$${77$\$$}88$\$$99$\$$€::$\$$<<$\$$‚>>$\$$ƒ??$\$$„@@$\$$…AA$\$$†BB$\$$‡CC$\$$ˆDD$\$$‰EE$\$$ŠFF$\$$‹GG$\$$ŒHH$\$$II$\$$ŽJJ$\$$KK$\$$LL$\$$‘MM$\$$’NN$\$$“OO$\$$”PP$\$$•QQ$\$$–RR$\$$—SS$\$$˜TT$\$$™UU$\$$šVV$\$$›WW$\$$œXX$\$$YY$\$$žZZ$\$$Ÿ[[$\$$ \\$\$$¡]]$\$$¢__$\$$£``$\$$¤aa$\$$¥bb$\$$¦cc$\$$§dd$\$$¨ee$\$$©ff$\$$ªgg$\$$«hh$\$$¬ii$\$$­jj$\$$®kk$\$$¯ll$\$$°mm$\$$±nn$\$$²oo$\$$³pp$\$$´qq$\$$µrr$\$$¶ss$\$$·tt$\$$¸uu$\$$¹vv$\$$ºww$\$$»xx$\$$¼yy$\$$½zz$\$$¾{{$\$$¿}}$\$$À$\$$Á€€$\$$$\$$‚$\$$ăƒ$\$$ń„$\$$ƅ…$\$$dž†$\$$ȇ‡$\$$Ɉˆ$\$$ʉ‰$\$$ˊŠ$\$$̋‹$\$$͌Œ$\$$΍$\$$ώŽ$\$$Џ$\$$ѐ$\$$ґ‘$\$$Ӓ’$\$$ԓ“$\$$Ք”$\$$֕•$\$$ז–$\$$ؗ—$\$$٘˜$\$$ڙ™$\$$ۚš$\$$ܛ›$\$$ݜœ$\$$ޝ$\$$ߞž$\$$àŸŸ$\$$á  $\$$â¡¡$\$$㢢$\$$䣣$\$$夤$\$$楥$\$$禦$\$$觧$\$$騨$\$$ê©©$\$$몪$\$$ì««$\$$í¬¬$\$$î­­$\$$ï®®$\$$ð¯¯$\$$ñ°°$\$$ò±±$\$$ó²²$\$$ô³³$\$$õ´´$\$$öµµ$\$$÷¶¶$\$$ø··$\$$ù¸¸$\$$ú¹¹$\$$ûºº$\$$ü»»$\$$ý¼¼$\$$þ½½$\$$ÿ¾¾$\$$¿¿$\$$ÀÀ$\$$ÁÁ$\$$ÂÂ$\$$ÃÃ$\$$ÄÄ$\$$ÅÅ$\$$ÆÆ$\$$ ÇÇ$\$$ ÈÈ$\$$ÉÉ$\$$ÊÊ$\$$ËË$\$$ÌÌ$\$$ÍÍ$\$$ÎÎ$\$$ÏÏ$\$$ÐÐ$\$$ÑÑ$\$$ÒÒ$\$$ÓÓ$\$$ÔÔ$\$$ÕÕ$\$$ÖÖ$\$$××$\$$ØØ$\$$ÙÙ$\$$ÚÚ$\$$#ÛÛ$\$$%ÜÜ$\$$*ÝÝ$\$$+ÞÞ$\$$,ßß$\$$/àà$\$$:áá$\$$<ââ$\$$>ãã$\$$?ää$\$$@åå$\$$[ææ$\$$\çç$\$$]èè$\$$`éé$\$${êê$\$$}ëë$\$$ìì$\$$€íí$\$$îî$\$$‚ïï$\$$ƒðð$\$$„ññ$\$$…òò$\$$†óó$\$$‡ôô$\$$ˆõõ$\$$‰öö$\$$Š÷÷$\$$‹øø$\$$Œùù$\$$úú$\$$Žûû$\$$üü$\$$ýý$\$$‘þþ$\$$’ÿÿ$\$$$\$$\$$\$$\$$\$$\$$\$$\$ $\$ $\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$$\$###$\$%%%$\$***$\$+++$\$,,,$\$/--$\$:..$\$00$\$?11$\$@22$\$[33$\$\44$\$]55$\$`66$\${77$\$}88$\$99$\$€::$\$<<$\$‚>>$\$ƒ??$\$„@@$\$…AA$\$†BB$\$‡CC$\$ˆDD$\$‰EE$\$ŠFF$\$‹GG$\$ŒHH$\$II$\$ŽJJ$\$KK$\$LL$\$‘MM$\$’NN$\$“OO$\$”PP$\$•QQ$\$–RR$\$—SS$\$˜TT$\$™UU$\$šVV$\$›WW$\$œXX$\$YY$\$žZZ$\$Ÿ[[$\$ \\$\$¡]]$\$¢__$\$£``$\$¤aa$\$¥bb$\$¦cc$\$§dd$\$¨ee$\$©ff$\$ªgg$\$«hh$\$¬ii$\$­jj$\$®kk$\$¯ll$\$°mm$\$±nn$\$²oo$\$³pp$\$´qq$\$µrr$\$¶ss$\$·tt$\$¸uu$\$¹vv$\$ºww$\$»xx$\$¼yy$\$½zz$\$¾{{$\$¿}}$\$À$\$Á€€$\$$\$‚$\$ăƒ$\$ń„$\$ƅ…$\$dž†$\$ȇ‡$\$Ɉˆ$\$ʉ‰$\$ˊŠ$\$̋‹$\$͌Œ$\$΍$\$ώŽ$\$Џ$\$ѐ$\$ґ‘$\$Ӓ’$\$ԓ“$\$Ք”$\$֕•$\$ז–$\$ؗ—$\$٘˜$\$ڙ™$\$ۚš$\$ܛ›$\$ݜœ$\$ޝ$\$ߞž$\$àŸŸ$\$á  $\$â¡¡$\$㢢$\$䣣$\$夤$\$楥$\$禦$\$觧$\$騨$\$ê©©$\$몪$\$ì««$\$í¬¬$\$î­­$\$ï®®$\$ð¯¯$\$ñ°°$\$ò±±$\$ó²²$\$ô³³$\$õ´´$\$öµµ$\$÷¶¶$\$ø··$\$ù¸¸$\$ú¹¹$\$ûºº$\$ü»»$\$ý¼¼$\$þ½½$\$ÿ¾¾$\$¿¿$\$ÀÀ$\$ÁÁ$\$ÂÂ$\$ÃÃ$\$ÄÄ$\$ÅÅ$\$ÆÆ$\$ ÇÇ$\$ ÈÈ$\$ÉÉ$\$ÊÊ$\$ËË$\$ÌÌ$\$ÍÍ$\$ÎÎ$\$ÏÏ$\$ÐÐ$\$ÑÑ$\$ÒÒ$\$ÓÓ$\$ÔÔ$\$ÕÕ$\$ÖÖ$\$××$\$ØØ$\$ÙÙ$\$ÚÚ$\$#ÛÛ$\$%ÜÜ$\$*ÝÝ$\$+ÞÞ$\$,ßß$\$/àà$\$:áá$\$<ââ$\$>ãã$\$?ää$\$@åå$\$[ææ$\$\çç$\$]èè$\$`éé$\${êê$\$}ëë$\$ìì$\$€íí$\$îî$\$‚ïï$\$ƒðð$\$„ññ$\$…òò$\$†óó$\$‡ôô$\$ˆõõ$\$‰öö$\$Š÷÷$\$‹øø$\$Œùù$\$úú$\$Žûû$\$üü$\$ýý$\$‘þþ$\$’ÿÿ$\$$${$${$${$${ $ ${$${$${$${$${$${$${$${$${$${###$%%%${***$+++${,,,$/--${:..$00$?11${@22$[33${\44$]55${`66${77${}88$99${€::$<<${‚>>$ƒ??${„@@$…AA${†BB$‡CC${ˆDD$‰EE${ŠFF$‹GG${ŒHH$II${ŽJJ$KK${LL$‘MM${’NN$“OO${”PP$•QQ${–RR$—SS${˜TT$™UU${šVV$›WW${œXX$YY${žZZ$Ÿ[[${ \\$¡]]${¢__$£``${¤aa$¥bb${¦cc$§dd${¨ee$©ff${ªgg$«hh${¬ii$­jj${®kk$¯ll${°mm$±nn${²oo$³pp${´qq$µrr${¶ss$·tt${¸uu$¹vv${ºww$»xx${¼yy$½zz${¾{{$¿}}${À$Á€€${$‚${ăƒ$ń„${ƅ…$dž†${ȇ‡$Ɉˆ${ʉ‰$ˊŠ${̋‹$͌Œ${΍$ώŽ${Џ$ѐ${ґ‘$Ӓ’${ԓ“$Ք”${֕•$ז–${ؗ—$٘˜${ڙ™$ۚš${ܛ›$ݜœ${ޝ$ߞž${àŸŸ$á  ${â¡¡$㢢${䣣$夤${楥$禦${觧$騨${ê©©$몪${ì««$í¬¬${î­­$ï®®${ð¯¯$ñ°°${ò±±$ó²²${ô³³$õ´´${öµµ$÷¶¶${ø··$ù¸¸${ú¹¹$ûºº${ü»»$ý¼¼${þ½½$ÿ¾¾${¿¿$ÀÀ${ÁÁ$ÂÂ${ÃÃ$ÄÄ${ÅÅ$ÆÆ${ ÇÇ$ ÈÈ${ÉÉ$ÊÊ${ËË$ÌÌ${ÍÍ$ÎÎ${ÏÏ$ÐÐ${ÑÑ$ÒÒ${ÓÓ$ÔÔ${ÕÕ$ÖÖ${××$ØØ${ÙÙ$ÚÚ${#ÛÛ$%ÜÜ${*ÝÝ$+ÞÞ${,ßß$/àà${:áá$<ââ${>ãã$?ää${@åå$[ææ${\çç$]èè${`éé${êê${}ëë$ìì${€íí$îî${‚ïï$ƒðð${„ññ$…òò${†óó$‡ôô${ˆõõ$‰öö${Š÷÷$‹øø${Œùù$úú${Žûû$üü${ýý$‘þþ${’ÿÿ$    !"& ' ();=^|~    !"&'();###=%%%^***|+++~,,,/-- :.. 00 ?11!@22"[33&\44']55(`66){77;}88=99^€::|<<~‚>>ƒ?? „@@ @@ -8041,7 +8041,7 @@ u v!w"x$y&z() Î Ï!Ð"Ñ$Ò&Ó(Ô)Õ;Ö=×[Ø^Ù{Ú|Û}Ü~Ý Þ ß à!á"â$ã&ä(å)æ;ç=è[é^ê{ë|ì}í~î ï ð ñ!ò"ó$ô&õ(ö)÷;ø=ù[ú^û{ü|ý}þ~ÿ - !"$&();=[^{|~}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             7777777777777777 re2c: warning: line 384: column 13: escape has no effect: '\.' [-Wuseless-escape] + !"$&();=[^{|~}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             >>>>>>>>>>>>>>>> re2c: warning: line 384: column 13: escape has no effect: '\.' [-Wuseless-escape] re2c: warning: line 384: column 32: escape has no effect: '\.' [-Wuseless-escape] re2c: warning: line 391: column 27: escape has no effect: '\[' [-Wuseless-escape] re2c: warning: line 392: column 11: escape has no effect: '\[' [-Wuseless-escape] diff --git a/re2c/test/repeat-01.cgir--skeleton.c b/re2c/test/repeat-01.cgir--skeleton.c index 92c707d4..cd905bbc 100644 --- a/re2c/test/repeat-01.cgir--skeleton.c +++ b/re2c/test/repeat-01.cgir--skeleton.c @@ -308,11 +308,11 @@ int lex_line13_r2() yy15: yy16: YYSKIP (); - status = action_line13_r2(i, keys, input, token, &cursor, 5); + status = action_line13_r2(i, keys, input, token, &cursor, 7); continue; yy18: YYSKIP (); - status = action_line13_r2(i, keys, input, token, &cursor, 6); + status = action_line13_r2(i, keys, input, token, &cursor, 8); continue; yy20: YYSKIP (); @@ -358,7 +358,7 @@ int main() } 12ab  !"#$%&'()*+,-./03456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`cdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ12b -  !"#$%&'()*+,-./03456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿre2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] +  !"#$%&'()*+,-./03456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿre2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 13: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 13: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] diff --git a/re2c/test/repeat-02.cgir--skeleton.c b/re2c/test/repeat-02.cgir--skeleton.c index 64327023..30a628c4 100644 --- a/re2c/test/repeat-02.cgir--skeleton.c +++ b/re2c/test/repeat-02.cgir--skeleton.c @@ -308,11 +308,11 @@ int lex_line13_r2() yy15: yy16: YYSKIP (); - status = action_line13_r2(i, keys, input, token, &cursor, 5); + status = action_line13_r2(i, keys, input, token, &cursor, 7); continue; yy18: YYSKIP (); - status = action_line13_r2(i, keys, input, token, &cursor, 6); + status = action_line13_r2(i, keys, input, token, &cursor, 8); continue; yy20: YYSKIP (); @@ -358,7 +358,7 @@ int main() } 12ab  !"#$%&'()*+,-./03456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`cdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ12b -  !"#$%&'()*+,-./03456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿre2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] +  !"#$%&'()*+,-./03456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿre2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 13: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 13: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] diff --git a/re2c/test/repeat-03.cgir--skeleton.c b/re2c/test/repeat-03.cgir--skeleton.c index e501c781..eb5b197b 100644 --- a/re2c/test/repeat-03.cgir--skeleton.c +++ b/re2c/test/repeat-03.cgir--skeleton.c @@ -339,11 +339,11 @@ int lex_line18_r2() } yy18: YYSKIP (); - status = action_line18_r2(i, keys, input, token, &cursor, 7); + status = action_line18_r2(i, keys, input, token, &cursor, 9); continue; yy20: YYSKIP (); - status = action_line18_r2(i, keys, input, token, &cursor, 6); + status = action_line18_r2(i, keys, input, token, &cursor, 8); continue; yy22: YYSKIP (); @@ -662,11 +662,11 @@ int lex_line28_r2() } yy18: YYSKIP (); - status = action_line28_r2(i, keys, input, token, &cursor, 7); + status = action_line28_r2(i, keys, input, token, &cursor, 9); continue; yy20: YYSKIP (); - status = action_line28_r2(i, keys, input, token, &cursor, 6); + status = action_line28_r2(i, keys, input, token, &cursor, 8); continue; yy22: YYSKIP (); @@ -718,9 +718,9 @@ int main() }   !"#$%&'()*+,-./023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ1abc ÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿac -ÿ  !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ2abc +                                                                                                                                                                                                                                                             ÿ  !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ2abc ÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿac -ÿre2c: warning: line 18: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] +                                                                                                                                                                                                                                                             ÿre2c: warning: line 18: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 18: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 28: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 28: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] diff --git a/re2c/test/reuse_conds_default_0.cgir--skeleton.c b/re2c/test/reuse_conds_default_0.cgir--skeleton.c index 7da12b70..3eaf0738 100644 --- a/re2c/test/reuse_conds_default_0.cgir--skeleton.c +++ b/re2c/test/reuse_conds_default_0.cgir--skeleton.c @@ -336,11 +336,11 @@ int lex_line15_r2() } yy19: YYSKIP (); - status = action_line15_r2(i, keys, input, token, &cursor, 7); + status = action_line15_r2(i, keys, input, token, &cursor, 9); continue; yy21: YYSKIP (); - status = action_line15_r2(i, keys, input, token, &cursor, 6); + status = action_line15_r2(i, keys, input, token, &cursor, 8); continue; yy23: YYSKIP (); @@ -657,7 +657,7 @@ int lex_line20_r2() if (yych == 'c') goto yy23; } YYSKIP (); - status = action_line20_r2(i, keys, input, token, &cursor, 7); + status = action_line20_r2(i, keys, input, token, &cursor, 9); continue; yy19: YYSKIP (); @@ -665,7 +665,7 @@ yy19: continue; yy21: YYSKIP (); - status = action_line20_r2(i, keys, input, token, &cursor, 6); + status = action_line20_r2(i, keys, input, token, &cursor, 8); continue; yy23: YYSKIP (); @@ -717,7 +717,7 @@ int main() }   !"#$%&'()*+,-./023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ 1abcþ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿac -ÿ  !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ2abc +                                                                                                                                                                                                                                                             ÿ  !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ2abc ÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ -acþre2c: warning: line 15: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] +ac                                                                                                                                                                                                                                                             þre2c: warning: line 15: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 20: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] diff --git a/re2c/test/reuse_conds_default_1.cgir--skeleton.c b/re2c/test/reuse_conds_default_1.cgir--skeleton.c index 6230086d..2ad0830f 100644 --- a/re2c/test/reuse_conds_default_1.cgir--skeleton.c +++ b/re2c/test/reuse_conds_default_1.cgir--skeleton.c @@ -339,7 +339,7 @@ int lex_line22_r2() if (yych == 'c') goto yy24; } YYSKIP (); - status = action_line22_r2(i, keys, input, token, &cursor, 7); + status = action_line22_r2(i, keys, input, token, &cursor, 9); continue; yy20: YYSKIP (); @@ -347,7 +347,7 @@ yy20: continue; yy22: YYSKIP (); - status = action_line22_r2(i, keys, input, token, &cursor, 6); + status = action_line22_r2(i, keys, input, token, &cursor, 8); continue; yy24: YYSKIP (); @@ -669,11 +669,11 @@ int lex_line32_r2() } yy19: YYSKIP (); - status = action_line32_r2(i, keys, input, token, &cursor, 7); + status = action_line32_r2(i, keys, input, token, &cursor, 9); continue; yy21: YYSKIP (); - status = action_line32_r2(i, keys, input, token, &cursor, 6); + status = action_line32_r2(i, keys, input, token, &cursor, 8); continue; yy23: YYSKIP (); @@ -725,6 +725,6 @@ int main() }   !"#$%&'()*+,-./023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ 1abcþ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ -acþ  !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +ac                                                                                                                                                                                                                                                             þ  !"#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ 2abcþ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿac -ÿre2c: warning: line 32: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] +                                                                                                                                                                                                                                                             ÿre2c: warning: line 32: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow] -- 2.40.0