diff --git a/README.build.md b/README.build.md index b188a59f..7c1d4b0a 100644 --- a/README.build.md +++ b/README.build.md @@ -86,6 +86,12 @@ Building on Unix: $ LD_LIBRARY_PATH=/usr/local/ssl/lib libwebsockets-test-server --ssl ``` + To get it to build on latest openssl (2016-04-10) it needed this approach + + ```bash + cmake .. -DLWS_WITH_HTTP2=1 -DLWS_OPENSSL_INCLUDE_DIRS=/usr/local/include/openssl -DLWS_OPENSSL_LIBRARIES="/usr/local/lib64/libssl.so;/usr/local/lib64/libcrypto.so" + ``` + **NOTE5**: To build with debug info and _DEBUG for lower priority debug messages compiled in, use diff --git a/lib/daemonize.c b/lib/daemonize.c index 79139fc4..5fbd60a7 100644 --- a/lib/daemonize.c +++ b/lib/daemonize.c @@ -143,19 +143,8 @@ lws_daemonize(const char *_lock_path) } /* If we got a good PID, then we can exit the parent process. */ - if (pid_daemon > 0) { - - /* - * Wait for confirmation signal from the child via - * SIGCHILD / USR1, or for two seconds to elapse - * (SIGALRM). pause() should not return. - */ - alarm(2); - - pause(); - /* should not be reachable */ + if (pid_daemon > 0) exit(0); - } /* At this point we are executing as the child process */ parent = getppid(); diff --git a/lib/handshake.c b/lib/handshake.c index d2dd4c76..584b34b5 100644 --- a/lib/handshake.c +++ b/lib/handshake.c @@ -66,7 +66,7 @@ lws_read(struct lws *wsi, unsigned char *buf, size_t len) int body_chunk_len; size_t n; - lwsl_debug("%s: incoming len %d\n", __func__, (int)len); + lwsl_debug("%s: incoming len %d state %d\n", __func__, (int)len, wsi->state); switch (wsi->state) { #ifdef LWS_USE_HTTP2 @@ -87,8 +87,10 @@ lws_read(struct lws *wsi, unsigned char *buf, size_t len) /* account for what we're using in rxflow buffer */ if (wsi->rxflow_buffer) wsi->rxflow_pos++; - if (lws_http2_parser(wsi, buf[n++])) + if (lws_http2_parser(wsi, buf[n++])) { + lwsl_debug("%s: http2_parser bailed\n", __func__); goto bail; + } } break; #endif diff --git a/lib/hpack.c b/lib/hpack.c index 2c5b1d94..a205cbc1 100644 --- a/lib/hpack.c +++ b/lib/hpack.c @@ -199,11 +199,15 @@ static int lws_frag_start(struct lws *wsi, int hdr_token_idx) { struct allocated_headers * ah = wsi->u.http2.http.ah; - if (!hdr_token_idx) + if (!hdr_token_idx) { + lwsl_err("%s: zero hdr_token_idx\n", __func__); return 1; + } - if (ah->nfrag >= ARRAY_SIZE(ah->frag_index)) + if (ah->nfrag >= ARRAY_SIZE(ah->frag_index)) { + lwsl_err("%s: frag index %d too big\n", __func__, ah->nfrag); return 1; + } ah->frags[ah->nfrag].offset = ah->pos; ah->frags[ah->nfrag].len = 0; @@ -355,6 +359,8 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) unsigned char c1; int n; + lwsl_debug(" state %d\n", wsi->u.http2.hpack); + switch (wsi->u.http2.hpack) { case HPKS_OPT_PADDING: wsi->u.http2.padding = c; @@ -388,6 +394,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) if (c & 0x80) { /* indexed header field only */ /* just a possibly-extended integer */ wsi->u.http2.hpack_type = HPKT_INDEXED_HDR_7; + lwsl_debug("HKPS_TYPE setting header_index %d\n", c & 0x7f); wsi->u.http2.header_index = c & 0x7f; if ((c & 0x7f) == 0x7f) { wsi->u.http2.hpack_len = c & 0x7f; @@ -395,6 +402,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.hpack = HPKS_IDX_EXT; break; } + lwsl_debug("HKPS_TYPE: %d\n", c & 0x7f); if (lws_write_indexed_hdr(wsi, c & 0x7f)) return 1; /* stay at same state */ @@ -406,6 +414,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) * H + possibly-extended value length * literal value */ + lwsl_debug("HKPS_TYPE 2 setting header_index %d\n", 0); wsi->u.http2.header_index = 0; if (c == 0x40) { /* literal name */ wsi->u.http2.hpack_type = HPKT_LITERAL_HDR_VALUE_INCR; @@ -421,6 +430,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.hpack = HPKS_IDX_EXT; break; } + lwsl_debug("HKPS_TYPE 3 setting header_index %d\n", c & 0x3f); wsi->u.http2.header_index = c & 0x3f; wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; @@ -439,6 +449,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.value = 0; break; } + //lwsl_debug("indexed\n"); /* indexed name */ wsi->u.http2.hpack_type = HPKT_INDEXED_HDR_4_VALUE; wsi->u.http2.header_index = 0; @@ -448,6 +459,7 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) wsi->u.http2.hpack = HPKS_IDX_EXT; break; } + //lwsl_err("HKPS_TYPE 5 setting header_index %d\n", c & 0xf); wsi->u.http2.header_index = c & 0xf; wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; @@ -475,11 +487,14 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) if (!(c & 0x80)) { switch (wsi->u.http2.hpack_type) { case HPKT_INDEXED_HDR_7: + //lwsl_err("HKPS_IDX_EXT hdr idx %d\n", wsi->u.http2.hpack_len); if (lws_write_indexed_hdr(wsi, wsi->u.http2.hpack_len)) return 1; wsi->u.http2.hpack = HPKS_TYPE; break; default: + // lwsl_err("HKPS_IDX_EXT setting header_index %d\n", + // wsi->u.http2.hpack_len); wsi->u.http2.header_index = wsi->u.http2.hpack_len; wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; @@ -495,10 +510,13 @@ int lws_hpack_interpret(struct lws *wsi, unsigned char c) if (wsi->u.http2.hpack_len < 0x7f) { pre_data: if (wsi->u.http2.value) { + if (wsi->u.http2.header_index) if (lws_frag_start(wsi, lws_token_from_index(wsi, wsi->u.http2.header_index, - NULL, NULL))) + NULL, NULL))) { + // lwsl_notice("%s: hlen failed\n", __func__); return 1; + } } else wsi->u.hdr.parser_state = WSI_TOKEN_NAME_PART; wsi->u.http2.hpack = HPKS_DATA; @@ -539,8 +557,9 @@ pre_data: c1 = c; } if (wsi->u.http2.value) { /* value */ - if (lws_frag_append(wsi, c1)) - return 1; + if (wsi->u.http2.header_index) + if (lws_frag_append(wsi, c1)) + return 1; } else { /* name */ if (lws_parse(wsi, c1)) return 1; @@ -566,7 +585,7 @@ pre_data: if (wsi->u.http2.value) { if (lws_frag_end(wsi)) return 1; - + // lwsl_err("data\n"); lws_dump_header(wsi, lws_token_from_index( wsi, wsi->u.http2.header_index, NULL, NULL)); @@ -576,7 +595,7 @@ pre_data: else wsi->u.http2.hpack = HPKS_TYPE; } else { /* name */ - if (wsi->u.hdr.parser_state < WSI_TOKEN_COUNT) + //if (wsi->u.hdr.parser_state < WSI_TOKEN_COUNT) wsi->u.http2.value = 1; wsi->u.http2.hpack = HPKS_HLEN; diff --git a/lib/http2.c b/lib/http2.c index 224668bd..317b8dda 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -242,8 +242,15 @@ lws_http2_parser(struct lws *wsi, unsigned char c) case LWS_HTTP2_FRAME_TYPE_CONTINUATION: case LWS_HTTP2_FRAME_TYPE_HEADERS: lwsl_info(" %02X\n", c); - if (lws_hpack_interpret(wsi->u.http2.stream_wsi, c)) + if (!wsi->u.http2.stream_wsi->u.hdr.ah) + if (lws_header_table_attach(wsi->u.http2.stream_wsi, 0)) { + lwsl_err("%s: Failed to get ah\n", __func__); + return 1; + } + if (lws_hpack_interpret(wsi->u.http2.stream_wsi, c)) { + lwsl_notice("%s: lws_hpack_interpret failed\n", __func__); return 1; + } break; case LWS_HTTP2_FRAME_TYPE_GOAWAY: if (wsi->u.http2.count >= 5 && wsi->u.http2.count <= 8) { @@ -376,9 +383,11 @@ lws_http2_parser(struct lws *wsi, unsigned char c) lwsl_info("LWS_HTTP2_FRAME_TYPE_HEADERS: stream_id = %d\n", wsi->u.http2.stream_id); if (!wsi->u.http2.stream_id) return 1; - if (!wsi->u.http2.stream_wsi) + if (!wsi->u.http2.stream_wsi) { wsi->u.http2.stream_wsi = lws_create_server_child_wsi(wsi->vhost, wsi, wsi->u.http2.stream_id); + wsi->u.http2.stream_wsi->http2_substream = 1; + } /* END_STREAM means after servicing this, close the stream */ wsi->u.http2.END_STREAM = !!(wsi->u.http2.flags & LWS_HTTP2_FLAG_END_STREAM); diff --git a/lib/lextable-strings.h b/lib/lextable-strings.h index 6a5a267e..24940803 100644 --- a/lib/lextable-strings.h +++ b/lib/lextable-strings.h @@ -40,11 +40,11 @@ static const char *set[] = { "sec-websocket-version:", "sec-websocket-origin:", - ":authority:", - ":method:", - ":path:", - ":scheme:", - ":status:", + ":authority", + ":method", + ":path", + ":scheme", + ":status", "accept-charset:", "accept-ranges:", diff --git a/lib/lextable.h b/lib/lextable.h index 23e526d6..520cfa38 100644 --- a/lib/lextable.h +++ b/lib/lextable.h @@ -11,14 +11,14 @@ 0x64 /* 'd' */, 0x10, 0x02 /* (to 0x022E state 265) */, 0x72 /* 'r' */, 0x19, 0x02 /* (to 0x023A state 270) */, 0x3A /* ':' */, 0x4A, 0x02 /* (to 0x026E state 299) */, - 0x65 /* 'e' */, 0xDB, 0x02 /* (to 0x0302 state 414) */, - 0x66 /* 'f' */, 0xF7, 0x02 /* (to 0x0321 state 430) */, - 0x6C /* 'l' */, 0x19, 0x03 /* (to 0x0346 state 463) */, - 0x6D /* 'm' */, 0x3C, 0x03 /* (to 0x036C state 489) */, - 0x74 /* 't' */, 0xAB, 0x03 /* (to 0x03DE state 583) */, - 0x76 /* 'v' */, 0xC6, 0x03 /* (to 0x03FC state 611) */, - 0x77 /* 'w' */, 0xD3, 0x03 /* (to 0x040C state 619) */, - 0x78 /* 'x' */, 0xFA, 0x03 /* (to 0x0436 state 655) */, + 0x65 /* 'e' */, 0xD6, 0x02 /* (to 0x02FD state 409) */, + 0x66 /* 'f' */, 0xF2, 0x02 /* (to 0x031C state 425) */, + 0x6C /* 'l' */, 0x14, 0x03 /* (to 0x0341 state 458) */, + 0x6D /* 'm' */, 0x37, 0x03 /* (to 0x0367 state 484) */, + 0x74 /* 't' */, 0xA6, 0x03 /* (to 0x03D9 state 578) */, + 0x76 /* 'v' */, 0xC1, 0x03 /* (to 0x03F7 state 606) */, + 0x77 /* 'w' */, 0xCE, 0x03 /* (to 0x0407 state 614) */, + 0x78 /* 'x' */, 0xF5, 0x03 /* (to 0x0431 state 650) */, 0x08, /* fail */ /* pos 0040: 1 */ 0xE5 /* 'e' -> */, /* pos 0041: 2 */ 0xF4 /* 't' -> */, @@ -26,8 +26,8 @@ /* pos 0043: 4 */ 0x00, 0x00 /* - terminal marker 0 - */, /* pos 0045: 5 */ 0x6F /* 'o' */, 0x0D, 0x00 /* (to 0x0052 state 6) */, 0x72 /* 'r' */, 0x8C, 0x01 /* (to 0x01D4 state 211) */, - 0x61 /* 'a' */, 0xD3, 0x03 /* (to 0x041E state 636) */, - 0x75 /* 'u' */, 0xD5, 0x03 /* (to 0x0423 state 640) */, + 0x61 /* 'a' */, 0xCE, 0x03 /* (to 0x0419 state 631) */, + 0x75 /* 'u' */, 0xD0, 0x03 /* (to 0x041E state 635) */, 0x08, /* fail */ /* pos 0052: 6 */ 0xF3 /* 's' -> */, /* pos 0053: 7 */ 0xF4 /* 't' -> */, @@ -68,8 +68,8 @@ /* pos 008d: 32 */ 0xBA /* ':' -> */, /* pos 008e: 33 */ 0x00, 0x04 /* - terminal marker 4 - */, /* pos 0090: 34 */ 0x70 /* 'p' */, 0x0A, 0x00 /* (to 0x009A state 35) */, - 0x73 /* 's' */, 0x5E, 0x03 /* (to 0x03F1 state 601) */, - 0x72 /* 'r' */, 0x96, 0x03 /* (to 0x042C state 647) */, + 0x73 /* 's' */, 0x59, 0x03 /* (to 0x03EC state 596) */, + 0x72 /* 'r' */, 0x91, 0x03 /* (to 0x0427 state 642) */, 0x08, /* fail */ /* pos 009a: 35 */ 0xE7 /* 'g' -> */, /* pos 009b: 36 */ 0xF2 /* 'r' -> */, @@ -85,11 +85,11 @@ /* pos 00a6: 46 */ 0xBA /* ':' -> */, /* pos 00a7: 47 */ 0x00, 0x06 /* - terminal marker 6 - */, /* pos 00a9: 48 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x00B0 state 49) */, - 0x74 /* 't' */, 0x18, 0x03 /* (to 0x03C4 state 558) */, + 0x74 /* 't' */, 0x13, 0x03 /* (to 0x03BF state 553) */, 0x08, /* fail */ /* pos 00b0: 49 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x00BA state 50) */, - 0x72 /* 'r' */, 0x01, 0x03 /* (to 0x03B4 state 544) */, - 0x74 /* 't' */, 0x04, 0x03 /* (to 0x03BA state 549) */, + 0x72 /* 'r' */, 0xFC, 0x02 /* (to 0x03AF state 539) */, + 0x74 /* 't' */, 0xFF, 0x02 /* (to 0x03B5 state 544) */, 0x08, /* fail */ /* pos 00ba: 50 */ 0xAD /* '-' -> */, /* pos 00bb: 51 */ 0xF7 /* 'w' -> */, @@ -170,7 +170,7 @@ /* pos 0128: 113 */ 0xB1 /* '1' -> */, /* pos 0129: 114 */ 0xAE /* '.' -> */, /* pos 012a: 115 */ 0x31 /* '1' */, 0x07, 0x00 /* (to 0x0131 state 116) */, - 0x30 /* '0' */, 0x14, 0x03 /* (to 0x0441 state 665) */, + 0x30 /* '0' */, 0x0F, 0x03 /* (to 0x043C state 660) */, 0x08, /* fail */ /* pos 0131: 116 */ 0xA0 /* ' ' -> */, /* pos 0132: 117 */ 0x00, 0x0F /* - terminal marker 15 - */, @@ -187,8 +187,8 @@ /* pos 013e: 128 */ 0x00, 0x10 /* - terminal marker 16 - */, /* pos 0140: 129 */ 0x63 /* 'c' */, 0x0D, 0x00 /* (to 0x014D state 130) */, 0x75 /* 'u' */, 0xAC, 0x00 /* (to 0x01EF state 230) */, - 0x67 /* 'g' */, 0x82, 0x01 /* (to 0x02C8 state 363) */, - 0x6C /* 'l' */, 0x83, 0x01 /* (to 0x02CC state 366) */, + 0x67 /* 'g' */, 0x7D, 0x01 /* (to 0x02C3 state 358) */, + 0x6C /* 'l' */, 0x7E, 0x01 /* (to 0x02C7 state 361) */, 0x08, /* fail */ /* pos 014d: 130 */ 0xE3 /* 'c' -> */, /* pos 014e: 131 */ 0xE5 /* 'e' -> */, @@ -211,7 +211,7 @@ /* pos 0168: 144 */ 0xEC /* 'l' -> */, /* pos 0169: 145 */ 0xAD /* '-' -> */, /* pos 016a: 146 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x0171 state 147) */, - 0x61 /* 'a' */, 0x4D, 0x01 /* (to 0x02BA state 350) */, + 0x61 /* 'a' */, 0x48, 0x01 /* (to 0x02B5 state 345) */, 0x08, /* fail */ /* pos 0171: 147 */ 0xE5 /* 'e' -> */, /* pos 0172: 148 */ 0xF1 /* 'q' -> */, @@ -233,11 +233,11 @@ /* pos 0183: 164 */ 0xAD /* '-' -> */, /* pos 0184: 165 */ 0x6D /* 'm' */, 0x0D, 0x00 /* (to 0x0191 state 166) */, 0x6E /* 'n' */, 0x20, 0x00 /* (to 0x01A7 state 181) */, - 0x72 /* 'r' */, 0xA3, 0x01 /* (to 0x032D state 440) */, - 0x75 /* 'u' */, 0xA7, 0x01 /* (to 0x0334 state 446) */, + 0x72 /* 'r' */, 0x9E, 0x01 /* (to 0x0328 state 435) */, + 0x75 /* 'u' */, 0xA2, 0x01 /* (to 0x032F state 441) */, 0x08, /* fail */ /* pos 0191: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0198 state 167) */, - 0x61 /* 'a' */, 0x93, 0x01 /* (to 0x0327 state 435) */, + 0x61 /* 'a' */, 0x8E, 0x01 /* (to 0x0322 state 430) */, 0x08, /* fail */ /* pos 0198: 167 */ 0xE4 /* 'd' -> */, /* pos 0199: 168 */ 0xE9 /* 'i' -> */, @@ -266,8 +266,8 @@ /* pos 01b1: 191 */ 0x00, 0x14 /* - terminal marker 20 - */, /* pos 01b3: 192 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x01C0 state 193) */, 0x6C /* 'l' */, 0x14, 0x00 /* (to 0x01CA state 202) */, - 0x63 /* 'c' */, 0xF0, 0x00 /* (to 0x02A9 state 335) */, - 0x72 /* 'r' */, 0xF6, 0x00 /* (to 0x02B2 state 343) */, + 0x63 /* 'c' */, 0xEB, 0x00 /* (to 0x02A4 state 330) */, + 0x72 /* 'r' */, 0xF1, 0x00 /* (to 0x02AD state 338) */, 0x08, /* fail */ /* pos 01c0: 193 */ 0xEE /* 'n' -> */, /* pos 01c1: 194 */ 0xE3 /* 'c' -> */, @@ -288,7 +288,7 @@ /* pos 01d1: 209 */ 0xBA /* ':' -> */, /* pos 01d2: 210 */ 0x00, 0x16 /* - terminal marker 22 - */, /* pos 01d4: 211 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x01DB state 212) */, - 0x6F /* 'o' */, 0xA3, 0x01 /* (to 0x037A state 502) */, + 0x6F /* 'o' */, 0x9E, 0x01 /* (to 0x0375 state 497) */, 0x08, /* fail */ /* pos 01db: 212 */ 0xE7 /* 'g' -> */, /* pos 01dc: 213 */ 0xED /* 'm' -> */, @@ -332,13 +332,13 @@ /* pos 0206: 251 */ 0xAD /* '-' -> */, /* pos 0207: 252 */ 0x6C /* 'l' */, 0x10, 0x00 /* (to 0x0217 state 253) */, 0x74 /* 't' */, 0x1E, 0x00 /* (to 0x0228 state 260) */, - 0x64 /* 'd' */, 0xC5, 0x00 /* (to 0x02D2 state 371) */, - 0x65 /* 'e' */, 0xCF, 0x00 /* (to 0x02DF state 383) */, - 0x72 /* 'r' */, 0xE8, 0x00 /* (to 0x02FB state 408) */, + 0x64 /* 'd' */, 0xC0, 0x00 /* (to 0x02CD state 366) */, + 0x65 /* 'e' */, 0xCA, 0x00 /* (to 0x02DA state 378) */, + 0x72 /* 'r' */, 0xE3, 0x00 /* (to 0x02F6 state 403) */, 0x08, /* fail */ /* pos 0217: 253 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x0221 state 254) */, - 0x61 /* 'a' */, 0xCF, 0x00 /* (to 0x02E9 state 392) */, - 0x6F /* 'o' */, 0xD5, 0x00 /* (to 0x02F2 state 400) */, + 0x61 /* 'a' */, 0xCA, 0x00 /* (to 0x02E4 state 387) */, + 0x6F /* 'o' */, 0xD0, 0x00 /* (to 0x02ED state 395) */, 0x08, /* fail */ /* pos 0221: 254 */ 0xEE /* 'n' -> */, /* pos 0222: 255 */ 0xE7 /* 'g' -> */, @@ -352,7 +352,7 @@ /* pos 022b: 263 */ 0xBA /* ':' -> */, /* pos 022c: 264 */ 0x00, 0x1C /* - terminal marker 28 - */, /* pos 022e: 265 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0235 state 266) */, - 0x65 /* 'e' */, 0xF5, 0x01 /* (to 0x0426 state 642) */, + 0x65 /* 'e' */, 0xF0, 0x01 /* (to 0x0421 state 637) */, 0x08, /* fail */ /* pos 0235: 266 */ 0xF4 /* 't' -> */, /* pos 0236: 267 */ 0xE5 /* 'e' -> */, @@ -367,10 +367,10 @@ /* pos 0244: 274 */ 0xBA /* ':' -> */, /* pos 0245: 275 */ 0x00, 0x1E /* - terminal marker 30 - */, /* pos 0247: 276 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x024E state 277) */, - 0x74 /* 't' */, 0x5F, 0x01 /* (to 0x03A9 state 534) */, + 0x74 /* 't' */, 0x5A, 0x01 /* (to 0x03A4 state 529) */, 0x08, /* fail */ /* pos 024e: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0255 state 278) */, - 0x72 /* 'r' */, 0x52, 0x01 /* (to 0x03A3 state 529) */, + 0x72 /* 'r' */, 0x4D, 0x01 /* (to 0x039E state 524) */, 0x08, /* fail */ /* pos 0255: 278 */ 0xF2 /* 'r' -> */, /* pos 0256: 279 */ 0xE5 /* 'e' -> */, @@ -394,9 +394,9 @@ /* pos 026b: 297 */ 0xBA /* ':' -> */, /* pos 026c: 298 */ 0x00, 0x22 /* - terminal marker 34 - */, /* pos 026e: 299 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x027B state 300) */, - 0x6D /* 'm' */, 0x15, 0x00 /* (to 0x0286 state 310) */, - 0x70 /* 'p' */, 0x1A, 0x00 /* (to 0x028E state 317) */, - 0x73 /* 's' */, 0x1D, 0x00 /* (to 0x0294 state 322) */, + 0x6D /* 'm' */, 0x14, 0x00 /* (to 0x0285 state 309) */, + 0x70 /* 'p' */, 0x18, 0x00 /* (to 0x028C state 315) */, + 0x73 /* 's' */, 0x1A, 0x00 /* (to 0x0291 state 319) */, 0x08, /* fail */ /* pos 027b: 300 */ 0xF5 /* 'u' -> */, /* pos 027c: 301 */ 0xF4 /* 't' -> */, @@ -406,378 +406,373 @@ /* pos 0280: 305 */ 0xE9 /* 'i' -> */, /* pos 0281: 306 */ 0xF4 /* 't' -> */, /* pos 0282: 307 */ 0xF9 /* 'y' -> */, -/* pos 0283: 308 */ 0xBA /* ':' -> */, -/* pos 0284: 309 */ 0x00, 0x23 /* - terminal marker 35 - */, -/* pos 0286: 310 */ 0xE5 /* 'e' -> */, -/* pos 0287: 311 */ 0xF4 /* 't' -> */, -/* pos 0288: 312 */ 0xE8 /* 'h' -> */, -/* pos 0289: 313 */ 0xEF /* 'o' -> */, -/* pos 028a: 314 */ 0xE4 /* 'd' -> */, -/* pos 028b: 315 */ 0xBA /* ':' -> */, -/* pos 028c: 316 */ 0x00, 0x24 /* - terminal marker 36 - */, -/* pos 028e: 317 */ 0xE1 /* 'a' -> */, -/* pos 028f: 318 */ 0xF4 /* 't' -> */, -/* pos 0290: 319 */ 0xE8 /* 'h' -> */, -/* pos 0291: 320 */ 0xBA /* ':' -> */, -/* pos 0292: 321 */ 0x00, 0x25 /* - terminal marker 37 - */, -/* pos 0294: 322 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x029B state 323) */, - 0x74 /* 't' */, 0x0B, 0x00 /* (to 0x02A2 state 329) */, +/* pos 0283: 308 */ 0x00, 0x23 /* - terminal marker 35 - */, +/* pos 0285: 309 */ 0xE5 /* 'e' -> */, +/* pos 0286: 310 */ 0xF4 /* 't' -> */, +/* pos 0287: 311 */ 0xE8 /* 'h' -> */, +/* pos 0288: 312 */ 0xEF /* 'o' -> */, +/* pos 0289: 313 */ 0xE4 /* 'd' -> */, +/* pos 028a: 314 */ 0x00, 0x24 /* - terminal marker 36 - */, +/* pos 028c: 315 */ 0xE1 /* 'a' -> */, +/* pos 028d: 316 */ 0xF4 /* 't' -> */, +/* pos 028e: 317 */ 0xE8 /* 'h' -> */, +/* pos 028f: 318 */ 0x00, 0x25 /* - terminal marker 37 - */, +/* pos 0291: 319 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x0298 state 320) */, + 0x74 /* 't' */, 0x0A, 0x00 /* (to 0x029E state 325) */, 0x08, /* fail */ -/* pos 029b: 323 */ 0xE8 /* 'h' -> */, -/* pos 029c: 324 */ 0xE5 /* 'e' -> */, -/* pos 029d: 325 */ 0xED /* 'm' -> */, -/* pos 029e: 326 */ 0xE5 /* 'e' -> */, -/* pos 029f: 327 */ 0xBA /* ':' -> */, -/* pos 02a0: 328 */ 0x00, 0x26 /* - terminal marker 38 - */, -/* pos 02a2: 329 */ 0xE1 /* 'a' -> */, -/* pos 02a3: 330 */ 0xF4 /* 't' -> */, -/* pos 02a4: 331 */ 0xF5 /* 'u' -> */, -/* pos 02a5: 332 */ 0xF3 /* 's' -> */, -/* pos 02a6: 333 */ 0xBA /* ':' -> */, -/* pos 02a7: 334 */ 0x00, 0x27 /* - terminal marker 39 - */, -/* pos 02a9: 335 */ 0xE8 /* 'h' -> */, -/* pos 02aa: 336 */ 0xE1 /* 'a' -> */, -/* pos 02ab: 337 */ 0xF2 /* 'r' -> */, -/* pos 02ac: 338 */ 0xF3 /* 's' -> */, -/* pos 02ad: 339 */ 0xE5 /* 'e' -> */, -/* pos 02ae: 340 */ 0xF4 /* 't' -> */, -/* pos 02af: 341 */ 0xBA /* ':' -> */, -/* pos 02b0: 342 */ 0x00, 0x28 /* - terminal marker 40 - */, -/* pos 02b2: 343 */ 0xE1 /* 'a' -> */, -/* pos 02b3: 344 */ 0xEE /* 'n' -> */, -/* pos 02b4: 345 */ 0xE7 /* 'g' -> */, -/* pos 02b5: 346 */ 0xE5 /* 'e' -> */, -/* pos 02b6: 347 */ 0xF3 /* 's' -> */, -/* pos 02b7: 348 */ 0xBA /* ':' -> */, -/* pos 02b8: 349 */ 0x00, 0x29 /* - terminal marker 41 - */, -/* pos 02ba: 350 */ 0xEC /* 'l' -> */, -/* pos 02bb: 351 */ 0xEC /* 'l' -> */, -/* pos 02bc: 352 */ 0xEF /* 'o' -> */, -/* pos 02bd: 353 */ 0xF7 /* 'w' -> */, -/* pos 02be: 354 */ 0xAD /* '-' -> */, -/* pos 02bf: 355 */ 0xEF /* 'o' -> */, -/* pos 02c0: 356 */ 0xF2 /* 'r' -> */, -/* pos 02c1: 357 */ 0xE9 /* 'i' -> */, -/* pos 02c2: 358 */ 0xE7 /* 'g' -> */, -/* pos 02c3: 359 */ 0xE9 /* 'i' -> */, -/* pos 02c4: 360 */ 0xEE /* 'n' -> */, -/* pos 02c5: 361 */ 0xBA /* ':' -> */, -/* pos 02c6: 362 */ 0x00, 0x2A /* - terminal marker 42 - */, -/* pos 02c8: 363 */ 0xE5 /* 'e' -> */, -/* pos 02c9: 364 */ 0xBA /* ':' -> */, -/* pos 02ca: 365 */ 0x00, 0x2B /* - terminal marker 43 - */, -/* pos 02cc: 366 */ 0xEC /* 'l' -> */, -/* pos 02cd: 367 */ 0xEF /* 'o' -> */, -/* pos 02ce: 368 */ 0xF7 /* 'w' -> */, -/* pos 02cf: 369 */ 0xBA /* ':' -> */, -/* pos 02d0: 370 */ 0x00, 0x2C /* - terminal marker 44 - */, +/* pos 0298: 320 */ 0xE8 /* 'h' -> */, +/* pos 0299: 321 */ 0xE5 /* 'e' -> */, +/* pos 029a: 322 */ 0xED /* 'm' -> */, +/* pos 029b: 323 */ 0xE5 /* 'e' -> */, +/* pos 029c: 324 */ 0x00, 0x26 /* - terminal marker 38 - */, +/* pos 029e: 325 */ 0xE1 /* 'a' -> */, +/* pos 029f: 326 */ 0xF4 /* 't' -> */, +/* pos 02a0: 327 */ 0xF5 /* 'u' -> */, +/* pos 02a1: 328 */ 0xF3 /* 's' -> */, +/* pos 02a2: 329 */ 0x00, 0x27 /* - terminal marker 39 - */, +/* pos 02a4: 330 */ 0xE8 /* 'h' -> */, +/* pos 02a5: 331 */ 0xE1 /* 'a' -> */, +/* pos 02a6: 332 */ 0xF2 /* 'r' -> */, +/* pos 02a7: 333 */ 0xF3 /* 's' -> */, +/* pos 02a8: 334 */ 0xE5 /* 'e' -> */, +/* pos 02a9: 335 */ 0xF4 /* 't' -> */, +/* pos 02aa: 336 */ 0xBA /* ':' -> */, +/* pos 02ab: 337 */ 0x00, 0x28 /* - terminal marker 40 - */, +/* pos 02ad: 338 */ 0xE1 /* 'a' -> */, +/* pos 02ae: 339 */ 0xEE /* 'n' -> */, +/* pos 02af: 340 */ 0xE7 /* 'g' -> */, +/* pos 02b0: 341 */ 0xE5 /* 'e' -> */, +/* pos 02b1: 342 */ 0xF3 /* 's' -> */, +/* pos 02b2: 343 */ 0xBA /* ':' -> */, +/* pos 02b3: 344 */ 0x00, 0x29 /* - terminal marker 41 - */, +/* pos 02b5: 345 */ 0xEC /* 'l' -> */, +/* pos 02b6: 346 */ 0xEC /* 'l' -> */, +/* pos 02b7: 347 */ 0xEF /* 'o' -> */, +/* pos 02b8: 348 */ 0xF7 /* 'w' -> */, +/* pos 02b9: 349 */ 0xAD /* '-' -> */, +/* pos 02ba: 350 */ 0xEF /* 'o' -> */, +/* pos 02bb: 351 */ 0xF2 /* 'r' -> */, +/* pos 02bc: 352 */ 0xE9 /* 'i' -> */, +/* pos 02bd: 353 */ 0xE7 /* 'g' -> */, +/* pos 02be: 354 */ 0xE9 /* 'i' -> */, +/* pos 02bf: 355 */ 0xEE /* 'n' -> */, +/* pos 02c0: 356 */ 0xBA /* ':' -> */, +/* pos 02c1: 357 */ 0x00, 0x2A /* - terminal marker 42 - */, +/* pos 02c3: 358 */ 0xE5 /* 'e' -> */, +/* pos 02c4: 359 */ 0xBA /* ':' -> */, +/* pos 02c5: 360 */ 0x00, 0x2B /* - terminal marker 43 - */, +/* pos 02c7: 361 */ 0xEC /* 'l' -> */, +/* pos 02c8: 362 */ 0xEF /* 'o' -> */, +/* pos 02c9: 363 */ 0xF7 /* 'w' -> */, +/* pos 02ca: 364 */ 0xBA /* ':' -> */, +/* pos 02cb: 365 */ 0x00, 0x2C /* - terminal marker 44 - */, +/* pos 02cd: 366 */ 0xE9 /* 'i' -> */, +/* pos 02ce: 367 */ 0xF3 /* 's' -> */, +/* pos 02cf: 368 */ 0xF0 /* 'p' -> */, +/* pos 02d0: 369 */ 0xEF /* 'o' -> */, +/* pos 02d1: 370 */ 0xF3 /* 's' -> */, /* pos 02d2: 371 */ 0xE9 /* 'i' -> */, -/* pos 02d3: 372 */ 0xF3 /* 's' -> */, -/* pos 02d4: 373 */ 0xF0 /* 'p' -> */, +/* pos 02d3: 372 */ 0xF4 /* 't' -> */, +/* pos 02d4: 373 */ 0xE9 /* 'i' -> */, /* pos 02d5: 374 */ 0xEF /* 'o' -> */, -/* pos 02d6: 375 */ 0xF3 /* 's' -> */, -/* pos 02d7: 376 */ 0xE9 /* 'i' -> */, -/* pos 02d8: 377 */ 0xF4 /* 't' -> */, -/* pos 02d9: 378 */ 0xE9 /* 'i' -> */, -/* pos 02da: 379 */ 0xEF /* 'o' -> */, -/* pos 02db: 380 */ 0xEE /* 'n' -> */, -/* pos 02dc: 381 */ 0xBA /* ':' -> */, -/* pos 02dd: 382 */ 0x00, 0x2D /* - terminal marker 45 - */, +/* pos 02d6: 375 */ 0xEE /* 'n' -> */, +/* pos 02d7: 376 */ 0xBA /* ':' -> */, +/* pos 02d8: 377 */ 0x00, 0x2D /* - terminal marker 45 - */, +/* pos 02da: 378 */ 0xEE /* 'n' -> */, +/* pos 02db: 379 */ 0xE3 /* 'c' -> */, +/* pos 02dc: 380 */ 0xEF /* 'o' -> */, +/* pos 02dd: 381 */ 0xE4 /* 'd' -> */, +/* pos 02de: 382 */ 0xE9 /* 'i' -> */, /* pos 02df: 383 */ 0xEE /* 'n' -> */, -/* pos 02e0: 384 */ 0xE3 /* 'c' -> */, -/* pos 02e1: 385 */ 0xEF /* 'o' -> */, -/* pos 02e2: 386 */ 0xE4 /* 'd' -> */, -/* pos 02e3: 387 */ 0xE9 /* 'i' -> */, -/* pos 02e4: 388 */ 0xEE /* 'n' -> */, -/* pos 02e5: 389 */ 0xE7 /* 'g' -> */, -/* pos 02e6: 390 */ 0xBA /* ':' -> */, -/* pos 02e7: 391 */ 0x00, 0x2E /* - terminal marker 46 - */, -/* pos 02e9: 392 */ 0xEE /* 'n' -> */, -/* pos 02ea: 393 */ 0xE7 /* 'g' -> */, -/* pos 02eb: 394 */ 0xF5 /* 'u' -> */, -/* pos 02ec: 395 */ 0xE1 /* 'a' -> */, -/* pos 02ed: 396 */ 0xE7 /* 'g' -> */, -/* pos 02ee: 397 */ 0xE5 /* 'e' -> */, -/* pos 02ef: 398 */ 0xBA /* ':' -> */, -/* pos 02f0: 399 */ 0x00, 0x2F /* - terminal marker 47 - */, -/* pos 02f2: 400 */ 0xE3 /* 'c' -> */, -/* pos 02f3: 401 */ 0xE1 /* 'a' -> */, -/* pos 02f4: 402 */ 0xF4 /* 't' -> */, -/* pos 02f5: 403 */ 0xE9 /* 'i' -> */, -/* pos 02f6: 404 */ 0xEF /* 'o' -> */, -/* pos 02f7: 405 */ 0xEE /* 'n' -> */, -/* pos 02f8: 406 */ 0xBA /* ':' -> */, -/* pos 02f9: 407 */ 0x00, 0x30 /* - terminal marker 48 - */, -/* pos 02fb: 408 */ 0xE1 /* 'a' -> */, -/* pos 02fc: 409 */ 0xEE /* 'n' -> */, -/* pos 02fd: 410 */ 0xE7 /* 'g' -> */, -/* pos 02fe: 411 */ 0xE5 /* 'e' -> */, -/* pos 02ff: 412 */ 0xBA /* ':' -> */, -/* pos 0300: 413 */ 0x00, 0x31 /* - terminal marker 49 - */, -/* pos 0302: 414 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x0309 state 415) */, - 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x030E state 419) */, +/* pos 02e0: 384 */ 0xE7 /* 'g' -> */, +/* pos 02e1: 385 */ 0xBA /* ':' -> */, +/* pos 02e2: 386 */ 0x00, 0x2E /* - terminal marker 46 - */, +/* pos 02e4: 387 */ 0xEE /* 'n' -> */, +/* pos 02e5: 388 */ 0xE7 /* 'g' -> */, +/* pos 02e6: 389 */ 0xF5 /* 'u' -> */, +/* pos 02e7: 390 */ 0xE1 /* 'a' -> */, +/* pos 02e8: 391 */ 0xE7 /* 'g' -> */, +/* pos 02e9: 392 */ 0xE5 /* 'e' -> */, +/* pos 02ea: 393 */ 0xBA /* ':' -> */, +/* pos 02eb: 394 */ 0x00, 0x2F /* - terminal marker 47 - */, +/* pos 02ed: 395 */ 0xE3 /* 'c' -> */, +/* pos 02ee: 396 */ 0xE1 /* 'a' -> */, +/* pos 02ef: 397 */ 0xF4 /* 't' -> */, +/* pos 02f0: 398 */ 0xE9 /* 'i' -> */, +/* pos 02f1: 399 */ 0xEF /* 'o' -> */, +/* pos 02f2: 400 */ 0xEE /* 'n' -> */, +/* pos 02f3: 401 */ 0xBA /* ':' -> */, +/* pos 02f4: 402 */ 0x00, 0x30 /* - terminal marker 48 - */, +/* pos 02f6: 403 */ 0xE1 /* 'a' -> */, +/* pos 02f7: 404 */ 0xEE /* 'n' -> */, +/* pos 02f8: 405 */ 0xE7 /* 'g' -> */, +/* pos 02f9: 406 */ 0xE5 /* 'e' -> */, +/* pos 02fa: 407 */ 0xBA /* ':' -> */, +/* pos 02fb: 408 */ 0x00, 0x31 /* - terminal marker 49 - */, +/* pos 02fd: 409 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x0304 state 410) */, + 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x0309 state 414) */, 0x08, /* fail */ -/* pos 0309: 415 */ 0xE1 /* 'a' -> */, -/* pos 030a: 416 */ 0xE7 /* 'g' -> */, -/* pos 030b: 417 */ 0xBA /* ':' -> */, -/* pos 030c: 418 */ 0x00, 0x32 /* - terminal marker 50 - */, -/* pos 030e: 419 */ 0xF0 /* 'p' -> */, -/* pos 030f: 420 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0316 state 421) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x031B state 425) */, +/* pos 0304: 410 */ 0xE1 /* 'a' -> */, +/* pos 0305: 411 */ 0xE7 /* 'g' -> */, +/* pos 0306: 412 */ 0xBA /* ':' -> */, +/* pos 0307: 413 */ 0x00, 0x32 /* - terminal marker 50 - */, +/* pos 0309: 414 */ 0xF0 /* 'p' -> */, +/* pos 030a: 415 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0311 state 416) */, + 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0316 state 420) */, 0x08, /* fail */ -/* pos 0316: 421 */ 0xE3 /* 'c' -> */, -/* pos 0317: 422 */ 0xF4 /* 't' -> */, -/* pos 0318: 423 */ 0xBA /* ':' -> */, -/* pos 0319: 424 */ 0x00, 0x33 /* - terminal marker 51 - */, -/* pos 031b: 425 */ 0xF2 /* 'r' -> */, -/* pos 031c: 426 */ 0xE5 /* 'e' -> */, -/* pos 031d: 427 */ 0xF3 /* 's' -> */, -/* pos 031e: 428 */ 0xBA /* ':' -> */, -/* pos 031f: 429 */ 0x00, 0x34 /* - terminal marker 52 - */, -/* pos 0321: 430 */ 0xF2 /* 'r' -> */, -/* pos 0322: 431 */ 0xEF /* 'o' -> */, -/* pos 0323: 432 */ 0xED /* 'm' -> */, -/* pos 0324: 433 */ 0xBA /* ':' -> */, -/* pos 0325: 434 */ 0x00, 0x35 /* - terminal marker 53 - */, -/* pos 0327: 435 */ 0xF4 /* 't' -> */, -/* pos 0328: 436 */ 0xE3 /* 'c' -> */, -/* pos 0329: 437 */ 0xE8 /* 'h' -> */, -/* pos 032a: 438 */ 0xBA /* ':' -> */, -/* pos 032b: 439 */ 0x00, 0x36 /* - terminal marker 54 - */, -/* pos 032d: 440 */ 0xE1 /* 'a' -> */, -/* pos 032e: 441 */ 0xEE /* 'n' -> */, -/* pos 032f: 442 */ 0xE7 /* 'g' -> */, -/* pos 0330: 443 */ 0xE5 /* 'e' -> */, -/* pos 0331: 444 */ 0xBA /* ':' -> */, -/* pos 0332: 445 */ 0x00, 0x37 /* - terminal marker 55 - */, -/* pos 0334: 446 */ 0xEE /* 'n' -> */, -/* pos 0335: 447 */ 0xED /* 'm' -> */, -/* pos 0336: 448 */ 0xEF /* 'o' -> */, +/* pos 0311: 416 */ 0xE3 /* 'c' -> */, +/* pos 0312: 417 */ 0xF4 /* 't' -> */, +/* pos 0313: 418 */ 0xBA /* ':' -> */, +/* pos 0314: 419 */ 0x00, 0x33 /* - terminal marker 51 - */, +/* pos 0316: 420 */ 0xF2 /* 'r' -> */, +/* pos 0317: 421 */ 0xE5 /* 'e' -> */, +/* pos 0318: 422 */ 0xF3 /* 's' -> */, +/* pos 0319: 423 */ 0xBA /* ':' -> */, +/* pos 031a: 424 */ 0x00, 0x34 /* - terminal marker 52 - */, +/* pos 031c: 425 */ 0xF2 /* 'r' -> */, +/* pos 031d: 426 */ 0xEF /* 'o' -> */, +/* pos 031e: 427 */ 0xED /* 'm' -> */, +/* pos 031f: 428 */ 0xBA /* ':' -> */, +/* pos 0320: 429 */ 0x00, 0x35 /* - terminal marker 53 - */, +/* pos 0322: 430 */ 0xF4 /* 't' -> */, +/* pos 0323: 431 */ 0xE3 /* 'c' -> */, +/* pos 0324: 432 */ 0xE8 /* 'h' -> */, +/* pos 0325: 433 */ 0xBA /* ':' -> */, +/* pos 0326: 434 */ 0x00, 0x36 /* - terminal marker 54 - */, +/* pos 0328: 435 */ 0xE1 /* 'a' -> */, +/* pos 0329: 436 */ 0xEE /* 'n' -> */, +/* pos 032a: 437 */ 0xE7 /* 'g' -> */, +/* pos 032b: 438 */ 0xE5 /* 'e' -> */, +/* pos 032c: 439 */ 0xBA /* ':' -> */, +/* pos 032d: 440 */ 0x00, 0x37 /* - terminal marker 55 - */, +/* pos 032f: 441 */ 0xEE /* 'n' -> */, +/* pos 0330: 442 */ 0xED /* 'm' -> */, +/* pos 0331: 443 */ 0xEF /* 'o' -> */, +/* pos 0332: 444 */ 0xE4 /* 'd' -> */, +/* pos 0333: 445 */ 0xE9 /* 'i' -> */, +/* pos 0334: 446 */ 0xE6 /* 'f' -> */, +/* pos 0335: 447 */ 0xE9 /* 'i' -> */, +/* pos 0336: 448 */ 0xE5 /* 'e' -> */, /* pos 0337: 449 */ 0xE4 /* 'd' -> */, -/* pos 0338: 450 */ 0xE9 /* 'i' -> */, -/* pos 0339: 451 */ 0xE6 /* 'f' -> */, +/* pos 0338: 450 */ 0xAD /* '-' -> */, +/* pos 0339: 451 */ 0xF3 /* 's' -> */, /* pos 033a: 452 */ 0xE9 /* 'i' -> */, -/* pos 033b: 453 */ 0xE5 /* 'e' -> */, -/* pos 033c: 454 */ 0xE4 /* 'd' -> */, -/* pos 033d: 455 */ 0xAD /* '-' -> */, -/* pos 033e: 456 */ 0xF3 /* 's' -> */, -/* pos 033f: 457 */ 0xE9 /* 'i' -> */, -/* pos 0340: 458 */ 0xEE /* 'n' -> */, -/* pos 0341: 459 */ 0xE3 /* 'c' -> */, -/* pos 0342: 460 */ 0xE5 /* 'e' -> */, -/* pos 0343: 461 */ 0xBA /* ':' -> */, -/* pos 0344: 462 */ 0x00, 0x38 /* - terminal marker 56 - */, -/* pos 0346: 463 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x0350 state 464) */, - 0x69 /* 'i' */, 0x15, 0x00 /* (to 0x035E state 477) */, - 0x6F /* 'o' */, 0x17, 0x00 /* (to 0x0363 state 481) */, +/* pos 033b: 453 */ 0xEE /* 'n' -> */, +/* pos 033c: 454 */ 0xE3 /* 'c' -> */, +/* pos 033d: 455 */ 0xE5 /* 'e' -> */, +/* pos 033e: 456 */ 0xBA /* ':' -> */, +/* pos 033f: 457 */ 0x00, 0x38 /* - terminal marker 56 - */, +/* pos 0341: 458 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x034B state 459) */, + 0x69 /* 'i' */, 0x15, 0x00 /* (to 0x0359 state 472) */, + 0x6F /* 'o' */, 0x17, 0x00 /* (to 0x035E state 476) */, 0x08, /* fail */ -/* pos 0350: 464 */ 0xF3 /* 's' -> */, -/* pos 0351: 465 */ 0xF4 /* 't' -> */, -/* pos 0352: 466 */ 0xAD /* '-' -> */, -/* pos 0353: 467 */ 0xED /* 'm' -> */, -/* pos 0354: 468 */ 0xEF /* 'o' -> */, +/* pos 034b: 459 */ 0xF3 /* 's' -> */, +/* pos 034c: 460 */ 0xF4 /* 't' -> */, +/* pos 034d: 461 */ 0xAD /* '-' -> */, +/* pos 034e: 462 */ 0xED /* 'm' -> */, +/* pos 034f: 463 */ 0xEF /* 'o' -> */, +/* pos 0350: 464 */ 0xE4 /* 'd' -> */, +/* pos 0351: 465 */ 0xE9 /* 'i' -> */, +/* pos 0352: 466 */ 0xE6 /* 'f' -> */, +/* pos 0353: 467 */ 0xE9 /* 'i' -> */, +/* pos 0354: 468 */ 0xE5 /* 'e' -> */, /* pos 0355: 469 */ 0xE4 /* 'd' -> */, -/* pos 0356: 470 */ 0xE9 /* 'i' -> */, -/* pos 0357: 471 */ 0xE6 /* 'f' -> */, -/* pos 0358: 472 */ 0xE9 /* 'i' -> */, -/* pos 0359: 473 */ 0xE5 /* 'e' -> */, -/* pos 035a: 474 */ 0xE4 /* 'd' -> */, -/* pos 035b: 475 */ 0xBA /* ':' -> */, -/* pos 035c: 476 */ 0x00, 0x39 /* - terminal marker 57 - */, -/* pos 035e: 477 */ 0xEE /* 'n' -> */, -/* pos 035f: 478 */ 0xEB /* 'k' -> */, -/* pos 0360: 479 */ 0xBA /* ':' -> */, -/* pos 0361: 480 */ 0x00, 0x3A /* - terminal marker 58 - */, -/* pos 0363: 481 */ 0xE3 /* 'c' -> */, -/* pos 0364: 482 */ 0xE1 /* 'a' -> */, -/* pos 0365: 483 */ 0xF4 /* 't' -> */, -/* pos 0366: 484 */ 0xE9 /* 'i' -> */, -/* pos 0367: 485 */ 0xEF /* 'o' -> */, -/* pos 0368: 486 */ 0xEE /* 'n' -> */, -/* pos 0369: 487 */ 0xBA /* ':' -> */, -/* pos 036a: 488 */ 0x00, 0x3B /* - terminal marker 59 - */, -/* pos 036c: 489 */ 0xE1 /* 'a' -> */, -/* pos 036d: 490 */ 0xF8 /* 'x' -> */, -/* pos 036e: 491 */ 0xAD /* '-' -> */, -/* pos 036f: 492 */ 0xE6 /* 'f' -> */, -/* pos 0370: 493 */ 0xEF /* 'o' -> */, -/* pos 0371: 494 */ 0xF2 /* 'r' -> */, -/* pos 0372: 495 */ 0xF7 /* 'w' -> */, -/* pos 0373: 496 */ 0xE1 /* 'a' -> */, -/* pos 0374: 497 */ 0xF2 /* 'r' -> */, -/* pos 0375: 498 */ 0xE4 /* 'd' -> */, -/* pos 0376: 499 */ 0xF3 /* 's' -> */, -/* pos 0377: 500 */ 0xBA /* ':' -> */, -/* pos 0378: 501 */ 0x00, 0x3C /* - terminal marker 60 - */, -/* pos 037a: 502 */ 0xF8 /* 'x' -> */, -/* pos 037b: 503 */ 0xF9 /* 'y' -> */, -/* pos 037c: 504 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x0383 state 505) */, - 0x20 /* ' ' */, 0xB5, 0x00 /* (to 0x0434 state 654) */, +/* pos 0356: 470 */ 0xBA /* ':' -> */, +/* pos 0357: 471 */ 0x00, 0x39 /* - terminal marker 57 - */, +/* pos 0359: 472 */ 0xEE /* 'n' -> */, +/* pos 035a: 473 */ 0xEB /* 'k' -> */, +/* pos 035b: 474 */ 0xBA /* ':' -> */, +/* pos 035c: 475 */ 0x00, 0x3A /* - terminal marker 58 - */, +/* pos 035e: 476 */ 0xE3 /* 'c' -> */, +/* pos 035f: 477 */ 0xE1 /* 'a' -> */, +/* pos 0360: 478 */ 0xF4 /* 't' -> */, +/* pos 0361: 479 */ 0xE9 /* 'i' -> */, +/* pos 0362: 480 */ 0xEF /* 'o' -> */, +/* pos 0363: 481 */ 0xEE /* 'n' -> */, +/* pos 0364: 482 */ 0xBA /* ':' -> */, +/* pos 0365: 483 */ 0x00, 0x3B /* - terminal marker 59 - */, +/* pos 0367: 484 */ 0xE1 /* 'a' -> */, +/* pos 0368: 485 */ 0xF8 /* 'x' -> */, +/* pos 0369: 486 */ 0xAD /* '-' -> */, +/* pos 036a: 487 */ 0xE6 /* 'f' -> */, +/* pos 036b: 488 */ 0xEF /* 'o' -> */, +/* pos 036c: 489 */ 0xF2 /* 'r' -> */, +/* pos 036d: 490 */ 0xF7 /* 'w' -> */, +/* pos 036e: 491 */ 0xE1 /* 'a' -> */, +/* pos 036f: 492 */ 0xF2 /* 'r' -> */, +/* pos 0370: 493 */ 0xE4 /* 'd' -> */, +/* pos 0371: 494 */ 0xF3 /* 's' -> */, +/* pos 0372: 495 */ 0xBA /* ':' -> */, +/* pos 0373: 496 */ 0x00, 0x3C /* - terminal marker 60 - */, +/* pos 0375: 497 */ 0xF8 /* 'x' -> */, +/* pos 0376: 498 */ 0xF9 /* 'y' -> */, +/* pos 0377: 499 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x037E state 500) */, + 0x20 /* ' ' */, 0xB5, 0x00 /* (to 0x042F state 649) */, 0x08, /* fail */ -/* pos 0383: 505 */ 0xE1 /* 'a' -> */, -/* pos 0384: 506 */ 0xF5 /* 'u' -> */, -/* pos 0385: 507 */ 0xF4 /* 't' -> */, -/* pos 0386: 508 */ 0xE8 /* 'h' -> */, -/* pos 0387: 509 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x038E state 510) */, - 0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x0398 state 519) */, +/* pos 037e: 500 */ 0xE1 /* 'a' -> */, +/* pos 037f: 501 */ 0xF5 /* 'u' -> */, +/* pos 0380: 502 */ 0xF4 /* 't' -> */, +/* pos 0381: 503 */ 0xE8 /* 'h' -> */, +/* pos 0382: 504 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0389 state 505) */, + 0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x0393 state 514) */, 0x08, /* fail */ -/* pos 038e: 510 */ 0xEE /* 'n' -> */, -/* pos 038f: 511 */ 0xF4 /* 't' -> */, -/* pos 0390: 512 */ 0xE9 /* 'i' -> */, -/* pos 0391: 513 */ 0xE3 /* 'c' -> */, -/* pos 0392: 514 */ 0xE1 /* 'a' -> */, -/* pos 0393: 515 */ 0xF4 /* 't' -> */, -/* pos 0394: 516 */ 0xE5 /* 'e' -> */, -/* pos 0395: 517 */ 0xBA /* ':' -> */, -/* pos 0396: 518 */ 0x00, 0x3D /* - terminal marker 61 - */, -/* pos 0398: 519 */ 0xF2 /* 'r' -> */, -/* pos 0399: 520 */ 0xE9 /* 'i' -> */, -/* pos 039a: 521 */ 0xFA /* 'z' -> */, -/* pos 039b: 522 */ 0xE1 /* 'a' -> */, -/* pos 039c: 523 */ 0xF4 /* 't' -> */, -/* pos 039d: 524 */ 0xE9 /* 'i' -> */, -/* pos 039e: 525 */ 0xEF /* 'o' -> */, -/* pos 039f: 526 */ 0xEE /* 'n' -> */, -/* pos 03a0: 527 */ 0xBA /* ':' -> */, -/* pos 03a1: 528 */ 0x00, 0x3E /* - terminal marker 62 - */, -/* pos 03a3: 529 */ 0xE5 /* 'e' -> */, -/* pos 03a4: 530 */ 0xF3 /* 's' -> */, -/* pos 03a5: 531 */ 0xE8 /* 'h' -> */, -/* pos 03a6: 532 */ 0xBA /* ':' -> */, -/* pos 03a7: 533 */ 0x00, 0x3F /* - terminal marker 63 - */, -/* pos 03a9: 534 */ 0xF2 /* 'r' -> */, -/* pos 03aa: 535 */ 0xF9 /* 'y' -> */, -/* pos 03ab: 536 */ 0xAD /* '-' -> */, -/* pos 03ac: 537 */ 0xE1 /* 'a' -> */, -/* pos 03ad: 538 */ 0xE6 /* 'f' -> */, -/* pos 03ae: 539 */ 0xF4 /* 't' -> */, -/* pos 03af: 540 */ 0xE5 /* 'e' -> */, -/* pos 03b0: 541 */ 0xF2 /* 'r' -> */, -/* pos 03b1: 542 */ 0xBA /* ':' -> */, -/* pos 03b2: 543 */ 0x00, 0x40 /* - terminal marker 64 - */, -/* pos 03b4: 544 */ 0xF6 /* 'v' -> */, -/* pos 03b5: 545 */ 0xE5 /* 'e' -> */, -/* pos 03b6: 546 */ 0xF2 /* 'r' -> */, -/* pos 03b7: 547 */ 0xBA /* ':' -> */, -/* pos 03b8: 548 */ 0x00, 0x41 /* - terminal marker 65 - */, -/* pos 03ba: 549 */ 0xAD /* '-' -> */, -/* pos 03bb: 550 */ 0xE3 /* 'c' -> */, -/* pos 03bc: 551 */ 0xEF /* 'o' -> */, -/* pos 03bd: 552 */ 0xEF /* 'o' -> */, -/* pos 03be: 553 */ 0xEB /* 'k' -> */, -/* pos 03bf: 554 */ 0xE9 /* 'i' -> */, -/* pos 03c0: 555 */ 0xE5 /* 'e' -> */, -/* pos 03c1: 556 */ 0xBA /* ':' -> */, -/* pos 03c2: 557 */ 0x00, 0x42 /* - terminal marker 66 - */, -/* pos 03c4: 558 */ 0xF2 /* 'r' -> */, -/* pos 03c5: 559 */ 0xE9 /* 'i' -> */, -/* pos 03c6: 560 */ 0xE3 /* 'c' -> */, -/* pos 03c7: 561 */ 0xF4 /* 't' -> */, -/* pos 03c8: 562 */ 0xAD /* '-' -> */, -/* pos 03c9: 563 */ 0xF4 /* 't' -> */, -/* pos 03ca: 564 */ 0xF2 /* 'r' -> */, -/* pos 03cb: 565 */ 0xE1 /* 'a' -> */, -/* pos 03cc: 566 */ 0xEE /* 'n' -> */, -/* pos 03cd: 567 */ 0xF3 /* 's' -> */, -/* pos 03ce: 568 */ 0xF0 /* 'p' -> */, -/* pos 03cf: 569 */ 0xEF /* 'o' -> */, -/* pos 03d0: 570 */ 0xF2 /* 'r' -> */, -/* pos 03d1: 571 */ 0xF4 /* 't' -> */, -/* pos 03d2: 572 */ 0xAD /* '-' -> */, -/* pos 03d3: 573 */ 0xF3 /* 's' -> */, -/* pos 03d4: 574 */ 0xE5 /* 'e' -> */, -/* pos 03d5: 575 */ 0xE3 /* 'c' -> */, -/* pos 03d6: 576 */ 0xF5 /* 'u' -> */, -/* pos 03d7: 577 */ 0xF2 /* 'r' -> */, -/* pos 03d8: 578 */ 0xE9 /* 'i' -> */, -/* pos 03d9: 579 */ 0xF4 /* 't' -> */, -/* pos 03da: 580 */ 0xF9 /* 'y' -> */, -/* pos 03db: 581 */ 0xBA /* ':' -> */, -/* pos 03dc: 582 */ 0x00, 0x43 /* - terminal marker 67 - */, -/* pos 03de: 583 */ 0xF2 /* 'r' -> */, -/* pos 03df: 584 */ 0xE1 /* 'a' -> */, -/* pos 03e0: 585 */ 0xEE /* 'n' -> */, -/* pos 03e1: 586 */ 0xF3 /* 's' -> */, -/* pos 03e2: 587 */ 0xE6 /* 'f' -> */, -/* pos 03e3: 588 */ 0xE5 /* 'e' -> */, -/* pos 03e4: 589 */ 0xF2 /* 'r' -> */, -/* pos 03e5: 590 */ 0xAD /* '-' -> */, -/* pos 03e6: 591 */ 0xE5 /* 'e' -> */, +/* pos 0389: 505 */ 0xEE /* 'n' -> */, +/* pos 038a: 506 */ 0xF4 /* 't' -> */, +/* pos 038b: 507 */ 0xE9 /* 'i' -> */, +/* pos 038c: 508 */ 0xE3 /* 'c' -> */, +/* pos 038d: 509 */ 0xE1 /* 'a' -> */, +/* pos 038e: 510 */ 0xF4 /* 't' -> */, +/* pos 038f: 511 */ 0xE5 /* 'e' -> */, +/* pos 0390: 512 */ 0xBA /* ':' -> */, +/* pos 0391: 513 */ 0x00, 0x3D /* - terminal marker 61 - */, +/* pos 0393: 514 */ 0xF2 /* 'r' -> */, +/* pos 0394: 515 */ 0xE9 /* 'i' -> */, +/* pos 0395: 516 */ 0xFA /* 'z' -> */, +/* pos 0396: 517 */ 0xE1 /* 'a' -> */, +/* pos 0397: 518 */ 0xF4 /* 't' -> */, +/* pos 0398: 519 */ 0xE9 /* 'i' -> */, +/* pos 0399: 520 */ 0xEF /* 'o' -> */, +/* pos 039a: 521 */ 0xEE /* 'n' -> */, +/* pos 039b: 522 */ 0xBA /* ':' -> */, +/* pos 039c: 523 */ 0x00, 0x3E /* - terminal marker 62 - */, +/* pos 039e: 524 */ 0xE5 /* 'e' -> */, +/* pos 039f: 525 */ 0xF3 /* 's' -> */, +/* pos 03a0: 526 */ 0xE8 /* 'h' -> */, +/* pos 03a1: 527 */ 0xBA /* ':' -> */, +/* pos 03a2: 528 */ 0x00, 0x3F /* - terminal marker 63 - */, +/* pos 03a4: 529 */ 0xF2 /* 'r' -> */, +/* pos 03a5: 530 */ 0xF9 /* 'y' -> */, +/* pos 03a6: 531 */ 0xAD /* '-' -> */, +/* pos 03a7: 532 */ 0xE1 /* 'a' -> */, +/* pos 03a8: 533 */ 0xE6 /* 'f' -> */, +/* pos 03a9: 534 */ 0xF4 /* 't' -> */, +/* pos 03aa: 535 */ 0xE5 /* 'e' -> */, +/* pos 03ab: 536 */ 0xF2 /* 'r' -> */, +/* pos 03ac: 537 */ 0xBA /* ':' -> */, +/* pos 03ad: 538 */ 0x00, 0x40 /* - terminal marker 64 - */, +/* pos 03af: 539 */ 0xF6 /* 'v' -> */, +/* pos 03b0: 540 */ 0xE5 /* 'e' -> */, +/* pos 03b1: 541 */ 0xF2 /* 'r' -> */, +/* pos 03b2: 542 */ 0xBA /* ':' -> */, +/* pos 03b3: 543 */ 0x00, 0x41 /* - terminal marker 65 - */, +/* pos 03b5: 544 */ 0xAD /* '-' -> */, +/* pos 03b6: 545 */ 0xE3 /* 'c' -> */, +/* pos 03b7: 546 */ 0xEF /* 'o' -> */, +/* pos 03b8: 547 */ 0xEF /* 'o' -> */, +/* pos 03b9: 548 */ 0xEB /* 'k' -> */, +/* pos 03ba: 549 */ 0xE9 /* 'i' -> */, +/* pos 03bb: 550 */ 0xE5 /* 'e' -> */, +/* pos 03bc: 551 */ 0xBA /* ':' -> */, +/* pos 03bd: 552 */ 0x00, 0x42 /* - terminal marker 66 - */, +/* pos 03bf: 553 */ 0xF2 /* 'r' -> */, +/* pos 03c0: 554 */ 0xE9 /* 'i' -> */, +/* pos 03c1: 555 */ 0xE3 /* 'c' -> */, +/* pos 03c2: 556 */ 0xF4 /* 't' -> */, +/* pos 03c3: 557 */ 0xAD /* '-' -> */, +/* pos 03c4: 558 */ 0xF4 /* 't' -> */, +/* pos 03c5: 559 */ 0xF2 /* 'r' -> */, +/* pos 03c6: 560 */ 0xE1 /* 'a' -> */, +/* pos 03c7: 561 */ 0xEE /* 'n' -> */, +/* pos 03c8: 562 */ 0xF3 /* 's' -> */, +/* pos 03c9: 563 */ 0xF0 /* 'p' -> */, +/* pos 03ca: 564 */ 0xEF /* 'o' -> */, +/* pos 03cb: 565 */ 0xF2 /* 'r' -> */, +/* pos 03cc: 566 */ 0xF4 /* 't' -> */, +/* pos 03cd: 567 */ 0xAD /* '-' -> */, +/* pos 03ce: 568 */ 0xF3 /* 's' -> */, +/* pos 03cf: 569 */ 0xE5 /* 'e' -> */, +/* pos 03d0: 570 */ 0xE3 /* 'c' -> */, +/* pos 03d1: 571 */ 0xF5 /* 'u' -> */, +/* pos 03d2: 572 */ 0xF2 /* 'r' -> */, +/* pos 03d3: 573 */ 0xE9 /* 'i' -> */, +/* pos 03d4: 574 */ 0xF4 /* 't' -> */, +/* pos 03d5: 575 */ 0xF9 /* 'y' -> */, +/* pos 03d6: 576 */ 0xBA /* ':' -> */, +/* pos 03d7: 577 */ 0x00, 0x43 /* - terminal marker 67 - */, +/* pos 03d9: 578 */ 0xF2 /* 'r' -> */, +/* pos 03da: 579 */ 0xE1 /* 'a' -> */, +/* pos 03db: 580 */ 0xEE /* 'n' -> */, +/* pos 03dc: 581 */ 0xF3 /* 's' -> */, +/* pos 03dd: 582 */ 0xE6 /* 'f' -> */, +/* pos 03de: 583 */ 0xE5 /* 'e' -> */, +/* pos 03df: 584 */ 0xF2 /* 'r' -> */, +/* pos 03e0: 585 */ 0xAD /* '-' -> */, +/* pos 03e1: 586 */ 0xE5 /* 'e' -> */, +/* pos 03e2: 587 */ 0xEE /* 'n' -> */, +/* pos 03e3: 588 */ 0xE3 /* 'c' -> */, +/* pos 03e4: 589 */ 0xEF /* 'o' -> */, +/* pos 03e5: 590 */ 0xE4 /* 'd' -> */, +/* pos 03e6: 591 */ 0xE9 /* 'i' -> */, /* pos 03e7: 592 */ 0xEE /* 'n' -> */, -/* pos 03e8: 593 */ 0xE3 /* 'c' -> */, -/* pos 03e9: 594 */ 0xEF /* 'o' -> */, -/* pos 03ea: 595 */ 0xE4 /* 'd' -> */, -/* pos 03eb: 596 */ 0xE9 /* 'i' -> */, -/* pos 03ec: 597 */ 0xEE /* 'n' -> */, -/* pos 03ed: 598 */ 0xE7 /* 'g' -> */, -/* pos 03ee: 599 */ 0xBA /* ':' -> */, -/* pos 03ef: 600 */ 0x00, 0x44 /* - terminal marker 68 - */, +/* pos 03e8: 593 */ 0xE7 /* 'g' -> */, +/* pos 03e9: 594 */ 0xBA /* ':' -> */, +/* pos 03ea: 595 */ 0x00, 0x44 /* - terminal marker 68 - */, +/* pos 03ec: 596 */ 0xE5 /* 'e' -> */, +/* pos 03ed: 597 */ 0xF2 /* 'r' -> */, +/* pos 03ee: 598 */ 0xAD /* '-' -> */, +/* pos 03ef: 599 */ 0xE1 /* 'a' -> */, +/* pos 03f0: 600 */ 0xE7 /* 'g' -> */, /* pos 03f1: 601 */ 0xE5 /* 'e' -> */, -/* pos 03f2: 602 */ 0xF2 /* 'r' -> */, -/* pos 03f3: 603 */ 0xAD /* '-' -> */, -/* pos 03f4: 604 */ 0xE1 /* 'a' -> */, -/* pos 03f5: 605 */ 0xE7 /* 'g' -> */, -/* pos 03f6: 606 */ 0xE5 /* 'e' -> */, -/* pos 03f7: 607 */ 0xEE /* 'n' -> */, -/* pos 03f8: 608 */ 0xF4 /* 't' -> */, -/* pos 03f9: 609 */ 0xBA /* ':' -> */, -/* pos 03fa: 610 */ 0x00, 0x45 /* - terminal marker 69 - */, -/* pos 03fc: 611 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0403 state 612) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0408 state 616) */, +/* pos 03f2: 602 */ 0xEE /* 'n' -> */, +/* pos 03f3: 603 */ 0xF4 /* 't' -> */, +/* pos 03f4: 604 */ 0xBA /* ':' -> */, +/* pos 03f5: 605 */ 0x00, 0x45 /* - terminal marker 69 - */, +/* pos 03f7: 606 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x03FE state 607) */, + 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0403 state 611) */, 0x08, /* fail */ -/* pos 0403: 612 */ 0xF2 /* 'r' -> */, -/* pos 0404: 613 */ 0xF9 /* 'y' -> */, -/* pos 0405: 614 */ 0xBA /* ':' -> */, -/* pos 0406: 615 */ 0x00, 0x46 /* - terminal marker 70 - */, -/* pos 0408: 616 */ 0xE1 /* 'a' -> */, -/* pos 0409: 617 */ 0xBA /* ':' -> */, -/* pos 040a: 618 */ 0x00, 0x47 /* - terminal marker 71 - */, -/* pos 040c: 619 */ 0xF7 /* 'w' -> */, -/* pos 040d: 620 */ 0xF7 /* 'w' -> */, -/* pos 040e: 621 */ 0xAD /* '-' -> */, -/* pos 040f: 622 */ 0xE1 /* 'a' -> */, -/* pos 0410: 623 */ 0xF5 /* 'u' -> */, -/* pos 0411: 624 */ 0xF4 /* 't' -> */, -/* pos 0412: 625 */ 0xE8 /* 'h' -> */, -/* pos 0413: 626 */ 0xE5 /* 'e' -> */, -/* pos 0414: 627 */ 0xEE /* 'n' -> */, -/* pos 0415: 628 */ 0xF4 /* 't' -> */, -/* pos 0416: 629 */ 0xE9 /* 'i' -> */, -/* pos 0417: 630 */ 0xE3 /* 'c' -> */, -/* pos 0418: 631 */ 0xE1 /* 'a' -> */, -/* pos 0419: 632 */ 0xF4 /* 't' -> */, -/* pos 041a: 633 */ 0xE5 /* 'e' -> */, -/* pos 041b: 634 */ 0xBA /* ':' -> */, -/* pos 041c: 635 */ 0x00, 0x48 /* - terminal marker 72 - */, -/* pos 041e: 636 */ 0xF4 /* 't' -> */, -/* pos 041f: 637 */ 0xE3 /* 'c' -> */, -/* pos 0420: 638 */ 0xE8 /* 'h' -> */, -/* pos 0421: 639 */ 0x00, 0x49 /* - terminal marker 73 - */, -/* pos 0423: 640 */ 0xF4 /* 't' -> */, -/* pos 0424: 641 */ 0x00, 0x4A /* - terminal marker 74 - */, -/* pos 0426: 642 */ 0xEC /* 'l' -> */, -/* pos 0427: 643 */ 0xE5 /* 'e' -> */, -/* pos 0428: 644 */ 0xF4 /* 't' -> */, -/* pos 0429: 645 */ 0xE5 /* 'e' -> */, -/* pos 042a: 646 */ 0x00, 0x4B /* - terminal marker 75 - */, -/* pos 042c: 647 */ 0xE9 /* 'i' -> */, -/* pos 042d: 648 */ 0xAD /* '-' -> */, -/* pos 042e: 649 */ 0xE1 /* 'a' -> */, -/* pos 042f: 650 */ 0xF2 /* 'r' -> */, -/* pos 0430: 651 */ 0xE7 /* 'g' -> */, -/* pos 0431: 652 */ 0xF3 /* 's' -> */, -/* pos 0432: 653 */ 0x00, 0x4C /* - terminal marker 76 - */, -/* pos 0434: 654 */ 0x00, 0x4D /* - terminal marker 77 - */, +/* pos 03fe: 607 */ 0xF2 /* 'r' -> */, +/* pos 03ff: 608 */ 0xF9 /* 'y' -> */, +/* pos 0400: 609 */ 0xBA /* ':' -> */, +/* pos 0401: 610 */ 0x00, 0x46 /* - terminal marker 70 - */, +/* pos 0403: 611 */ 0xE1 /* 'a' -> */, +/* pos 0404: 612 */ 0xBA /* ':' -> */, +/* pos 0405: 613 */ 0x00, 0x47 /* - terminal marker 71 - */, +/* pos 0407: 614 */ 0xF7 /* 'w' -> */, +/* pos 0408: 615 */ 0xF7 /* 'w' -> */, +/* pos 0409: 616 */ 0xAD /* '-' -> */, +/* pos 040a: 617 */ 0xE1 /* 'a' -> */, +/* pos 040b: 618 */ 0xF5 /* 'u' -> */, +/* pos 040c: 619 */ 0xF4 /* 't' -> */, +/* pos 040d: 620 */ 0xE8 /* 'h' -> */, +/* pos 040e: 621 */ 0xE5 /* 'e' -> */, +/* pos 040f: 622 */ 0xEE /* 'n' -> */, +/* pos 0410: 623 */ 0xF4 /* 't' -> */, +/* pos 0411: 624 */ 0xE9 /* 'i' -> */, +/* pos 0412: 625 */ 0xE3 /* 'c' -> */, +/* pos 0413: 626 */ 0xE1 /* 'a' -> */, +/* pos 0414: 627 */ 0xF4 /* 't' -> */, +/* pos 0415: 628 */ 0xE5 /* 'e' -> */, +/* pos 0416: 629 */ 0xBA /* ':' -> */, +/* pos 0417: 630 */ 0x00, 0x48 /* - terminal marker 72 - */, +/* pos 0419: 631 */ 0xF4 /* 't' -> */, +/* pos 041a: 632 */ 0xE3 /* 'c' -> */, +/* pos 041b: 633 */ 0xE8 /* 'h' -> */, +/* pos 041c: 634 */ 0x00, 0x49 /* - terminal marker 73 - */, +/* pos 041e: 635 */ 0xF4 /* 't' -> */, +/* pos 041f: 636 */ 0x00, 0x4A /* - terminal marker 74 - */, +/* pos 0421: 637 */ 0xEC /* 'l' -> */, +/* pos 0422: 638 */ 0xE5 /* 'e' -> */, +/* pos 0423: 639 */ 0xF4 /* 't' -> */, +/* pos 0424: 640 */ 0xE5 /* 'e' -> */, +/* pos 0425: 641 */ 0x00, 0x4B /* - terminal marker 75 - */, +/* pos 0427: 642 */ 0xE9 /* 'i' -> */, +/* pos 0428: 643 */ 0xAD /* '-' -> */, +/* pos 0429: 644 */ 0xE1 /* 'a' -> */, +/* pos 042a: 645 */ 0xF2 /* 'r' -> */, +/* pos 042b: 646 */ 0xE7 /* 'g' -> */, +/* pos 042c: 647 */ 0xF3 /* 's' -> */, +/* pos 042d: 648 */ 0x00, 0x4C /* - terminal marker 76 - */, +/* pos 042f: 649 */ 0x00, 0x4D /* - terminal marker 77 - */, +/* pos 0431: 650 */ 0xAD /* '-' -> */, +/* pos 0432: 651 */ 0xF2 /* 'r' -> */, +/* pos 0433: 652 */ 0xE5 /* 'e' -> */, +/* pos 0434: 653 */ 0xE1 /* 'a' -> */, +/* pos 0435: 654 */ 0xEC /* 'l' -> */, /* pos 0436: 655 */ 0xAD /* '-' -> */, -/* pos 0437: 656 */ 0xF2 /* 'r' -> */, -/* pos 0438: 657 */ 0xE5 /* 'e' -> */, -/* pos 0439: 658 */ 0xE1 /* 'a' -> */, -/* pos 043a: 659 */ 0xEC /* 'l' -> */, -/* pos 043b: 660 */ 0xAD /* '-' -> */, -/* pos 043c: 661 */ 0xE9 /* 'i' -> */, -/* pos 043d: 662 */ 0xF0 /* 'p' -> */, -/* pos 043e: 663 */ 0xBA /* ':' -> */, -/* pos 043f: 664 */ 0x00, 0x4E /* - terminal marker 78 - */, -/* pos 0441: 665 */ 0xA0 /* ' ' -> */, -/* pos 0442: 666 */ 0x00, 0x4F /* - terminal marker 79 - */, -/* total size 1092 bytes */ +/* pos 0437: 656 */ 0xE9 /* 'i' -> */, +/* pos 0438: 657 */ 0xF0 /* 'p' -> */, +/* pos 0439: 658 */ 0xBA /* ':' -> */, +/* pos 043a: 659 */ 0x00, 0x4E /* - terminal marker 78 - */, +/* pos 043c: 660 */ 0xA0 /* ' ' -> */, +/* pos 043d: 661 */ 0x00, 0x4F /* - terminal marker 79 - */, +/* total size 1087 bytes */ diff --git a/lib/lws-plat-unix.c b/lib/lws-plat-unix.c index 880ad85d..abfe72cc 100644 --- a/lib/lws-plat-unix.c +++ b/lib/lws-plat-unix.c @@ -440,12 +440,14 @@ next: #endif +#if 0 static void sigabrt_handler(int x) { printf("%s\n", __func__); //*(char *)0 = 0; } +#endif LWS_VISIBLE int lws_plat_context_early_init(void) @@ -460,7 +462,7 @@ lws_plat_context_early_init(void) signal(SIGPIPE, SIG_IGN); - signal(SIGABRT, sigabrt_handler); +// signal(SIGABRT, sigabrt_handler); return 0; } diff --git a/lib/output.c b/lib/output.c index b527e9c5..d23c3281 100644 --- a/lib/output.c +++ b/lib/output.c @@ -560,7 +560,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) unsigned long amount; int n, m; - while (!lws_send_pipe_choked(wsi)) { + while (wsi->http2_substream || !lws_send_pipe_choked(wsi)) { if (wsi->trunc_len) { if (lws_issue_raw(wsi, wsi->trunc_alloc + wsi->trunc_offset, diff --git a/lib/pollfd.c b/lib/pollfd.c index 7a4f17e4..9168b9ed 100644 --- a/lib/pollfd.c +++ b/lib/pollfd.c @@ -43,6 +43,10 @@ _lws_change_pollfd(struct lws *wsi, int _and, int _or, struct lws_pollargs *pa) pa->prev_events = pfd->events; pa->events = pfd->events = (pfd->events & ~_and) | _or; + + if (wsi->http2_substream) + return 0; + if (wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_CHANGE_MODE_POLL_FD, wsi->user_space, (void *)pa, 0)) { ret = -1; @@ -76,6 +80,7 @@ _lws_change_pollfd(struct lws *wsi, int _and, int _or, struct lws_pollargs *pa) #if LWS_POSIX pa_events = pa->prev_events != pa->events; #endif + if (pa_events) { if (lws_plat_change_pollfd(context, wsi, pfd)) { diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 0684326d..cff84623 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -392,6 +392,7 @@ enum lws_connection_states { enum http_version { HTTP_VERSION_1_0, HTTP_VERSION_1_1, + HTTP_VERSION_2 }; enum http_connection_type { @@ -1216,6 +1217,7 @@ struct lws { #endif unsigned int hdr_parsing_completed:1; + unsigned int http2_substream:1; unsigned int listener:1; unsigned int user_space_externally_allocated:1; unsigned int socket_is_permanently_unusable:1; @@ -1562,7 +1564,7 @@ lws_ssl_destroy(struct lws_vhost *vhost); #ifdef LWS_USE_HTTP2 LWS_EXTERN void -lws_context_init_http2_ssl(struct lws_context *context); +lws_context_init_http2_ssl(struct lws_vhost *vhost); #else #define lws_context_init_http2_ssl(_a) #endif diff --git a/lib/server.c b/lib/server.c index b28c9bba..aca8ad79 100644 --- a/lib/server.c +++ b/lib/server.c @@ -359,37 +359,41 @@ lws_http_action(struct lws *wsi) wsi->u.http.content_length = atoi(content_length_str); } - /* http_version? Default to 1.0, override with token: */ - request_version = HTTP_VERSION_1_0; + if (wsi->http2_substream) { + wsi->u.http.request_version = HTTP_VERSION_2; + } else { + /* http_version? Default to 1.0, override with token: */ + request_version = HTTP_VERSION_1_0; - /* Works for single digit HTTP versions. : */ - http_version_len = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP); - if (http_version_len > 7) { - lws_hdr_copy(wsi, http_version_str, - sizeof(http_version_str) - 1, WSI_TOKEN_HTTP); - if (http_version_str[5] == '1' && http_version_str[7] == '1') - request_version = HTTP_VERSION_1_1; - } - wsi->u.http.request_version = request_version; + /* Works for single digit HTTP versions. : */ + http_version_len = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP); + if (http_version_len > 7) { + lws_hdr_copy(wsi, http_version_str, + sizeof(http_version_str) - 1, WSI_TOKEN_HTTP); + if (http_version_str[5] == '1' && http_version_str[7] == '1') + request_version = HTTP_VERSION_1_1; + } + wsi->u.http.request_version = request_version; - /* HTTP/1.1 defaults to "keep-alive", 1.0 to "close" */ - if (request_version == HTTP_VERSION_1_1) - connection_type = HTTP_CONNECTION_KEEP_ALIVE; - else - connection_type = HTTP_CONNECTION_CLOSE; - - /* Override default if http "Connection:" header: */ - if (lws_hdr_total_length(wsi, WSI_TOKEN_CONNECTION)) { - lws_hdr_copy(wsi, http_conn_str, sizeof(http_conn_str) - 1, - WSI_TOKEN_CONNECTION); - http_conn_str[sizeof(http_conn_str) - 1] = '\0'; - if (!strcasecmp(http_conn_str, "keep-alive")) + /* HTTP/1.1 defaults to "keep-alive", 1.0 to "close" */ + if (request_version == HTTP_VERSION_1_1) connection_type = HTTP_CONNECTION_KEEP_ALIVE; else - if (!strcasecmp(http_conn_str, "close")) - connection_type = HTTP_CONNECTION_CLOSE; + connection_type = HTTP_CONNECTION_CLOSE; + + /* Override default if http "Connection:" header: */ + if (lws_hdr_total_length(wsi, WSI_TOKEN_CONNECTION)) { + lws_hdr_copy(wsi, http_conn_str, sizeof(http_conn_str) - 1, + WSI_TOKEN_CONNECTION); + http_conn_str[sizeof(http_conn_str) - 1] = '\0'; + if (!strcasecmp(http_conn_str, "keep-alive")) + connection_type = HTTP_CONNECTION_KEEP_ALIVE; + else + if (!strcasecmp(http_conn_str, "close")) + connection_type = HTTP_CONNECTION_CLOSE; + } + wsi->u.http.connection_type = connection_type; } - wsi->u.http.connection_type = connection_type; n = wsi->protocol->callback(wsi, LWS_CALLBACK_FILTER_HTTP_CONNECTION, wsi->user_space, uri_ptr, uri_len); @@ -479,6 +483,8 @@ lws_http_action(struct lws *wsi) "http://", "https://" }; + // lwsl_err("inin '%s'\n", s); + if (!lws_hdr_total_length(wsi, WSI_TOKEN_HOST)) goto bail_nuke_ah; if (lws_add_http_header_status(wsi, 301, &p, end)) @@ -550,7 +556,7 @@ lws_http_action(struct lws *wsi) if (!s) s = "index.html"; - + // lwsl_err("okok\n"); n = lws_http_serve(wsi, s, hit->origin); } else @@ -632,8 +638,8 @@ lws_handshake_server(struct lws *wsi, unsigned char **buf, size_t len) } #ifdef LWS_USE_HTTP2 if (!strcasecmp(lws_hdr_simple_ptr(wsi, WSI_TOKEN_UPGRADE), - "h2c-14")) { - lwsl_info("Upgrade to h2c-14\n"); + "h2c")) { + lwsl_info("Upgrade to h2c\n"); goto upgrade_h2c; } #endif diff --git a/lib/ssl-http2.c b/lib/ssl-http2.c index f1344c23..f03ee602 100644 --- a/lib/ssl-http2.c +++ b/lib/ssl-http2.c @@ -87,16 +87,16 @@ alpn_cb(SSL *s, const unsigned char **out, unsigned char *outlen, #endif LWS_VISIBLE void -lws_context_init_http2_ssl(struct lws_context *context) +lws_context_init_http2_ssl(struct lws_vhost *vhost) { #if OPENSSL_VERSION_NUMBER >= 0x10002000L - static struct alpn_ctx protos = { (unsigned char *)"\x05h2-14" + static struct alpn_ctx protos = { (unsigned char *)"\x02h2" "\x08http/1.1", 6 + 9 }; - SSL_CTX_set_next_protos_advertised_cb(context->ssl_ctx, npn_cb, &protos); + SSL_CTX_set_next_protos_advertised_cb(vhost->ssl_ctx, npn_cb, &protos); // ALPN selection callback - SSL_CTX_set_alpn_select_cb(context->ssl_ctx, alpn_cb, &protos); + SSL_CTX_set_alpn_select_cb(vhost->ssl_ctx, alpn_cb, &protos); lwsl_notice(" HTTP2 / ALPN enabled\n"); #else lwsl_notice( diff --git a/lib/ssl-server.c b/lib/ssl-server.c index 55ff61bd..f544fbe9 100644 --- a/lib/ssl-server.c +++ b/lib/ssl-server.c @@ -366,7 +366,7 @@ lws_context_init_server_ssl(struct lws_context_creation_info *info, * If we're supporting HTTP2, initialize that */ - lws_context_init_http2_ssl(context); + lws_context_init_http2_ssl(vhost); } return 0; diff --git a/lib/ssl.c b/lib/ssl.c index 1bb8e0c2..b4722b39 100644 --- a/lib/ssl.c +++ b/lib/ssl.c @@ -98,8 +98,12 @@ lws_ssl_destroy(struct lws_vhost *vhost) #if (OPENSSL_VERSION_NUMBER < 0x01000000) || defined(USE_WOLFSSL) ERR_remove_state(0); +#else +#if (OPENSSL_VERSION_NUMBER >= 0x10100005L) + ERR_remove_thread_state(); #else ERR_remove_thread_state(NULL); +#endif #endif ERR_free_strings(); EVP_cleanup(); @@ -442,8 +446,12 @@ lws_ssl_context_destroy(struct lws_context *context) { #if (OPENSSL_VERSION_NUMBER < 0x01000000) || defined(USE_WOLFSSL) ERR_remove_state(0); +#else +#if (OPENSSL_VERSION_NUMBER >= 0x10100005L) + ERR_remove_thread_state(); #else ERR_remove_thread_state(NULL); +#endif #endif ERR_free_strings(); EVP_cleanup(); diff --git a/lwsws/main.c b/lwsws/main.c index 24fc31d1..8d84552b 100644 --- a/lwsws/main.c +++ b/lwsws/main.c @@ -133,6 +133,7 @@ int main(int argc, char **argv) #ifndef _WIN32 syslog_options &= ~LOG_PERROR; #endif + printf("Daemonizing...\n"); break; #endif case 'd': @@ -159,6 +160,8 @@ int main(int argc, char **argv) fprintf(stderr, "Failed to daemonize\n"); return 10; } + if (daemonize) + lwsl_notice("Daemonized\n"); #endif signal(SIGINT, sighandler); diff --git a/plugins/protocol_dumb_increment.c b/plugins/protocol_dumb_increment.c index f26e5936..711251b5 100644 --- a/plugins/protocol_dumb_increment.c +++ b/plugins/protocol_dumb_increment.c @@ -18,6 +18,7 @@ * Public Domain. */ #include "../lib/libwebsockets.h" +#include struct per_vhost_data__dumb_increment { uv_timer_t timeout_watcher; diff --git a/plugins/protocol_lws_mirror.c b/plugins/protocol_lws_mirror.c index ba656603..05614db9 100644 --- a/plugins/protocol_lws_mirror.c +++ b/plugins/protocol_lws_mirror.c @@ -18,6 +18,7 @@ * Public Domain. */ #include "../lib/libwebsockets.h" +#include /* lws-mirror_protocol */ diff --git a/plugins/protocol_lws_status.c b/plugins/protocol_lws_status.c index fabaf6d0..359fd940 100644 --- a/plugins/protocol_lws_status.c +++ b/plugins/protocol_lws_status.c @@ -19,6 +19,7 @@ */ #include "../lib/libwebsockets.h" #include +#include struct per_session_data__lws_status { struct per_session_data__lws_status *list;