diff --git a/changelog b/changelog index b2ef533b..9be12684 100644 --- a/changelog +++ b/changelog @@ -75,6 +75,11 @@ feature. Input sanitization added to the js. 7) client connections attempted when no ah is free no longer fail, they are just deferred until an ah becomes available. +8) The test client pays attention to if you give it an http:/ or https:// +protocol string to its argument in URL format. If so, it stays in http[s] +client mode and doesn't upgrade to ws[s], allowing you to do generic http client +operations. + User API additions ------------------ @@ -125,6 +130,24 @@ this generates this kind of timestamp for use as logging preamble lwsts[13116]: [2016/01/25 14:52:52:8386] NOTICE: Initial logging level 7 +5) struct lws_client_connect_info has a new member + + const char *method + +If it's NULL, then everything happens as before, lws_client_connect_via_info() +makes a ws or wss connection to the address given. + +If you set method to a valid http method like "GET", though, then this method +is used and the connection remains in http[s], it's not upgraded to ws[s]. + +So with this, you can perform http[s] client operations as well as ws[s] ones. + +There are 4 new related callbacks + + LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44, + LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45, + LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46, + LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47, v1.7.0 diff --git a/lib/client-handshake.c b/lib/client-handshake.c index aaeb335d..d1baa0eb 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -383,7 +383,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) wsi->context = i->context; /* assert the mode and union status (hdr) clearly */ - lws_union_transition(wsi, LWSCM_HTTP_SERVING); + lws_union_transition(wsi, LWSCM_HTTP_CLIENT); wsi->sock = LWS_SOCK_INVALID; /* 1) fill up the wsi with stuff from the connect_info as far as it @@ -417,6 +417,11 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) goto bail; } #endif + wsi->protocol = &i->context->protocols[0]; + if (wsi && !wsi->user_space && i->userdata) { + wsi->user_space_externally_allocated = 1; + wsi->user_space = i->userdata; + } /* 2) stash the things from connect_info that we can't process without * an ah. Because if no ah, we will go on the ah waiting list and @@ -432,6 +437,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) wsi->u.hdr.stash->origin[0] = '\0'; wsi->u.hdr.stash->protocol[0] = '\0'; + wsi->u.hdr.stash->method[0] = '\0'; strncpy(wsi->u.hdr.stash->address, i->address, sizeof(wsi->u.hdr.stash->address) - 1); @@ -445,12 +451,16 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) if (i->protocol) strncpy(wsi->u.hdr.stash->protocol, i->protocol, sizeof(wsi->u.hdr.stash->protocol) - 1); + if (i->method) + strncpy(wsi->u.hdr.stash->method, i->method, + sizeof(wsi->u.hdr.stash->method) - 1); wsi->u.hdr.stash->address[sizeof(wsi->u.hdr.stash->address) - 1] = '\0'; wsi->u.hdr.stash->path[sizeof(wsi->u.hdr.stash->path) - 1] = '\0'; wsi->u.hdr.stash->host[sizeof(wsi->u.hdr.stash->host) - 1] = '\0'; wsi->u.hdr.stash->origin[sizeof(wsi->u.hdr.stash->origin) - 1] = '\0'; wsi->u.hdr.stash->protocol[sizeof(wsi->u.hdr.stash->protocol) - 1] = '\0'; + wsi->u.hdr.stash->method[sizeof(wsi->u.hdr.stash->method) - 1] = '\0'; /* if we went on the waiting list, no probs just return the wsi * when we get the ah, now or later, he will call @@ -503,6 +513,10 @@ lws_client_connect_via_info2(struct lws *wsi) if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS, stash->protocol)) goto bail1; + if (stash->method[0]) + if (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_METHOD, + stash->method)) + goto bail1; lws_free_set_NULL(wsi->u.hdr.stash); diff --git a/lib/client.c b/lib/client.c index 94497e94..bb84d172 100644 --- a/lib/client.c +++ b/lib/client.c @@ -492,6 +492,51 @@ strtolower(char *s) } } +/** + * lws_http_transaction_completed() - wait for new http transaction or close + * @wsi: websocket connection + * + * Returns 1 if the HTTP connection must close now + * Returns 0 and resets connection to wait for new HTTP header / + * transaction if possible + */ + +LWS_VISIBLE int LWS_WARN_UNUSED_RESULT +lws_http_transaction_completed_client(struct lws *wsi) +{ + lwsl_debug("%s: wsi %p\n", __func__, wsi); + /* if we can't go back to accept new headers, drop the connection */ + if (wsi->u.http.connection_type != HTTP_CONNECTION_KEEP_ALIVE) { + lwsl_info("%s: %p: close connection\n", __func__, wsi); + return 1; + } + + /* otherwise set ourselves up ready to go again */ + wsi->state = LWSS_CLIENT_HTTP_ESTABLISHED; + wsi->mode = LWSCM_HTTP_CLIENT_ACCEPTED; + wsi->u.http.content_length = 0; + wsi->hdr_parsing_completed = 0; + + /* He asked for it to stay alive indefinitely */ + lws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); + + /* + * As client, nothing new is going to come until we ask for it + * we can drop the ah, if any + */ + if (wsi->u.hdr.ah) { + wsi->u.hdr.ah->rxpos = wsi->u.hdr.ah->rxlen; + lws_header_table_detach(wsi, 0); + } + + /* If we're (re)starting on headers, need other implied init */ + wsi->u.hdr.ues = URIES_IDLE; + + lwsl_info("%s: %p: keep-alive await new transaction\n", __func__, wsi); + + return 0; +} + int lws_client_interpret_server_handshake(struct lws *wsi) { @@ -499,6 +544,7 @@ lws_client_interpret_server_handshake(struct lws *wsi) struct lws_context *context = wsi->context; int close_reason = LWS_CLOSE_STATUS_PROTOCOL_ERR; const char *pc, *prot, *ads = NULL, *path; + struct allocated_headers *ah; char *p; #ifndef LWS_NO_EXTENSIONS struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi]; @@ -512,11 +558,41 @@ lws_client_interpret_server_handshake(struct lws *wsi) void *v; #endif + if (!wsi->do_ws) { + /* we are being an http client... + */ + ah = wsi->u.hdr.ah; + lws_union_transition(wsi, LWSCM_HTTP_CLIENT_ACCEPTED); + wsi->state = LWSS_CLIENT_HTTP_ESTABLISHED; + wsi->u.http.ah = ah; + } + /* * well, what the server sent looked reasonable for syntax. * Now let's confirm it sent all the necessary headers + * + * http (non-ws) client will expect something like this + * + * HTTP/1.0.200 + * server:.libwebsockets + * content-type:.text/html + * content-length:.17703 + * set-cookie:.test=LWS_1456736240_336776_COOKIE;Max-Age=360000 + * + * + * */ + + wsi->u.http.connection_type = HTTP_CONNECTION_KEEP_ALIVE; p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP); + if (wsi->do_ws && !p) { + lwsl_info("no URI\n"); + goto bail3; + } + if (!p) { + p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP1_0); + wsi->u.http.connection_type = HTTP_CONNECTION_CLOSE; + } if (!p) { lwsl_info("no URI\n"); goto bail3; @@ -539,6 +615,56 @@ lws_client_interpret_server_handshake(struct lws *wsi) } return 0; } + + if (!wsi->do_ws) { + if (n != 200) { + lwsl_notice("Connection failed with code %d", n); + goto bail2; + } + + /* allocate the per-connection user memory (if any) */ + if (lws_ensure_user_space(wsi)) { + lwsl_err("Problem allocating wsi user mem\n"); + goto bail2; + } + + if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH)) { + wsi->u.http.content_length = + atoi(lws_hdr_simple_ptr(wsi, + WSI_TOKEN_HTTP_CONTENT_LENGTH)); + lwsl_notice("%s: incoming content length %d\n", __func__, + wsi->u.http.content_length); + wsi->u.http.content_remain = wsi->u.http.content_length; + } else /* can't do 1.1 without a content length */ + wsi->u.http.connection_type = HTTP_CONNECTION_CLOSE; + + /* + * we seem to be good to go, give client last chance to check + * headers and OK it + */ + if (wsi->protocol->callback(wsi, LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH, + wsi->user_space, NULL, 0)) + goto bail2; + + /* clear his proxy connection timeout */ + lws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); + + wsi->rxflow_change_to = LWS_RXFLOW_ALLOW; + + /* call him back to inform him he is up */ + if (wsi->protocol->callback(wsi, + LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP, + wsi->user_space, NULL, 0)) + goto bail3; + + /* free up his parsing allocations */ + lws_header_table_detach(wsi, 0); + + lwsl_notice("%s: client connection up\n", __func__); + + return 0; + } + if (lws_hdr_total_length(wsi, WSI_TOKEN_ACCEPT) == 0) { lwsl_info("no ACCEPT\n"); isErrorCodeReceived = 1; @@ -887,39 +1013,36 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) { char buf[128], hash[20], key_b64[40], *p = pkt; struct lws_context *context = wsi->context; + const char *meth; int n; #ifndef LWS_NO_EXTENSIONS const struct lws_extension *ext; int ext_count = 0; #endif - /* - * create the random key - */ - n = lws_get_random(context, hash, 16); - if (n != 16) { - lwsl_err("Unable to read from random dev %s\n", - SYSTEM_RANDOM_FILEPATH); - lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS); - return NULL; + meth = lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_METHOD); + if (!meth) { + meth = "GET"; + wsi->do_ws = 1; + } else + wsi->do_ws = 0; + + if (wsi->do_ws) { + /* + * create the random key + */ + n = lws_get_random(context, hash, 16); + if (n != 16) { + lwsl_err("Unable to read from random dev %s\n", + SYSTEM_RANDOM_FILEPATH); + lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS); + return NULL; + } + + lws_b64_encode_string(hash, 16, key_b64, sizeof(key_b64)); } - lws_b64_encode_string(hash, 16, key_b64, sizeof(key_b64)); - /* - * 00 example client handshake - * - * GET /socket.io/websocket HTTP/1.1 - * Upgrade: WebSocket - * Connection: Upgrade - * Host: 127.0.0.1:9999 - * Origin: http://127.0.0.1 - * Sec-WebSocket-Key1: 1 0 2#0W 9 89 7 92 ^ - * Sec-WebSocket-Key2: 7 7Y 4328 B2v[8(z1 - * Cookie: socketio=websocket - * - * (Á®Ä0¶†≥ - * * 04 example client handshake * * GET /chat HTTP/1.1 @@ -932,7 +1055,7 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) * Sec-WebSocket-Version: 4 */ - p += sprintf(p, "GET %s HTTP/1.1\x0d\x0a", + p += sprintf(p, "%s %s HTTP/1.1\x0d\x0a", meth, lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_URI)); p += sprintf(p, "Pragma: no-cache\x0d\x0a" @@ -940,65 +1063,79 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) p += sprintf(p, "Host: %s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_HOST)); - p += sprintf(p, "Upgrade: websocket\x0d\x0a" - "Connection: Upgrade\x0d\x0a" - "Sec-WebSocket-Key: "); - strcpy(p, key_b64); - p += strlen(key_b64); - p += sprintf(p, "\x0d\x0a"); + if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN)) p += sprintf(p, "Origin: http://%s\x0d\x0a", lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_ORIGIN)); - if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)) - p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a", - lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)); + if (wsi->do_ws) { + p += sprintf(p, "Upgrade: websocket\x0d\x0a" + "Connection: Upgrade\x0d\x0a" + "Sec-WebSocket-Key: "); + strcpy(p, key_b64); + p += strlen(key_b64); + p += sprintf(p, "\x0d\x0a"); + if (lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)) + p += sprintf(p, "Sec-WebSocket-Protocol: %s\x0d\x0a", + lws_hdr_simple_ptr(wsi, _WSI_TOKEN_CLIENT_SENT_PROTOCOLS)); - /* tell the server what extensions we could support */ + /* tell the server what extensions we could support */ - p += sprintf(p, "Sec-WebSocket-Extensions: "); + p += sprintf(p, "Sec-WebSocket-Extensions: "); #ifndef LWS_NO_EXTENSIONS - ext = context->extensions; - while (ext && ext->callback) { - n = lws_ext_cb_all_exts(context, wsi, - LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION, - (char *)ext->name, 0); - if (n) { /* an extension vetos us */ - lwsl_ext("ext %s vetoed\n", (char *)ext->name); + ext = context->extensions; + while (ext && ext->callback) { + n = lws_ext_cb_all_exts(context, wsi, + LWS_EXT_CB_CHECK_OK_TO_PROPOSE_EXTENSION, + (char *)ext->name, 0); + if (n) { /* an extension vetos us */ + lwsl_ext("ext %s vetoed\n", (char *)ext->name); + ext++; + continue; + } + n = context->protocols[0].callback(wsi, + LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED, + wsi->user_space, (char *)ext->name, 0); + + /* + * zero return from callback means + * go ahead and allow the extension, + * it's what we get if the callback is + * unhandled + */ + + if (n) { + ext++; + continue; + } + + /* apply it */ + + if (ext_count) + *p++ = ','; + p += sprintf(p, "%s", ext->client_offer); + ext_count++; + ext++; - continue; } - n = context->protocols[0].callback(wsi, - LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED, - wsi->user_space, (char *)ext->name, 0); - - /* - * zero return from callback means - * go ahead and allow the extension, - * it's what we get if the callback is - * unhandled - */ - - if (n) { - ext++; - continue; - } - - /* apply it */ - - if (ext_count) - *p++ = ','; - p += sprintf(p, "%s", ext->client_offer); - ext_count++; - - ext++; - } #endif - p += sprintf(p, "\x0d\x0a"); + p += sprintf(p, "\x0d\x0a"); - if (wsi->ietf_spec_revision) - p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a", - wsi->ietf_spec_revision); + if (wsi->ietf_spec_revision) + p += sprintf(p, "Sec-WebSocket-Version: %d\x0d\x0a", + wsi->ietf_spec_revision); + + /* prepare the expected server accept response */ + + key_b64[39] = '\0'; /* enforce composed length below buf sizeof */ + n = sprintf(buf, "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", key_b64); + + lws_SHA1((unsigned char *)buf, n, (unsigned char *)hash); + + lws_b64_encode_string(hash, 20, + wsi->u.hdr.ah->initial_handshake_hash_base64, + sizeof(wsi->u.hdr.ah->initial_handshake_hash_base64)); + } /* give userland a chance to append, eg, cookies */ @@ -1007,17 +1144,6 @@ lws_generate_client_handshake(struct lws *wsi, char *pkt) p += sprintf(p, "\x0d\x0a"); - /* prepare the expected server accept response */ - - key_b64[39] = '\0'; /* enforce composed length below buf sizeof */ - n = sprintf(buf, "%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", key_b64); - - lws_SHA1((unsigned char *)buf, n, (unsigned char *)hash); - - lws_b64_encode_string(hash, 20, - wsi->u.hdr.ah->initial_handshake_hash_base64, - sizeof(wsi->u.hdr.ah->initial_handshake_hash_base64)); - return p; } diff --git a/lib/lextable-strings.h b/lib/lextable-strings.h index 52ed26b7..6a5a267e 100644 --- a/lib/lextable-strings.h +++ b/lib/lextable-strings.h @@ -88,6 +88,7 @@ static const char *set[] = { "proxy ", "x-real-ip:", + "http/1.0 ", "", /* not matchable */ diff --git a/lib/lextable.h b/lib/lextable.h index c7f02e55..23e526d6 100644 --- a/lib/lextable.h +++ b/lib/lextable.h @@ -6,28 +6,28 @@ 0x75 /* 'u' */, 0x81, 0x00 /* (to 0x0090 state 34) */, 0x73 /* 's' */, 0x97, 0x00 /* (to 0x00A9 state 48) */, 0x0D /* '.' */, 0xD0, 0x00 /* (to 0x00E5 state 68) */, - 0x61 /* 'a' */, 0x22, 0x01 /* (to 0x013A state 129) */, - 0x69 /* 'i' */, 0x61, 0x01 /* (to 0x017C state 163) */, - 0x64 /* 'd' */, 0x0A, 0x02 /* (to 0x0228 state 265) */, - 0x72 /* 'r' */, 0x13, 0x02 /* (to 0x0234 state 270) */, - 0x3A /* ':' */, 0x44, 0x02 /* (to 0x0268 state 299) */, - 0x65 /* 'e' */, 0xD5, 0x02 /* (to 0x02FC state 414) */, - 0x66 /* 'f' */, 0xF1, 0x02 /* (to 0x031B state 430) */, - 0x6C /* 'l' */, 0x13, 0x03 /* (to 0x0340 state 463) */, - 0x6D /* 'm' */, 0x36, 0x03 /* (to 0x0366 state 489) */, - 0x74 /* 't' */, 0xA5, 0x03 /* (to 0x03D8 state 583) */, - 0x76 /* 'v' */, 0xC0, 0x03 /* (to 0x03F6 state 611) */, - 0x77 /* 'w' */, 0xCD, 0x03 /* (to 0x0406 state 619) */, - 0x78 /* 'x' */, 0xF4, 0x03 /* (to 0x0430 state 655) */, + 0x61 /* 'a' */, 0x28, 0x01 /* (to 0x0140 state 129) */, + 0x69 /* 'i' */, 0x67, 0x01 /* (to 0x0182 state 163) */, + 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) */, 0x08, /* fail */ /* pos 0040: 1 */ 0xE5 /* 'e' -> */, /* pos 0041: 2 */ 0xF4 /* 't' -> */, /* pos 0042: 3 */ 0xA0 /* ' ' -> */, /* pos 0043: 4 */ 0x00, 0x00 /* - terminal marker 0 - */, /* pos 0045: 5 */ 0x6F /* 'o' */, 0x0D, 0x00 /* (to 0x0052 state 6) */, - 0x72 /* 'r' */, 0x86, 0x01 /* (to 0x01CE state 211) */, - 0x61 /* 'a' */, 0xCD, 0x03 /* (to 0x0418 state 636) */, - 0x75 /* 'u' */, 0xCF, 0x03 /* (to 0x041D state 640) */, + 0x72 /* 'r' */, 0x8C, 0x01 /* (to 0x01D4 state 211) */, + 0x61 /* 'a' */, 0xD3, 0x03 /* (to 0x041E state 636) */, + 0x75 /* 'u' */, 0xD5, 0x03 /* (to 0x0423 state 640) */, 0x08, /* fail */ /* pos 0052: 6 */ 0xF3 /* 's' -> */, /* pos 0053: 7 */ 0xF4 /* 't' -> */, @@ -51,13 +51,13 @@ /* pos 006f: 21 */ 0xBA /* ':' -> */, /* pos 0070: 22 */ 0x00, 0x03 /* - terminal marker 3 - */, /* pos 0072: 23 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0079 state 24) */, - 0x61 /* 'a' */, 0x66, 0x01 /* (to 0x01DB state 217) */, + 0x61 /* 'a' */, 0x6C, 0x01 /* (to 0x01E1 state 217) */, 0x08, /* fail */ /* pos 0079: 24 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0080 state 25) */, - 0x6F /* 'o' */, 0x7B, 0x01 /* (to 0x01F7 state 243) */, + 0x6F /* 'o' */, 0x81, 0x01 /* (to 0x01FD state 243) */, 0x08, /* fail */ /* pos 0080: 25 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0087 state 26) */, - 0x74 /* 't' */, 0x7A, 0x01 /* (to 0x01FD state 248) */, + 0x74 /* 't' */, 0x80, 0x01 /* (to 0x0203 state 248) */, 0x08, /* fail */ /* pos 0087: 26 */ 0xE5 /* 'e' -> */, /* pos 0088: 27 */ 0xE3 /* 'c' -> */, @@ -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' */, 0x58, 0x03 /* (to 0x03EB state 601) */, - 0x72 /* 'r' */, 0x90, 0x03 /* (to 0x0426 state 647) */, + 0x73 /* 's' */, 0x5E, 0x03 /* (to 0x03F1 state 601) */, + 0x72 /* 'r' */, 0x96, 0x03 /* (to 0x042C state 647) */, 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' */, 0x12, 0x03 /* (to 0x03BE state 558) */, + 0x74 /* 't' */, 0x18, 0x03 /* (to 0x03C4 state 558) */, 0x08, /* fail */ /* pos 00b0: 49 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x00BA state 50) */, - 0x72 /* 'r' */, 0xFB, 0x02 /* (to 0x03AE state 544) */, - 0x74 /* 't' */, 0xFE, 0x02 /* (to 0x03B4 state 549) */, + 0x72 /* 'r' */, 0x01, 0x03 /* (to 0x03B4 state 544) */, + 0x74 /* 't' */, 0x04, 0x03 /* (to 0x03BA state 549) */, 0x08, /* fail */ /* pos 00ba: 50 */ 0xAD /* '-' -> */, /* pos 00bb: 51 */ 0xF7 /* 'w' -> */, @@ -108,8 +108,8 @@ 0x70 /* 'p' */, 0x38, 0x00 /* (to 0x0106 state 88) */, 0x61 /* 'a' */, 0x3F, 0x00 /* (to 0x0110 state 97) */, 0x6E /* 'n' */, 0x44, 0x00 /* (to 0x0118 state 104) */, - 0x76 /* 'v' */, 0x80, 0x01 /* (to 0x0257 state 284) */, - 0x6F /* 'o' */, 0x86, 0x01 /* (to 0x0260 state 292) */, + 0x76 /* 'v' */, 0x86, 0x01 /* (to 0x025D state 284) */, + 0x6F /* 'o' */, 0x8C, 0x01 /* (to 0x0266 state 292) */, 0x08, /* fail */ /* pos 00de: 62 */ 0xF2 /* 'r' -> */, /* pos 00df: 63 */ 0xE1 /* 'a' -> */, @@ -134,7 +134,7 @@ /* pos 00f5: 82 */ 0xF9 /* 'y' -> */, /* pos 00f6: 83 */ 0x31 /* '1' */, 0x0A, 0x00 /* (to 0x0100 state 84) */, 0x32 /* '2' */, 0x0A, 0x00 /* (to 0x0103 state 86) */, - 0x3A /* ':' */, 0x59, 0x01 /* (to 0x0255 state 283) */, + 0x3A /* ':' */, 0x5F, 0x01 /* (to 0x025B state 283) */, 0x08, /* fail */ /* pos 0100: 84 */ 0xBA /* ':' -> */, /* pos 0101: 85 */ 0x00, 0x0A /* - terminal marker 10 - */, @@ -165,615 +165,619 @@ /* pos 011f: 110 */ 0xF4 /* 't' -> */, /* pos 0120: 111 */ 0xF0 /* 'p' -> */, /* pos 0121: 112 */ 0x2F /* '/' */, 0x07, 0x00 /* (to 0x0128 state 113) */, - 0x32 /* '2' */, 0x0A, 0x00 /* (to 0x012E state 118) */, + 0x32 /* '2' */, 0x10, 0x00 /* (to 0x0134 state 118) */, 0x08, /* fail */ /* pos 0128: 113 */ 0xB1 /* '1' -> */, /* pos 0129: 114 */ 0xAE /* '.' -> */, -/* pos 012a: 115 */ 0xB1 /* '1' -> */, -/* pos 012b: 116 */ 0xA0 /* ' ' -> */, -/* pos 012c: 117 */ 0x00, 0x0F /* - terminal marker 15 - */, -/* pos 012e: 118 */ 0xAD /* '-' -> */, -/* pos 012f: 119 */ 0xF3 /* 's' -> */, -/* pos 0130: 120 */ 0xE5 /* 'e' -> */, -/* pos 0131: 121 */ 0xF4 /* 't' -> */, -/* pos 0132: 122 */ 0xF4 /* 't' -> */, -/* pos 0133: 123 */ 0xE9 /* 'i' -> */, -/* pos 0134: 124 */ 0xEE /* 'n' -> */, -/* pos 0135: 125 */ 0xE7 /* 'g' -> */, -/* pos 0136: 126 */ 0xF3 /* 's' -> */, -/* pos 0137: 127 */ 0xBA /* ':' -> */, -/* pos 0138: 128 */ 0x00, 0x10 /* - terminal marker 16 - */, -/* pos 013a: 129 */ 0x63 /* 'c' */, 0x0D, 0x00 /* (to 0x0147 state 130) */, - 0x75 /* 'u' */, 0xAC, 0x00 /* (to 0x01E9 state 230) */, - 0x67 /* 'g' */, 0x82, 0x01 /* (to 0x02C2 state 363) */, - 0x6C /* 'l' */, 0x83, 0x01 /* (to 0x02C6 state 366) */, +/* pos 012a: 115 */ 0x31 /* '1' */, 0x07, 0x00 /* (to 0x0131 state 116) */, + 0x30 /* '0' */, 0x14, 0x03 /* (to 0x0441 state 665) */, 0x08, /* fail */ -/* pos 0147: 130 */ 0xE3 /* 'c' -> */, -/* pos 0148: 131 */ 0xE5 /* 'e' -> */, -/* pos 0149: 132 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x0150 state 133) */, - 0x73 /* 's' */, 0x0E, 0x00 /* (to 0x015A state 136) */, +/* pos 0131: 116 */ 0xA0 /* ' ' -> */, +/* pos 0132: 117 */ 0x00, 0x0F /* - terminal marker 15 - */, +/* pos 0134: 118 */ 0xAD /* '-' -> */, +/* pos 0135: 119 */ 0xF3 /* 's' -> */, +/* pos 0136: 120 */ 0xE5 /* 'e' -> */, +/* pos 0137: 121 */ 0xF4 /* 't' -> */, +/* pos 0138: 122 */ 0xF4 /* 't' -> */, +/* pos 0139: 123 */ 0xE9 /* 'i' -> */, +/* pos 013a: 124 */ 0xEE /* 'n' -> */, +/* pos 013b: 125 */ 0xE7 /* 'g' -> */, +/* pos 013c: 126 */ 0xF3 /* 's' -> */, +/* pos 013d: 127 */ 0xBA /* ':' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0150: 133 */ 0xF4 /* 't' -> */, -/* pos 0151: 134 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x0158 state 135) */, - 0x2D /* '-' */, 0x59, 0x00 /* (to 0x01AD state 192) */, +/* pos 014d: 130 */ 0xE3 /* 'c' -> */, +/* pos 014e: 131 */ 0xE5 /* 'e' -> */, +/* pos 014f: 132 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x0156 state 133) */, + 0x73 /* 's' */, 0x0E, 0x00 /* (to 0x0160 state 136) */, 0x08, /* fail */ -/* pos 0158: 135 */ 0x00, 0x11 /* - terminal marker 17 - */, -/* pos 015a: 136 */ 0xF3 /* 's' -> */, -/* pos 015b: 137 */ 0xAD /* '-' -> */, -/* pos 015c: 138 */ 0xE3 /* 'c' -> */, -/* pos 015d: 139 */ 0xEF /* 'o' -> */, -/* pos 015e: 140 */ 0xEE /* 'n' -> */, -/* pos 015f: 141 */ 0xF4 /* 't' -> */, -/* pos 0160: 142 */ 0xF2 /* 'r' -> */, -/* pos 0161: 143 */ 0xEF /* 'o' -> */, -/* pos 0162: 144 */ 0xEC /* 'l' -> */, -/* pos 0163: 145 */ 0xAD /* '-' -> */, -/* pos 0164: 146 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x016B state 147) */, - 0x61 /* 'a' */, 0x4D, 0x01 /* (to 0x02B4 state 350) */, +/* pos 0156: 133 */ 0xF4 /* 't' -> */, +/* pos 0157: 134 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x015E state 135) */, + 0x2D /* '-' */, 0x59, 0x00 /* (to 0x01B3 state 192) */, 0x08, /* fail */ -/* pos 016b: 147 */ 0xE5 /* 'e' -> */, -/* pos 016c: 148 */ 0xF1 /* 'q' -> */, -/* pos 016d: 149 */ 0xF5 /* 'u' -> */, -/* pos 016e: 150 */ 0xE5 /* 'e' -> */, -/* pos 016f: 151 */ 0xF3 /* 's' -> */, -/* pos 0170: 152 */ 0xF4 /* 't' -> */, -/* pos 0171: 153 */ 0xAD /* '-' -> */, -/* pos 0172: 154 */ 0xE8 /* 'h' -> */, -/* pos 0173: 155 */ 0xE5 /* 'e' -> */, -/* pos 0174: 156 */ 0xE1 /* 'a' -> */, -/* pos 0175: 157 */ 0xE4 /* 'd' -> */, -/* pos 0176: 158 */ 0xE5 /* 'e' -> */, -/* pos 0177: 159 */ 0xF2 /* 'r' -> */, -/* pos 0178: 160 */ 0xF3 /* 's' -> */, -/* pos 0179: 161 */ 0xBA /* ':' -> */, -/* pos 017a: 162 */ 0x00, 0x12 /* - terminal marker 18 - */, -/* pos 017c: 163 */ 0xE6 /* 'f' -> */, -/* pos 017d: 164 */ 0xAD /* '-' -> */, -/* pos 017e: 165 */ 0x6D /* 'm' */, 0x0D, 0x00 /* (to 0x018B state 166) */, - 0x6E /* 'n' */, 0x20, 0x00 /* (to 0x01A1 state 181) */, - 0x72 /* 'r' */, 0xA3, 0x01 /* (to 0x0327 state 440) */, - 0x75 /* 'u' */, 0xA7, 0x01 /* (to 0x032E state 446) */, +/* pos 015e: 135 */ 0x00, 0x11 /* - terminal marker 17 - */, +/* pos 0160: 136 */ 0xF3 /* 's' -> */, +/* pos 0161: 137 */ 0xAD /* '-' -> */, +/* pos 0162: 138 */ 0xE3 /* 'c' -> */, +/* pos 0163: 139 */ 0xEF /* 'o' -> */, +/* pos 0164: 140 */ 0xEE /* 'n' -> */, +/* pos 0165: 141 */ 0xF4 /* 't' -> */, +/* pos 0166: 142 */ 0xF2 /* 'r' -> */, +/* pos 0167: 143 */ 0xEF /* 'o' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 018b: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0192 state 167) */, - 0x61 /* 'a' */, 0x93, 0x01 /* (to 0x0321 state 435) */, +/* pos 0171: 147 */ 0xE5 /* 'e' -> */, +/* pos 0172: 148 */ 0xF1 /* 'q' -> */, +/* pos 0173: 149 */ 0xF5 /* 'u' -> */, +/* pos 0174: 150 */ 0xE5 /* 'e' -> */, +/* pos 0175: 151 */ 0xF3 /* 's' -> */, +/* pos 0176: 152 */ 0xF4 /* 't' -> */, +/* pos 0177: 153 */ 0xAD /* '-' -> */, +/* pos 0178: 154 */ 0xE8 /* 'h' -> */, +/* pos 0179: 155 */ 0xE5 /* 'e' -> */, +/* pos 017a: 156 */ 0xE1 /* 'a' -> */, +/* pos 017b: 157 */ 0xE4 /* 'd' -> */, +/* pos 017c: 158 */ 0xE5 /* 'e' -> */, +/* pos 017d: 159 */ 0xF2 /* 'r' -> */, +/* pos 017e: 160 */ 0xF3 /* 's' -> */, +/* pos 017f: 161 */ 0xBA /* ':' -> */, +/* pos 0180: 162 */ 0x00, 0x12 /* - terminal marker 18 - */, +/* pos 0182: 163 */ 0xE6 /* 'f' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0192: 167 */ 0xE4 /* 'd' -> */, -/* pos 0193: 168 */ 0xE9 /* 'i' -> */, -/* pos 0194: 169 */ 0xE6 /* 'f' -> */, -/* pos 0195: 170 */ 0xE9 /* 'i' -> */, -/* pos 0196: 171 */ 0xE5 /* 'e' -> */, -/* pos 0197: 172 */ 0xE4 /* 'd' -> */, -/* pos 0198: 173 */ 0xAD /* '-' -> */, -/* pos 0199: 174 */ 0xF3 /* 's' -> */, -/* pos 019a: 175 */ 0xE9 /* 'i' -> */, -/* pos 019b: 176 */ 0xEE /* 'n' -> */, -/* pos 019c: 177 */ 0xE3 /* 'c' -> */, -/* pos 019d: 178 */ 0xE5 /* 'e' -> */, -/* pos 019e: 179 */ 0xBA /* ':' -> */, -/* pos 019f: 180 */ 0x00, 0x13 /* - terminal marker 19 - */, -/* pos 01a1: 181 */ 0xEF /* 'o' -> */, -/* pos 01a2: 182 */ 0xEE /* 'n' -> */, -/* pos 01a3: 183 */ 0xE5 /* 'e' -> */, -/* pos 01a4: 184 */ 0xAD /* '-' -> */, -/* pos 01a5: 185 */ 0xED /* 'm' -> */, -/* pos 01a6: 186 */ 0xE1 /* 'a' -> */, -/* pos 01a7: 187 */ 0xF4 /* 't' -> */, -/* pos 01a8: 188 */ 0xE3 /* 'c' -> */, -/* pos 01a9: 189 */ 0xE8 /* 'h' -> */, -/* pos 01aa: 190 */ 0xBA /* ':' -> */, -/* pos 01ab: 191 */ 0x00, 0x14 /* - terminal marker 20 - */, -/* pos 01ad: 192 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x01BA state 193) */, - 0x6C /* 'l' */, 0x14, 0x00 /* (to 0x01C4 state 202) */, - 0x63 /* 'c' */, 0xF0, 0x00 /* (to 0x02A3 state 335) */, - 0x72 /* 'r' */, 0xF6, 0x00 /* (to 0x02AC state 343) */, +/* pos 0191: 166 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0198 state 167) */, + 0x61 /* 'a' */, 0x93, 0x01 /* (to 0x0327 state 435) */, 0x08, /* fail */ -/* pos 01ba: 193 */ 0xEE /* 'n' -> */, -/* pos 01bb: 194 */ 0xE3 /* 'c' -> */, -/* pos 01bc: 195 */ 0xEF /* 'o' -> */, -/* pos 01bd: 196 */ 0xE4 /* 'd' -> */, -/* pos 01be: 197 */ 0xE9 /* 'i' -> */, -/* pos 01bf: 198 */ 0xEE /* 'n' -> */, -/* pos 01c0: 199 */ 0xE7 /* 'g' -> */, -/* pos 01c1: 200 */ 0xBA /* ':' -> */, -/* pos 01c2: 201 */ 0x00, 0x15 /* - terminal marker 21 - */, -/* pos 01c4: 202 */ 0xE1 /* 'a' -> */, -/* pos 01c5: 203 */ 0xEE /* 'n' -> */, -/* pos 01c6: 204 */ 0xE7 /* 'g' -> */, -/* pos 01c7: 205 */ 0xF5 /* 'u' -> */, -/* pos 01c8: 206 */ 0xE1 /* 'a' -> */, -/* pos 01c9: 207 */ 0xE7 /* 'g' -> */, -/* pos 01ca: 208 */ 0xE5 /* 'e' -> */, -/* pos 01cb: 209 */ 0xBA /* ':' -> */, -/* pos 01cc: 210 */ 0x00, 0x16 /* - terminal marker 22 - */, -/* pos 01ce: 211 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x01D5 state 212) */, - 0x6F /* 'o' */, 0xA3, 0x01 /* (to 0x0374 state 502) */, +/* pos 0198: 167 */ 0xE4 /* 'd' -> */, +/* pos 0199: 168 */ 0xE9 /* 'i' -> */, +/* pos 019a: 169 */ 0xE6 /* 'f' -> */, +/* pos 019b: 170 */ 0xE9 /* 'i' -> */, +/* pos 019c: 171 */ 0xE5 /* 'e' -> */, +/* pos 019d: 172 */ 0xE4 /* 'd' -> */, +/* pos 019e: 173 */ 0xAD /* '-' -> */, +/* pos 019f: 174 */ 0xF3 /* 's' -> */, +/* pos 01a0: 175 */ 0xE9 /* 'i' -> */, +/* pos 01a1: 176 */ 0xEE /* 'n' -> */, +/* pos 01a2: 177 */ 0xE3 /* 'c' -> */, +/* pos 01a3: 178 */ 0xE5 /* 'e' -> */, +/* pos 01a4: 179 */ 0xBA /* ':' -> */, +/* pos 01a5: 180 */ 0x00, 0x13 /* - terminal marker 19 - */, +/* pos 01a7: 181 */ 0xEF /* 'o' -> */, +/* pos 01a8: 182 */ 0xEE /* 'n' -> */, +/* pos 01a9: 183 */ 0xE5 /* 'e' -> */, +/* pos 01aa: 184 */ 0xAD /* '-' -> */, +/* pos 01ab: 185 */ 0xED /* 'm' -> */, +/* pos 01ac: 186 */ 0xE1 /* 'a' -> */, +/* pos 01ad: 187 */ 0xF4 /* 't' -> */, +/* pos 01ae: 188 */ 0xE3 /* 'c' -> */, +/* pos 01af: 189 */ 0xE8 /* 'h' -> */, +/* pos 01b0: 190 */ 0xBA /* ':' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 01d5: 212 */ 0xE7 /* 'g' -> */, -/* pos 01d6: 213 */ 0xED /* 'm' -> */, -/* pos 01d7: 214 */ 0xE1 /* 'a' -> */, -/* pos 01d8: 215 */ 0xBA /* ':' -> */, -/* pos 01d9: 216 */ 0x00, 0x17 /* - terminal marker 23 - */, -/* pos 01db: 217 */ 0xE3 /* 'c' -> */, -/* pos 01dc: 218 */ 0xE8 /* 'h' -> */, -/* pos 01dd: 219 */ 0xE5 /* 'e' -> */, -/* pos 01de: 220 */ 0xAD /* '-' -> */, -/* pos 01df: 221 */ 0xE3 /* 'c' -> */, -/* pos 01e0: 222 */ 0xEF /* 'o' -> */, -/* pos 01e1: 223 */ 0xEE /* 'n' -> */, -/* pos 01e2: 224 */ 0xF4 /* 't' -> */, -/* pos 01e3: 225 */ 0xF2 /* 'r' -> */, -/* pos 01e4: 226 */ 0xEF /* 'o' -> */, -/* pos 01e5: 227 */ 0xEC /* 'l' -> */, -/* pos 01e6: 228 */ 0xBA /* ':' -> */, -/* pos 01e7: 229 */ 0x00, 0x18 /* - terminal marker 24 - */, -/* pos 01e9: 230 */ 0xF4 /* 't' -> */, -/* pos 01ea: 231 */ 0xE8 /* 'h' -> */, -/* pos 01eb: 232 */ 0xEF /* 'o' -> */, -/* pos 01ec: 233 */ 0xF2 /* 'r' -> */, -/* pos 01ed: 234 */ 0xE9 /* 'i' -> */, -/* pos 01ee: 235 */ 0xFA /* 'z' -> */, -/* pos 01ef: 236 */ 0xE1 /* 'a' -> */, -/* pos 01f0: 237 */ 0xF4 /* 't' -> */, -/* pos 01f1: 238 */ 0xE9 /* 'i' -> */, -/* pos 01f2: 239 */ 0xEF /* 'o' -> */, -/* pos 01f3: 240 */ 0xEE /* 'n' -> */, -/* pos 01f4: 241 */ 0xBA /* ':' -> */, -/* pos 01f5: 242 */ 0x00, 0x19 /* - terminal marker 25 - */, -/* pos 01f7: 243 */ 0xEB /* 'k' -> */, -/* pos 01f8: 244 */ 0xE9 /* 'i' -> */, -/* pos 01f9: 245 */ 0xE5 /* 'e' -> */, -/* pos 01fa: 246 */ 0xBA /* ':' -> */, -/* pos 01fb: 247 */ 0x00, 0x1A /* - terminal marker 26 - */, -/* pos 01fd: 248 */ 0xE5 /* 'e' -> */, -/* pos 01fe: 249 */ 0xEE /* 'n' -> */, -/* pos 01ff: 250 */ 0xF4 /* 't' -> */, -/* pos 0200: 251 */ 0xAD /* '-' -> */, -/* pos 0201: 252 */ 0x6C /* 'l' */, 0x10, 0x00 /* (to 0x0211 state 253) */, - 0x74 /* 't' */, 0x1E, 0x00 /* (to 0x0222 state 260) */, - 0x64 /* 'd' */, 0xC5, 0x00 /* (to 0x02CC state 371) */, - 0x65 /* 'e' */, 0xCF, 0x00 /* (to 0x02D9 state 383) */, - 0x72 /* 'r' */, 0xE8, 0x00 /* (to 0x02F5 state 408) */, +/* pos 01c0: 193 */ 0xEE /* 'n' -> */, +/* pos 01c1: 194 */ 0xE3 /* 'c' -> */, +/* pos 01c2: 195 */ 0xEF /* 'o' -> */, +/* pos 01c3: 196 */ 0xE4 /* 'd' -> */, +/* pos 01c4: 197 */ 0xE9 /* 'i' -> */, +/* pos 01c5: 198 */ 0xEE /* 'n' -> */, +/* pos 01c6: 199 */ 0xE7 /* 'g' -> */, +/* pos 01c7: 200 */ 0xBA /* ':' -> */, +/* pos 01c8: 201 */ 0x00, 0x15 /* - terminal marker 21 - */, +/* pos 01ca: 202 */ 0xE1 /* 'a' -> */, +/* pos 01cb: 203 */ 0xEE /* 'n' -> */, +/* pos 01cc: 204 */ 0xE7 /* 'g' -> */, +/* pos 01cd: 205 */ 0xF5 /* 'u' -> */, +/* pos 01ce: 206 */ 0xE1 /* 'a' -> */, +/* pos 01cf: 207 */ 0xE7 /* 'g' -> */, +/* pos 01d0: 208 */ 0xE5 /* 'e' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0211: 253 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x021B state 254) */, - 0x61 /* 'a' */, 0xCF, 0x00 /* (to 0x02E3 state 392) */, - 0x6F /* 'o' */, 0xD5, 0x00 /* (to 0x02EC state 400) */, +/* pos 01db: 212 */ 0xE7 /* 'g' -> */, +/* pos 01dc: 213 */ 0xED /* 'm' -> */, +/* pos 01dd: 214 */ 0xE1 /* 'a' -> */, +/* pos 01de: 215 */ 0xBA /* ':' -> */, +/* pos 01df: 216 */ 0x00, 0x17 /* - terminal marker 23 - */, +/* pos 01e1: 217 */ 0xE3 /* 'c' -> */, +/* pos 01e2: 218 */ 0xE8 /* 'h' -> */, +/* pos 01e3: 219 */ 0xE5 /* 'e' -> */, +/* pos 01e4: 220 */ 0xAD /* '-' -> */, +/* pos 01e5: 221 */ 0xE3 /* 'c' -> */, +/* pos 01e6: 222 */ 0xEF /* 'o' -> */, +/* pos 01e7: 223 */ 0xEE /* 'n' -> */, +/* pos 01e8: 224 */ 0xF4 /* 't' -> */, +/* pos 01e9: 225 */ 0xF2 /* 'r' -> */, +/* pos 01ea: 226 */ 0xEF /* 'o' -> */, +/* pos 01eb: 227 */ 0xEC /* 'l' -> */, +/* pos 01ec: 228 */ 0xBA /* ':' -> */, +/* pos 01ed: 229 */ 0x00, 0x18 /* - terminal marker 24 - */, +/* pos 01ef: 230 */ 0xF4 /* 't' -> */, +/* pos 01f0: 231 */ 0xE8 /* 'h' -> */, +/* pos 01f1: 232 */ 0xEF /* 'o' -> */, +/* pos 01f2: 233 */ 0xF2 /* 'r' -> */, +/* pos 01f3: 234 */ 0xE9 /* 'i' -> */, +/* pos 01f4: 235 */ 0xFA /* 'z' -> */, +/* pos 01f5: 236 */ 0xE1 /* 'a' -> */, +/* pos 01f6: 237 */ 0xF4 /* 't' -> */, +/* pos 01f7: 238 */ 0xE9 /* 'i' -> */, +/* pos 01f8: 239 */ 0xEF /* 'o' -> */, +/* pos 01f9: 240 */ 0xEE /* 'n' -> */, +/* pos 01fa: 241 */ 0xBA /* ':' -> */, +/* pos 01fb: 242 */ 0x00, 0x19 /* - terminal marker 25 - */, +/* pos 01fd: 243 */ 0xEB /* 'k' -> */, +/* pos 01fe: 244 */ 0xE9 /* 'i' -> */, +/* pos 01ff: 245 */ 0xE5 /* 'e' -> */, +/* pos 0200: 246 */ 0xBA /* ':' -> */, +/* pos 0201: 247 */ 0x00, 0x1A /* - terminal marker 26 - */, +/* pos 0203: 248 */ 0xE5 /* 'e' -> */, +/* pos 0204: 249 */ 0xEE /* 'n' -> */, +/* pos 0205: 250 */ 0xF4 /* 't' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 021b: 254 */ 0xEE /* 'n' -> */, -/* pos 021c: 255 */ 0xE7 /* 'g' -> */, -/* pos 021d: 256 */ 0xF4 /* 't' -> */, -/* pos 021e: 257 */ 0xE8 /* 'h' -> */, -/* pos 021f: 258 */ 0xBA /* ':' -> */, -/* pos 0220: 259 */ 0x00, 0x1B /* - terminal marker 27 - */, -/* pos 0222: 260 */ 0xF9 /* 'y' -> */, -/* pos 0223: 261 */ 0xF0 /* 'p' -> */, -/* pos 0224: 262 */ 0xE5 /* 'e' -> */, -/* pos 0225: 263 */ 0xBA /* ':' -> */, -/* pos 0226: 264 */ 0x00, 0x1C /* - terminal marker 28 - */, -/* pos 0228: 265 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x022F state 266) */, - 0x65 /* 'e' */, 0xF5, 0x01 /* (to 0x0420 state 642) */, +/* 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) */, 0x08, /* fail */ -/* pos 022f: 266 */ 0xF4 /* 't' -> */, -/* pos 0230: 267 */ 0xE5 /* 'e' -> */, -/* pos 0231: 268 */ 0xBA /* ':' -> */, -/* pos 0232: 269 */ 0x00, 0x1D /* - terminal marker 29 - */, -/* pos 0234: 270 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x023B state 271) */, - 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x0241 state 276) */, +/* pos 0221: 254 */ 0xEE /* 'n' -> */, +/* pos 0222: 255 */ 0xE7 /* 'g' -> */, +/* pos 0223: 256 */ 0xF4 /* 't' -> */, +/* pos 0224: 257 */ 0xE8 /* 'h' -> */, +/* pos 0225: 258 */ 0xBA /* ':' -> */, +/* pos 0226: 259 */ 0x00, 0x1B /* - terminal marker 27 - */, +/* pos 0228: 260 */ 0xF9 /* 'y' -> */, +/* pos 0229: 261 */ 0xF0 /* 'p' -> */, +/* pos 022a: 262 */ 0xE5 /* 'e' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 023b: 271 */ 0xEE /* 'n' -> */, -/* pos 023c: 272 */ 0xE7 /* 'g' -> */, -/* pos 023d: 273 */ 0xE5 /* 'e' -> */, -/* pos 023e: 274 */ 0xBA /* ':' -> */, -/* pos 023f: 275 */ 0x00, 0x1E /* - terminal marker 30 - */, -/* pos 0241: 276 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x0248 state 277) */, - 0x74 /* 't' */, 0x5F, 0x01 /* (to 0x03A3 state 534) */, +/* pos 0235: 266 */ 0xF4 /* 't' -> */, +/* pos 0236: 267 */ 0xE5 /* 'e' -> */, +/* pos 0237: 268 */ 0xBA /* ':' -> */, +/* pos 0238: 269 */ 0x00, 0x1D /* - terminal marker 29 - */, +/* pos 023a: 270 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0241 state 271) */, + 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x0247 state 276) */, 0x08, /* fail */ -/* pos 0248: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x024F state 278) */, - 0x72 /* 'r' */, 0x52, 0x01 /* (to 0x039D state 529) */, +/* pos 0241: 271 */ 0xEE /* 'n' -> */, +/* pos 0242: 272 */ 0xE7 /* 'g' -> */, +/* pos 0243: 273 */ 0xE5 /* 'e' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 024f: 278 */ 0xF2 /* 'r' -> */, -/* pos 0250: 279 */ 0xE5 /* 'e' -> */, -/* pos 0251: 280 */ 0xF2 /* 'r' -> */, -/* pos 0252: 281 */ 0xBA /* ':' -> */, -/* pos 0253: 282 */ 0x00, 0x1F /* - terminal marker 31 - */, -/* pos 0255: 283 */ 0x00, 0x20 /* - terminal marker 32 - */, -/* pos 0257: 284 */ 0xE5 /* 'e' -> */, -/* pos 0258: 285 */ 0xF2 /* 'r' -> */, -/* pos 0259: 286 */ 0xF3 /* 's' -> */, -/* pos 025a: 287 */ 0xE9 /* 'i' -> */, -/* pos 025b: 288 */ 0xEF /* 'o' -> */, -/* pos 025c: 289 */ 0xEE /* 'n' -> */, -/* pos 025d: 290 */ 0xBA /* ':' -> */, -/* pos 025e: 291 */ 0x00, 0x21 /* - terminal marker 33 - */, -/* pos 0260: 292 */ 0xF2 /* 'r' -> */, -/* pos 0261: 293 */ 0xE9 /* 'i' -> */, -/* pos 0262: 294 */ 0xE7 /* 'g' -> */, -/* pos 0263: 295 */ 0xE9 /* 'i' -> */, -/* pos 0264: 296 */ 0xEE /* 'n' -> */, -/* pos 0265: 297 */ 0xBA /* ':' -> */, -/* pos 0266: 298 */ 0x00, 0x22 /* - terminal marker 34 - */, -/* pos 0268: 299 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0275 state 300) */, - 0x6D /* 'm' */, 0x15, 0x00 /* (to 0x0280 state 310) */, - 0x70 /* 'p' */, 0x1A, 0x00 /* (to 0x0288 state 317) */, - 0x73 /* 's' */, 0x1D, 0x00 /* (to 0x028E state 322) */, +/* pos 024e: 277 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0255 state 278) */, + 0x72 /* 'r' */, 0x52, 0x01 /* (to 0x03A3 state 529) */, 0x08, /* fail */ -/* pos 0275: 300 */ 0xF5 /* 'u' -> */, -/* pos 0276: 301 */ 0xF4 /* 't' -> */, -/* pos 0277: 302 */ 0xE8 /* 'h' -> */, -/* pos 0278: 303 */ 0xEF /* 'o' -> */, -/* pos 0279: 304 */ 0xF2 /* 'r' -> */, -/* pos 027a: 305 */ 0xE9 /* 'i' -> */, -/* pos 027b: 306 */ 0xF4 /* 't' -> */, -/* pos 027c: 307 */ 0xF9 /* 'y' -> */, -/* pos 027d: 308 */ 0xBA /* ':' -> */, -/* pos 027e: 309 */ 0x00, 0x23 /* - terminal marker 35 - */, -/* pos 0280: 310 */ 0xE5 /* 'e' -> */, -/* pos 0281: 311 */ 0xF4 /* 't' -> */, -/* pos 0282: 312 */ 0xE8 /* 'h' -> */, -/* pos 0283: 313 */ 0xEF /* 'o' -> */, -/* pos 0284: 314 */ 0xE4 /* 'd' -> */, -/* pos 0285: 315 */ 0xBA /* ':' -> */, -/* pos 0286: 316 */ 0x00, 0x24 /* - terminal marker 36 - */, -/* pos 0288: 317 */ 0xE1 /* 'a' -> */, -/* pos 0289: 318 */ 0xF4 /* 't' -> */, -/* pos 028a: 319 */ 0xE8 /* 'h' -> */, -/* pos 028b: 320 */ 0xBA /* ':' -> */, -/* pos 028c: 321 */ 0x00, 0x25 /* - terminal marker 37 - */, -/* pos 028e: 322 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x0295 state 323) */, - 0x74 /* 't' */, 0x0B, 0x00 /* (to 0x029C state 329) */, +/* pos 0255: 278 */ 0xF2 /* 'r' -> */, +/* pos 0256: 279 */ 0xE5 /* 'e' -> */, +/* pos 0257: 280 */ 0xF2 /* 'r' -> */, +/* pos 0258: 281 */ 0xBA /* ':' -> */, +/* pos 0259: 282 */ 0x00, 0x1F /* - terminal marker 31 - */, +/* pos 025b: 283 */ 0x00, 0x20 /* - terminal marker 32 - */, +/* pos 025d: 284 */ 0xE5 /* 'e' -> */, +/* pos 025e: 285 */ 0xF2 /* 'r' -> */, +/* pos 025f: 286 */ 0xF3 /* 's' -> */, +/* pos 0260: 287 */ 0xE9 /* 'i' -> */, +/* pos 0261: 288 */ 0xEF /* 'o' -> */, +/* pos 0262: 289 */ 0xEE /* 'n' -> */, +/* pos 0263: 290 */ 0xBA /* ':' -> */, +/* pos 0264: 291 */ 0x00, 0x21 /* - terminal marker 33 - */, +/* pos 0266: 292 */ 0xF2 /* 'r' -> */, +/* pos 0267: 293 */ 0xE9 /* 'i' -> */, +/* pos 0268: 294 */ 0xE7 /* 'g' -> */, +/* pos 0269: 295 */ 0xE9 /* 'i' -> */, +/* pos 026a: 296 */ 0xEE /* 'n' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0295: 323 */ 0xE8 /* 'h' -> */, -/* pos 0296: 324 */ 0xE5 /* 'e' -> */, -/* pos 0297: 325 */ 0xED /* 'm' -> */, -/* pos 0298: 326 */ 0xE5 /* 'e' -> */, -/* pos 0299: 327 */ 0xBA /* ':' -> */, -/* pos 029a: 328 */ 0x00, 0x26 /* - terminal marker 38 - */, -/* pos 029c: 329 */ 0xE1 /* 'a' -> */, -/* pos 029d: 330 */ 0xF4 /* 't' -> */, -/* pos 029e: 331 */ 0xF5 /* 'u' -> */, -/* pos 029f: 332 */ 0xF3 /* 's' -> */, -/* pos 02a0: 333 */ 0xBA /* ':' -> */, -/* pos 02a1: 334 */ 0x00, 0x27 /* - terminal marker 39 - */, -/* pos 02a3: 335 */ 0xE8 /* 'h' -> */, -/* pos 02a4: 336 */ 0xE1 /* 'a' -> */, -/* pos 02a5: 337 */ 0xF2 /* 'r' -> */, -/* pos 02a6: 338 */ 0xF3 /* 's' -> */, -/* pos 02a7: 339 */ 0xE5 /* 'e' -> */, -/* pos 02a8: 340 */ 0xF4 /* 't' -> */, -/* pos 02a9: 341 */ 0xBA /* ':' -> */, -/* pos 02aa: 342 */ 0x00, 0x28 /* - terminal marker 40 - */, -/* pos 02ac: 343 */ 0xE1 /* 'a' -> */, -/* pos 02ad: 344 */ 0xEE /* 'n' -> */, -/* pos 02ae: 345 */ 0xE7 /* 'g' -> */, -/* pos 02af: 346 */ 0xE5 /* 'e' -> */, -/* pos 02b0: 347 */ 0xF3 /* 's' -> */, -/* pos 02b1: 348 */ 0xBA /* ':' -> */, -/* pos 02b2: 349 */ 0x00, 0x29 /* - terminal marker 41 - */, -/* pos 02b4: 350 */ 0xEC /* 'l' -> */, -/* pos 02b5: 351 */ 0xEC /* 'l' -> */, -/* pos 02b6: 352 */ 0xEF /* 'o' -> */, -/* pos 02b7: 353 */ 0xF7 /* 'w' -> */, -/* pos 02b8: 354 */ 0xAD /* '-' -> */, -/* pos 02b9: 355 */ 0xEF /* 'o' -> */, -/* pos 02ba: 356 */ 0xF2 /* 'r' -> */, -/* pos 02bb: 357 */ 0xE9 /* 'i' -> */, -/* pos 02bc: 358 */ 0xE7 /* 'g' -> */, -/* pos 02bd: 359 */ 0xE9 /* 'i' -> */, -/* pos 02be: 360 */ 0xEE /* 'n' -> */, -/* pos 02bf: 361 */ 0xBA /* ':' -> */, -/* pos 02c0: 362 */ 0x00, 0x2A /* - terminal marker 42 - */, -/* pos 02c2: 363 */ 0xE5 /* 'e' -> */, -/* pos 02c3: 364 */ 0xBA /* ':' -> */, -/* pos 02c4: 365 */ 0x00, 0x2B /* - terminal marker 43 - */, -/* pos 02c6: 366 */ 0xEC /* 'l' -> */, -/* pos 02c7: 367 */ 0xEF /* 'o' -> */, -/* pos 02c8: 368 */ 0xF7 /* 'w' -> */, -/* pos 02c9: 369 */ 0xBA /* ':' -> */, -/* pos 02ca: 370 */ 0x00, 0x2C /* - terminal marker 44 - */, -/* pos 02cc: 371 */ 0xE9 /* 'i' -> */, -/* pos 02cd: 372 */ 0xF3 /* 's' -> */, -/* pos 02ce: 373 */ 0xF0 /* 'p' -> */, -/* pos 02cf: 374 */ 0xEF /* 'o' -> */, -/* pos 02d0: 375 */ 0xF3 /* 's' -> */, -/* pos 02d1: 376 */ 0xE9 /* 'i' -> */, -/* pos 02d2: 377 */ 0xF4 /* 't' -> */, -/* pos 02d3: 378 */ 0xE9 /* 'i' -> */, -/* pos 02d4: 379 */ 0xEF /* 'o' -> */, -/* pos 02d5: 380 */ 0xEE /* 'n' -> */, -/* pos 02d6: 381 */ 0xBA /* ':' -> */, -/* pos 02d7: 382 */ 0x00, 0x2D /* - terminal marker 45 - */, -/* pos 02d9: 383 */ 0xEE /* 'n' -> */, -/* pos 02da: 384 */ 0xE3 /* 'c' -> */, -/* pos 02db: 385 */ 0xEF /* 'o' -> */, -/* pos 02dc: 386 */ 0xE4 /* 'd' -> */, -/* pos 02dd: 387 */ 0xE9 /* 'i' -> */, -/* pos 02de: 388 */ 0xEE /* 'n' -> */, -/* pos 02df: 389 */ 0xE7 /* 'g' -> */, -/* pos 02e0: 390 */ 0xBA /* ':' -> */, -/* pos 02e1: 391 */ 0x00, 0x2E /* - terminal marker 46 - */, -/* pos 02e3: 392 */ 0xEE /* 'n' -> */, -/* pos 02e4: 393 */ 0xE7 /* 'g' -> */, -/* pos 02e5: 394 */ 0xF5 /* 'u' -> */, -/* pos 02e6: 395 */ 0xE1 /* 'a' -> */, -/* pos 02e7: 396 */ 0xE7 /* 'g' -> */, -/* pos 02e8: 397 */ 0xE5 /* 'e' -> */, -/* pos 02e9: 398 */ 0xBA /* ':' -> */, -/* pos 02ea: 399 */ 0x00, 0x2F /* - terminal marker 47 - */, -/* pos 02ec: 400 */ 0xE3 /* 'c' -> */, -/* pos 02ed: 401 */ 0xE1 /* 'a' -> */, -/* pos 02ee: 402 */ 0xF4 /* 't' -> */, -/* pos 02ef: 403 */ 0xE9 /* 'i' -> */, -/* pos 02f0: 404 */ 0xEF /* 'o' -> */, -/* pos 02f1: 405 */ 0xEE /* 'n' -> */, -/* pos 02f2: 406 */ 0xBA /* ':' -> */, -/* pos 02f3: 407 */ 0x00, 0x30 /* - terminal marker 48 - */, -/* pos 02f5: 408 */ 0xE1 /* 'a' -> */, -/* pos 02f6: 409 */ 0xEE /* 'n' -> */, -/* pos 02f7: 410 */ 0xE7 /* 'g' -> */, -/* pos 02f8: 411 */ 0xE5 /* 'e' -> */, -/* pos 02f9: 412 */ 0xBA /* ':' -> */, -/* pos 02fa: 413 */ 0x00, 0x31 /* - terminal marker 49 - */, -/* pos 02fc: 414 */ 0x74 /* 't' */, 0x07, 0x00 /* (to 0x0303 state 415) */, - 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x0308 state 419) */, +/* pos 027b: 300 */ 0xF5 /* 'u' -> */, +/* pos 027c: 301 */ 0xF4 /* 't' -> */, +/* pos 027d: 302 */ 0xE8 /* 'h' -> */, +/* pos 027e: 303 */ 0xEF /* 'o' -> */, +/* pos 027f: 304 */ 0xF2 /* 'r' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 0303: 415 */ 0xE1 /* 'a' -> */, -/* pos 0304: 416 */ 0xE7 /* 'g' -> */, -/* pos 0305: 417 */ 0xBA /* ':' -> */, -/* pos 0306: 418 */ 0x00, 0x32 /* - terminal marker 50 - */, -/* pos 0308: 419 */ 0xF0 /* 'p' -> */, -/* pos 0309: 420 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0310 state 421) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0315 state 425) */, +/* 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 02d2: 371 */ 0xE9 /* 'i' -> */, +/* pos 02d3: 372 */ 0xF3 /* 's' -> */, +/* pos 02d4: 373 */ 0xF0 /* 'p' -> */, +/* 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 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) */, 0x08, /* fail */ -/* pos 0310: 421 */ 0xE3 /* 'c' -> */, -/* pos 0311: 422 */ 0xF4 /* 't' -> */, -/* pos 0312: 423 */ 0xBA /* ':' -> */, -/* pos 0313: 424 */ 0x00, 0x33 /* - terminal marker 51 - */, -/* pos 0315: 425 */ 0xF2 /* 'r' -> */, -/* pos 0316: 426 */ 0xE5 /* 'e' -> */, -/* pos 0317: 427 */ 0xF3 /* 's' -> */, -/* pos 0318: 428 */ 0xBA /* ':' -> */, -/* pos 0319: 429 */ 0x00, 0x34 /* - terminal marker 52 - */, -/* pos 031b: 430 */ 0xF2 /* 'r' -> */, -/* pos 031c: 431 */ 0xEF /* 'o' -> */, -/* pos 031d: 432 */ 0xED /* 'm' -> */, -/* pos 031e: 433 */ 0xBA /* ':' -> */, -/* pos 031f: 434 */ 0x00, 0x35 /* - terminal marker 53 - */, -/* pos 0321: 435 */ 0xF4 /* 't' -> */, -/* pos 0322: 436 */ 0xE3 /* 'c' -> */, -/* pos 0323: 437 */ 0xE8 /* 'h' -> */, -/* pos 0324: 438 */ 0xBA /* ':' -> */, -/* pos 0325: 439 */ 0x00, 0x36 /* - terminal marker 54 - */, -/* pos 0327: 440 */ 0xE1 /* 'a' -> */, -/* pos 0328: 441 */ 0xEE /* 'n' -> */, -/* pos 0329: 442 */ 0xE7 /* 'g' -> */, -/* pos 032a: 443 */ 0xE5 /* 'e' -> */, -/* pos 032b: 444 */ 0xBA /* ':' -> */, -/* pos 032c: 445 */ 0x00, 0x37 /* - terminal marker 55 - */, -/* pos 032e: 446 */ 0xEE /* 'n' -> */, -/* pos 032f: 447 */ 0xED /* 'm' -> */, -/* pos 0330: 448 */ 0xEF /* 'o' -> */, -/* pos 0331: 449 */ 0xE4 /* 'd' -> */, -/* pos 0332: 450 */ 0xE9 /* 'i' -> */, -/* pos 0333: 451 */ 0xE6 /* 'f' -> */, -/* pos 0334: 452 */ 0xE9 /* 'i' -> */, -/* pos 0335: 453 */ 0xE5 /* 'e' -> */, -/* pos 0336: 454 */ 0xE4 /* 'd' -> */, -/* pos 0337: 455 */ 0xAD /* '-' -> */, -/* pos 0338: 456 */ 0xF3 /* 's' -> */, -/* pos 0339: 457 */ 0xE9 /* 'i' -> */, -/* pos 033a: 458 */ 0xEE /* 'n' -> */, -/* pos 033b: 459 */ 0xE3 /* 'c' -> */, -/* pos 033c: 460 */ 0xE5 /* 'e' -> */, -/* pos 033d: 461 */ 0xBA /* ':' -> */, -/* pos 033e: 462 */ 0x00, 0x38 /* - terminal marker 56 - */, -/* pos 0340: 463 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x034A state 464) */, - 0x69 /* 'i' */, 0x15, 0x00 /* (to 0x0358 state 477) */, - 0x6F /* 'o' */, 0x17, 0x00 /* (to 0x035D state 481) */, +/* 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) */, 0x08, /* fail */ -/* pos 034a: 464 */ 0xF3 /* 's' -> */, -/* pos 034b: 465 */ 0xF4 /* 't' -> */, -/* pos 034c: 466 */ 0xAD /* '-' -> */, -/* pos 034d: 467 */ 0xED /* 'm' -> */, -/* pos 034e: 468 */ 0xEF /* 'o' -> */, -/* pos 034f: 469 */ 0xE4 /* 'd' -> */, -/* pos 0350: 470 */ 0xE9 /* 'i' -> */, -/* pos 0351: 471 */ 0xE6 /* 'f' -> */, -/* pos 0352: 472 */ 0xE9 /* 'i' -> */, -/* pos 0353: 473 */ 0xE5 /* 'e' -> */, -/* pos 0354: 474 */ 0xE4 /* 'd' -> */, -/* pos 0355: 475 */ 0xBA /* ':' -> */, -/* pos 0356: 476 */ 0x00, 0x39 /* - terminal marker 57 - */, -/* pos 0358: 477 */ 0xEE /* 'n' -> */, -/* pos 0359: 478 */ 0xEB /* 'k' -> */, -/* pos 035a: 479 */ 0xBA /* ':' -> */, -/* pos 035b: 480 */ 0x00, 0x3A /* - terminal marker 58 - */, -/* pos 035d: 481 */ 0xE3 /* 'c' -> */, -/* pos 035e: 482 */ 0xE1 /* 'a' -> */, -/* pos 035f: 483 */ 0xF4 /* 't' -> */, -/* pos 0360: 484 */ 0xE9 /* 'i' -> */, -/* pos 0361: 485 */ 0xEF /* 'o' -> */, -/* pos 0362: 486 */ 0xEE /* 'n' -> */, -/* pos 0363: 487 */ 0xBA /* ':' -> */, -/* pos 0364: 488 */ 0x00, 0x3B /* - terminal marker 59 - */, -/* pos 0366: 489 */ 0xE1 /* 'a' -> */, -/* pos 0367: 490 */ 0xF8 /* 'x' -> */, -/* pos 0368: 491 */ 0xAD /* '-' -> */, -/* pos 0369: 492 */ 0xE6 /* 'f' -> */, -/* pos 036a: 493 */ 0xEF /* 'o' -> */, -/* pos 036b: 494 */ 0xF2 /* 'r' -> */, -/* pos 036c: 495 */ 0xF7 /* 'w' -> */, -/* pos 036d: 496 */ 0xE1 /* 'a' -> */, -/* pos 036e: 497 */ 0xF2 /* 'r' -> */, -/* pos 036f: 498 */ 0xE4 /* 'd' -> */, -/* pos 0370: 499 */ 0xF3 /* 's' -> */, -/* pos 0371: 500 */ 0xBA /* ':' -> */, -/* pos 0372: 501 */ 0x00, 0x3C /* - terminal marker 60 - */, -/* pos 0374: 502 */ 0xF8 /* 'x' -> */, -/* pos 0375: 503 */ 0xF9 /* 'y' -> */, -/* pos 0376: 504 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x037D state 505) */, - 0x20 /* ' ' */, 0xB5, 0x00 /* (to 0x042E state 654) */, +/* 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 0337: 449 */ 0xE4 /* 'd' -> */, +/* pos 0338: 450 */ 0xE9 /* 'i' -> */, +/* pos 0339: 451 */ 0xE6 /* 'f' -> */, +/* 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) */, 0x08, /* fail */ -/* pos 037d: 505 */ 0xE1 /* 'a' -> */, -/* pos 037e: 506 */ 0xF5 /* 'u' -> */, -/* pos 037f: 507 */ 0xF4 /* 't' -> */, -/* pos 0380: 508 */ 0xE8 /* 'h' -> */, -/* pos 0381: 509 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0388 state 510) */, - 0x6F /* 'o' */, 0x0E, 0x00 /* (to 0x0392 state 519) */, +/* 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 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) */, 0x08, /* fail */ -/* pos 0388: 510 */ 0xEE /* 'n' -> */, -/* pos 0389: 511 */ 0xF4 /* 't' -> */, -/* pos 038a: 512 */ 0xE9 /* 'i' -> */, -/* pos 038b: 513 */ 0xE3 /* 'c' -> */, -/* pos 038c: 514 */ 0xE1 /* 'a' -> */, -/* pos 038d: 515 */ 0xF4 /* 't' -> */, -/* pos 038e: 516 */ 0xE5 /* 'e' -> */, -/* pos 038f: 517 */ 0xBA /* ':' -> */, -/* pos 0390: 518 */ 0x00, 0x3D /* - terminal marker 61 - */, -/* pos 0392: 519 */ 0xF2 /* 'r' -> */, -/* pos 0393: 520 */ 0xE9 /* 'i' -> */, -/* pos 0394: 521 */ 0xFA /* 'z' -> */, -/* pos 0395: 522 */ 0xE1 /* 'a' -> */, -/* pos 0396: 523 */ 0xF4 /* 't' -> */, -/* pos 0397: 524 */ 0xE9 /* 'i' -> */, -/* pos 0398: 525 */ 0xEF /* 'o' -> */, -/* pos 0399: 526 */ 0xEE /* 'n' -> */, -/* pos 039a: 527 */ 0xBA /* ':' -> */, -/* pos 039b: 528 */ 0x00, 0x3E /* - terminal marker 62 - */, -/* pos 039d: 529 */ 0xE5 /* 'e' -> */, -/* pos 039e: 530 */ 0xF3 /* 's' -> */, -/* pos 039f: 531 */ 0xE8 /* 'h' -> */, -/* pos 03a0: 532 */ 0xBA /* ':' -> */, -/* pos 03a1: 533 */ 0x00, 0x3F /* - terminal marker 63 - */, -/* pos 03a3: 534 */ 0xF2 /* 'r' -> */, -/* pos 03a4: 535 */ 0xF9 /* 'y' -> */, -/* pos 03a5: 536 */ 0xAD /* '-' -> */, -/* pos 03a6: 537 */ 0xE1 /* 'a' -> */, -/* pos 03a7: 538 */ 0xE6 /* 'f' -> */, -/* pos 03a8: 539 */ 0xF4 /* 't' -> */, -/* pos 03a9: 540 */ 0xE5 /* 'e' -> */, -/* pos 03aa: 541 */ 0xF2 /* 'r' -> */, -/* pos 03ab: 542 */ 0xBA /* ':' -> */, -/* pos 03ac: 543 */ 0x00, 0x40 /* - terminal marker 64 - */, -/* pos 03ae: 544 */ 0xF6 /* 'v' -> */, -/* pos 03af: 545 */ 0xE5 /* 'e' -> */, -/* pos 03b0: 546 */ 0xF2 /* 'r' -> */, -/* pos 03b1: 547 */ 0xBA /* ':' -> */, -/* pos 03b2: 548 */ 0x00, 0x41 /* - terminal marker 65 - */, -/* pos 03b4: 549 */ 0xAD /* '-' -> */, -/* pos 03b5: 550 */ 0xE3 /* 'c' -> */, -/* pos 03b6: 551 */ 0xEF /* 'o' -> */, -/* pos 03b7: 552 */ 0xEF /* 'o' -> */, -/* pos 03b8: 553 */ 0xEB /* 'k' -> */, -/* pos 03b9: 554 */ 0xE9 /* 'i' -> */, -/* pos 03ba: 555 */ 0xE5 /* 'e' -> */, -/* pos 03bb: 556 */ 0xBA /* ':' -> */, -/* pos 03bc: 557 */ 0x00, 0x42 /* - terminal marker 66 - */, -/* pos 03be: 558 */ 0xF2 /* 'r' -> */, -/* pos 03bf: 559 */ 0xE9 /* 'i' -> */, -/* pos 03c0: 560 */ 0xE3 /* 'c' -> */, -/* pos 03c1: 561 */ 0xF4 /* 't' -> */, -/* pos 03c2: 562 */ 0xAD /* '-' -> */, -/* pos 03c3: 563 */ 0xF4 /* 't' -> */, -/* pos 03c4: 564 */ 0xF2 /* 'r' -> */, -/* pos 03c5: 565 */ 0xE1 /* 'a' -> */, -/* pos 03c6: 566 */ 0xEE /* 'n' -> */, -/* pos 03c7: 567 */ 0xF3 /* 's' -> */, -/* pos 03c8: 568 */ 0xF0 /* 'p' -> */, -/* pos 03c9: 569 */ 0xEF /* 'o' -> */, -/* pos 03ca: 570 */ 0xF2 /* 'r' -> */, -/* pos 03cb: 571 */ 0xF4 /* 't' -> */, -/* pos 03cc: 572 */ 0xAD /* '-' -> */, -/* pos 03cd: 573 */ 0xF3 /* 's' -> */, -/* pos 03ce: 574 */ 0xE5 /* 'e' -> */, -/* pos 03cf: 575 */ 0xE3 /* 'c' -> */, -/* pos 03d0: 576 */ 0xF5 /* 'u' -> */, -/* pos 03d1: 577 */ 0xF2 /* 'r' -> */, -/* pos 03d2: 578 */ 0xE9 /* 'i' -> */, -/* pos 03d3: 579 */ 0xF4 /* 't' -> */, -/* pos 03d4: 580 */ 0xF9 /* 'y' -> */, -/* pos 03d5: 581 */ 0xBA /* ':' -> */, -/* pos 03d6: 582 */ 0x00, 0x43 /* - terminal marker 67 - */, -/* pos 03d8: 583 */ 0xF2 /* 'r' -> */, -/* pos 03d9: 584 */ 0xE1 /* 'a' -> */, -/* pos 03da: 585 */ 0xEE /* 'n' -> */, -/* pos 03db: 586 */ 0xF3 /* 's' -> */, -/* pos 03dc: 587 */ 0xE6 /* 'f' -> */, -/* pos 03dd: 588 */ 0xE5 /* 'e' -> */, -/* pos 03de: 589 */ 0xF2 /* 'r' -> */, -/* pos 03df: 590 */ 0xAD /* '-' -> */, -/* pos 03e0: 591 */ 0xE5 /* 'e' -> */, -/* pos 03e1: 592 */ 0xEE /* 'n' -> */, -/* pos 03e2: 593 */ 0xE3 /* 'c' -> */, -/* pos 03e3: 594 */ 0xEF /* 'o' -> */, -/* pos 03e4: 595 */ 0xE4 /* 'd' -> */, -/* pos 03e5: 596 */ 0xE9 /* 'i' -> */, -/* pos 03e6: 597 */ 0xEE /* 'n' -> */, -/* pos 03e7: 598 */ 0xE7 /* 'g' -> */, -/* pos 03e8: 599 */ 0xBA /* ':' -> */, -/* pos 03e9: 600 */ 0x00, 0x44 /* - terminal marker 68 - */, -/* pos 03eb: 601 */ 0xE5 /* 'e' -> */, -/* pos 03ec: 602 */ 0xF2 /* 'r' -> */, -/* pos 03ed: 603 */ 0xAD /* '-' -> */, -/* pos 03ee: 604 */ 0xE1 /* 'a' -> */, -/* pos 03ef: 605 */ 0xE7 /* 'g' -> */, -/* pos 03f0: 606 */ 0xE5 /* 'e' -> */, -/* pos 03f1: 607 */ 0xEE /* 'n' -> */, -/* pos 03f2: 608 */ 0xF4 /* 't' -> */, -/* pos 03f3: 609 */ 0xBA /* ':' -> */, -/* pos 03f4: 610 */ 0x00, 0x45 /* - terminal marker 69 - */, -/* pos 03f6: 611 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x03FD state 612) */, - 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0402 state 616) */, +/* 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) */, 0x08, /* fail */ -/* pos 03fd: 612 */ 0xF2 /* 'r' -> */, -/* pos 03fe: 613 */ 0xF9 /* 'y' -> */, -/* pos 03ff: 614 */ 0xBA /* ':' -> */, -/* pos 0400: 615 */ 0x00, 0x46 /* - terminal marker 70 - */, -/* pos 0402: 616 */ 0xE1 /* 'a' -> */, -/* pos 0403: 617 */ 0xBA /* ':' -> */, -/* pos 0404: 618 */ 0x00, 0x47 /* - terminal marker 71 - */, -/* pos 0406: 619 */ 0xF7 /* 'w' -> */, -/* pos 0407: 620 */ 0xF7 /* 'w' -> */, -/* pos 0408: 621 */ 0xAD /* '-' -> */, -/* pos 0409: 622 */ 0xE1 /* 'a' -> */, -/* pos 040a: 623 */ 0xF5 /* 'u' -> */, -/* pos 040b: 624 */ 0xF4 /* 't' -> */, -/* pos 040c: 625 */ 0xE8 /* 'h' -> */, -/* pos 040d: 626 */ 0xE5 /* 'e' -> */, -/* pos 040e: 627 */ 0xEE /* 'n' -> */, -/* pos 040f: 628 */ 0xF4 /* 't' -> */, -/* pos 0410: 629 */ 0xE9 /* 'i' -> */, -/* pos 0411: 630 */ 0xE3 /* 'c' -> */, -/* pos 0412: 631 */ 0xE1 /* 'a' -> */, -/* pos 0413: 632 */ 0xF4 /* 't' -> */, -/* pos 0414: 633 */ 0xE5 /* 'e' -> */, -/* pos 0415: 634 */ 0xBA /* ':' -> */, -/* pos 0416: 635 */ 0x00, 0x48 /* - terminal marker 72 - */, -/* pos 0418: 636 */ 0xF4 /* 't' -> */, -/* pos 0419: 637 */ 0xE3 /* 'c' -> */, -/* pos 041a: 638 */ 0xE8 /* 'h' -> */, -/* pos 041b: 639 */ 0x00, 0x49 /* - terminal marker 73 - */, -/* pos 041d: 640 */ 0xF4 /* 't' -> */, -/* pos 041e: 641 */ 0x00, 0x4A /* - terminal marker 74 - */, -/* pos 0420: 642 */ 0xEC /* 'l' -> */, -/* pos 0421: 643 */ 0xE5 /* 'e' -> */, -/* pos 0422: 644 */ 0xF4 /* 't' -> */, -/* pos 0423: 645 */ 0xE5 /* 'e' -> */, -/* pos 0424: 646 */ 0x00, 0x4B /* - terminal marker 75 - */, -/* pos 0426: 647 */ 0xE9 /* 'i' -> */, -/* pos 0427: 648 */ 0xAD /* '-' -> */, -/* pos 0428: 649 */ 0xE1 /* 'a' -> */, -/* pos 0429: 650 */ 0xF2 /* 'r' -> */, -/* pos 042a: 651 */ 0xE7 /* 'g' -> */, -/* pos 042b: 652 */ 0xF3 /* 's' -> */, -/* pos 042c: 653 */ 0x00, 0x4C /* - terminal marker 76 - */, -/* pos 042e: 654 */ 0x00, 0x4D /* - terminal marker 77 - */, -/* pos 0430: 655 */ 0xAD /* '-' -> */, -/* pos 0431: 656 */ 0xF2 /* 'r' -> */, -/* pos 0432: 657 */ 0xE5 /* 'e' -> */, -/* pos 0433: 658 */ 0xE1 /* 'a' -> */, -/* pos 0434: 659 */ 0xEC /* 'l' -> */, -/* pos 0435: 660 */ 0xAD /* '-' -> */, -/* pos 0436: 661 */ 0xE9 /* 'i' -> */, -/* pos 0437: 662 */ 0xF0 /* 'p' -> */, -/* pos 0438: 663 */ 0xBA /* ':' -> */, -/* pos 0439: 664 */ 0x00, 0x4E /* - terminal marker 78 - */, -/* total size 1083 bytes */ +/* 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 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 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) */, + 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 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 */ diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 257d6b41..cb2b09ba 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -219,6 +219,9 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason) if (wsi->mode == LWSCM_HTTP_SERVING) context->protocols[0].callback(wsi, LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0); + if (wsi->mode == LWSCM_HTTP_CLIENT) + context->protocols[0].callback(wsi, LWS_CALLBACK_CLOSED_CLIENT_HTTP, + wsi->user_space, NULL, 0); /* * are his extensions okay with him closing? Eg he might be a mux diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 5755b872..6bb4a80a 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -349,6 +349,10 @@ enum lws_callback_reasons { LWS_CALLBACK_CGI_TERMINATED = 41, LWS_CALLBACK_CGI_STDIN_DATA = 42, LWS_CALLBACK_CGI_STDIN_COMPLETED = 43, + LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44, + LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45, + LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46, + LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47, /****** add new things just above ---^ ******/ @@ -610,6 +614,7 @@ enum lws_token_indexes { WSI_TOKEN_HTTP_URI_ARGS = 76, WSI_TOKEN_PROXY = 77, WSI_TOKEN_HTTP_X_REAL_IP = 78, + WSI_TOKEN_HTTP1_0 = 79, /****** add new things just above ---^ ******/ @@ -621,6 +626,7 @@ enum lws_token_indexes { _WSI_TOKEN_CLIENT_URI, _WSI_TOKEN_CLIENT_HOST, _WSI_TOKEN_CLIENT_ORIGIN, + _WSI_TOKEN_CLIENT_METHOD, /* always last real token index*/ WSI_TOKEN_COUNT, @@ -1393,6 +1399,8 @@ struct lws_context_creation_info { * @ietf_version_or_minus_one: currently leave at 0 or -1 * @userdata: if non-NULL, use this as wsi user_data instead of malloc it * @client_exts: array of extensions that may be used on connection + * @method: if non-NULL, do this http method instead of ws[s] upgrade. + * use "GET" to be a simple http client connection */ struct lws_client_connect_info { @@ -1407,6 +1415,7 @@ struct lws_client_connect_info { int ietf_version_or_minus_one; void *userdata; const struct lws_extension *client_exts; + const char *method; /* Add new things just above here ---^ * This is part of the ABI, don't needlessly break compatibility diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 8fe072df..4a9a92b4 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -349,6 +349,7 @@ enum lws_connection_states { LWSS_HTTP_BODY, LWSS_DEAD_SOCKET, LWSS_ESTABLISHED, + LWSS_CLIENT_HTTP_ESTABLISHED, LWSS_CLIENT_UNCONNECTED, LWSS_RETURNED_CLOSE_ALREADY, LWSS_AWAITING_CLOSE_ACK, @@ -410,7 +411,9 @@ enum lws_rx_parse_state { enum connection_mode { LWSCM_HTTP_SERVING, + LWSCM_HTTP_CLIENT, /* we are client to someone else's server */ LWSCM_HTTP_SERVING_ACCEPTED, /* actual HTTP service going on */ + LWSCM_HTTP_CLIENT_ACCEPTED, /* actual HTTP service going on */ LWSCM_PRE_WS_SERVING_ACCEPT, LWSCM_WS_SERVING, @@ -787,6 +790,18 @@ enum uri_esc_states { * used interchangeably to access the same data */ + +#ifndef LWS_NO_CLIENT +struct client_info_stash { + char address[256]; + char path[1024]; + char host[256]; + char origin[256]; + char protocol[256]; + char method[16]; +}; +#endif + struct _lws_header_related { /* MUST be first in struct */ struct allocated_headers *ah; @@ -976,17 +991,6 @@ struct _lws_http2_related { #endif -#ifndef LWS_NO_CLIENT -struct client_info_stash { - char address[256]; - char path[1024]; - char host[256]; - char origin[256]; - char protocol[256]; -}; -#endif - - struct _lws_websocket_related { /* cheapest way to deal with ah overlap with ws union transition */ struct _lws_header_related hdr; @@ -1112,6 +1116,9 @@ struct lws { unsigned int socket_is_permanently_unusable:1; unsigned int rxflow_change_to:2; unsigned int more_rx_waiting:1; /* has to live here since ah may stick to end */ +#ifndef LWS_NO_CLIENT + unsigned int do_ws:1; /* whether we are doing http or ws flow */ +#endif #ifndef LWS_NO_EXTENSIONS unsigned int extension_data_pending:1; #endif diff --git a/lib/service.c b/lib/service.c index c665f117..bbd0719d 100644 --- a/lib/service.c +++ b/lib/service.c @@ -602,9 +602,13 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t switch (wsi->mode) { case LWSCM_HTTP_SERVING: + case LWSCM_HTTP_CLIENT: case LWSCM_HTTP_SERVING_ACCEPTED: case LWSCM_SERVER_LISTENER: case LWSCM_SSL_ACK_PENDING: + if (wsi->state == LWSS_CLIENT_HTTP_ESTABLISHED) { + goto handled; + } n = lws_server_socket_service(context, wsi, pollfd); if (n) /* closed by above */ return 1; @@ -616,6 +620,7 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t case LWSCM_WS_SERVING: case LWSCM_WS_CLIENT: case LWSCM_HTTP2_SERVING: + case LWSCM_HTTP_CLIENT_ACCEPTED: /* 1: something requested a callback when it was OK to write */ @@ -739,6 +744,7 @@ read: eff_buf.token = (char *)pt->serv_buf; } + /* * give any active extensions a chance to munge the buffer * before parse. We pass in a pointer to an lws_tokens struct @@ -751,6 +757,34 @@ read: * used then so it is efficient. */ drain: + if (wsi->mode == LWSCM_HTTP_CLIENT_ACCEPTED) { + lwsl_notice("%s: calling LWS_CALLBACK_RECEIVE_CLIENT_HTTP, " + "rem %d len %d\n", __func__, + wsi->u.http.content_remain, eff_buf.token_len); + if (wsi->u.http.content_remain < eff_buf.token_len) + n = wsi->u.http.content_remain; + else + n = eff_buf.token_len; + if (user_callback_handle_rxflow(wsi->protocol->callback, + wsi, LWS_CALLBACK_RECEIVE_CLIENT_HTTP, + wsi->user_space, (void *)eff_buf.token, + eff_buf.token_len)) + goto close_and_handled; + wsi->u.http.content_remain -= n; + if (wsi->u.http.content_remain) + goto handled; + + lwsl_notice("%s: client http receved all content\n", + __func__); + if (user_callback_handle_rxflow(wsi->protocol->callback, + wsi, LWS_CALLBACK_COMPLETED_CLIENT_HTTP, + wsi->user_space, NULL, 0)) + goto close_and_handled; + + if (wsi->u.http.connection_type == HTTP_CONNECTION_CLOSE) + goto close_and_handled; + goto handled; + } do { more = 0; diff --git a/libwebsockets-api-doc.html b/libwebsockets-api-doc.html index e4f422ab..eae14036 100644 --- a/libwebsockets-api-doc.html +++ b/libwebsockets-api-doc.html @@ -133,6 +133,22 @@ protocol supported, or the specific protocol ordinal This function creates a connection to a remote server
+

lws_http_transaction_completed_client - wait for new http transaction or close

+int LWS_WARN_UNUSED_RESULT +lws_http_transaction_completed_client +(struct lws * wsi) +

Arguments

+
+
wsi +
websocket connection +
+

Description

+
+Returns 1 if the HTTP connection must close now +Returns 0 and resets connection to wait for new HTTP header / +transaction if possible +
+

lws_get_library_version -

const char * lws_get_library_version @@ -1711,6 +1727,7 @@ Otherwise a default timeout is used.     int ietf_version_or_minus_one;
    void * userdata;
    const struct lws_extension * client_exts;
+    const char * method;
};

Members

@@ -1736,6 +1753,9 @@ Otherwise a default timeout is used.
if non-NULL, use this as wsi user_data instead of malloc it
client_exts
array of extensions that may be used on connection +
method +
if non-NULL, do this http method instead of ws[s] upgrade. +use "GET" to be a simple http client connection

lws_close_reason - Set reason and aux data to send with Close packet If you are going to return nonzero from the callback requesting the connection to close, you can optionally call this to set the reason the peer will be told if possible.

diff --git a/test-server/test-client.c b/test-server/test-client.c index 2f6ea10e..93c92aa3 100644 --- a/test-server/test-client.c +++ b/test-server/test-client.c @@ -74,6 +74,8 @@ static int callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { + char *buf = (char *)in; + switch (reason) { case LWS_CALLBACK_CLIENT_ESTABLISHED: @@ -114,6 +116,16 @@ callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason, return 1; break; + case LWS_CALLBACK_RECEIVE_CLIENT_HTTP: + while (len--) + putchar(*buf++); + break; + + case LWS_CALLBACK_COMPLETED_CLIENT_HTTP: + wsi_dumb = NULL; + force_exit = 1; + break; + default: break; } @@ -269,7 +281,7 @@ static int ratelimit_connects(unsigned int *last, unsigned int secs) int main(int argc, char **argv) { int n = 0, ret = 0, port = 7681, use_ssl = 0, ietf_version = -1; - unsigned int rl_dumb = 0, rl_mirror = 0; + unsigned int rl_dumb = 0, rl_mirror = 0, do_ws = 1; struct lws_context_creation_info info; struct lws_client_connect_info i; struct lws_context *context; @@ -362,6 +374,14 @@ int main(int argc, char **argv) i.origin = i.address; i.ietf_version_or_minus_one = ietf_version; i.client_exts = exts; + + if (!strcmp(prot, "http") || !strcmp(prot, "https")) { + lwsl_notice("using %s mode (non-ws)\n", prot); + i.method = "GET"; + do_ws = 0; + } else + lwsl_notice("using %s mode (ws)\n", prot); + /* * sit there servicing the websocket context to handle incoming * packets, and drawing random circles on the mirror protocol websocket @@ -374,17 +394,23 @@ int main(int argc, char **argv) while (!force_exit) { - if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) { - lwsl_notice("dumb: connecting\n"); - i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name; - wsi_dumb = lws_client_connect_via_info(&i); - } + if (do_ws) { + if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) { + lwsl_notice("dumb: connecting\n"); + i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name; + wsi_dumb = lws_client_connect_via_info(&i); + } - if (!wsi_mirror && ratelimit_connects(&rl_mirror, 2u)) { - lwsl_notice("mirror: connecting\n"); - i.protocol = protocols[PROTOCOL_LWS_MIRROR].name; - wsi_mirror = lws_client_connect_via_info(&i); - } + if (!wsi_mirror && ratelimit_connects(&rl_mirror, 2u)) { + lwsl_notice("mirror: connecting\n"); + i.protocol = protocols[PROTOCOL_LWS_MIRROR].name; + wsi_mirror = lws_client_connect_via_info(&i); + } + } else + if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) { + lwsl_notice("http: connecting\n"); + wsi_dumb = lws_client_connect_via_info(&i); + } lws_service(context, 500); }