diff options
author | Mamadou DIOP <bossiel@yahoo.fr> | 2015-08-17 01:56:35 +0200 |
---|---|---|
committer | Mamadou DIOP <bossiel@yahoo.fr> | 2015-08-17 01:56:35 +0200 |
commit | 631fffee8a28b1bec5ed1f1d26a20e0135967f99 (patch) | |
tree | 74afe3bf3efe15aa82bcd0272b2b0f4d48c2d837 /tinyDEMO | |
parent | 7908865936604036e6f200f1b5e069f8752f3a3a (diff) | |
download | doubango-631fffee8a28b1bec5ed1f1d26a20e0135967f99.zip doubango-631fffee8a28b1bec5ed1f1d26a20e0135967f99.tar.gz |
-
Diffstat (limited to 'tinyDEMO')
40 files changed, 9923 insertions, 0 deletions
diff --git a/tinyDEMO/asterisk.sn b/tinyDEMO/asterisk.sn new file mode 100644 index 0000000..1430539 --- /dev/null +++ b/tinyDEMO/asterisk.sn @@ -0,0 +1,52 @@ +## For more information about scenarios, please refer to the Programmer's Guide + +# user's parameters (like ANSI-C #define) +%%domain octavius.inet.org +%%user user2 +%%pwd 1234 +%%proxy_ip octavius.i6net.org # IP address or FQDN +%%proxy_port 5060 +%%proxy_trans udp # udp, tcp, tls or sctp +%%expires 300 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-trans $$(proxy_trans) \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# OPTIONS to hack AOR +#++opt +#++sleep --sec $$(sleep-sec) + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + + +# Press ENTER +++sleep --sec -1 + +#++av --to sip:2233392625@$$(domain) \ +# --header Action-Header=Myheader-value @@action \ +# >>(inv_audio_sid) + +#++sleep --sec -1 +#++hu --sid $$(inv_audio_sid) + + +# Exit the application +++e diff --git a/tinyDEMO/cmd.c b/tinyDEMO/cmd.c new file mode 100644 index 0000000..a2d6c89 --- /dev/null +++ b/tinyDEMO/cmd.c @@ -0,0 +1,159 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "cmd.h" + +#include "dssl.h" + +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_debug.h" + +//#define PAD " " + +static int pred_find_opt_by_type(const tsk_list_item_t *item, const void *type); + +/* parse a command line */ +cmd_t* cmd_parse(const char* buffer, tsk_size_t size, tsk_bool_t *comment, tsk_params_L_t* params) +{ + return dssl_parse(buffer, size, comment, params); +} + +///* print usage */ +void cmd_print_help() +{ + printf("\n\n========================= Usage =========================\n\n"); + printf("Please refer to the Programmer's Guide at\n http://www.doubango.org/\n\n"); + +// +// printf("Usage:\n"); +// printf(PAD"++[command] --[opts]\n\n"); +// +// /* Commands */ +// printf("Commands:\n--\n"); +// printf(PAD"[++audio] or [++a"PAD"%s", "Make audio call\n--\n"); +// printf(PAD"[++audiovideo] or [++av]"PAD"%s", "Make audio/video call\n--\n"); +// printf(PAD"[++config-file] or [++cf]"PAD"%s", "Load opts from config file\n--\n"); +// printf(PAD"[++config-session] | [++css]"PAD"%s", "Configure an 3GPP IMS/LTE session\n--\n"); +// printf(PAD"[++config-stack] | [++cst]"PAD"%s", "Configure an 3GPP IMS/LTE stack\n--\n"); +// printf(PAD"[++exit] | [++e]"PAD"%s", "Exit the application\n--\n"); +// printf(PAD"[++file] | [++f]"PAD"%s", "Send a file. The stack must be running (see ++run command). To abort the File transfer, use ++hangup.\n--\n"); +// printf(PAD"[++hangup] | [++hp]"PAD"%s", "Hangup any SIP session (unREGISTER, unSUBSCRIBE, unPUBLISH, HangUp Call, Abort ...).\n--\n"); +// printf(PAD"[++help] | [++h]"PAD"%s", "Print this help screen\n--\n"); +// printf(PAD"[++message] | [++m]"PAD"%s", "Send Pager Mode IM. The stack must be running (see ++run command).\n\n"); +// printf(PAD"[++publish] | [++pub]"PAD"%s", "Send PUBLISH message. The stack must be running (see ++run command). To unPUBLISH, use ++hanggup.\n--\n"); +// printf(PAD"[++quit] | [++q]"PAD"%s", "Quit the application\n--\n"); +// printf(PAD"[++run]"PAD"%s", "Start/Run the 3GPP IMS/LTE stack. Mandatory before starting to do anything.\n--\n"); +// printf(PAD"[++sms]"PAD"%s", "Send Binary SMS (RP-DATA). The stack must be running (see ++run command).\n--\n"); +// printf(PAD"[++subscribe] | [++sub]"PAD"%s", "Send SUBSCRIBE message. The stack must be running (see ++run command). To unSUBSCRIBE, use ++hangup.\n--\n"); +// printf(PAD"[++video] or [++v]"PAD"%s", "Make video call\n--\n"); +// +// printf("\n\n========================= =========================\n\n"); +} + +cmd_t* cmd_create(cmd_type_t type) +{ + return tsk_object_new(cmd_def_t, type); +} + +static tsk_object_t* cmd_ctor(tsk_object_t * self, va_list * app) +{ + cmd_t *cmd = self; + if(cmd){ + cmd->type = va_arg(*app, cmd_type_t); + cmd->opts = tsk_list_create(); + } + return self; +} + +static tsk_object_t* cmd_dtor(tsk_object_t * self) +{ + cmd_t *cmd = self; + if(cmd){ + TSK_OBJECT_SAFE_FREE(cmd->opts); + TSK_FREE(cmd->sidparam); + } + + return self; +} + +static const tsk_object_def_t cmd_def_s = +{ + sizeof(cmd_t), + cmd_ctor, + cmd_dtor, + tsk_null, +}; +const tsk_object_def_t *cmd_def_t = &cmd_def_s; + + +opt_t* opt_create(opt_type_t type, lv_t level, const char* value) +{ + return tsk_object_new(opt_def_t, type, level, value); +} + +const opt_t* opt_get_by_type(const opts_L_t* opts, opt_type_t type) +{ + const tsk_list_item_t* item; + if((item = tsk_list_find_item_by_pred(opts, pred_find_opt_by_type, &type))){ + return item->data; + } + return tsk_null; +} + +static int pred_find_opt_by_type(const tsk_list_item_t *item, const void *type) +{ + if(item && item->data){ + opt_t *opt = item->data; + return (opt->type - *((opt_type_t*)type)); + } + return -1; +} + +static tsk_object_t* opt_ctor(tsk_object_t * self, va_list * app) +{ + opt_t *opt = self; + if(opt){ + opt->type = va_arg(*app, opt_type_t); + opt->lv = va_arg(*app, lv_t); + opt->value = tsk_strdup(va_arg(*app, const char*)); + } + return self; +} + +static tsk_object_t* opt_dtor(tsk_object_t * self) +{ + opt_t *opt = self; + if(opt){ + TSK_FREE(opt->value); + } + + return self; +} + +static const tsk_object_def_t opt_def_s = +{ + sizeof(opt_t), + opt_ctor, + opt_dtor, + tsk_null, +}; +const tsk_object_def_t *opt_def_t = &opt_def_s; diff --git a/tinyDEMO/cmd.h b/tinyDEMO/cmd.h new file mode 100644 index 0000000..6c544ad --- /dev/null +++ b/tinyDEMO/cmd.h @@ -0,0 +1,149 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_CMD_H) +#define TINYDEMO_CMD_H + +#include "demo_config.h" + +#include "tsk_params.h" + +_BEGIN_DECLS + +typedef enum cmd_type_e +{ + cmd_none, + + cmd_audio, /* ++audio | ++a*/ + cmd_audiovideo, /* ++audiovideo | ++av*/ + cmd_config_session, /* ++config-session | ++css */ + cmd_config_stack, /* ++config-stack | ++cst*/ + cmd_dtmf, /*++dtmf*/ + cmd_dump, /*++dump | ++d*/ + cmd_ect, /*++ect*/ + cmd_exit, /*++exit | ++e | ++quit | ++q*/ + cmd_file, /* ++file | ++f*/ + cmd_hangup, /* ++hangup | ++hu */ + cmd_help, /* ++help | ++h */ + cmd_hold, /* ++hold | ++ho */ + cmd_large_message, /* ++large-message | ++lm */ + cmd_message, /* ++message | ++m*/ + cmd_options, /* ++options | ++opt*/ + cmd_publish, /* ++publish | ++pub*/ + cmd_register, /* ++register | ++reg */ + cmd_resume, /* ++resume | ++res */ + cmd_run, /* ++run | ++r*/ + cmd_scenario, /* ++scenario | ++sn*/ + cmd_sleep, /* ++sleep */ + cmd_sms, /* ++sms */ + cmd_stop, /* ++stop */ + cmd_subscribe, /* ++subscribe | ++sub */ + cmd_video, /* ++video | ++v */ +} +cmd_type_t; + +typedef enum opt_type_e +{ + opt_none, + + opt_amf, /* --amf 0x85FF */ + opt_caps, /* --caps +g.oma.sip-im or language=en,fr*/ + opt_dhcpv4, /* --dhcpv4 */ + opt_dhcpv6, /* --dhcpv6 */ + opt_dname, /* --dname bob */ + opt_dns_naptr, /* --dns-naptr */ + opt_from, /* --from sip:alice@open-ims.test */ + opt_event, /* --event 2 */ + opt_expires, /* --expires|--xp 30 */ + opt_header, /* --header Supported=norefersub */ + opt_impi, /* --impi bob@open-ims.test */ + opt_impu, /* --impu sip:bob@open-ims.test */ + opt_ipv6, /* --ipv6 */ + opt_local_ip, /* --local-ip 192.168.0.10 */ + opt_local_port, /* --local-port 5060 */ + opt_opid, /* --opid 0xA712F5D04B */ + opt_password, /* --password|--pwd mysecret */ + opt_path, /* --path /cygdrive/c/Projects/sample.cfg */ + opt_payload, /* --payload|--pay hello world! */ + opt_pcscf_ip, /* --pcscf-ip 192.168.0.13 */ + opt_pcscf_port, /* --pcscf-port 5060 */ + opt_pcscf_trans, /* --pcscf-trans udp */ + opt_realm, /* --realm open-ims.test */ + opt_sec, /* --sec 1800 */ + opt_sid, /* --sid 1234 */ + opt_sigcomp_id, /* --sigcomp-id urn:uuid:2e5fdc76-00be-4314-8202-1116fa82a473 */ + opt_silent, /* --silent */ + opt_smsc, /* --smsc +3315245856 */ + opt_stun_ip, /* --stun-ip numb.viagenie.ca */ + opt_stun_pwd, /* --stun-pwd mysecret */ + opt_stun_port, /* --stun-port 3478 */ + opt_stun_usr, /* --stun-usr bob@open-ims.test */ + opt_to, /* --to sip:alice@open-ims.test */ +} +opt_type_t; + +typedef enum lv_e +{ + lv_none, + + lv_stack, /* @@stack | @@st */ + lv_session, /* @@session | @@ss */ + lv_action /* @@action | @@request | @@a | @@r*/ +} +lv_t; + +typedef struct opt_s +{ + TSK_DECLARE_OBJECT; + + opt_type_t type; + lv_t lv; + char* value; +} +opt_t; +typedef tsk_list_t opts_L_t; + +typedef struct cmd_s +{ + TSK_DECLARE_OBJECT; + + cmd_type_t type; + opts_L_t *opts; + char* sidparam; +} +cmd_t; + +cmd_t* cmd_create(cmd_type_t ); +#define cmd_create_null() cmd_create(cmd_none) + +cmd_t* cmd_parse(const char* buffer, tsk_size_t size, tsk_bool_t *comment, tsk_params_L_t* params); +void cmd_print_help(); + +opt_t* opt_create(opt_type_t, lv_t, const char*); +const opt_t* opt_get_by_type(const opts_L_t* , opt_type_t); +#define opt_create_null() opt_create(opt_none, lv_none, tsk_null) + +const tsk_object_def_t *opt_def_t; +const tsk_object_def_t *cmd_def_t; + +_END_DECLS + +#endif /* TINYDEMO_CMD_H */ diff --git a/tinyDEMO/common.c b/tinyDEMO/common.c new file mode 100644 index 0000000..386fed3 --- /dev/null +++ b/tinyDEMO/common.c @@ -0,0 +1,880 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "common.h" + +#include "invite.h" +#include "message.h" +#include "options.h" +#include "publish.h" +#include "register.h" +#include "subscribe.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +/* === default values === */ +#define DEFAULT_REALM "open-ims.test" +#define DEFAULT_IMPI "bob@"DEFAULT_REALM +#define DEFAULT_IMPU "sip:bob@"DEFAULT_REALM + +#ifndef DEFAULT_LOCAL_IP +//# ifdef ANDROID /* On the emulator */ +//# define DEFAULT_LOCAL_IP "10.0.2.15" +//# define DEFAULT_LOCAL_IP "192.168.0.14" +//# else +# define DEFAULT_LOCAL_IP TNET_SOCKET_HOST_ANY +//# endif +#endif + + +extern ctx_t* ctx; + +int stack_callback(const tsip_event_t *sipevent); +int session_handle_event(const tsip_event_t *sipevent); +int session_tostring(const session_t* session); + +/* our SIP callback function */ +int stack_callback(const tsip_event_t *_event) +{ + int ret = 0; + + if(!_event){ /* should never happen ...but who know? */ + TSK_DEBUG_WARN("Null SIP event."); + return -1; + } + +#if 0 + tsk_safeobj_lock(ctx); +#endif + + switch(_event->type){ + case tsip_event_register: + { /* REGISTER */ + ret = register_handle_event(_event); + break; + } + case tsip_event_invite: + { /* INVITE */ + ret = invite_handle_event(_event); + break; + } + case tsip_event_message: + { /* MESSAGE */ + ret = message_handle_event(_event); + break; + } + case tsip_event_options: + { /* OPTIONS */ + ret = options_handle_event(_event); + break; + } + case tsip_event_publish: + { /* PUBLISH */ + ret = publish_handle_event(_event); + break; + } + case tsip_event_subscribe: + { /* SUBSCRIBE */ + ret = subscribe_handle_event(_event); + break; + } + + case tsip_event_dialog: + { /* Common to all dialogs */ + ret = session_handle_event(_event); + break; + } + + case tsip_event_stack: + { + switch(_event->code){ + case tsip_event_code_stack_started: + TSK_DEBUG_INFO("Stack started"); + break; + case tsip_event_code_stack_stopped: + TSK_DEBUG_INFO("Stack stopped"); + break; + case tsip_event_code_stack_failed_to_start: + TSK_DEBUG_INFO("Stack failed to start"); + break; + case tsip_event_code_stack_failed_to_stop: + TSK_DEBUG_INFO("Stack failed to stop"); + break; + } + break; + } + + default: + { /* Unsupported */ + TSK_DEBUG_WARN("%d not supported as SIP event.", _event->type); + ret = -3; + break; + } + } +#if 0 + tsk_safeobj_unlock(ctx); +#endif + + return ret; +} + +/* ================================================================== + ========================== Context ================================= +*/ + +ctx_t* ctx_create() +{ + return tsk_object_new(ctx_def_t); +} + +static tsk_object_t* ctx_ctor(tsk_object_t * self, va_list * app) +{ + ctx_t *ctx = self; + if(ctx){ + /* stack */ + ctx->stack = tsip_stack_create(stack_callback, DEFAULT_REALM, DEFAULT_IMPI, DEFAULT_IMPU, /* Mandatory parameters */ + TSIP_STACK_SET_LOCAL_IP(DEFAULT_LOCAL_IP), /* local IP */ + TSIP_STACK_SET_NULL() /* Mandatory */); + + /* SIP Sessions */ + ctx->sessions = tsk_list_create(); + + /* user's parameters */ + ctx->params = tsk_list_create(); + + /* init internal mutex */ + tsk_safeobj_init(ctx); + } + return self; +} + +static tsk_object_t* ctx_dtor(tsk_object_t * self) +{ + ctx_t *ctx = self; + if(ctx){ + /* Stop the stack (as sessions are alive, you will continue to receive callbacks)*/ + tsip_stack_stop(ctx->stack); + + /* sessions : should be freed before the stack as explained on the Programmer's Guide + * As all dialogs have been hanged up, the list should be empty ...but who know?*/ + TSK_OBJECT_SAFE_FREE(ctx->sessions); + + /* Destroy the stack */ + TSK_OBJECT_SAFE_FREE(ctx->stack); + + /* Identity */ + TSK_FREE(ctx->identity.display_name); + TSK_FREE(ctx->identity.impu); + TSK_FREE(ctx->identity.preferred); + TSK_FREE(ctx->identity.impi); + TSK_FREE(ctx->identity.password); + + /* Network */ + TSK_FREE(ctx->network.local_ip); + TSK_FREE(ctx->network.proxy_cscf); + TSK_FREE(ctx->network.proxy_cscf_trans); + TSK_FREE(ctx->network.realm); + + /* Security */ + TSK_FREE(ctx->security.operator_id); + + /* Params */ + TSK_OBJECT_SAFE_FREE(ctx->params); + + /* deinit internal mutex */ + tsk_safeobj_deinit(ctx); + } + + return self; +} + +static const tsk_object_def_t ctx_def_s = +{ + sizeof(ctx_t), + ctx_ctor, + ctx_dtor, + tsk_null, +}; +const tsk_object_def_t *ctx_def_t = &ctx_def_s; + + +/* ================================================================== + ========================== Stack ================================= +*/ + +int stack_dump() +{ + const tsk_list_item_t* item; + + tsk_list_foreach(item, ctx->sessions){ + session_tostring(item->data); + } + return 0; +} + +int stack_config(const opts_L_t* opts) +{ + const tsk_list_item_t* item; + const opt_t* opt; + int ret = 0; + tsk_param_t* param; + tsk_bool_t pcscf_changed = tsk_false; + tsk_bool_t stun_done = tsk_false; + + if(!opts){ + return -1; + } + + tsk_list_foreach(item, opts){ + opt = item->data; + + /* Stack-level option */ + if(opt->lv != lv_none && opt->lv != lv_stack){ + continue; + } + + switch(opt->type){ + case opt_amf: + { + break; + } + case opt_dhcpv4: + case opt_dhcpv6: + { + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_DISCOVERY_DHCP(tsk_true), + TSIP_STACK_SET_NULL()); + break; + } + case opt_dname: + { + break; + } + case opt_dns_naptr: + { + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_DISCOVERY_NAPTR(tsk_true), + TSIP_STACK_SET_NULL()); + break; + } + case opt_header: + { + if((param = tsk_params_parse_param(opt->value, tsk_strlen(opt->value)))){ + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_HEADER(param->name, param->value), + TSIP_STACK_SET_NULL()); + TSK_OBJECT_SAFE_FREE(param); + } + break; + } + case opt_impi: + { + tsk_strupdate(&ctx->identity.impi, opt->value); + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_IMPI(ctx->identity.impi), + TSIP_STACK_SET_NULL()); + break; + } + case opt_impu: + { + tsk_strupdate(&ctx->identity.impu, opt->value); + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_IMPU(ctx->identity.impu), + TSIP_STACK_SET_NULL()); + break; + } + case opt_ipv6: + { + pcscf_changed = tsk_true; + ctx->network.ipv6 = tsk_true; + break; + } + case opt_local_ip: + { + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_LOCAL_IP(opt->value), + TSIP_STACK_SET_NULL()); + break; + } + case opt_local_port: + { + unsigned port = (unsigned)atoi(opt->value); + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_LOCAL_PORT(port), + TSIP_STACK_SET_NULL()); + break; + } + case opt_opid: + { + break; + } + case opt_password: + { + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_PASSWORD(opt->value), + TSIP_STACK_SET_NULL()); + break; + } + case opt_pcscf_ip: + { + pcscf_changed = tsk_true; + tsk_strupdate(&ctx->network.proxy_cscf, opt->value); + break; + } + case opt_pcscf_port: + { + pcscf_changed = tsk_true; + ctx->network.proxy_cscf_port = atoi(opt->value); + break; + } + case opt_pcscf_trans: + { + pcscf_changed = tsk_true; + tsk_strupdate(&ctx->network.proxy_cscf_trans, opt->value); + break; + } + case opt_realm: + { + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_REALM(opt->value), + TSIP_STACK_SET_NULL()); + break; + } + + case opt_sigcomp_id: + { /* add compartment */ + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_SIGCOMP_NEW_COMPARTMENT(opt->value), + TSIP_STACK_SET_NULL()); + break; + } + + case opt_stun_ip: + case opt_stun_pwd: + case opt_stun_port: + case opt_stun_usr: + { + if(!stun_done){ + const opt_t* _opt; + const char* ip = tsk_null, *usr = tsk_null, *pwd = tsk_null; + unsigned port = 0; + + if((_opt = opt_get_by_type(opts, opt_stun_ip))){ + ip = _opt->value; + } + if((_opt = opt_get_by_type(opts, opt_stun_port))){ + port = atoi(_opt->value); + } + if((_opt = opt_get_by_type(opts, opt_stun_usr))){ + usr = _opt->value; + } + if((_opt = opt_get_by_type(opts, opt_stun_pwd))){ + pwd = _opt->value; + } + + if(ip && port){ + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_STUN_SERVER(ip, port), + TSIP_STACK_SET_NULL()); + } + if(usr){ + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_STUN_CRED(usr, pwd), + TSIP_STACK_SET_NULL()); + } + + stun_done = tsk_true; + } + break; + } + + }/* switch */ + + } /* foreach */ + + /* whether Proxy-CSCF config has changed */ + if(pcscf_changed){ + ret = tsip_stack_set(ctx->stack, + TSIP_STACK_SET_PROXY_CSCF(ctx->network.proxy_cscf, ctx->network.proxy_cscf_port, ctx->network.proxy_cscf_trans, ctx->network.ipv6 ? "ipv6" : "ipv4"), + TSIP_STACK_SET_NULL()); + } + + return ret; +} + +int stack_run(const opts_L_t* opts) +{ + if(!ctx->stack){ + TSK_DEBUG_ERROR("Stack is Null."); + return -1; + } + else{ + return tsip_stack_start(ctx->stack); + } +} + +/* ================================================================== + ========================== Session ================================= +*/ + +/* Find SIP session by id */ +int pred_find_session_by_id(const tsk_list_item_t *item, const void* id) +{ + const session_t* session; + if(item && item->data){ + session = item->data; + return (int)(tsip_ssession_get_id(session->handle) + - *((tsip_ssession_id_t*)id)); + } + return -1; +} + +session_t* session_create(session_type_t type, tsip_ssession_handle_t* handle) +{ + session_t* session = tsk_object_new(session_def_t, type, handle); + if(!session){ + TSK_DEBUG_ERROR("Failed to create new SIP session"); + return tsk_null; + } + + switch(type){ + case st_invite: + { /* Enable all features (QoS, Session timers, SigComp, ...) */ + tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_USERDATA(session), + /*=== MEDIA */ + TSIP_SSESSION_SET_MEDIA( + // 100rel + TSIP_MSESSION_SET_100rel(tsk_false), + // Session timers + TSIP_MSESSION_SET_TIMERS(3600, "uac"), + // QoS + TSIP_MSESSION_SET_QOS(tmedia_qos_stype_segmented, tmedia_qos_strength_optional), + // close media params + TSIP_MSESSION_SET_NULL() + ), + + TSIP_SSESSION_SET_NULL()); + break; + } + default: + break; + } + return session; +} + +const session_t* session_get_by_sid(const sessions_L_t* sessions, tsip_ssession_id_t sid) +{ + const tsk_list_item_t* item; + if((item = tsk_list_find_item_by_pred(sessions, pred_find_session_by_id, &sid))){ + return item->data; + } + else{ + return tsk_null; + } +} + + +int session_tostring(const session_t* session) +{ + //char* temp = tsk_null; + printf("== Session: "); + if(session){ + /* Session Id */ + printf("sid=%llu", tsip_ssession_get_id(session->handle)); + /* Type */ + printf(" type="); + switch(session->type){ + case st_invite: + printf("INVITE"); + break; + case st_message: + printf("MESSAGE"); + break; + case st_publish: + printf("PUBLISH"); + break; + case st_register: + printf("REGISTER"); + break; + case st_subscribe: + printf("SUBSCRIBE"); + break; + default: + printf("(null)"); + break; + } + /* From */ + printf(" from=%s", session->from ? session->from : ctx->identity.impu); + /* From */ + printf(" to=%s", session->to ? session->to : ctx->identity.impu); + } + else{ + printf("(invalid)"); + } + printf("\n"); + return -1; +} + + +/* handle events -common to all sessions */ +int session_handle_event(const tsip_event_t *_event) +{ + const session_t* session; + + /* Find associated session */ + if(!(session = session_get_by_sid(ctx->sessions, tsip_ssession_get_id(_event->ss)))){ + /* Silentky ignore */ + return 0; + } + switch(_event->code) + { + /* === 7xx ==> errors === */ + case tsip_event_code_dialog_transport_error: + case tsip_event_code_dialog_global_error: + case tsip_event_code_dialog_message_error: + /* do not guess that the dialog is terminated, wait for "tsip_event_code_dialog_terminated" event */ + break; + + /* === 8xx ==> success === */ + case tsip_event_code_dialog_request_incoming: + case tsip_event_code_dialog_request_cancelled: + case tsip_event_code_dialog_request_sent: + break; + + /* === 9xx ==> Informational === */ + case tsip_event_code_dialog_terminated: + { /* we no longer need the session + * -> remove and destroy the session */ + TSK_DEBUG_INFO("Dialog Terminated --> %s", _event->phrase); + tsk_list_remove_item_by_data(ctx->sessions, session); + break; + } + + case tsip_event_code_dialog_connected: + ((session_t*)session)->connected = tsk_true; + break; + case tsip_event_code_dialog_terminating: + break; + } + return 0; +} + +/* handle commands -common to all sessions */ +const session_t* session_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + const opt_t* opt; + const tsk_list_item_t* item; + tsk_param_t* param; + int ret = 0; + + /* Check if there is a session with is Id */ + if((opt = opt_get_by_type(opts, opt_sid))){ + tsip_ssession_id_t sid = atoi(opt->value); + session = session_get_by_sid(ctx->sessions, sid); + } + +#define TYPE_FROM_CMD(_CMD) \ + ((_CMD==cmd_audio || _CMD==cmd_video || _CMD==cmd_audiovideo || _CMD==cmd_file || _CMD==cmd_large_message) ? st_invite : \ + ((_CMD==cmd_message || _CMD==cmd_sms) ? st_message : \ + (_CMD==cmd_options ? st_options : \ + (_CMD==cmd_publish ? st_publish : \ + (_CMD==cmd_register ? st_register : \ + (_CMD==cmd_subscribe ? st_subscribe : st_none)))))) + + /* === Command === */ + switch(cmd){ + case cmd_audio: case cmd_video: case cmd_audiovideo: case cmd_file: case cmd_large_message: + case cmd_message: + case cmd_sms: + case cmd_options: + case cmd_publish: + case cmd_register: + case cmd_subscribe: + { + if(!session){ /* Create "client-side-session" */ + session_t* _session; + if((_session = session_client_create(TYPE_FROM_CMD(cmd))) && (session = _session)){ + tsk_list_push_back_data(ctx->sessions, (void**)&_session); + } + } + break; + } + default: + { + if(session){ + /* hold, resume, refer, update, ...all in-dialog commands */ + break; + } + else{ + TSK_DEBUG_WARN("Session handling: Cannot handle this command [%d]", cmd); + goto bail; + } + } + } /* switch */ + + if(!session){ + TSK_DEBUG_ERROR("SIP Session is Null"); + goto bail; + } + + /* === User Options === */ + tsk_list_foreach(item, opts){ + opt = item->data; + + /* Session-level option? */ + if(opt->lv != lv_none && opt->lv != lv_session){ + continue; + } + + switch(opt->type){ + case opt_caps: + { + if(!tsk_strnullORempty(opt->value)){ + if((param = tsk_params_parse_param(opt->value, tsk_strlen(opt->value)))){ + ret = tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_CAPS(param->name, param->value), + TSIP_SSESSION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(param); + } + } + break; + } + case opt_expires: + { + if(!tsk_strnullORempty(opt->value)){ + unsigned expires = atoi(opt->value); + ret = tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_EXPIRES(expires), + TSIP_SSESSION_SET_NULL()); + } + break; + } + case opt_from: + { /* You should use TSIP_SSESSION_SET_OPTION(TSIP_SSESSION_OPTION_FROM, value) + instead of TSIP_SSESSION_SET_HEADER() to set the destination URI. */ + break; + } + case opt_header: + { + if((param = tsk_params_parse_param(opt->value, tsk_strlen(opt->value)))){ + ret = tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_HEADER(param->name, param->value), + TSIP_SSESSION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(param); + } + break; + } + case opt_payload: + { /* Will be handled by the caller */ + break; + } + case opt_silent: + { /* valueless option */ + ret = tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_SILENT_HANGUP(tsk_true), + TSIP_SSESSION_SET_NULL()); + break; + } + case opt_sigcomp_id: + { /* sigcomp-id */ + ret = tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_SIGCOMP_COMPARTMENT(opt->value), + TSIP_SSESSION_SET_NULL()); + break; + } + case opt_to: + { /* You should use TSIP_SSESSION_SET_OPTION(TSIP_SSESSION_OPTION_TO, value) + instead of TSIP_SSESSION_SET_HEADER() to set the destination URI. */ + if((cmd != cmd_sms) && (cmd != cmd_ect) && !tsk_strnullORempty(opt->value)){ /* SMS will use SMSC Address as Request URI */ + ret = tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_TO(opt->value), + TSIP_SSESSION_SET_NULL()); + } + break; + } + default: + { + /* will be handled by the caller */ + break; + } + } + + } /* foreach */ + +bail: + return session; +} + +int session_hangup(tsip_ssession_id_t sid) +{ + const session_t* session; + if((session = session_get_by_sid(ctx->sessions, sid))){ + switch(session->type){ + case st_invite: + tsip_api_invite_send_bye(session->handle, + /* You can add your parameters */ + TSIP_ACTION_SET_NULL()); + break; + case st_message: + break; + case st_publish: + tsip_api_publish_send_unpublish(session->handle, + /* You can add your parameters */ + TSIP_ACTION_SET_NULL()); + break; + case st_register: + tsip_api_register_send_unregister(session->handle, + /* You can add your parameters */ + TSIP_ACTION_SET_NULL()); + break; + case st_subscribe: + tsip_api_subscribe_send_unsubscribe(session->handle, + /* You can add your parameters */ + TSIP_ACTION_SET_NULL()); + break; + default: + TSK_DEBUG_WARN("Cannot hangup session with this type [%d]", session->type); + return -2; + } + return 0; + } + else{ + TSK_DEBUG_WARN("Failed to find session with sid=%llu", sid); + return -1; + } +} + +static tsk_object_t* session_ctor(tsk_object_t * self, va_list * app) +{ + session_t *session = self; + if(session){ + session->type = va_arg(*app, session_type_t); + if((session->handle = va_arg(*app, tsip_ssession_handle_t*))){ + int ret; + /* "server-side-session" */ + if((ret = tsip_ssession_take_ownership(session->handle))){ + TSK_DEBUG_ERROR("Failed to take ownership [%d]", ret); + } + } + else{ + /* "client-side-session" */ + session->handle = tsip_ssession_create(ctx->stack, + TSIP_SSESSION_SET_NULL()); + } + } + return self; +} + +static tsk_object_t* session_dtor(tsk_object_t * self) +{ + session_t *session = self; + if(session){ + TSK_OBJECT_SAFE_FREE(session->handle); + + TSK_FREE(session->to); + TSK_FREE(session->from); + } + + return self; +} + +static int session_cmp(const tsk_object_t *_ss1, const tsk_object_t *_ss2) +{ + const session_t *ss1 = _ss1; + const session_t *ss2 = _ss2; + + if(ss1 && ss1){ + if(ss1->handle && ss2->handle){ + return tsk_object_cmp(ss1->handle, ss2->handle); + } + else{ + return (ss2 - ss1); + } + } + else if(!ss1 && !ss2) return 0; + else return -1; +} + +static const tsk_object_def_t session_def_s = +{ + sizeof(session_t), + session_ctor, + session_dtor, + session_cmp, +}; +const tsk_object_def_t *session_def_t = &session_def_s; + + + +tsip_action_handle_t* action_get_config(const opts_L_t* opts) +{ + const opt_t* opt; + const tsk_list_item_t* item; + tsip_action_handle_t* action_config = tsk_null; + tsk_param_t* param; + + if(TSK_LIST_IS_EMPTY(opts)){ + return tsk_null; + } + + tsk_list_foreach(item, opts){ + opt = item->data; + + /* action level? */ + if(opt->lv != lv_action){ + continue; + } + + /* create new action */ + if(!action_config && !(action_config = tsip_action_create(tsip_atype_config, + TSIP_ACTION_SET_NULL()))) break; + + switch(opt->type){ + case opt_header: + { + if((param = tsk_params_parse_param(opt->value, tsk_strlen(opt->value)))){ + tsip_action_set(action_config, + TSIP_ACTION_SET_HEADER(param->name, param->value), + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(param); + } + break; + } + case opt_payload: + { + tsip_action_set(action_config, + TSIP_ACTION_SET_PAYLOAD(opt->value, tsk_strlen(opt->value)), + TSIP_ACTION_SET_NULL()); + break; + } + default: + { + break; + } + } + } + + return action_config; +} diff --git a/tinyDEMO/common.h b/tinyDEMO/common.h new file mode 100644 index 0000000..7c32547 --- /dev/null +++ b/tinyDEMO/common.h @@ -0,0 +1,127 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_COMMON_H) +#define TINYDEMO_COMMON_H + +#include "demo_config.h" + +#include "cmd.h" + +#include "tinysip.h" /* 3GPP IMS/LTE API */ + +_BEGIN_DECLS + +typedef enum session_type_e +{ + st_none, + + st_invite, + st_message, + st_options, + st_publish, + st_register, + st_subscribe, +} +session_type_t; + +typedef struct session_s +{ + TSK_DECLARE_OBJECT; + + tsip_ssession_handle_t* handle; + + session_type_t type; + char* from; + char* to; + tsk_bool_t connected; +} +session_t; +typedef tsk_list_t sessions_L_t; +#define SESSION(self) ((session_t*)(self)) + +typedef struct ctx_s +{ + TSK_DECLARE_OBJECT; + + tsip_stack_handle_t *stack; + + /* Identity */ + struct{ + char* display_name; + char *impu; + char *preferred; + char *impi; + char *password; + } identity; + + /* Network */ + struct{ + char *local_ip; + tnet_port_t local_port; + + char *proxy_cscf; + tnet_port_t proxy_cscf_port; + char* proxy_cscf_trans; + + char *realm; + + tsk_bool_t ipv6; + tsk_bool_t naptr; + tsk_bool_t dhcp; + } network; + + /* Security */ + struct{ + tsk_bool_t earlyIMS; + char* operator_id; + uint16_t amf; + } security; + + sessions_L_t* sessions; + tsk_params_L_t* params; + + TSK_DECLARE_SAFEOBJ; /* For thread-safeness */ +} +ctx_t; + +ctx_t* ctx_create(); + +int stack_dump(); +int stack_config(const opts_L_t* opts); +int stack_run(const opts_L_t* opts); + +session_t* session_create(session_type_t, tsip_ssession_handle_t* ); +#define session_client_create(type) session_create(type, tsk_null) +#define session_server_create(type, handle) session_create(type, handle) + +const session_t* session_get_by_sid(const sessions_L_t* , tsip_ssession_id_t ); +int session_tostring(const session_t* ); +int session_hangup(tsip_ssession_id_t sid); + +tsip_action_handle_t* action_get_config(const opts_L_t* opts); + +const tsk_object_def_t *session_def_t; +const tsk_object_def_t *ctx_def_t; + +_END_DECLS + +#endif /* TINYDEMO_COMMON_H */ diff --git a/tinyDEMO/core-alcatel.sn b/tinyDEMO/core-alcatel.sn new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tinyDEMO/core-alcatel.sn diff --git a/tinyDEMO/core-colibria.sn b/tinyDEMO/core-colibria.sn new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tinyDEMO/core-colibria.sn diff --git a/tinyDEMO/core-doubango.sn b/tinyDEMO/core-doubango.sn new file mode 100644 index 0000000..12015b6 --- /dev/null +++ b/tinyDEMO/core-doubango.sn @@ -0,0 +1,59 @@ +## For more information about scenarios, please refer to the Programmer's Guide +# + +# user's parameters (like ANSI-C #define) +%%domain doubango.org +%%user alice +%%pwd mysecret +%%proxy_ip 192.168.0.13 # IP address or FQDN +%%proxy_port 5060 +%%proxy_trans udp # udp, tcp, tls or sctp +%%expires 300 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid + +#--stun-ip numb.viagenie.ca --stun-port 3478 --stun-usr $$(user)@$$(domain) --stun-pwd $$(pwd) + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# OPTIONS to hack AOR +#++opt +#++sleep --sec $$(sleep-sec) + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + + +# Press ENTER +++sleep --sec -1 + +++av --to sip:5552734301@$$(domain) \ + --header Action-Header=Myheader-value @@action \ + >>(inv_audio_sid) + +# 5552734300 qVGA +# 5552734301 VGA +# 5552734303 HDTV (1280x720) + +++sleep --sec -1 +++hu --sid $$(inv_audio_sid) +++sleep --sec -1 + +# Exit the application +++e diff --git a/tinyDEMO/core-ericsson.sn b/tinyDEMO/core-ericsson.sn new file mode 100644 index 0000000..b3860e6 --- /dev/null +++ b/tinyDEMO/core-ericsson.sn @@ -0,0 +1,98 @@ +## For more information about scenarios, please refer to the Programmer's Guide + +# user's parameters (like ANSI-C #define) +%%domain ericsson.com +%%user mamadou +%%pwd mamadou +%%proxy_ip 192.168.0.17 # IP address or FQDN +%%proxy_port 5081 +%%proxy_trans tcp # udp, tcp, tls or sctp +%%expires 100 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid + +#--local-ip 10.0.2.15\ + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user)@$$(domain) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + + +# OPTIONS to hack AOR +#++opt +#++sleep --sec 1 + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + +# sleep +++sleep --sec $$(sleep-sec) + +# SUBSCRIBE to reg event package (silent hangup) +#++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --silent --header Event=reg --header Accept=application/reginfo+xml \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) + +#SUBSCRIBE to presence event package (alice) +#++sub --to sip:alice@$$(domain) --xp $$(expires) --header Event=presence --header Supported=eventlist\ +# --header Accept=multipart/related, application/rlmi+xml, application/pidf+xml, application/rpid+xml, application/xcap-diff+xml, message/external-body \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-pres-sid) + +#PUBLISH +#++sn --path ./publish.sn + +#send Pager Mode IM +#++m --to sip:alice@$$(domain) \ +# --header NS=imdn <urn:ietf:params:imdn> \ +# --header imdn.Message-ID=34jk324j \ +# --header DateTime=2006-04-04T12:16:49-05:00 \ +# --header imdn.Disposition-Notification=positive-delivery, negative-delivery \ +# --header Content-Type=text/plain \ +# --pay Hello World + +#Send Binary SMS (RP-DATA) +#++sms --smsc sip:+33185145269@$$(domain);user=phone;npi=ISDN --to sip:+33685214585@$$(domain);user=phone \ +# --header Content-Type=application/vnd.3gpp.sms \ +# --header Transfer-Encoding=binary \ +# --pay hello world + +#send INVITE +#++a --to sip:alice@$$(domain) >>(inv_audio_sid) +#++sleep --sec -1 +#++ho --sid $$(inv_audio_sid) +#++sleep --sec -1 +#++res --sid $$(inv_audio_sid) +#++ect --sid $$(inv_audio_sid) --to sip:alice@$$(domain) + +# Press ENTER +++sleep --sec -1 + +# unsunscribe (reg and pres) +#++hu --sid $$(sub-reg-sid) +#++hu --sid $$(sub-pres-sid) +#++hu --sid $$(pub-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + +# unregister +#++hu --sid $$(reg-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + +# Exit the application +++e
\ No newline at end of file diff --git a/tinyDEMO/core-inexbee.sn b/tinyDEMO/core-inexbee.sn new file mode 100644 index 0000000..dd8b665 --- /dev/null +++ b/tinyDEMO/core-inexbee.sn @@ -0,0 +1,70 @@ +## For more information about scenarios, please refer to the Programmer's Guide + +# user's parameters (like ANSI-C #define) +# No Proxy-CSCF ==> we are using DNS-NAPTR discovery +%%domain ims.inexbee.com +%%user bob +%%pwd bob +%%proxy_trans udp # udp, tcp, tls or sctp +%%expires 30 # expires used by all dialogs +%%sleep-sec 2.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user)@$$(domain) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --dns-naptr --pcscf-ip 192.168.16.225 --pcscf-port 4060 --pcscf-trans $$(proxy_trans)\ + --header Privacy=header;id --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action\ + >>(reg-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + + subscribe to reg event package +#++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --header Event=reg --header Accept=application/reginfo+xml \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) + +#subscribe to presence event package (alice) +#++sub --to sip:alice@$$(domain) --xp $$(expires) --header Event=presence --header Supported=eventlist\ +# --header Accept=multipart/related, application/rlmi+xml, application/pidf+xml, application/rpid+xml, application/xcap-diff+xml, message/external-body \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-pres-sid) + +#publish +#++sn --path ./publish.sn + +++av --to sip:004@$$(domain) \ + --header Action-Header=Myheader-value @@action \ + >>(inv_audio_sid) + +# sleep +++sleep --sec -1 # Press ENTER + +# unsunscribe (reg and pres) +#++hu --sid $$(sub-reg-sid) +#++hu --sid $$(sub-pres-sid) +#++hu --sid $$(pub-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + +# unregister +#++hu --sid $$(reg-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + +# Exit the application +++e
\ No newline at end of file diff --git a/tinyDEMO/core-micromethod.sn b/tinyDEMO/core-micromethod.sn new file mode 100644 index 0000000..ecae35e --- /dev/null +++ b/tinyDEMO/core-micromethod.sn @@ -0,0 +1,112 @@ +## For more information about scenarios, please refer to the Programmer's Guide + +# user's parameters (like ANSI-C #define) +%%domain open-ims.test +%%user popo +%%pwd popo +%%proxy_ip 192.168.0.10 # IP address or FQDN +%%proxy_port 5060 +%%proxy_trans udp # udp, tcp, tls or sctp +%%expires 60 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid +%%inv_file_sid + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +#--stun-ip numb.viagenie.ca --stun-port 3478 --stun-usr $$(user)@$$(domain) --stun-pwd $$(pwd) +++cst --realm $$(domain) --impi $$(user)@$$(domain) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# OPTIONS to hack AOR +#++opt +#++sleep --sec $$(sleep-sec) + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + +# sleep +++sleep --sec $$(sleep-sec) + +# SUBSCRIBE to reg event package (silent hangup) +#++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --silent --header Event=reg --header Accept=application/reginfo+xml \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) + +#SUBSCRIBE to presence event package (alice) +#++sub --to sip:alice@$$(domain) --xp $$(expires) --header Event=presence --header Supported=eventlist\ +# --header Accept=multipart/related, application/rlmi+xml, application/pidf+xml, application/rpid+xml, application/xcap-diff+xml, message/external-body \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-pres-sid) + +#PUBLISH +#++sn --path ./publish.sn + +#send Pager Mode IM +#++m --to sip:alice@$$(domain) \ +# --header NS=imdn <urn:ietf:params:imdn> \ +# --header imdn.Message-ID=34jk324j \ +# --header DateTime=2006-04-04T12:16:49-05:00 \ +# --header imdn.Disposition-Notification=positive-delivery, negative-delivery \ +# --header Content-Type=text/plain \ +# --pay Hello World + +#Send Binary SMS (RP-DATA) +#++sms --smsc sip:+33185145269@$$(domain);user=phone;npi=ISDN --to sip:+33685214585@$$(domain);user=phone \ +# --header Content-Type=application/vnd.3gpp.sms \ +# --header Transfer-Encoding=binary \ +# --pay hello world + +#send INVITE +#++av --to sip:bob@$$(domain) \ +# --header Action-Header=Myheader-value @@action \ +# >>(inv_audio_sid) +#++hu --sid $$(inv_audio_sid) + +++file --to sip:bob@$$(domain) --path ./core-micromethod.sn \ + --header Action-Header=Myheader-value @@action \ + >>(inv_file_sid) + +++sleep --sec -1 + + +#++sleep --sec -1 +#++ho --sid $$(inv_audio_sid) +#++sleep --sec -1 +#++res --sid $$(inv_audio_sid) +#++sleep --sec -1 +#++ect --sid $$(inv_audio_sid) --to alice@$$(domain) +#++sleep --sec -1 +#++dtmf --sid $$(inv_audio_sid) --event 1 + + +# Press ENTER +++sleep --sec -1 + +# unsunscribe (reg and pres) +#++hu --sid $$(sub-reg-sid) +#++hu --sid $$(sub-pres-sid) +#++hu --sid $$(pub-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + +# unregister +#++hu --sid $$(reg-sid) + +# sleep +#++sleep --sec $$(sleep-sec) + +# Exit the application +++e
\ No newline at end of file diff --git a/tinyDEMO/core-nsn.sn b/tinyDEMO/core-nsn.sn new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tinyDEMO/core-nsn.sn diff --git a/tinyDEMO/demo_config.h b/tinyDEMO/demo_config.h new file mode 100644 index 0000000..6d8c84b --- /dev/null +++ b/tinyDEMO/demo_config.h @@ -0,0 +1,47 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_CONFIG_H) +#define TINYDEMO_CONFIG_H + +#ifdef __SYMBIAN32__ +#undef _WIN32 /* Because of WINSCW */ +#endif + +/* Guards against C++ name mangling */ +#ifdef __cplusplus +# define _BEGIN_DECLS extern "C" { +# define _END_DECLS } +#else +# define _BEGIN_DECLS +# define _END_DECLS +#endif + +#ifdef _MSC_VER +# define _CRT_SECURE_NO_WARNINGS +# pragma warning( disable : 4996 ) +#endif + +/* use SIP OPTIONS and "rport" to hack the AOR +* usefult on some emulator (such as Android) with non-routable IP addresses */ +#define HACK_AOR 0 + +#endif /* TINYDEMO_CONFIG_H */ diff --git a/tinyDEMO/droid-makefile b/tinyDEMO/droid-makefile new file mode 100644 index 0000000..9e3aa93 --- /dev/null +++ b/tinyDEMO/droid-makefile @@ -0,0 +1,44 @@ +APP := demo + +FFMPEG_LDFLAGS := -L../thirdparties/android/lib -lavutil -lswscale -lavcodec -lgcc + +CFLAGS := $(CFLAGS_COMMON) -I../tinySAK/src -I../tinyNET/src -I../tinySMS/include -I../tinyHTTP/include -I../tinySDP/include -I../tinyDAV/include -I../tinyMEDIA/include -I../tinySIP/include +LDFLAGS := $(LDFLAGS_COMMON) -Wl,-Bsymbolic,--whole-archive -Wl,--entry=main -lm $(FFMPEG_LDFLAGS) -ltinySAK -ltinyNET -ltinyHTTP -ltinyIPSec -ltinySMS -ltinySDP -ltinyMEDIA -ltinyDAV -ltinySIP + +all: $(APP) + +OBJS = \ + cmd.o \ + common.o \ + dssl.o \ + invite.o \ + main.o \ + message.o \ + options.o \ + publish.o \ + register.o \ + subscribe.o + +$(APP): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ + +%.o: %.c + $(CC) -c $(INCLUDE) $(CFLAGS) $< -o $@ + +install: $(APP) + $(ANDROID_SDK_ROOT)/tools/adb push $(APP) $(EXEC_DIR)/$(APP) + $(ANDROID_SDK_ROOT)/tools/adb shell chmod 777 $(EXEC_DIR)/$(APP) +ifneq ($(SN), ) + $(ANDROID_SDK_ROOT)/tools/adb push $(SN) $(EXEC_DIR) + $(ANDROID_SDK_ROOT)/tools/adb shell chmod 777 $(EXEC_DIR)/$(SN) +endif + +run: + $(ANDROID_SDK_ROOT)/tools/adb shell $(EXEC_DIR)/$(APP) + +#dbg: +# $(MAKE) $(MAKEFILE) DEBUG="-g -DDEBUG" +# $(MAKE) $(MAKEFILE) install + +clean: + @rm -f $(OBJS) $(APP)
\ No newline at end of file diff --git a/tinyDEMO/dssl.c b/tinyDEMO/dssl.c new file mode 100644 index 0000000..599394b --- /dev/null +++ b/tinyDEMO/dssl.c @@ -0,0 +1,5071 @@ + +/* #line 1 "./dssl.rl" */ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "dssl.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_ragel_state.h" + +#include <string.h> + +#define DEBUG_PARSER 0 + +#define set_level(_lv) if(opt) opt->lv = _lv; + +char* replace_param(char* pivot, int index_1, int index_2, tsk_params_L_t* params) +{ + char* pname = tsk_null; + char* ret = tsk_null; + const tsk_param_t* p; + //tsk_size_t len = tsk_strlen(pivot); + //tsk_bool_t parenthesis = tsk_false; + int i1, i2; + + /* whether there are parenthesis around the param */ + if((i1 = tsk_strindexOf((pivot + index_1), tsk_strlen((pivot + index_1)), "(")) == 2 + && (i2 = tsk_strindexOf((pivot + index_1 + i1), tsk_strlen((pivot + index_1 + i1)), ")")) != -1) + { + pname = tsk_strndup((pivot + index_1 + i1 + 1), (i2 - i1 + 1)); + index_2 = index_1 + i1 + i2 + 1; + } + else{ + pname = tsk_strndup((pivot + index_1 + 2/*$$*/), (index_2 - index_1 - 2)); + } + + if((p = tsk_params_get_param_by_name(params, pname))){ + tsk_strncat(&ret, pivot, index_1); + tsk_strncat(&ret, p->value, tsk_strlen(p->value)); + tsk_strncat(&ret, (pivot + index_2), (tsk_strlen(pivot) - index_2)); + } + else{ + TSK_DEBUG_WARN("Failed to find param [%s]", pname); + } + + TSK_FREE(pname); + return ret; +} + +tsk_bool_t next_not_(const char* p, const char* pe, char c) +{ + if((p && pe) && (pe-p) >=2){ + return (*p == c && *(p + 1) == c) ? tsk_false : tsk_true; + } + return tsk_true; +} +#define next_not_hyphens(p, pe) next_not_(p, pe, '-') +#define next_not_arobases(p, pe) next_not_(p, pe, '@') +#define next_not_percents(p, pe) next_not_(p, pe, '%') +#define next_not_redirs(p, pe) next_not_(p, pe, '>') + +/*********************************** +* Ragel state machine. +*/ + +/* #line 311 "./dssl.rl" */ + + +cmd_t* dssl_parse(const char *buffer, tsk_size_t size, tsk_bool_t *comment, tsk_params_L_t* params) +{ + int cs = 0; + const char *p = buffer; + const char *pe; + const char *eof; + opt_t* opt = tsk_null; + tsk_param_t* param = tsk_null; + cmd_t *cmd = cmd_create_null(); + char* temp = tsk_null; + int index; + + const char *ts = tsk_null, *te = tsk_null; + int act = 0; + + const char *tag_start = tsk_null; + + /* global vars and initilization (Ragel) */ + +/* #line 109 "./dssl.c" */ +static const char _demo_machine_parser_cmd_actions[] = { + 0, 1, 0, 1, 3, 1, 8, 1, + 12, 1, 13, 1, 14, 1, 15, 1, + 16, 1, 17, 1, 18, 1, 19, 1, + 20, 1, 21, 1, 22, 1, 23, 1, + 24, 1, 25, 1, 26, 1, 27, 1, + 28, 1, 29, 1, 30, 1, 31, 1, + 32, 1, 33, 1, 34, 1, 35, 1, + 36, 1, 37, 1, 38, 1, 39, 1, + 40, 1, 41, 1, 42, 1, 43, 1, + 44, 1, 45, 1, 46, 1, 47, 1, + 48, 1, 49, 1, 50, 1, 51, 1, + 52, 1, 53, 1, 54, 1, 55, 1, + 56, 1, 57, 1, 58, 1, 59, 1, + 60, 1, 61, 1, 62, 1, 63, 1, + 64, 1, 65, 1, 66, 1, 67, 1, + 68, 1, 69, 1, 70, 1, 71, 1, + 72, 1, 73, 1, 74, 1, 75, 1, + 76, 1, 78, 1, 84, 1, 85, 2, + 0, 3, 2, 0, 12, 2, 1, 0, + 2, 2, 80, 2, 3, 0, 2, 4, + 77, 2, 4, 82, 2, 5, 0, 2, + 9, 83, 2, 11, 79, 2, 13, 79, + 2, 14, 79, 2, 15, 79, 2, 16, + 79, 2, 17, 79, 2, 18, 79, 2, + 19, 79, 2, 20, 79, 2, 21, 79, + 2, 22, 79, 2, 23, 79, 2, 24, + 79, 2, 25, 79, 2, 26, 79, 2, + 27, 79, 2, 28, 79, 2, 29, 79, + 2, 30, 79, 2, 31, 79, 2, 32, + 79, 2, 33, 79, 2, 34, 79, 2, + 35, 79, 2, 36, 79, 2, 37, 79, + 2, 71, 12, 2, 72, 12, 2, 73, + 12, 2, 76, 0, 2, 76, 3, 2, + 76, 10, 2, 76, 12, 2, 76, 13, + 2, 76, 14, 2, 76, 15, 2, 76, + 16, 2, 76, 17, 2, 76, 18, 2, + 76, 19, 2, 76, 20, 2, 76, 21, + 2, 76, 22, 2, 76, 23, 2, 76, + 24, 2, 76, 25, 2, 76, 26, 2, + 76, 27, 2, 76, 28, 2, 76, 29, + 2, 76, 30, 2, 76, 31, 2, 76, + 32, 2, 76, 33, 2, 76, 34, 2, + 76, 35, 2, 76, 36, 2, 76, 37, + 2, 76, 38, 2, 76, 39, 2, 76, + 40, 2, 76, 41, 2, 76, 42, 2, + 76, 43, 2, 76, 44, 2, 76, 45, + 2, 76, 46, 2, 76, 47, 2, 76, + 48, 2, 76, 49, 2, 76, 50, 2, + 76, 51, 2, 76, 52, 2, 76, 53, + 2, 76, 54, 2, 76, 55, 2, 76, + 56, 2, 76, 57, 2, 76, 58, 2, + 76, 59, 2, 76, 60, 2, 76, 61, + 2, 76, 62, 2, 76, 63, 2, 76, + 64, 2, 76, 65, 2, 76, 66, 2, + 76, 67, 2, 76, 68, 2, 76, 69, + 2, 76, 70, 2, 76, 71, 2, 76, + 72, 2, 76, 73, 3, 0, 4, 77, + 3, 0, 4, 82, 3, 0, 9, 83, + 3, 0, 11, 79, 3, 3, 2, 80, + 3, 5, 0, 8, 3, 7, 6, 81, + 3, 10, 0, 3, 3, 12, 2, 80, + 3, 13, 11, 79, 3, 14, 11, 79, + 3, 15, 11, 79, 3, 16, 11, 79, + 3, 17, 11, 79, 3, 18, 11, 79, + 3, 19, 11, 79, 3, 20, 11, 79, + 3, 21, 11, 79, 3, 22, 11, 79, + 3, 23, 11, 79, 3, 24, 11, 79, + 3, 25, 11, 79, 3, 26, 11, 79, + 3, 27, 11, 79, 3, 28, 11, 79, + 3, 29, 11, 79, 3, 30, 11, 79, + 3, 31, 11, 79, 3, 32, 11, 79, + 3, 33, 11, 79, 3, 34, 11, 79, + 3, 35, 11, 79, 3, 36, 11, 79, + 3, 37, 11, 79, 3, 38, 0, 3, + 3, 39, 0, 3, 3, 40, 0, 3, + 3, 41, 0, 3, 3, 42, 0, 3, + 3, 43, 0, 3, 3, 44, 0, 3, + 3, 45, 0, 3, 3, 46, 0, 3, + 3, 47, 0, 3, 3, 48, 0, 3, + 3, 49, 0, 3, 3, 50, 0, 3, + 3, 51, 0, 3, 3, 52, 0, 3, + 3, 53, 0, 3, 3, 54, 0, 3, + 3, 55, 0, 3, 3, 56, 0, 3, + 3, 57, 0, 3, 3, 58, 0, 3, + 3, 59, 0, 3, 3, 60, 0, 3, + 3, 61, 0, 3, 3, 62, 0, 3, + 3, 63, 0, 3, 3, 64, 0, 3, + 3, 65, 0, 3, 3, 66, 0, 3, + 3, 67, 0, 3, 3, 68, 0, 3, + 3, 69, 0, 3, 3, 70, 0, 3, + 3, 71, 2, 80, 3, 72, 2, 80, + 3, 73, 2, 80, 3, 76, 0, 12, + 3, 76, 1, 0, 3, 76, 10, 0, + 3, 76, 38, 0, 3, 76, 38, 10, + 3, 76, 39, 0, 3, 76, 39, 10, + 3, 76, 40, 0, 3, 76, 40, 10, + 3, 76, 41, 0, 3, 76, 41, 10, + 3, 76, 42, 0, 3, 76, 42, 10, + 3, 76, 43, 0, 3, 76, 43, 10, + 3, 76, 44, 0, 3, 76, 44, 10, + 3, 76, 45, 0, 3, 76, 45, 10, + 3, 76, 46, 0, 3, 76, 46, 10, + 3, 76, 47, 0, 3, 76, 47, 10, + 3, 76, 48, 0, 3, 76, 48, 10, + 3, 76, 49, 0, 3, 76, 49, 10, + 3, 76, 50, 0, 3, 76, 50, 10, + 3, 76, 51, 0, 3, 76, 51, 10, + 3, 76, 52, 0, 3, 76, 52, 10, + 3, 76, 53, 0, 3, 76, 53, 10, + 3, 76, 54, 0, 3, 76, 54, 10, + 3, 76, 55, 0, 3, 76, 55, 10, + 3, 76, 56, 0, 3, 76, 56, 10, + 3, 76, 57, 0, 3, 76, 57, 10, + 3, 76, 58, 0, 3, 76, 58, 10, + 3, 76, 59, 0, 3, 76, 59, 10, + 3, 76, 60, 0, 3, 76, 60, 10, + 3, 76, 61, 0, 3, 76, 61, 10, + 3, 76, 62, 0, 3, 76, 62, 10, + 3, 76, 63, 0, 3, 76, 63, 10, + 3, 76, 64, 0, 3, 76, 64, 10, + 3, 76, 65, 0, 3, 76, 65, 10, + 3, 76, 66, 0, 3, 76, 66, 10, + 3, 76, 67, 0, 3, 76, 67, 10, + 3, 76, 68, 0, 3, 76, 68, 10, + 3, 76, 69, 0, 3, 76, 69, 10, + 3, 76, 70, 0, 3, 76, 70, 10, + 3, 76, 71, 12, 3, 76, 72, 12, + 3, 76, 73, 12, 4, 0, 3, 2, + 80, 4, 0, 7, 6, 81, 4, 0, + 12, 2, 80, 4, 1, 0, 10, 3, + 4, 3, 12, 2, 80, 4, 3, 71, + 2, 80, 4, 3, 72, 2, 80, 4, + 3, 73, 2, 80, 4, 38, 10, 0, + 3, 4, 39, 10, 0, 3, 4, 40, + 10, 0, 3, 4, 41, 10, 0, 3, + 4, 42, 10, 0, 3, 4, 43, 10, + 0, 3, 4, 44, 10, 0, 3, 4, + 45, 10, 0, 3, 4, 46, 10, 0, + 3, 4, 47, 10, 0, 3, 4, 48, + 10, 0, 3, 4, 49, 10, 0, 3, + 4, 50, 10, 0, 3, 4, 51, 10, + 0, 3, 4, 52, 10, 0, 3, 4, + 53, 10, 0, 3, 4, 54, 10, 0, + 3, 4, 55, 10, 0, 3, 4, 56, + 10, 0, 3, 4, 57, 10, 0, 3, + 4, 58, 10, 0, 3, 4, 59, 10, + 0, 3, 4, 60, 10, 0, 3, 4, + 61, 10, 0, 3, 4, 62, 10, 0, + 3, 4, 63, 10, 0, 3, 4, 64, + 10, 0, 3, 4, 65, 10, 0, 3, + 4, 66, 10, 0, 3, 4, 67, 10, + 0, 3, 4, 68, 10, 0, 3, 4, + 69, 10, 0, 3, 4, 70, 10, 0, + 3, 4, 71, 12, 2, 80, 4, 72, + 12, 2, 80, 4, 73, 12, 2, 80, + 4, 76, 1, 0, 10, 4, 76, 38, + 10, 0, 4, 76, 39, 10, 0, 4, + 76, 40, 10, 0, 4, 76, 41, 10, + 0, 4, 76, 42, 10, 0, 4, 76, + 43, 10, 0, 4, 76, 44, 10, 0, + 4, 76, 45, 10, 0, 4, 76, 46, + 10, 0, 4, 76, 47, 10, 0, 4, + 76, 48, 10, 0, 4, 76, 49, 10, + 0, 4, 76, 50, 10, 0, 4, 76, + 51, 10, 0, 4, 76, 52, 10, 0, + 4, 76, 53, 10, 0, 4, 76, 54, + 10, 0, 4, 76, 55, 10, 0, 4, + 76, 56, 10, 0, 4, 76, 57, 10, + 0, 4, 76, 58, 10, 0, 4, 76, + 59, 10, 0, 4, 76, 60, 10, 0, + 4, 76, 61, 10, 0, 4, 76, 62, + 10, 0, 4, 76, 63, 10, 0, 4, + 76, 64, 10, 0, 4, 76, 65, 10, + 0, 4, 76, 66, 10, 0, 4, 76, + 67, 10, 0, 4, 76, 68, 10, 0, + 4, 76, 69, 10, 0, 4, 76, 70, + 10, 0, 5, 3, 0, 12, 2, 80, + 5, 3, 71, 12, 2, 80, 5, 3, + 72, 12, 2, 80, 5, 3, 73, 12, + 2, 80, 5, 10, 0, 3, 2, 80, + 5, 38, 0, 3, 2, 80, 5, 39, + 0, 3, 2, 80, 5, 40, 0, 3, + 2, 80, 5, 41, 0, 3, 2, 80, + 5, 42, 0, 3, 2, 80, 5, 43, + 0, 3, 2, 80, 5, 44, 0, 3, + 2, 80, 5, 45, 0, 3, 2, 80, + 5, 46, 0, 3, 2, 80, 5, 47, + 0, 3, 2, 80, 5, 48, 0, 3, + 2, 80, 5, 49, 0, 3, 2, 80, + 5, 50, 0, 3, 2, 80, 5, 51, + 0, 3, 2, 80, 5, 52, 0, 3, + 2, 80, 5, 53, 0, 3, 2, 80, + 5, 54, 0, 3, 2, 80, 5, 55, + 0, 3, 2, 80, 5, 56, 0, 3, + 2, 80, 5, 57, 0, 3, 2, 80, + 5, 58, 0, 3, 2, 80, 5, 59, + 0, 3, 2, 80, 5, 60, 0, 3, + 2, 80, 5, 61, 0, 3, 2, 80, + 5, 62, 0, 3, 2, 80, 5, 63, + 0, 3, 2, 80, 5, 64, 0, 3, + 2, 80, 5, 65, 0, 3, 2, 80, + 5, 66, 0, 3, 2, 80, 5, 67, + 0, 3, 2, 80, 5, 68, 0, 3, + 2, 80, 5, 69, 0, 3, 2, 80, + 5, 70, 0, 3, 2, 80, 6, 1, + 0, 10, 3, 2, 80, 6, 38, 10, + 0, 3, 2, 80, 6, 39, 10, 0, + 3, 2, 80, 6, 40, 10, 0, 3, + 2, 80, 6, 41, 10, 0, 3, 2, + 80, 6, 42, 10, 0, 3, 2, 80, + 6, 43, 10, 0, 3, 2, 80, 6, + 44, 10, 0, 3, 2, 80, 6, 45, + 10, 0, 3, 2, 80, 6, 46, 10, + 0, 3, 2, 80, 6, 47, 10, 0, + 3, 2, 80, 6, 48, 10, 0, 3, + 2, 80, 6, 49, 10, 0, 3, 2, + 80, 6, 50, 10, 0, 3, 2, 80, + 6, 51, 10, 0, 3, 2, 80, 6, + 52, 10, 0, 3, 2, 80, 6, 53, + 10, 0, 3, 2, 80, 6, 54, 10, + 0, 3, 2, 80, 6, 55, 10, 0, + 3, 2, 80, 6, 56, 10, 0, 3, + 2, 80, 6, 57, 10, 0, 3, 2, + 80, 6, 58, 10, 0, 3, 2, 80, + 6, 59, 10, 0, 3, 2, 80, 6, + 60, 10, 0, 3, 2, 80, 6, 61, + 10, 0, 3, 2, 80, 6, 62, 10, + 0, 3, 2, 80, 6, 63, 10, 0, + 3, 2, 80, 6, 64, 10, 0, 3, + 2, 80, 6, 65, 10, 0, 3, 2, + 80, 6, 66, 10, 0, 3, 2, 80, + 6, 67, 10, 0, 3, 2, 80, 6, + 68, 10, 0, 3, 2, 80, 6, 69, + 10, 0, 3, 2, 80, 6, 70, 10, + 0, 3, 2, 80 +}; + +static const short _demo_machine_parser_cmd_cond_offsets[] = { + 0, 0, 0, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 4, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 7, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 10, 11, + 12, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355 +}; + +static const char _demo_machine_parser_cmd_cond_lengths[] = { + 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1 +}; + +static const short _demo_machine_parser_cmd_cond_keys[] = { + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + -128, 127, -128, 127, -128, 127, -128, 127, + 0 +}; + +static const char _demo_machine_parser_cmd_cond_spaces[] = { + 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +static const short _demo_machine_parser_cmd_key_offsets[] = { + 0, 0, 1, 13, 23, 24, 28, 30, + 32, 34, 36, 37, 39, 43, 45, 47, + 49, 51, 53, 55, 57, 59, 61, 63, + 67, 69, 71, 73, 74, 76, 78, 80, + 82, 84, 86, 88, 90, 92, 94, 96, + 98, 100, 102, 104, 106, 108, 110, 112, + 114, 116, 118, 122, 124, 126, 128, 130, + 142, 144, 146, 148, 150, 152, 154, 156, + 158, 160, 162, 164, 166, 168, 170, 172, + 174, 176, 178, 180, 182, 184, 186, 188, + 190, 192, 194, 196, 198, 200, 202, 204, + 206, 208, 210, 212, 214, 216, 218, 222, + 224, 226, 228, 230, 232, 234, 236, 237, + 238, 240, 242, 244, 246, 248, 250, 252, + 254, 256, 262, 264, 266, 268, 270, 272, + 274, 276, 278, 280, 282, 284, 286, 290, + 292, 294, 296, 298, 302, 304, 306, 308, + 310, 312, 314, 316, 318, 320, 322, 324, + 328, 330, 334, 336, 338, 340, 342, 343, + 347, 349, 351, 353, 355, 361, 367, 369, + 371, 373, 375, 377, 379, 381, 383, 385, + 393, 395, 397, 399, 405, 407, 409, 411, + 413, 414, 416, 418, 420, 422, 424, 426, + 428, 430, 432, 433, 439, 441, 445, 447, + 449, 451, 453, 455, 457, 459, 461, 463, + 465, 467, 469, 470, 476, 478, 480, 482, + 484, 486, 488, 490, 492, 494, 496, 498, + 500, 501, 503, 505, 507, 509, 511, 515, + 517, 519, 520, 522, 524, 526, 528, 530, + 531, 536, 538, 540, 550, 552, 581, 581, + 610, 640, 644, 646, 648, 650, 652, 653, + 655, 659, 661, 663, 665, 667, 669, 697, + 729, 759, 761, 789, 819, 849, 851, 853, + 855, 857, 885, 889, 891, 893, 895, 896, + 898, 900, 902, 904, 906, 908, 910, 938, + 966, 968, 970, 972, 974, 976, 1004, 1006, + 1008, 1038, 1040, 1042, 1044, 1072, 1074, 1076, + 1104, 1106, 1108, 1110, 1138, 1168, 1198, 1202, + 1232, 1234, 1236, 1238, 1240, 1268, 1280, 1282, + 1284, 1286, 1288, 1290, 1292, 1320, 1350, 1352, + 1354, 1356, 1384, 1386, 1388, 1390, 1418, 1420, + 1448, 1450, 1452, 1480, 1482, 1510, 1512, 1514, + 1516, 1518, 1520, 1548, 1578, 1580, 1582, 1610, + 1612, 1640, 1642, 1644, 1672, 1674, 1676, 1704, + 1732, 1734, 1762, 1764, 1766, 1794, 1796, 1798, + 1826, 1828, 1830, 1858, 1860, 1862, 1864, 1892, + 1896, 1898, 1900, 1902, 1930, 1932, 1934, 1936, + 1938, 1966, 1996, 2024, 2056, 2086, 2114, 2144, + 2174, 2202, 2230, 2258, 2286, 2316, 2344, 2372, + 2400, 2430, 2460, 2490, 2518, 2546, 2576, 2604, + 2632, 2660, 2688, 2716, 2744, 2774, 2802, 2830, + 2858, 2886, 2914, 2942, 2970, 2998, 3026, 3054, + 3082, 3110, 3176, 3184, 3190, 3200, 3203, 3206, + 3216, 3227, 3232, 3237, 3242, 3247, 3256, 3267, + 3272, 3277, 3282, 3287, 3292, 3301, 3306, 3311, + 3316, 3321, 3326, 3335, 3344, 3349, 3354, 3363, + 3374, 3383, 3394, 3403, 3412, 3421, 3425, 3429, + 3457, 3473, 3477, 3489, 3505, 3533, 3565, 3585, + 3605, 3625, 3645, 3673, 3705, 3725, 3745, 3765, + 3785, 3805, 3833, 3853, 3873, 3893, 3913, 3933, + 3961, 3989, 4009, 4029, 4057, 4085, 4093, 4101, + 4109, 4117, 4141, 4169, 4177, 4185, 4193, 4201, + 4209, 4225, 4233, 4241, 4249, 4257, 4265, 4289, + 4313, 4321, 4329, 4353, 4417, 4427, 4437, 4473, + 4483, 4493, 4503, 4539, 4551, 4561, 4571, 4581, + 4591, 4627, 4639, 4649, 4659, 4669, 4705, 4715, + 4725, 4735, 4771, 4781, 4791, 4801, 4811, 4821, + 4857, 4869, 4879, 4891, 4927, 4937, 4947, 4957, + 4967, 4976, 4988, 4998, 5034, 5044, 5054, 5064, + 5100, 5114, 5128, 5138, 5148, 5158, 5168, 5178, + 5214, 5224, 5234, 5244, 5254, 5290, 5306, 5316, + 5352, 5362, 5398, 5408, 5444, 5458, 5494, 5504, + 5514, 5524, 5534, 5543, 5553, 5563, 5599, 5609, + 5619, 5629, 5665, 5675, 5685, 5721, 5731, 5741, + 5750, 5764, 5774, 5810, 5822, 5832, 5842, 5878, + 5888, 5924, 5934, 5944, 5980, 5990, 6026, 6064, + 6074, 6084, 6094, 6130, 6140, 6150, 6160, 6169, + 6183, 6193, 6229, 6239, 6249, 6259, 6295, 6305, + 6315, 6325, 6335, 6371, 6381, 6391, 6401, 6437, + 6473, 6483, 6492, 6528, 6538, 6548, 6558, 6568, + 6578, 6614, 6626, 6636, 6646, 6682, 6691, 6701, + 6711, 6721, 6731, 6741, 6777, 6843, 6877, 6911, + 6945, 6979, 7013, 7047, 7081, 7115, 7149, 7183, + 7217, 7251, 7285, 7319, 7353, 7387, 7421, 7455, + 7489, 7523, 7557, 7591, 7625, 7661, 7695, 7729, + 7763, 7797, 7831, 7865, 7899, 7933, 7967, 8001, + 8009, 8017, 8025, 8033, 8041, 8053, 8061, 8069, + 8077, 8085, 8097, 8105, 8113, 8119, 8127, 8135, + 8143, 8151, 8159, 8171, 8179, 8187, 8195, 8203, + 8211, 8219, 8227, 8235, 8243, 8251, 8259, 8267, + 8275, 8283, 8291, 8299, 8311, 8319, 8331, 8339, + 8345, 8353, 8361, 8369, 8377, 8383, 8395, 8403, + 8411, 8419, 8427, 8435, 8443, 8451, 8467, 8483, + 8491, 8499, 8507, 8515, 8523, 8531, 8567, 8575, + 8583, 8591, 8599, 8607, 8615, 8621, 8637, 8645, + 8653, 8661, 8669, 8677, 8685, 8693, 8701, 8709, + 8717, 8725, 8733, 8753, 8761, 8777, 8785, 8793, + 8801, 8809, 8815, 8823, 8831, 8839, 8847, 8855, + 8863, 8871, 8879, 8887, 8893, 8909, 8917, 8929, + 8937, 8945, 8953, 8961, 8969, 8977, 8985, 8993, + 8997 +}; + +static const short _demo_machine_parser_cmd_trans_keys[] = { + 37, 800, 805, 1056, 1061, 777, 781, 896, + 1032, 1033, 1037, 1038, 1151, 800, 1056, 777, + 781, 896, 1032, 1033, 1037, 1038, 1151, 43, + 79, 83, 111, 115, 78, 110, 70, 102, + 73, 105, 71, 103, 45, 83, 115, 69, + 84, 101, 116, 83, 115, 83, 115, 73, + 105, 79, 111, 78, 110, 84, 116, 78, + 110, 71, 103, 85, 117, 80, 112, 65, + 77, 97, 109, 82, 114, 71, 103, 69, + 101, 45, 77, 109, 69, 101, 83, 115, + 83, 115, 65, 97, 71, 103, 69, 101, + 83, 115, 83, 115, 65, 97, 71, 103, + 69, 101, 80, 112, 84, 116, 79, 111, + 78, 110, 83, 115, 85, 117, 66, 98, + 73, 105, 83, 115, 72, 104, 71, 83, + 103, 115, 83, 115, 84, 116, 69, 101, + 82, 114, 67, 76, 77, 78, 84, 85, + 99, 108, 109, 110, 116, 117, 69, 101, + 78, 110, 65, 97, 82, 114, 73, 105, + 79, 111, 68, 100, 69, 101, 79, 111, + 69, 101, 69, 101, 80, 112, 83, 115, + 79, 111, 80, 112, 66, 98, 67, 99, + 82, 114, 73, 105, 66, 98, 69, 101, + 77, 109, 69, 101, 78, 110, 73, 105, + 84, 116, 76, 108, 80, 112, 68, 100, + 76, 108, 69, 101, 77, 109, 70, 102, + 77, 109, 80, 112, 65, 97, 67, 99, + 75, 107, 83, 84, 115, 116, 68, 100, + 73, 105, 79, 111, 73, 105, 68, 100, + 69, 101, 79, 111, 45, 64, 84, 116, + 73, 105, 79, 111, 78, 110, 81, 113, + 85, 117, 69, 101, 83, 115, 84, 116, + 69, 83, 84, 101, 115, 116, 83, 115, + 83, 115, 73, 105, 79, 111, 78, 110, + 67, 99, 75, 107, 77, 109, 70, 102, + 65, 97, 80, 112, 83, 115, 72, 78, + 104, 110, 67, 99, 80, 112, 86, 118, + 52, 54, 86, 88, 118, 120, 69, 101, + 78, 110, 84, 116, 82, 114, 79, 111, + 77, 109, 69, 101, 65, 97, 68, 100, + 69, 101, 82, 114, 77, 80, 109, 112, + 80, 112, 73, 85, 105, 117, 79, 111, + 67, 99, 65, 97, 76, 108, 45, 73, + 80, 105, 112, 80, 112, 80, 112, 73, + 105, 68, 100, 65, 67, 87, 97, 99, + 119, 83, 84, 89, 115, 116, 121, 83, + 115, 87, 119, 79, 111, 82, 114, 68, + 100, 69, 101, 65, 97, 76, 108, 77, + 109, 69, 73, 77, 84, 101, 105, 109, + 116, 67, 99, 79, 111, 80, 112, 68, + 71, 76, 100, 103, 108, 67, 99, 79, + 111, 77, 109, 80, 112, 45, 73, 105, + 68, 100, 69, 101, 78, 110, 84, 116, + 83, 115, 67, 99, 85, 117, 78, 110, + 45, 73, 80, 85, 105, 112, 117, 80, + 112, 79, 87, 111, 119, 82, 114, 84, + 116, 68, 100, 83, 115, 82, 114, 72, + 104, 79, 111, 65, 97, 68, 100, 83, + 115, 67, 99, 70, 102, 45, 73, 80, + 84, 105, 112, 116, 80, 112, 79, 111, + 82, 114, 84, 116, 82, 114, 65, 97, + 78, 110, 83, 115, 79, 111, 82, 114, + 84, 116, 86, 118, 54, 80, 112, 73, + 105, 82, 114, 69, 101, 83, 115, 65, + 83, 97, 115, 77, 109, 69, 101, 45, + 78, 110, 65, 97, 80, 112, 84, 116, + 82, 114, 62, 35, 37, 43, 45, 62, + 896, 1151, 896, 1151, 288, 544, 265, 269, + 384, 520, 521, 525, 526, 639, 384, 639, + 43, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 118, 43, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 85, + 86, 97, 99, 100, 101, 102, 104, 108, + 109, 111, 112, 113, 114, 115, 117, 118, + 79, 83, 111, 115, 78, 110, 70, 102, + 73, 105, 71, 103, 45, 83, 115, 69, + 84, 101, 116, 83, 115, 83, 115, 73, + 105, 79, 111, 78, 110, 65, 67, 68, + 69, 70, 72, 76, 77, 79, 80, 81, + 82, 83, 86, 97, 99, 100, 101, 102, + 104, 108, 109, 111, 112, 113, 114, 115, + 118, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 84, 85, + 86, 97, 99, 100, 101, 102, 104, 108, + 109, 111, 112, 113, 114, 115, 116, 117, + 118, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 88, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 120, 84, + 116, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 118, 65, 67, 68, + 69, 70, 72, 73, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 105, 108, 109, 111, 112, 113, + 114, 115, 118, 65, 67, 68, 69, 70, + 72, 76, 77, 79, 80, 81, 82, 83, + 85, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 117, + 118, 78, 110, 71, 103, 85, 117, 80, + 112, 65, 67, 68, 69, 70, 72, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 118, 65, 77, 97, + 109, 82, 114, 71, 103, 69, 101, 45, + 77, 109, 69, 101, 83, 115, 83, 115, + 65, 97, 71, 103, 69, 101, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 83, 115, + 83, 115, 65, 97, 71, 103, 69, 101, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 80, 112, 84, 116, + 65, 67, 68, 69, 70, 72, 73, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 105, 108, 109, + 111, 112, 113, 114, 115, 118, 79, 111, + 78, 110, 83, 115, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 85, 117, 66, 98, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 73, 105, 83, 115, 72, 104, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 85, + 86, 97, 99, 100, 101, 102, 104, 108, + 109, 111, 112, 113, 114, 115, 117, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 117, 118, 71, 83, + 103, 115, 65, 67, 68, 69, 70, 72, + 73, 76, 77, 79, 80, 81, 82, 83, + 86, 97, 99, 100, 101, 102, 104, 105, + 108, 109, 111, 112, 113, 114, 115, 118, + 83, 115, 84, 116, 69, 101, 82, 114, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 67, 76, 77, 78, + 84, 85, 99, 108, 109, 110, 116, 117, + 69, 101, 78, 110, 65, 97, 82, 114, + 73, 105, 79, 111, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 73, 76, + 77, 79, 80, 81, 82, 83, 86, 97, + 99, 100, 101, 102, 104, 105, 108, 109, + 111, 112, 113, 114, 115, 118, 68, 100, + 69, 101, 79, 111, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 69, 101, 69, 101, 80, 112, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 83, 115, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 79, 111, 80, 112, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 66, 98, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 67, 99, + 82, 114, 73, 105, 66, 98, 69, 101, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 85, 86, 97, 99, 100, 101, 102, + 104, 108, 109, 111, 112, 113, 114, 115, + 117, 118, 77, 109, 69, 101, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 78, 110, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 73, 105, 84, 116, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 76, 108, 80, 112, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 68, 100, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 76, 108, 69, 101, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 77, 109, 70, 102, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 77, 109, 80, 112, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 97, 67, 99, 75, 107, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 83, 84, 115, 116, + 68, 100, 73, 105, 79, 111, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 73, 105, 68, 100, 69, 101, + 79, 111, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 85, 86, 97, 99, 100, + 101, 102, 104, 108, 109, 111, 112, 113, + 114, 115, 117, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 84, 85, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 116, 117, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 88, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 118, 120, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 73, 76, 77, 79, 80, 81, 82, 83, + 86, 97, 99, 100, 101, 102, 104, 105, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 117, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 73, 76, 77, 79, + 80, 81, 82, 83, 86, 97, 99, 100, + 101, 102, 104, 105, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 117, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 85, 86, 97, 99, 100, + 101, 102, 104, 108, 109, 111, 112, 113, + 114, 115, 117, 118, 65, 67, 68, 69, + 70, 72, 73, 76, 77, 79, 80, 81, + 82, 83, 86, 97, 99, 100, 101, 102, + 104, 105, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 73, 76, 77, 79, 80, 81, 82, 83, + 86, 97, 99, 100, 101, 102, 104, 105, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 86, 97, 99, + 100, 101, 102, 104, 108, 109, 111, 112, + 113, 114, 115, 118, 65, 67, 68, 69, + 70, 72, 76, 77, 79, 80, 81, 82, + 83, 86, 97, 99, 100, 101, 102, 104, + 108, 109, 111, 112, 113, 114, 115, 118, + 65, 67, 68, 69, 70, 72, 76, 77, + 79, 80, 81, 82, 83, 85, 86, 97, + 99, 100, 101, 102, 104, 108, 109, 111, + 112, 113, 114, 115, 117, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 65, 67, + 68, 69, 70, 72, 76, 77, 79, 80, + 81, 82, 83, 86, 97, 99, 100, 101, + 102, 104, 108, 109, 111, 112, 113, 114, + 115, 118, 65, 67, 68, 69, 70, 72, + 76, 77, 79, 80, 81, 82, 83, 86, + 97, 99, 100, 101, 102, 104, 108, 109, + 111, 112, 113, 114, 115, 118, 288, 301, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 557, 576, + 577, 579, 580, 581, 582, 584, 585, 588, + 591, 592, 594, 595, 596, 600, 609, 611, + 612, 613, 614, 616, 617, 620, 623, 624, + 626, 627, 628, 632, 128, 383, 384, 639, + 288, 320, 544, 576, 128, 383, 384, 639, + 288, 320, 544, 576, 384, 639, 32, 64, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 9, 13, 32, 9, 13, 32, 64, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 65, 67, 82, 83, 97, 99, 114, + 115, 9, 13, 32, 84, 116, 9, 13, + 32, 73, 105, 9, 13, 32, 79, 111, + 9, 13, 32, 78, 110, 9, 13, 32, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 65, 69, 82, 83, 97, 101, 114, + 115, 9, 13, 32, 81, 113, 9, 13, + 32, 85, 117, 9, 13, 32, 69, 101, + 9, 13, 32, 83, 115, 9, 13, 32, + 84, 116, 9, 13, 32, 69, 83, 84, + 101, 115, 116, 9, 13, 32, 83, 115, + 9, 13, 32, 83, 115, 9, 13, 32, + 73, 105, 9, 13, 32, 79, 111, 9, + 13, 32, 78, 110, 9, 13, 32, 65, + 82, 83, 97, 114, 115, 9, 13, 32, + 65, 82, 83, 97, 114, 115, 9, 13, + 32, 67, 99, 9, 13, 32, 75, 107, + 9, 13, 32, 65, 82, 83, 97, 114, + 115, 9, 13, 32, 65, 67, 82, 83, + 97, 99, 114, 115, 9, 13, 32, 65, + 82, 83, 97, 114, 115, 9, 13, 32, + 65, 69, 82, 83, 97, 101, 114, 115, + 9, 13, 32, 65, 82, 83, 97, 114, + 115, 9, 13, 32, 65, 82, 83, 97, + 114, 115, 9, 13, 32, 65, 82, 83, + 97, 114, 115, 9, 13, 320, 576, 384, + 639, 320, 576, 384, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 544, 576, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 32, 64, 9, 13, 288, 320, 544, + 576, 265, 269, 384, 520, 521, 525, 526, + 639, 288, 320, 544, 576, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 323, 338, 339, 353, 355, 370, 371, 544, + 576, 577, 579, 594, 595, 609, 611, 626, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 340, + 372, 544, 576, 596, 628, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 329, 361, 544, 576, 585, + 617, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 335, + 367, 544, 576, 591, 623, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 334, 366, 544, 576, 590, + 622, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 325, 338, 339, 353, + 357, 370, 371, 544, 576, 577, 581, 594, + 595, 609, 613, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 337, 369, 544, 576, 593, + 625, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 341, + 373, 544, 576, 597, 629, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 325, 357, 544, 576, 581, + 613, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 339, + 371, 544, 576, 595, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 340, 372, 544, 576, 596, + 628, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 325, + 339, 340, 357, 371, 372, 544, 576, 581, + 595, 596, 613, 627, 628, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 339, 371, 544, 576, 595, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 339, + 371, 544, 576, 595, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 329, 361, 544, 576, 585, + 617, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 335, + 367, 544, 576, 591, 623, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 334, 366, 544, 576, 590, + 622, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 323, + 355, 544, 576, 579, 611, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 331, 363, 544, 576, 587, + 619, 128, 264, 265, 269, 270, 383, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 128, 264, 265, + 269, 270, 383, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 323, 338, 339, 353, + 355, 370, 371, 544, 576, 577, 579, 594, + 595, 609, 611, 626, 627, 265, 269, 384, + 520, 521, 525, 526, 639, 320, 340, 372, + 576, 596, 628, 384, 639, 320, 329, 361, + 576, 585, 617, 384, 639, 320, 335, 367, + 576, 591, 623, 384, 639, 320, 334, 366, + 576, 590, 622, 384, 639, 288, 320, 321, + 338, 339, 353, 370, 371, 544, 576, 577, + 594, 595, 609, 626, 627, 265, 269, 384, + 520, 521, 525, 526, 639, 288, 320, 321, + 325, 338, 339, 353, 357, 370, 371, 544, + 576, 577, 581, 594, 595, 609, 613, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 320, 337, 369, 576, 593, 625, 384, + 639, 320, 341, 373, 576, 597, 629, 384, + 639, 320, 325, 357, 576, 581, 613, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 340, 372, 576, 596, 628, 384, + 639, 320, 325, 339, 340, 357, 371, 372, + 576, 581, 595, 596, 613, 627, 628, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 329, 361, 576, 585, 617, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 334, 366, 576, 590, 622, 384, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 331, 363, 576, 587, 619, 384, + 639, 288, 320, 321, 338, 339, 353, 370, + 371, 544, 576, 577, 594, 595, 609, 626, + 627, 265, 269, 384, 520, 521, 525, 526, + 639, 288, 301, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 557, 576, 577, 583, 588, 593, 600, + 609, 615, 620, 625, 632, 128, 383, 384, + 578, 579, 585, 586, 590, 591, 596, 597, + 610, 611, 617, 618, 622, 623, 628, 629, + 639, 288, 320, 333, 365, 544, 576, 128, + 383, 384, 639, 288, 320, 326, 358, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 353, 544, 576, 128, + 383, 384, 639, 288, 320, 336, 368, 544, + 576, 128, 383, 384, 639, 288, 320, 339, + 371, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 328, 334, 360, + 366, 544, 576, 128, 383, 384, 639, 288, + 320, 323, 355, 544, 576, 128, 383, 384, + 639, 288, 320, 336, 368, 544, 576, 128, + 383, 384, 639, 288, 320, 342, 374, 544, + 576, 128, 383, 384, 639, 288, 308, 310, + 320, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 342, 344, 374, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 325, 357, 544, 576, 128, 383, 384, + 639, 288, 320, 334, 366, 544, 576, 128, + 383, 384, 639, 288, 320, 340, 372, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 338, 370, 544, 576, 128, + 383, 384, 639, 288, 320, 335, 367, 544, + 576, 128, 383, 384, 639, 288, 320, 333, + 365, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 325, 357, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 353, 544, 576, 128, 383, 384, 639, 288, + 320, 324, 356, 544, 576, 128, 383, 384, + 639, 288, 320, 325, 357, 544, 576, 128, + 383, 384, 639, 288, 320, 338, 370, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 333, 336, 365, 368, 544, + 576, 128, 383, 384, 639, 288, 320, 336, + 368, 544, 576, 128, 383, 384, 639, 288, + 320, 329, 341, 361, 373, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 335, 367, 544, 576, 128, 383, 384, + 639, 288, 320, 323, 355, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 353, 544, + 576, 128, 383, 384, 639, 288, 320, 332, + 364, 544, 576, 128, 383, 384, 639, 288, + 301, 320, 544, 576, 128, 383, 384, 639, + 288, 320, 329, 336, 361, 368, 544, 576, + 128, 383, 384, 639, 288, 320, 336, 368, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 336, 368, 544, 576, + 128, 383, 384, 639, 288, 320, 329, 361, + 544, 576, 128, 383, 384, 639, 288, 320, + 324, 356, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 321, 323, + 343, 353, 355, 375, 544, 576, 128, 383, + 384, 639, 288, 320, 339, 340, 345, 371, + 372, 377, 544, 576, 128, 383, 384, 639, + 288, 320, 339, 371, 544, 576, 128, 383, + 384, 639, 288, 320, 343, 375, 544, 576, + 128, 383, 384, 639, 288, 320, 335, 367, + 544, 576, 128, 383, 384, 639, 288, 320, + 338, 370, 544, 576, 128, 383, 384, 639, + 288, 320, 324, 356, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 325, 357, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 353, 544, 576, 128, 383, + 384, 639, 288, 320, 332, 364, 544, 576, + 128, 383, 384, 639, 288, 320, 333, 365, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 325, 329, 333, 340, + 357, 361, 365, 372, 544, 576, 128, 383, + 384, 639, 288, 320, 323, 355, 544, 576, + 128, 383, 384, 639, 288, 320, 321, 323, + 324, 325, 326, 328, 329, 332, 335, 336, + 338, 339, 340, 344, 353, 355, 356, 357, + 358, 360, 361, 364, 367, 368, 370, 371, + 372, 376, 544, 576, 128, 383, 384, 639, + 288, 320, 335, 367, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 336, 368, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 324, 327, + 332, 356, 359, 364, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 323, 355, 544, 576, 128, 383, 384, 639, + 288, 320, 335, 367, 544, 576, 128, 383, + 384, 639, 288, 320, 333, 365, 544, 576, + 128, 383, 384, 639, 288, 320, 336, 368, + 544, 576, 128, 383, 384, 639, 288, 301, + 320, 544, 576, 128, 383, 384, 639, 288, + 320, 329, 361, 544, 576, 128, 383, 384, + 639, 288, 320, 324, 356, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 325, 357, 544, 576, 128, 383, 384, + 639, 288, 320, 334, 366, 544, 576, 128, + 383, 384, 639, 288, 320, 340, 372, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 339, 371, 544, 576, 128, + 383, 384, 639, 288, 320, 323, 355, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 341, 373, 544, 576, 128, + 383, 384, 639, 288, 320, 334, 366, 544, + 576, 128, 383, 384, 639, 288, 301, 320, + 544, 576, 128, 383, 384, 639, 288, 320, + 329, 336, 341, 361, 368, 373, 544, 576, + 128, 383, 384, 639, 288, 320, 336, 368, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 335, 343, 367, 375, + 544, 576, 128, 383, 384, 639, 288, 320, + 338, 370, 544, 576, 128, 383, 384, 639, + 288, 320, 340, 372, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 324, 356, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 339, 371, + 544, 576, 128, 383, 384, 639, 288, 320, + 338, 370, 544, 576, 128, 383, 384, 639, + 288, 320, 321, 323, 324, 325, 326, 328, + 329, 332, 335, 336, 338, 339, 340, 344, + 353, 355, 356, 357, 358, 360, 361, 364, + 367, 368, 370, 371, 372, 376, 544, 576, + 128, 383, 384, 639, 288, 320, 328, 360, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 588, 620, 128, 383, 384, 639, + 288, 320, 335, 367, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 353, 544, 576, + 128, 383, 384, 639, 288, 320, 324, 356, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 320, 339, 371, 544, 576, + 128, 383, 384, 639, 288, 320, 323, 355, + 544, 576, 128, 383, 384, 639, 288, 320, + 326, 358, 544, 576, 128, 383, 384, 639, + 288, 301, 320, 544, 576, 128, 383, 384, + 639, 288, 320, 329, 336, 340, 361, 368, + 372, 544, 576, 128, 383, 384, 639, 288, + 320, 336, 368, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 128, 383, 384, 639, 288, 320, 335, + 367, 544, 576, 128, 383, 384, 639, 288, + 320, 338, 370, 544, 576, 128, 383, 384, + 639, 288, 320, 340, 372, 544, 576, 128, + 383, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 128, 383, 384, 639, 288, + 320, 338, 370, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 353, 544, 576, 128, + 383, 384, 639, 288, 320, 334, 366, 544, + 576, 128, 383, 384, 639, 288, 320, 339, + 371, 544, 576, 128, 383, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 128, + 383, 384, 639, 288, 320, 335, 367, 544, + 576, 128, 383, 384, 639, 288, 320, 338, + 370, 544, 576, 128, 383, 384, 639, 288, + 320, 340, 372, 544, 576, 128, 383, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 320, 342, 374, 544, 576, 128, + 383, 384, 639, 288, 310, 320, 544, 576, + 128, 383, 384, 639, 288, 320, 321, 323, + 324, 325, 326, 328, 329, 332, 335, 336, + 338, 339, 340, 344, 353, 355, 356, 357, + 358, 360, 361, 364, 367, 368, 370, 371, + 372, 376, 544, 576, 128, 383, 384, 639, + 288, 320, 336, 368, 544, 576, 128, 383, + 384, 639, 288, 320, 329, 361, 544, 576, + 128, 383, 384, 639, 288, 320, 338, 370, + 544, 576, 128, 383, 384, 639, 288, 320, + 325, 357, 544, 576, 128, 383, 384, 639, + 288, 320, 339, 371, 544, 576, 128, 383, + 384, 639, 288, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 339, 353, 371, 544, 576, 128, 383, + 384, 639, 288, 320, 333, 365, 544, 576, + 128, 383, 384, 639, 288, 320, 325, 357, + 544, 576, 128, 383, 384, 639, 288, 320, + 321, 323, 324, 325, 326, 328, 329, 332, + 335, 336, 338, 339, 340, 344, 353, 355, + 356, 357, 358, 360, 361, 364, 367, 368, + 370, 371, 372, 376, 544, 576, 128, 383, + 384, 639, 288, 301, 320, 544, 576, 128, + 383, 384, 639, 288, 320, 334, 366, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 353, 544, 576, 128, 383, 384, 639, 288, + 320, 336, 368, 544, 576, 128, 383, 384, + 639, 288, 320, 340, 372, 544, 576, 128, + 383, 384, 639, 288, 320, 338, 370, 544, + 576, 128, 383, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 128, 383, 384, + 639, 288, 301, 320, 321, 323, 324, 325, + 326, 328, 329, 332, 335, 336, 338, 339, + 340, 344, 353, 355, 356, 357, 358, 360, + 361, 364, 367, 368, 370, 371, 372, 376, + 544, 557, 576, 577, 579, 580, 581, 582, + 584, 585, 588, 591, 592, 594, 595, 596, + 600, 609, 611, 612, 613, 614, 616, 617, + 620, 623, 624, 626, 627, 628, 632, 128, + 383, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 588, 620, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 288, 320, 321, 323, 324, 325, 326, + 328, 329, 332, 335, 336, 338, 339, 340, + 344, 353, 355, 356, 357, 358, 360, 361, + 364, 367, 368, 370, 371, 372, 376, 544, + 576, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 384, 639, 288, 320, 321, + 323, 324, 325, 326, 328, 329, 332, 335, + 336, 338, 339, 340, 344, 353, 355, 356, + 357, 358, 360, 361, 364, 367, 368, 370, + 371, 372, 376, 544, 576, 384, 639, 288, + 320, 321, 323, 324, 325, 326, 328, 329, + 332, 335, 336, 338, 339, 340, 344, 353, + 355, 356, 357, 358, 360, 361, 364, 367, + 368, 370, 371, 372, 376, 544, 576, 384, + 639, 320, 333, 365, 576, 589, 621, 384, + 639, 320, 326, 358, 576, 582, 614, 384, + 639, 320, 321, 353, 576, 577, 609, 384, + 639, 320, 336, 368, 576, 592, 624, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 328, 334, 360, 366, 576, 584, + 590, 616, 622, 384, 639, 320, 323, 355, + 576, 579, 611, 384, 639, 320, 336, 368, + 576, 592, 624, 384, 639, 320, 342, 374, + 576, 598, 630, 384, 639, 308, 310, 320, + 564, 566, 576, 384, 639, 320, 321, 339, + 353, 371, 576, 577, 595, 609, 627, 384, + 639, 320, 333, 365, 576, 589, 621, 384, + 639, 320, 325, 357, 576, 581, 613, 384, + 639, 301, 320, 557, 576, 384, 639, 320, + 334, 366, 576, 590, 622, 384, 639, 320, + 321, 353, 576, 577, 609, 384, 639, 320, + 336, 368, 576, 592, 624, 384, 639, 320, + 340, 372, 576, 596, 628, 384, 639, 320, + 338, 370, 576, 594, 626, 384, 639, 320, + 342, 344, 374, 376, 576, 598, 600, 630, + 632, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 334, 366, 576, 590, + 622, 384, 639, 320, 340, 372, 576, 596, + 628, 384, 639, 320, 336, 368, 576, 592, + 624, 384, 639, 320, 329, 361, 576, 585, + 617, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 339, 371, 576, 595, + 627, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 335, 367, 576, 591, + 623, 384, 639, 320, 333, 365, 576, 589, + 621, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 321, 353, 576, 577, + 609, 384, 639, 320, 324, 356, 576, 580, + 612, 384, 639, 320, 325, 357, 576, 581, + 613, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 333, 336, 365, 368, + 576, 589, 592, 621, 624, 384, 639, 320, + 336, 368, 576, 592, 624, 384, 639, 320, + 329, 341, 361, 373, 576, 585, 597, 617, + 629, 384, 639, 320, 342, 374, 576, 598, + 630, 384, 639, 310, 320, 566, 576, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 321, 353, 576, 577, 609, 384, + 639, 320, 332, 364, 576, 588, 620, 384, + 639, 301, 320, 557, 576, 384, 639, 320, + 329, 336, 361, 368, 576, 585, 592, 617, + 624, 384, 639, 320, 336, 368, 576, 592, + 624, 384, 639, 320, 335, 367, 576, 591, + 623, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 340, 372, 576, 596, + 628, 384, 639, 320, 336, 368, 576, 592, + 624, 384, 639, 320, 329, 361, 576, 585, + 617, 384, 639, 320, 324, 356, 576, 580, + 612, 384, 639, 320, 321, 323, 343, 353, + 355, 375, 576, 577, 579, 599, 609, 611, + 631, 384, 639, 320, 339, 340, 345, 371, + 372, 377, 576, 595, 596, 601, 627, 628, + 633, 384, 639, 320, 339, 371, 576, 595, + 627, 384, 639, 320, 343, 375, 576, 599, + 631, 384, 639, 320, 335, 367, 576, 591, + 623, 384, 639, 320, 338, 370, 576, 594, + 626, 384, 639, 320, 324, 356, 576, 580, + 612, 384, 639, 320, 328, 360, 576, 584, + 616, 384, 639, 288, 320, 321, 323, 324, + 325, 326, 328, 329, 332, 335, 336, 338, + 339, 340, 344, 353, 355, 356, 357, 358, + 360, 361, 364, 367, 368, 370, 371, 372, + 376, 544, 576, 588, 620, 384, 639, 320, + 335, 367, 576, 591, 623, 384, 639, 320, + 321, 353, 576, 577, 609, 384, 639, 320, + 324, 356, 576, 580, 612, 384, 639, 320, + 339, 371, 576, 595, 627, 384, 639, 320, + 323, 355, 576, 579, 611, 384, 639, 320, + 326, 358, 576, 582, 614, 384, 639, 301, + 320, 557, 576, 384, 639, 320, 329, 336, + 340, 361, 368, 372, 576, 585, 592, 596, + 617, 624, 628, 384, 639, 320, 336, 368, + 576, 592, 624, 384, 639, 320, 335, 367, + 576, 591, 623, 384, 639, 320, 338, 370, + 576, 594, 626, 384, 639, 320, 340, 372, + 576, 596, 628, 384, 639, 320, 338, 370, + 576, 594, 626, 384, 639, 320, 321, 353, + 576, 577, 609, 384, 639, 320, 334, 366, + 576, 590, 622, 384, 639, 320, 339, 371, + 576, 595, 627, 384, 639, 320, 325, 357, + 576, 581, 613, 384, 639, 320, 321, 353, + 576, 577, 609, 384, 639, 320, 332, 364, + 576, 588, 620, 384, 639, 320, 333, 365, + 576, 589, 621, 384, 639, 320, 325, 329, + 333, 340, 357, 361, 365, 372, 576, 581, + 585, 589, 596, 613, 617, 621, 628, 384, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 324, 327, 332, 356, 359, 364, + 576, 580, 583, 588, 612, 615, 620, 384, + 639, 320, 323, 355, 576, 579, 611, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 333, 365, 576, 589, 621, 384, + 639, 320, 336, 368, 576, 592, 624, 384, + 639, 301, 320, 557, 576, 384, 639, 320, + 329, 361, 576, 585, 617, 384, 639, 320, + 324, 356, 576, 580, 612, 384, 639, 320, + 325, 357, 576, 581, 613, 384, 639, 320, + 334, 366, 576, 590, 622, 384, 639, 320, + 340, 372, 576, 596, 628, 384, 639, 320, + 339, 371, 576, 595, 627, 384, 639, 320, + 323, 355, 576, 579, 611, 384, 639, 320, + 341, 373, 576, 597, 629, 384, 639, 320, + 334, 366, 576, 590, 622, 384, 639, 301, + 320, 557, 576, 384, 639, 320, 329, 336, + 341, 361, 368, 373, 576, 585, 592, 597, + 617, 624, 629, 384, 639, 320, 336, 368, + 576, 592, 624, 384, 639, 320, 335, 343, + 367, 375, 576, 591, 599, 623, 631, 384, + 639, 320, 338, 370, 576, 594, 626, 384, + 639, 320, 340, 372, 576, 596, 628, 384, + 639, 320, 324, 356, 576, 580, 612, 384, + 639, 320, 339, 371, 576, 595, 627, 384, + 639, 320, 338, 370, 576, 594, 626, 384, + 639, 320, 335, 367, 576, 591, 623, 384, + 639, 320, 336, 368, 576, 592, 624, 384, + 639, 296, 297, 318, 552, 553, 574, 384, + 639, 297, 553, 384, 639, 297, 553, 384, + 639, 0 +}; + +static const char _demo_machine_parser_cmd_single_lengths[] = { + 0, 1, 4, 2, 1, 4, 2, 2, + 2, 2, 1, 2, 4, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 4, + 2, 2, 2, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 4, 2, 2, 2, 2, 12, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 6, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 4, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 4, + 2, 4, 2, 2, 2, 2, 1, 4, + 2, 2, 2, 2, 6, 6, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 8, + 2, 2, 2, 6, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 6, 2, 4, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 6, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 2, 2, 4, 2, + 2, 1, 2, 2, 2, 2, 2, 1, + 5, 0, 0, 2, 0, 29, 0, 29, + 30, 4, 2, 2, 2, 2, 1, 2, + 4, 2, 2, 2, 2, 2, 28, 32, + 30, 2, 28, 30, 30, 2, 2, 2, + 2, 28, 4, 2, 2, 2, 1, 2, + 2, 2, 2, 2, 2, 2, 28, 28, + 2, 2, 2, 2, 2, 28, 2, 2, + 30, 2, 2, 2, 28, 2, 2, 28, + 2, 2, 2, 28, 30, 30, 4, 30, + 2, 2, 2, 2, 28, 12, 2, 2, + 2, 2, 2, 2, 28, 30, 2, 2, + 2, 28, 2, 2, 2, 28, 2, 28, + 2, 2, 28, 2, 28, 2, 2, 2, + 2, 2, 28, 30, 2, 2, 28, 2, + 28, 2, 2, 28, 2, 2, 28, 28, + 2, 28, 2, 2, 28, 2, 2, 28, + 2, 2, 28, 2, 2, 2, 28, 4, + 2, 2, 2, 28, 2, 2, 2, 2, + 28, 30, 28, 32, 30, 28, 30, 30, + 28, 28, 28, 28, 30, 28, 28, 28, + 30, 30, 30, 28, 28, 30, 28, 28, + 28, 28, 28, 28, 30, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 62, 4, 4, 8, 1, 1, 8, + 9, 3, 3, 3, 3, 7, 9, 3, + 3, 3, 3, 3, 7, 3, 3, 3, + 3, 3, 7, 7, 3, 3, 7, 9, + 7, 9, 7, 7, 7, 2, 2, 16, + 4, 2, 4, 4, 16, 20, 8, 8, + 8, 8, 16, 20, 8, 8, 8, 8, + 8, 16, 8, 8, 8, 8, 8, 16, + 16, 8, 8, 16, 20, 6, 6, 6, + 6, 16, 20, 6, 6, 6, 6, 6, + 14, 6, 6, 6, 6, 6, 16, 16, + 6, 6, 16, 44, 6, 6, 32, 6, + 6, 6, 32, 8, 6, 6, 6, 6, + 32, 8, 6, 6, 6, 32, 6, 6, + 6, 32, 6, 6, 6, 6, 6, 32, + 8, 6, 8, 32, 6, 6, 6, 6, + 5, 8, 6, 32, 6, 6, 6, 32, + 10, 10, 6, 6, 6, 6, 6, 32, + 6, 6, 6, 6, 32, 12, 6, 32, + 6, 32, 6, 32, 10, 32, 6, 6, + 6, 6, 5, 6, 6, 32, 6, 6, + 6, 32, 6, 6, 32, 6, 6, 5, + 10, 6, 32, 8, 6, 6, 32, 6, + 32, 6, 6, 32, 6, 32, 34, 6, + 6, 6, 32, 6, 6, 6, 5, 10, + 6, 32, 6, 6, 6, 32, 6, 6, + 6, 6, 32, 6, 6, 6, 32, 32, + 6, 5, 32, 6, 6, 6, 6, 6, + 32, 8, 6, 6, 32, 5, 6, 6, + 6, 6, 6, 32, 62, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 34, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 6, + 6, 6, 6, 6, 10, 6, 6, 6, + 6, 10, 6, 6, 4, 6, 6, 6, + 6, 6, 10, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 10, 6, 10, 6, 4, + 6, 6, 6, 6, 4, 10, 6, 6, + 6, 6, 6, 6, 6, 14, 14, 6, + 6, 6, 6, 6, 6, 34, 6, 6, + 6, 6, 6, 6, 4, 14, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 18, 6, 14, 6, 6, 6, + 6, 4, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 4, 14, 6, 10, 6, + 6, 6, 6, 6, 6, 6, 6, 2, + 2 +}; + +static const char _demo_machine_parser_cmd_range_lengths[] = { + 0, 0, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 4, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 6, + 6, 1, 4, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 4, 1, 1, 1, + 1, 4, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 4, 4, + 1, 1, 4, 10, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1 +}; + +static const short _demo_machine_parser_cmd_index_offsets[] = { + 0, 0, 2, 11, 18, 20, 25, 28, + 31, 34, 37, 39, 42, 47, 50, 53, + 56, 59, 62, 65, 68, 71, 74, 77, + 82, 85, 88, 91, 93, 96, 99, 102, + 105, 108, 111, 114, 117, 120, 123, 126, + 129, 132, 135, 138, 141, 144, 147, 150, + 153, 156, 159, 164, 167, 170, 173, 176, + 189, 192, 195, 198, 201, 204, 207, 210, + 213, 216, 219, 222, 225, 228, 231, 234, + 237, 240, 243, 246, 249, 252, 255, 258, + 261, 264, 267, 270, 273, 276, 279, 282, + 285, 288, 291, 294, 297, 300, 303, 308, + 311, 314, 317, 320, 323, 326, 329, 331, + 333, 336, 339, 342, 345, 348, 351, 354, + 357, 360, 367, 370, 373, 376, 379, 382, + 385, 388, 391, 394, 397, 400, 403, 408, + 411, 414, 417, 420, 425, 428, 431, 434, + 437, 440, 443, 446, 449, 452, 455, 458, + 463, 466, 471, 474, 477, 480, 483, 485, + 490, 493, 496, 499, 502, 509, 516, 519, + 522, 525, 528, 531, 534, 537, 540, 543, + 552, 555, 558, 561, 568, 571, 574, 577, + 580, 582, 585, 588, 591, 594, 597, 600, + 603, 606, 609, 611, 618, 621, 626, 629, + 632, 635, 638, 641, 644, 647, 650, 653, + 656, 659, 662, 664, 671, 674, 677, 680, + 683, 686, 689, 692, 695, 698, 701, 704, + 707, 709, 712, 715, 718, 721, 724, 729, + 732, 735, 737, 740, 743, 746, 749, 752, + 754, 760, 762, 764, 771, 773, 803, 804, + 834, 865, 870, 873, 876, 879, 882, 884, + 887, 892, 895, 898, 901, 904, 907, 936, + 969, 1000, 1003, 1032, 1063, 1094, 1097, 1100, + 1103, 1106, 1135, 1140, 1143, 1146, 1149, 1151, + 1154, 1157, 1160, 1163, 1166, 1169, 1172, 1201, + 1230, 1233, 1236, 1239, 1242, 1245, 1274, 1277, + 1280, 1311, 1314, 1317, 1320, 1349, 1352, 1355, + 1384, 1387, 1390, 1393, 1422, 1453, 1484, 1489, + 1520, 1523, 1526, 1529, 1532, 1561, 1574, 1577, + 1580, 1583, 1586, 1589, 1592, 1621, 1652, 1655, + 1658, 1661, 1690, 1693, 1696, 1699, 1728, 1731, + 1760, 1763, 1766, 1795, 1798, 1827, 1830, 1833, + 1836, 1839, 1842, 1871, 1902, 1905, 1908, 1937, + 1940, 1969, 1972, 1975, 2004, 2007, 2010, 2039, + 2068, 2071, 2100, 2103, 2106, 2135, 2138, 2141, + 2170, 2173, 2176, 2205, 2208, 2211, 2214, 2243, + 2248, 2251, 2254, 2257, 2286, 2289, 2292, 2295, + 2298, 2327, 2358, 2387, 2420, 2451, 2480, 2511, + 2542, 2571, 2600, 2629, 2658, 2689, 2718, 2747, + 2776, 2807, 2838, 2869, 2898, 2927, 2958, 2987, + 3016, 3045, 3074, 3103, 3132, 3163, 3192, 3221, + 3250, 3279, 3308, 3337, 3366, 3395, 3424, 3453, + 3482, 3511, 3576, 3583, 3589, 3599, 3602, 3605, + 3615, 3626, 3631, 3636, 3641, 3646, 3655, 3666, + 3671, 3676, 3681, 3686, 3691, 3700, 3705, 3710, + 3715, 3720, 3725, 3734, 3743, 3748, 3753, 3762, + 3773, 3782, 3793, 3802, 3811, 3820, 3824, 3828, + 3851, 3862, 3866, 3875, 3886, 3909, 3936, 3951, + 3966, 3981, 3996, 4019, 4046, 4061, 4076, 4091, + 4106, 4121, 4144, 4159, 4174, 4189, 4204, 4219, + 4242, 4265, 4280, 4295, 4318, 4343, 4351, 4359, + 4367, 4375, 4396, 4421, 4429, 4437, 4445, 4453, + 4461, 4477, 4485, 4493, 4501, 4509, 4517, 4538, + 4559, 4567, 4575, 4596, 4651, 4660, 4669, 4704, + 4713, 4722, 4731, 4766, 4777, 4786, 4795, 4804, + 4813, 4848, 4859, 4868, 4877, 4886, 4921, 4930, + 4939, 4948, 4983, 4992, 5001, 5010, 5019, 5028, + 5063, 5074, 5083, 5094, 5129, 5138, 5147, 5156, + 5165, 5173, 5184, 5193, 5228, 5237, 5246, 5255, + 5290, 5303, 5316, 5325, 5334, 5343, 5352, 5361, + 5396, 5405, 5414, 5423, 5432, 5467, 5482, 5491, + 5526, 5535, 5570, 5579, 5614, 5627, 5662, 5671, + 5680, 5689, 5698, 5706, 5715, 5724, 5759, 5768, + 5777, 5786, 5821, 5830, 5839, 5874, 5883, 5892, + 5900, 5913, 5922, 5957, 5968, 5977, 5986, 6021, + 6030, 6065, 6074, 6083, 6118, 6127, 6162, 6199, + 6208, 6217, 6226, 6261, 6270, 6279, 6288, 6296, + 6309, 6318, 6353, 6362, 6371, 6380, 6415, 6424, + 6433, 6442, 6451, 6486, 6495, 6504, 6513, 6548, + 6583, 6592, 6600, 6635, 6644, 6653, 6662, 6671, + 6680, 6715, 6726, 6735, 6744, 6779, 6787, 6796, + 6805, 6814, 6823, 6832, 6867, 6932, 6966, 7000, + 7034, 7068, 7102, 7136, 7170, 7204, 7238, 7272, + 7306, 7340, 7374, 7408, 7442, 7476, 7510, 7544, + 7578, 7612, 7646, 7680, 7714, 7750, 7784, 7818, + 7852, 7886, 7920, 7954, 7988, 8022, 8056, 8090, + 8098, 8106, 8114, 8122, 8130, 8142, 8150, 8158, + 8166, 8174, 8186, 8194, 8202, 8208, 8216, 8224, + 8232, 8240, 8248, 8260, 8268, 8276, 8284, 8292, + 8300, 8308, 8316, 8324, 8332, 8340, 8348, 8356, + 8364, 8372, 8380, 8388, 8400, 8408, 8420, 8428, + 8434, 8442, 8450, 8458, 8466, 8472, 8484, 8492, + 8500, 8508, 8516, 8524, 8532, 8540, 8556, 8572, + 8580, 8588, 8596, 8604, 8612, 8620, 8656, 8664, + 8672, 8680, 8688, 8696, 8704, 8710, 8726, 8734, + 8742, 8750, 8758, 8766, 8774, 8782, 8790, 8798, + 8806, 8814, 8822, 8842, 8850, 8866, 8874, 8882, + 8890, 8898, 8904, 8912, 8920, 8928, 8936, 8944, + 8952, 8960, 8968, 8976, 8982, 8998, 9006, 9018, + 9026, 9034, 9042, 9050, 9058, 9066, 9074, 9082, + 9086 +}; + +static const short _demo_machine_parser_cmd_indicies[] = { + 0, 1, 2, 0, 2, 4, 2, 3, + 2, 3, 1, 5, 5, 5, 6, 5, + 6, 1, 7, 1, 9, 10, 9, 10, + 8, 11, 11, 8, 12, 12, 8, 13, + 13, 8, 14, 14, 8, 15, 8, 16, + 16, 8, 17, 18, 17, 18, 8, 19, + 19, 8, 20, 20, 8, 21, 21, 8, + 22, 22, 8, 23, 23, 8, 24, 24, + 8, 25, 25, 8, 26, 26, 8, 27, + 27, 8, 28, 28, 8, 29, 30, 29, + 30, 8, 31, 31, 8, 32, 32, 8, + 33, 33, 8, 34, 8, 35, 35, 8, + 36, 36, 8, 37, 37, 8, 38, 38, + 8, 39, 39, 8, 40, 40, 8, 30, + 30, 8, 41, 41, 8, 42, 42, 8, + 43, 43, 8, 44, 44, 8, 45, 45, + 8, 46, 46, 8, 47, 47, 8, 48, + 48, 8, 49, 49, 8, 50, 50, 8, + 51, 51, 8, 52, 52, 8, 53, 53, + 8, 54, 54, 8, 55, 55, 8, 56, + 57, 56, 57, 8, 58, 58, 8, 59, + 59, 8, 60, 60, 8, 61, 61, 8, + 62, 63, 64, 65, 66, 67, 62, 63, + 64, 65, 66, 67, 8, 68, 68, 8, + 69, 69, 8, 70, 70, 8, 71, 71, + 8, 72, 72, 8, 65, 65, 8, 73, + 73, 8, 74, 74, 8, 75, 75, 8, + 76, 76, 8, 77, 77, 8, 78, 78, + 8, 79, 79, 8, 80, 80, 8, 81, + 81, 8, 82, 82, 8, 83, 83, 8, + 84, 84, 8, 85, 85, 8, 86, 86, + 8, 87, 87, 8, 88, 88, 8, 89, + 89, 8, 90, 90, 8, 91, 91, 8, + 92, 92, 8, 93, 93, 8, 94, 94, + 8, 95, 95, 8, 96, 96, 8, 97, + 97, 8, 98, 98, 8, 99, 99, 8, + 100, 100, 8, 101, 101, 8, 102, 102, + 8, 103, 103, 8, 104, 104, 8, 23, + 104, 23, 104, 8, 105, 105, 8, 106, + 106, 8, 107, 107, 8, 108, 108, 8, + 109, 109, 8, 110, 110, 8, 111, 111, + 8, 112, 1, 114, 113, 115, 115, 113, + 116, 116, 113, 117, 117, 113, 118, 118, + 113, 119, 119, 113, 120, 120, 113, 121, + 121, 113, 122, 122, 113, 118, 118, 113, + 123, 124, 125, 123, 124, 125, 113, 126, + 126, 113, 127, 127, 113, 128, 128, 113, + 129, 129, 113, 124, 124, 113, 130, 130, + 113, 131, 131, 113, 132, 132, 113, 133, + 133, 113, 134, 134, 113, 135, 135, 113, + 136, 136, 113, 137, 138, 137, 138, 113, + 139, 139, 113, 140, 140, 113, 141, 141, + 113, 142, 143, 113, 144, 145, 144, 145, + 113, 146, 146, 113, 147, 147, 113, 148, + 148, 113, 149, 149, 113, 150, 150, 113, + 151, 151, 113, 152, 152, 113, 153, 153, + 113, 154, 154, 113, 155, 155, 113, 156, + 156, 113, 157, 158, 157, 158, 113, 159, + 159, 113, 160, 161, 160, 161, 113, 162, + 162, 113, 163, 163, 113, 164, 164, 113, + 165, 165, 113, 166, 113, 167, 168, 167, + 168, 113, 169, 169, 113, 170, 170, 113, + 171, 171, 113, 172, 172, 113, 173, 174, + 175, 173, 174, 175, 113, 176, 177, 178, + 176, 177, 178, 113, 179, 179, 113, 180, + 180, 113, 181, 181, 113, 175, 175, 113, + 182, 182, 113, 183, 183, 113, 184, 184, + 113, 185, 185, 113, 186, 186, 113, 187, + 188, 189, 190, 187, 188, 189, 190, 113, + 191, 191, 113, 192, 192, 113, 193, 193, + 113, 194, 195, 196, 194, 195, 196, 113, + 197, 197, 113, 198, 198, 113, 199, 199, + 113, 200, 200, 113, 201, 113, 202, 202, + 113, 203, 203, 113, 204, 204, 113, 205, + 205, 113, 206, 206, 113, 207, 207, 113, + 208, 208, 113, 209, 209, 113, 210, 210, + 113, 211, 113, 212, 213, 214, 212, 213, + 214, 113, 215, 215, 113, 216, 217, 216, + 217, 113, 218, 218, 113, 219, 219, 113, + 220, 220, 113, 221, 221, 113, 222, 222, + 113, 223, 223, 113, 224, 224, 113, 225, + 225, 113, 226, 226, 113, 227, 227, 113, + 228, 228, 113, 229, 229, 113, 230, 113, + 231, 232, 233, 231, 232, 233, 113, 234, + 234, 113, 235, 235, 113, 236, 236, 113, + 237, 237, 113, 238, 238, 113, 239, 239, + 113, 240, 240, 113, 241, 241, 113, 242, + 242, 113, 243, 243, 113, 244, 244, 113, + 245, 245, 113, 246, 113, 247, 247, 113, + 248, 248, 113, 249, 249, 113, 250, 250, + 113, 193, 193, 113, 251, 252, 251, 252, + 113, 253, 253, 113, 254, 254, 113, 255, + 113, 256, 256, 113, 257, 257, 113, 258, + 258, 113, 259, 259, 113, 260, 260, 113, + 261, 1, 263, 264, 265, 266, 267, 262, + 269, 268, 271, 270, 273, 273, 273, 274, + 273, 274, 272, 276, 275, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 278, 295, 279, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, + 309, 278, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, + 325, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, + 295, 326, 327, 326, 327, 295, 328, 328, + 295, 329, 329, 295, 330, 330, 295, 331, + 331, 295, 332, 295, 333, 333, 295, 334, + 335, 334, 335, 295, 336, 336, 295, 337, + 337, 295, 338, 338, 295, 339, 339, 295, + 340, 340, 295, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 295, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 295, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, + 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 295, + 389, 389, 295, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 404, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 295, + 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 406, + 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 295, 422, + 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 295, 437, 437, + 295, 438, 438, 295, 439, 439, 295, 435, + 435, 295, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, + 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 295, 455, + 456, 455, 456, 295, 457, 457, 295, 458, + 458, 295, 459, 459, 295, 460, 295, 461, + 461, 295, 462, 462, 295, 463, 463, 295, + 464, 464, 295, 465, 465, 295, 466, 466, + 295, 456, 456, 295, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, + 295, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 483, + 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 295, 497, 497, + 295, 498, 498, 295, 499, 499, 295, 500, + 500, 295, 501, 501, 295, 483, 484, 485, + 502, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 483, 484, 485, 502, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 295, 503, 503, 295, 504, 504, 295, + 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 506, + 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 295, 521, + 521, 295, 522, 522, 295, 523, 523, 295, + 506, 507, 508, 509, 510, 511, 513, 514, + 515, 516, 517, 518, 519, 520, 506, 507, + 508, 509, 510, 511, 513, 514, 515, 516, + 517, 518, 519, 520, 295, 524, 524, 295, + 525, 525, 295, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, + 540, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 536, 537, 538, 539, 540, 295, + 541, 541, 295, 542, 542, 295, 543, 543, + 295, 527, 528, 529, 530, 531, 532, 544, + 534, 535, 536, 537, 538, 539, 540, 527, + 528, 529, 530, 531, 532, 544, 534, 535, + 536, 537, 538, 539, 540, 295, 374, 545, + 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 388, 387, 374, 545, 376, + 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 388, 387, 295, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 295, 562, 563, 562, 563, + 295, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, + 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 295, + 580, 580, 295, 581, 581, 295, 582, 582, + 295, 583, 583, 295, 565, 566, 567, 568, + 569, 570, 572, 573, 574, 575, 576, 577, + 578, 579, 565, 566, 567, 568, 569, 570, + 572, 573, 574, 575, 576, 577, 578, 579, + 295, 584, 585, 586, 587, 588, 589, 584, + 585, 586, 587, 588, 589, 295, 590, 590, + 295, 591, 591, 295, 592, 592, 295, 593, + 593, 295, 594, 594, 295, 587, 587, 295, + 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 295, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 295, 626, 626, 295, 627, + 627, 295, 628, 628, 295, 611, 612, 613, + 614, 615, 616, 618, 619, 620, 621, 622, + 623, 624, 625, 611, 612, 613, 614, 615, + 616, 618, 619, 620, 621, 622, 623, 624, + 625, 295, 629, 629, 295, 630, 630, 295, + 631, 631, 295, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, + 646, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 295, + 647, 647, 295, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, + 662, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 295, + 663, 663, 295, 664, 664, 295, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 295, 680, 680, 295, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 295, 696, 696, 295, 697, 697, + 295, 698, 698, 295, 699, 699, 295, 700, + 700, 295, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 701, 695, + 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 701, 695, 295, 703, + 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 295, 718, 718, + 295, 719, 719, 295, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, + 715, 717, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 717, + 295, 720, 720, 295, 547, 548, 549, 721, + 551, 552, 553, 554, 555, 556, 557, 558, + 559, 561, 547, 548, 549, 721, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 561, + 295, 722, 722, 295, 723, 723, 295, 374, + 545, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 374, 545, 376, + 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 295, 724, 724, 295, 725, + 725, 295, 726, 423, 424, 727, 426, 427, + 428, 429, 728, 431, 432, 433, 434, 436, + 726, 423, 424, 727, 426, 427, 428, 429, + 728, 431, 432, 433, 434, 436, 295, 730, + 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 295, 744, 744, 295, 730, + 731, 732, 733, 734, 735, 745, 737, 738, + 739, 740, 741, 742, 743, 730, 731, 732, + 733, 734, 735, 745, 737, 738, 739, 740, + 741, 742, 743, 295, 746, 746, 295, 747, + 747, 295, 406, 407, 408, 409, 410, 411, + 413, 414, 415, 416, 417, 418, 419, 420, + 406, 407, 408, 409, 410, 411, 413, 414, + 415, 416, 417, 418, 419, 420, 295, 748, + 748, 295, 749, 749, 295, 751, 752, 753, + 754, 755, 756, 757, 758, 759, 760, 761, + 762, 763, 764, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 763, + 764, 295, 765, 765, 295, 766, 766, 295, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 372, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 372, 295, 767, 767, 295, + 768, 768, 295, 769, 769, 295, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, + 781, 782, 783, 784, 771, 772, 773, 774, + 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 295, 340, 769, 340, 769, 295, + 785, 785, 295, 786, 786, 295, 787, 787, + 295, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 788, 311, + 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 788, 295, 789, 789, + 295, 790, 790, 295, 791, 791, 295, 325, + 325, 295, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, + 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 295, 808, + 809, 810, 811, 812, 813, 814, 815, 816, + 817, 818, 819, 820, 821, 111, 808, 809, + 810, 811, 812, 813, 814, 815, 816, 817, + 818, 819, 820, 821, 111, 807, 823, 824, + 825, 826, 827, 828, 829, 830, 831, 832, + 833, 834, 835, 836, 823, 824, 825, 826, + 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 822, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 837, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, + 868, 869, 854, 871, 872, 873, 874, 875, + 876, 877, 878, 879, 880, 881, 882, 883, + 884, 871, 872, 873, 874, 875, 876, 877, + 878, 879, 880, 881, 882, 883, 884, 870, + 886, 887, 888, 889, 890, 891, 892, 893, + 894, 895, 896, 897, 898, 899, 900, 886, + 887, 888, 889, 890, 891, 892, 893, 894, + 895, 896, 897, 898, 899, 900, 885, 902, + 903, 904, 905, 906, 907, 908, 909, 910, + 911, 912, 913, 914, 28, 915, 902, 903, + 904, 905, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 28, 915, 901, 917, 918, + 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 930, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 928, + 929, 930, 916, 932, 933, 934, 935, 936, + 937, 938, 939, 940, 941, 942, 943, 944, + 945, 932, 933, 934, 935, 936, 937, 938, + 939, 940, 941, 942, 943, 944, 945, 931, + 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 960, 946, 947, 948, 949, + 961, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 947, 948, 949, 961, 951, + 952, 953, 954, 955, 956, 957, 958, 959, + 960, 946, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, + 977, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, + 962, 963, 964, 965, 966, 967, 968, 970, + 971, 972, 973, 974, 975, 976, 977, 963, + 964, 965, 966, 967, 968, 970, 971, 972, + 973, 974, 975, 976, 977, 962, 979, 980, + 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 979, 980, 981, 982, + 983, 984, 985, 986, 987, 988, 989, 990, + 991, 992, 978, 979, 980, 981, 982, 983, + 984, 993, 986, 987, 988, 989, 990, 991, + 992, 979, 980, 981, 982, 983, 984, 993, + 986, 987, 988, 989, 990, 991, 992, 978, + 855, 994, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 866, 867, 869, 868, 855, + 994, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, 869, 868, 854, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 995, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 1023, 1024, 1025, 1026, 1012, 1013, 1014, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, + 1023, 1024, 1025, 1026, 1011, 1012, 1013, 1014, + 1015, 1016, 1017, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1012, 1013, 1014, 1015, 1016, + 1017, 1019, 1020, 1021, 1022, 1023, 1024, 1025, + 1026, 1011, 1028, 1029, 1030, 1031, 1032, 1033, + 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, + 1036, 1037, 1038, 1039, 1040, 1041, 1027, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1043, 1044, + 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1042, 1043, 1044, + 1045, 1046, 1047, 1048, 1050, 1051, 1052, 1053, + 1054, 1055, 1056, 1057, 1043, 1044, 1045, 1046, + 1047, 1048, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1042, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1059, 1060, 1061, 1062, 1063, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1058, + 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, + 1084, 1085, 1086, 1087, 1073, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, + 1100, 1101, 1102, 1089, 1090, 1091, 1092, 1093, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1088, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 1117, 1103, 1104, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, + 1113, 1114, 1115, 1118, 1117, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1118, 1117, 1103, 1120, 1121, 1122, 1123, + 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, + 1132, 1133, 1134, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, + 1133, 1134, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, + 1134, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1130, 1131, 1132, 1134, 1119, + 996, 997, 998, 1135, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1010, 996, 997, + 998, 1135, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1010, 995, 855, 994, 857, + 858, 859, 860, 861, 862, 863, 864, 865, + 866, 867, 868, 855, 994, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, + 868, 854, 1136, 903, 904, 1137, 906, 907, + 908, 909, 1138, 911, 912, 913, 914, 915, + 1136, 903, 904, 1137, 906, 907, 908, 909, + 1138, 911, 912, 913, 914, 915, 901, 1140, + 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, + 1149, 1150, 1151, 1152, 1153, 1140, 1141, 1142, + 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, + 1151, 1152, 1153, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1154, 1147, 1148, 1149, 1150, 1151, + 1152, 1153, 1140, 1141, 1142, 1143, 1144, 1145, + 1154, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1139, 886, 887, 888, 889, 890, 891, 893, + 894, 895, 896, 897, 898, 899, 900, 886, + 887, 888, 889, 890, 891, 893, 894, 895, + 896, 897, 898, 899, 900, 885, 1156, 1157, + 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1167, 1168, 1169, 1156, 1157, 1158, 1159, + 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, + 1168, 1169, 1155, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 853, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 853, 837, + 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, + 1179, 1180, 1181, 1182, 1183, 1184, 1171, 1172, + 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, + 1181, 1182, 1183, 1184, 1170, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, + 819, 820, 1185, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 817, 818, 819, 820, + 1185, 807, 1187, 1188, 1189, 1190, 1191, 1192, + 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, 1197, 1198, 1199, 1200, 1186, 1203, + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1203, 1221, + 1222, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1206, + 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, + 1215, 1216, 1217, 1218, 1219, 1202, 1220, 1201, + 1225, 1226, 1225, 1228, 1224, 1227, 1223, 1230, + 1231, 1230, 1233, 1232, 1229, 1236, 1237, 1238, + 1239, 1240, 1238, 1239, 1240, 1236, 1235, 1243, + 1243, 1242, 1245, 1245, 1244, 1236, 1237, 1246, + 1247, 1248, 1246, 1247, 1248, 1236, 1235, 1250, + 1251, 1252, 1253, 1254, 1251, 1252, 1253, 1254, + 1250, 1242, 1243, 1255, 1255, 1243, 1242, 1243, + 1256, 1256, 1243, 1242, 1243, 1257, 1257, 1243, + 1242, 1243, 1258, 1258, 1243, 1242, 1250, 1251, + 1253, 1254, 1251, 1253, 1254, 1250, 1242, 1250, + 1251, 1259, 1253, 1254, 1251, 1259, 1253, 1254, + 1250, 1242, 1243, 1260, 1260, 1243, 1242, 1243, + 1261, 1261, 1243, 1242, 1243, 1262, 1262, 1243, + 1242, 1243, 1263, 1263, 1243, 1242, 1243, 1258, + 1258, 1243, 1242, 1243, 1264, 1265, 1266, 1264, + 1265, 1266, 1243, 1242, 1243, 1267, 1267, 1243, + 1242, 1243, 1268, 1268, 1243, 1242, 1243, 1269, + 1269, 1243, 1242, 1243, 1270, 1270, 1243, 1242, + 1243, 1265, 1265, 1243, 1242, 1272, 1273, 1274, + 1275, 1273, 1274, 1275, 1272, 1242, 1277, 1278, + 1279, 1280, 1278, 1279, 1280, 1277, 1242, 1243, + 1281, 1281, 1243, 1242, 1243, 1282, 1282, 1243, + 1242, 1277, 1283, 1279, 1280, 1283, 1279, 1280, + 1277, 1242, 1285, 1286, 1287, 1288, 1289, 1286, + 1287, 1288, 1289, 1285, 1284, 1285, 1286, 1288, + 1289, 1286, 1288, 1289, 1285, 1284, 1285, 1286, + 1290, 1288, 1289, 1286, 1290, 1288, 1289, 1285, + 1284, 1292, 1293, 1294, 1295, 1293, 1294, 1295, + 1292, 1291, 1297, 1298, 1299, 1300, 1298, 1299, + 1300, 1297, 1296, 1297, 1301, 1299, 1300, 1301, + 1299, 1300, 1297, 1296, 1303, 1305, 1304, 1302, + 1306, 1307, 1304, 1302, 1236, 1309, 1238, 1239, + 1240, 1238, 1239, 1240, 1311, 1312, 1313, 1314, + 1315, 1313, 1314, 1315, 1235, 1236, 1235, 1310, + 1311, 1310, 1308, 1243, 1317, 1319, 1320, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1243, 1321, + 1243, 1242, 1245, 1303, 1322, 1305, 1245, 1304, + 1322, 1304, 1302, 1243, 1323, 1319, 1324, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1236, 1309, + 1246, 1247, 1248, 1246, 1247, 1248, 1311, 1312, + 1325, 1326, 1327, 1325, 1326, 1327, 1235, 1236, + 1235, 1310, 1311, 1310, 1308, 1250, 1317, 1251, + 1252, 1253, 1254, 1251, 1252, 1253, 1254, 1329, + 1320, 1330, 1331, 1332, 1333, 1330, 1331, 1332, + 1333, 1242, 1250, 1242, 1318, 1329, 1318, 1328, + 1243, 1317, 1255, 1255, 1319, 1320, 1334, 1334, + 1242, 1243, 1242, 1318, 1319, 1318, 1316, 1243, + 1317, 1256, 1256, 1319, 1320, 1335, 1335, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1243, 1317, + 1257, 1257, 1319, 1320, 1336, 1336, 1242, 1243, + 1242, 1318, 1319, 1318, 1316, 1243, 1317, 1258, + 1258, 1319, 1320, 1337, 1337, 1242, 1243, 1242, + 1318, 1319, 1318, 1316, 1250, 1317, 1251, 1253, + 1254, 1251, 1253, 1254, 1329, 1320, 1330, 1332, + 1333, 1330, 1332, 1333, 1242, 1250, 1242, 1318, + 1329, 1318, 1328, 1250, 1317, 1251, 1259, 1253, + 1254, 1251, 1259, 1253, 1254, 1329, 1320, 1330, + 1338, 1332, 1333, 1330, 1338, 1332, 1333, 1242, + 1250, 1242, 1318, 1329, 1318, 1328, 1243, 1317, + 1260, 1260, 1319, 1320, 1339, 1339, 1242, 1243, + 1242, 1318, 1319, 1318, 1316, 1243, 1317, 1261, + 1261, 1319, 1320, 1340, 1340, 1242, 1243, 1242, + 1318, 1319, 1318, 1316, 1243, 1317, 1262, 1262, + 1319, 1320, 1341, 1341, 1242, 1243, 1242, 1318, + 1319, 1318, 1316, 1243, 1317, 1263, 1263, 1319, + 1320, 1342, 1342, 1242, 1243, 1242, 1318, 1319, + 1318, 1316, 1243, 1317, 1258, 1258, 1319, 1320, + 1337, 1337, 1242, 1243, 1242, 1318, 1319, 1318, + 1316, 1243, 1317, 1264, 1265, 1266, 1264, 1265, + 1266, 1319, 1320, 1343, 1344, 1345, 1343, 1344, + 1345, 1242, 1243, 1242, 1318, 1319, 1318, 1316, + 1243, 1317, 1267, 1267, 1319, 1320, 1346, 1346, + 1242, 1243, 1242, 1318, 1319, 1318, 1316, 1243, + 1317, 1268, 1268, 1319, 1320, 1347, 1347, 1242, + 1243, 1242, 1318, 1319, 1318, 1316, 1243, 1317, + 1269, 1269, 1319, 1320, 1348, 1348, 1242, 1243, + 1242, 1318, 1319, 1318, 1316, 1243, 1317, 1270, + 1270, 1319, 1320, 1349, 1349, 1242, 1243, 1242, + 1318, 1319, 1318, 1316, 1243, 1317, 1265, 1265, + 1319, 1320, 1344, 1344, 1242, 1243, 1242, 1318, + 1319, 1318, 1316, 1272, 1317, 1273, 1274, 1275, + 1273, 1274, 1275, 1351, 1320, 1352, 1353, 1354, + 1352, 1353, 1354, 1242, 1272, 1242, 1318, 1351, + 1318, 1350, 1277, 1317, 1278, 1279, 1280, 1278, + 1279, 1280, 1356, 1320, 1357, 1358, 1359, 1357, + 1358, 1359, 1242, 1277, 1242, 1318, 1356, 1318, + 1355, 1243, 1317, 1281, 1281, 1319, 1320, 1360, + 1360, 1242, 1243, 1242, 1318, 1319, 1318, 1316, + 1243, 1317, 1282, 1282, 1319, 1320, 1361, 1361, + 1242, 1243, 1242, 1318, 1319, 1318, 1316, 1277, + 1317, 1283, 1279, 1280, 1283, 1279, 1280, 1356, + 1320, 1362, 1358, 1359, 1362, 1358, 1359, 1242, + 1277, 1242, 1318, 1356, 1318, 1355, 1285, 1303, + 1286, 1287, 1288, 1289, 1286, 1287, 1288, 1289, + 1364, 1305, 1365, 1366, 1367, 1368, 1365, 1366, + 1367, 1368, 1285, 1304, 1364, 1304, 1363, 1303, + 115, 115, 1305, 1369, 1369, 1304, 1302, 1303, + 116, 116, 1305, 1370, 1370, 1304, 1302, 1303, + 117, 117, 1305, 1371, 1371, 1304, 1302, 1303, + 118, 118, 1305, 1372, 1372, 1304, 1302, 1285, + 1303, 1286, 1288, 1289, 1286, 1288, 1289, 1364, + 1305, 1365, 1367, 1368, 1365, 1367, 1368, 1285, + 1304, 1364, 1304, 1363, 1285, 1303, 1286, 1290, + 1288, 1289, 1286, 1290, 1288, 1289, 1364, 1305, + 1365, 1373, 1367, 1368, 1365, 1373, 1367, 1368, + 1285, 1304, 1364, 1304, 1363, 1303, 119, 119, + 1305, 1374, 1374, 1304, 1302, 1303, 120, 120, + 1305, 1375, 1375, 1304, 1302, 1303, 121, 121, + 1305, 1376, 1376, 1304, 1302, 1303, 122, 122, + 1305, 1377, 1377, 1304, 1302, 1303, 118, 118, + 1305, 1372, 1372, 1304, 1302, 1303, 123, 124, + 125, 123, 124, 125, 1305, 1378, 1379, 1380, + 1378, 1379, 1380, 1304, 1302, 1303, 126, 126, + 1305, 1381, 1381, 1304, 1302, 1303, 127, 127, + 1305, 1382, 1382, 1304, 1302, 1303, 128, 128, + 1305, 1383, 1383, 1304, 1302, 1303, 129, 129, + 1305, 1384, 1384, 1304, 1302, 1303, 124, 124, + 1305, 1379, 1379, 1304, 1302, 1292, 1303, 1293, + 1294, 1295, 1293, 1294, 1295, 1386, 1305, 1387, + 1388, 1389, 1387, 1388, 1389, 1292, 1304, 1386, + 1304, 1385, 1297, 1303, 1298, 1299, 1300, 1298, + 1299, 1300, 1391, 1305, 1392, 1393, 1394, 1392, + 1393, 1394, 1297, 1304, 1391, 1304, 1390, 1303, + 130, 130, 1305, 1395, 1395, 1304, 1302, 1303, + 131, 131, 1305, 1396, 1396, 1304, 1302, 1297, + 1303, 1301, 1299, 1300, 1301, 1299, 1300, 1391, + 1305, 1397, 1393, 1394, 1397, 1393, 1394, 1297, + 1304, 1391, 1304, 1390, 1203, 1204, 1205, 1398, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, + 1407, 1408, 1409, 1410, 1411, 1398, 1399, 1400, + 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, + 1409, 1410, 1411, 1203, 1221, 1222, 1227, 1220, + 1227, 1220, 1227, 1227, 1220, 1227, 1220, 1227, + 1202, 1220, 1227, 1220, 1227, 1220, 1227, 1220, + 1227, 1220, 1201, 1225, 1226, 1412, 1412, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1413, 1413, + 1225, 1228, 1224, 1227, 1223, 1415, 1416, 1417, + 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, + 1426, 1427, 1428, 1429, 1430, 1417, 1418, 1419, + 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, + 1428, 1429, 1430, 1415, 1432, 1224, 1431, 1414, + 1225, 1226, 1433, 1433, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1434, 1434, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1435, 1435, 1225, 1228, + 1224, 1227, 1223, 1437, 1438, 1439, 1440, 1441, + 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, + 1450, 1451, 1452, 1439, 1440, 1441, 1442, 1443, + 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, + 1452, 1437, 1454, 1224, 1453, 1436, 1225, 1226, + 1455, 1456, 1455, 1456, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1457, 1457, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1458, 1458, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1459, 1459, 1225, + 1228, 1224, 1227, 1223, 1225, 1460, 1461, 1226, + 1225, 1228, 1224, 1227, 1223, 1463, 1464, 1465, + 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, + 1474, 1475, 1476, 1477, 1478, 1465, 1466, 1467, + 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, + 1476, 1477, 1478, 1463, 1480, 1224, 1479, 1462, + 1225, 1226, 1481, 1482, 1481, 1482, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1483, 1483, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1484, 1484, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1485, + 1485, 1225, 1228, 1224, 1227, 1223, 1487, 1488, + 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, + 1497, 1498, 1499, 1500, 1501, 1502, 1489, 1490, + 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, + 1499, 1500, 1501, 1502, 1487, 1504, 1224, 1503, + 1486, 1225, 1226, 1505, 1505, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1506, 1506, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1507, 1507, 1225, + 1228, 1224, 1227, 1223, 1509, 1510, 1511, 1512, + 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, + 1521, 1522, 1523, 1524, 1511, 1512, 1513, 1514, + 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, + 1523, 1524, 1509, 1526, 1224, 1525, 1508, 1225, + 1226, 1527, 1527, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1528, 1528, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1529, 1529, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1530, 1530, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1531, 1531, 1225, + 1228, 1224, 1227, 1223, 1533, 1534, 1535, 1536, + 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, + 1545, 1546, 1547, 1548, 1535, 1536, 1537, 1538, + 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, + 1547, 1548, 1533, 1550, 1224, 1549, 1532, 1225, + 1226, 1551, 1552, 1551, 1552, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1553, 1553, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1554, 1555, 1554, + 1555, 1225, 1228, 1224, 1227, 1223, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, + 1567, 1568, 1569, 1570, 1571, 1572, 1559, 1560, + 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1557, 1574, 1224, 1573, + 1556, 1225, 1226, 1575, 1575, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1576, 1576, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1577, 1577, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1578, 1578, + 1225, 1228, 1224, 1227, 1223, 1225, 1579, 1226, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1580, + 1581, 1580, 1581, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1582, 1582, 1225, 1228, 1224, 1227, + 1223, 1584, 1585, 1586, 1587, 1588, 1589, 1590, + 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1586, 1587, 1588, 1589, 1590, 1591, 1592, + 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1584, + 1601, 1224, 1600, 1583, 1225, 1226, 1602, 1602, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1603, + 1603, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1604, 1604, 1225, 1228, 1224, 1227, 1223, 1606, + 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1620, 1621, 1606, 1623, 1224, + 1622, 1605, 1225, 1226, 1624, 1625, 1626, 1624, + 1625, 1626, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1627, 1628, 1629, 1627, 1628, 1629, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1630, 1630, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1631, + 1631, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1632, 1632, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1626, 1626, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1633, 1633, 1225, 1228, 1224, 1227, + 1223, 1635, 1636, 1637, 1638, 1639, 1640, 1641, + 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, + 1650, 1637, 1638, 1639, 1640, 1641, 1642, 1643, + 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1635, + 1652, 1224, 1651, 1634, 1225, 1226, 1653, 1653, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1654, + 1654, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1655, 1655, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1656, 1656, 1225, 1228, 1224, 1227, 1223, + 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, + 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1668, 1669, 1670, 1671, 1672, 1673, 1658, 1675, + 1224, 1674, 1657, 1225, 1226, 1676, 1677, 1678, + 1679, 1676, 1677, 1678, 1679, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1680, 1680, 1225, 1228, + 1224, 1227, 1223, 1682, 1683, 1684, 1685, 1686, + 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, + 1695, 1696, 1697, 1684, 1685, 1686, 1687, 1688, + 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1682, 1699, 1224, 1698, 1681, 1225, 1226, + 1700, 1700, 1225, 1228, 1224, 1227, 1223, 1702, + 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, + 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1704, + 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, + 1713, 1714, 1715, 1716, 1717, 1702, 1719, 1224, + 1718, 1701, 1225, 1226, 1720, 1720, 1225, 1228, + 1224, 1227, 1223, 1722, 1723, 1724, 1725, 1726, + 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 1736, 1737, 1724, 1725, 1726, 1727, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, + 1737, 1722, 1739, 1224, 1738, 1721, 1225, 1226, + 1740, 1741, 1742, 1740, 1741, 1742, 1225, 1228, + 1224, 1227, 1223, 1744, 1745, 1746, 1747, 1748, + 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, + 1757, 1758, 1759, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, + 1759, 1744, 1761, 1224, 1760, 1743, 1225, 1226, + 1762, 1762, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1763, 1763, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1764, 1764, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1765, 1765, 1225, 1228, 1224, + 1227, 1223, 1225, 1766, 1226, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1767, 1767, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1768, 1768, 1225, + 1228, 1224, 1227, 1223, 1770, 1771, 1772, 1773, + 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 1782, 1783, 1784, 1785, 1772, 1773, 1774, 1775, + 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, + 1784, 1785, 1770, 1787, 1224, 1786, 1769, 1225, + 1226, 1788, 1788, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1789, 1789, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1790, 1790, 1225, 1228, 1224, + 1227, 1223, 1792, 1793, 1794, 1795, 1796, 1797, + 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1806, 1807, 1794, 1795, 1796, 1797, 1798, 1799, + 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, + 1792, 1809, 1224, 1808, 1791, 1225, 1226, 1810, + 1810, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1811, 1811, 1225, 1228, 1224, 1227, 1223, 1813, + 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, + 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, + 1824, 1825, 1826, 1827, 1828, 1813, 1830, 1224, + 1829, 1812, 1225, 1226, 1831, 1831, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1832, 1832, 1225, + 1228, 1224, 1227, 1223, 1225, 1833, 1226, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 1834, 1835, + 1836, 1834, 1835, 1836, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1837, 1837, 1225, 1228, 1224, + 1227, 1223, 1839, 1840, 1841, 1842, 1843, 1844, + 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1853, 1854, 1841, 1842, 1843, 1844, 1845, 1846, + 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, + 1839, 1856, 1224, 1855, 1838, 1225, 1226, 1857, + 1858, 1857, 1858, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1859, 1859, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1860, 1860, 1225, 1228, 1224, + 1227, 1223, 1862, 1863, 1864, 1865, 1866, 1867, + 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, + 1876, 1877, 1864, 1865, 1866, 1867, 1868, 1869, + 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, + 1862, 1879, 1224, 1878, 1861, 1225, 1226, 1880, + 1880, 1225, 1228, 1224, 1227, 1223, 1882, 1883, + 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, + 1892, 1893, 1894, 1895, 1896, 1897, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, + 1894, 1895, 1896, 1897, 1882, 1899, 1224, 1898, + 1881, 1225, 1226, 1900, 1900, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1901, 1901, 1225, 1228, + 1224, 1227, 1223, 1903, 1904, 1905, 1906, 1907, + 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, + 1916, 1917, 1918, 1905, 1906, 1907, 1908, 1909, + 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, + 1918, 1903, 1920, 1224, 1919, 1902, 1225, 1226, + 1921, 1921, 1225, 1228, 1224, 1227, 1223, 1923, + 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, + 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1925, + 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, + 1934, 1935, 1936, 1937, 1938, 1923, 1940, 1224, + 1939, 1922, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, + 1956, 1957, 1944, 1945, 1946, 1947, 1948, 1949, + 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1942, 1959, 1227, 1227, 1224, 1958, 1941, 1225, + 1226, 1960, 1960, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1961, 1961, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 1962, 1962, 1225, 1228, 1224, + 1227, 1223, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1963, 1952, 1953, 1954, 1955, + 1956, 1957, 1944, 1945, 1946, 1947, 1948, 1949, + 1950, 1963, 1952, 1953, 1954, 1955, 1956, 1957, + 1942, 1959, 1224, 1958, 1941, 1225, 1226, 1964, + 1964, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 1965, 1965, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1966, 1966, 1225, 1228, 1224, 1227, 1223, + 1225, 1967, 1226, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 1968, 1969, 1970, 1968, 1969, 1970, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 1971, + 1971, 1225, 1228, 1224, 1227, 1223, 1973, 1974, + 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, + 1983, 1984, 1985, 1986, 1987, 1988, 1975, 1976, + 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, + 1985, 1986, 1987, 1988, 1973, 1990, 1224, 1989, + 1972, 1225, 1226, 1991, 1991, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 1992, 1992, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 1993, 1993, 1225, + 1228, 1224, 1227, 1223, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2008, 2009, 2010, 1997, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, + 2009, 2010, 1995, 2012, 1224, 2011, 1994, 1225, + 1226, 2013, 2013, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 2014, 2014, 1225, 1228, 1224, 1227, + 1223, 1225, 1226, 2015, 2015, 1225, 1228, 1224, + 1227, 1223, 1225, 1226, 2016, 2016, 1225, 1228, + 1224, 1227, 1223, 2018, 2019, 2020, 2021, 2022, + 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, + 2031, 2032, 2033, 2020, 2021, 2022, 2023, 2024, + 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, + 2033, 2018, 2035, 1224, 2034, 2017, 1225, 1226, + 2036, 2036, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 2037, 2037, 1225, 1228, 1224, 1227, 1223, + 1225, 1226, 2038, 2038, 1225, 1228, 1224, 1227, + 1223, 2040, 2041, 2042, 2043, 2044, 2045, 2046, + 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, + 2055, 2042, 2043, 2044, 2045, 2046, 2047, 2048, + 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2040, + 2057, 1224, 2056, 2039, 2059, 2060, 2061, 2062, + 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, + 2071, 2072, 2073, 2074, 2061, 2062, 2063, 2064, + 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, + 2073, 2074, 2059, 2076, 1224, 2075, 2058, 1225, + 1226, 2077, 2077, 1225, 1228, 1224, 1227, 1223, + 1225, 2078, 1226, 1225, 1228, 1224, 1227, 1223, + 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, + 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, + 2090, 2091, 2092, 2093, 2094, 2095, 2080, 2097, + 1224, 2096, 2079, 1225, 1226, 2098, 2098, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 2099, 2099, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 2100, + 2100, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 2101, 2101, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 1720, 1720, 1225, 1228, 1224, 1227, 1223, + 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, + 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, + 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, + 2113, 2114, 2115, 2116, 2117, 2118, 2103, 2120, + 1224, 2119, 2102, 1225, 1226, 2121, 2122, 2121, + 2122, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 2123, 2123, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 2124, 2124, 1225, 1228, 1224, 1227, 1223, + 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, + 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, 2141, 2126, 2143, + 1224, 2142, 2125, 1225, 2144, 1226, 1225, 1228, + 1224, 1227, 1223, 1225, 1226, 2145, 2145, 1225, + 1228, 1224, 1227, 1223, 1225, 1226, 2146, 2146, + 1225, 1228, 1224, 1227, 1223, 1225, 1226, 2147, + 2147, 1225, 1228, 1224, 1227, 1223, 1225, 1226, + 2148, 2148, 1225, 1228, 1224, 1227, 1223, 1225, + 1226, 2149, 2149, 1225, 1228, 1224, 1227, 1223, + 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, + 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, + 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, + 2161, 2162, 2163, 2164, 2165, 2166, 2151, 2168, + 1224, 2167, 2150, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, + 1216, 1217, 1218, 1219, 1206, 1207, 1208, 1209, + 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, + 1218, 1219, 1203, 1221, 1222, 2169, 2170, 2171, + 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, + 2180, 2181, 2182, 2169, 2170, 2171, 2172, 2173, + 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, + 2182, 1202, 1220, 1201, 2184, 2185, 2186, 2187, + 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, + 2196, 2197, 2198, 2199, 2186, 2187, 2188, 2189, + 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, + 2198, 2199, 2184, 2201, 2200, 2183, 2203, 2204, + 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, + 2213, 2214, 2215, 2216, 2217, 2218, 2205, 2206, + 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, + 2215, 2216, 2217, 2218, 2203, 2220, 2219, 2202, + 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, + 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, + 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, + 2232, 2233, 2234, 2235, 2236, 2237, 2222, 2239, + 2238, 2221, 2241, 2242, 2243, 2244, 2245, 2246, + 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, + 2255, 2256, 2243, 2244, 2245, 2246, 2247, 2248, + 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, + 2241, 2258, 2257, 2240, 2260, 2261, 2262, 2263, + 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, + 2272, 2273, 2274, 2275, 2262, 2263, 2264, 2265, + 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, + 2274, 2275, 2260, 2277, 2276, 2259, 2279, 2280, + 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, + 2289, 2290, 2291, 2292, 2293, 2294, 2281, 2282, + 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, + 2291, 2292, 2293, 2294, 2279, 2296, 2295, 2278, + 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, + 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, + 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, + 2308, 2309, 2310, 2311, 2312, 2313, 2298, 2315, + 2314, 2297, 2317, 2318, 2319, 2320, 2321, 2322, + 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, + 2331, 2332, 2319, 2320, 2321, 2322, 2323, 2324, + 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, + 2317, 2334, 2333, 2316, 2336, 2337, 2338, 2339, + 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, + 2348, 2349, 2350, 2351, 2338, 2339, 2340, 2341, + 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, + 2350, 2351, 2336, 2353, 2352, 2335, 2355, 2356, + 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, + 2365, 2366, 2367, 2368, 2369, 2370, 2357, 2358, + 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, + 2367, 2368, 2369, 2370, 2355, 2372, 2371, 2354, + 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, + 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, + 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, + 2384, 2385, 2386, 2387, 2388, 2389, 2374, 2391, + 2390, 2373, 2393, 2394, 2395, 2396, 2397, 2398, + 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, + 2407, 2408, 2395, 2396, 2397, 2398, 2399, 2400, + 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, + 2393, 2410, 2409, 2392, 2412, 2413, 2414, 2415, + 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, + 2424, 2425, 2426, 2427, 2414, 2415, 2416, 2417, + 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, + 2426, 2427, 2412, 2429, 2428, 2411, 2431, 2432, + 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, + 2441, 2442, 2443, 2444, 2445, 2446, 2433, 2434, + 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, + 2443, 2444, 2445, 2446, 2431, 2448, 2447, 2430, + 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, + 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, + 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 2462, 2463, 2464, 2465, 2450, 2467, + 2466, 2449, 2469, 2470, 2471, 2472, 2473, 2474, + 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, + 2483, 2484, 2471, 2472, 2473, 2474, 2475, 2476, + 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, + 2469, 2486, 2485, 2468, 2488, 2489, 2490, 2491, + 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, + 2500, 2501, 2502, 2503, 2490, 2491, 2492, 2493, + 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, + 2502, 2503, 2488, 2505, 2504, 2487, 2507, 2508, + 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, + 2517, 2518, 2519, 2520, 2521, 2522, 2509, 2510, + 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, + 2519, 2520, 2521, 2522, 2507, 2524, 2523, 2506, + 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, + 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, + 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, + 2536, 2537, 2538, 2539, 2540, 2541, 2526, 2543, + 2542, 2525, 2545, 2546, 2547, 2548, 2549, 2550, + 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, + 2559, 2560, 2547, 2548, 2549, 2550, 2551, 2552, + 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, + 2545, 2562, 2561, 2544, 2564, 2565, 2566, 2567, + 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, + 2576, 2577, 2578, 2579, 2566, 2567, 2568, 2569, + 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, + 2578, 2579, 2564, 2581, 2580, 2563, 2583, 2584, + 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, + 2593, 2594, 2595, 2596, 2597, 2598, 2585, 2586, + 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, + 2595, 2596, 2597, 2598, 2583, 2600, 2599, 2582, + 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, + 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, + 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, + 2612, 2613, 2614, 2615, 2616, 2617, 2602, 2619, + 2618, 2601, 2621, 2622, 2623, 2624, 2625, 2626, + 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, + 2635, 2636, 2623, 2624, 2625, 2626, 2627, 2628, + 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, + 2621, 2638, 2630, 2630, 2637, 2620, 2621, 2622, + 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2639, + 2631, 2632, 2633, 2634, 2635, 2636, 2623, 2624, + 2625, 2626, 2627, 2628, 2629, 2639, 2631, 2632, + 2633, 2634, 2635, 2636, 2621, 2638, 2637, 2620, + 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, + 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, + 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, + 2651, 2652, 2653, 2654, 2655, 2656, 2641, 2658, + 2657, 2640, 2660, 2661, 2662, 2663, 2664, 2665, + 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, + 2674, 2675, 2662, 2663, 2664, 2665, 2666, 2667, + 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, + 2660, 2677, 2676, 2659, 2679, 2680, 2681, 2682, + 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, + 2691, 2692, 2693, 2694, 2681, 2682, 2683, 2684, + 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, + 2693, 2694, 2679, 2696, 2695, 2678, 2698, 2699, + 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, + 2708, 2709, 2710, 2711, 2712, 2713, 2700, 2701, + 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, + 2710, 2711, 2712, 2713, 2698, 2715, 2714, 2697, + 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, + 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, + 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, + 2727, 2728, 2729, 2730, 2731, 2732, 2717, 2734, + 2733, 2716, 2736, 2737, 2738, 2739, 2740, 2741, + 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, + 2750, 2751, 2738, 2739, 2740, 2741, 2742, 2743, + 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, + 2736, 2753, 2752, 2735, 2755, 2756, 2757, 2758, + 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, + 2767, 2768, 2769, 2770, 2757, 2758, 2759, 2760, + 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, + 2769, 2770, 2755, 2772, 2771, 2754, 2774, 2775, + 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, + 2784, 2785, 2786, 2787, 2788, 2789, 2776, 2777, + 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, + 2786, 2787, 2788, 2789, 2774, 2791, 2790, 2773, + 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, + 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, + 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, + 2803, 2804, 2805, 2806, 2807, 2808, 2793, 2810, + 2809, 2792, 1303, 132, 132, 1305, 2811, 2811, + 1304, 1302, 1303, 133, 133, 1305, 133, 133, + 1304, 1302, 1303, 134, 134, 1305, 2812, 2812, + 1304, 1302, 1303, 135, 135, 1305, 2813, 2813, + 1304, 1302, 1303, 136, 136, 1305, 136, 136, + 1304, 1302, 1303, 137, 138, 137, 138, 1305, + 2814, 2815, 2814, 2815, 1304, 1302, 1303, 139, + 139, 1305, 2816, 2816, 1304, 1302, 1303, 140, + 140, 1305, 2817, 2817, 1304, 1302, 1303, 141, + 141, 1305, 2818, 2818, 1304, 1302, 142, 143, + 1303, 142, 143, 1305, 1304, 1302, 1303, 251, + 252, 251, 252, 1305, 2819, 2820, 2819, 2820, + 1304, 1302, 1303, 253, 253, 1305, 2821, 2821, + 1304, 1302, 1303, 254, 254, 1305, 254, 254, + 1304, 1302, 255, 1303, 2822, 1305, 1304, 1302, + 1303, 256, 256, 1305, 2823, 2823, 1304, 1302, + 1303, 257, 257, 1305, 2824, 2824, 1304, 1302, + 1303, 258, 258, 1305, 2825, 2825, 1304, 1302, + 1303, 259, 259, 1305, 2826, 2826, 1304, 1302, + 1303, 260, 260, 1305, 260, 260, 1304, 1302, + 1303, 144, 145, 144, 145, 1305, 2827, 2828, + 2827, 2828, 1304, 1302, 1303, 146, 146, 1305, + 2829, 2829, 1304, 1302, 1303, 147, 147, 1305, + 2830, 2830, 1304, 1302, 1303, 148, 148, 1305, + 148, 148, 1304, 1302, 1303, 247, 247, 1305, + 2831, 2831, 1304, 1302, 1303, 248, 248, 1305, + 2832, 2832, 1304, 1302, 1303, 249, 249, 1305, + 2833, 2833, 1304, 1302, 1303, 250, 250, 1305, + 2834, 2834, 1304, 1302, 1303, 193, 193, 1305, + 193, 193, 1304, 1302, 1303, 149, 149, 1305, + 2835, 2835, 1304, 1302, 1303, 150, 150, 1305, + 2836, 2836, 1304, 1302, 1303, 151, 151, 1305, + 151, 151, 1304, 1302, 1303, 152, 152, 1305, + 2837, 2837, 1304, 1302, 1303, 153, 153, 1305, + 2838, 2838, 1304, 1302, 1303, 154, 154, 1305, + 2839, 2839, 1304, 1302, 1303, 155, 155, 1305, + 2840, 2840, 1304, 1302, 1303, 156, 156, 1305, + 156, 156, 1304, 1302, 1303, 157, 158, 157, + 158, 1305, 2841, 2842, 2841, 2842, 1304, 1302, + 1303, 159, 159, 1305, 2843, 2843, 1304, 1302, + 1303, 160, 161, 160, 161, 1305, 160, 161, + 160, 161, 1304, 1302, 1303, 245, 245, 1305, + 2844, 2844, 1304, 1302, 246, 1303, 246, 1305, + 1304, 1302, 1303, 162, 162, 1305, 2845, 2845, + 1304, 1302, 1303, 163, 163, 1305, 2846, 2846, + 1304, 1302, 1303, 164, 164, 1305, 2847, 2847, + 1304, 1302, 1303, 165, 165, 1305, 2848, 2848, + 1304, 1302, 166, 1303, 2849, 1305, 1304, 1302, + 1303, 167, 168, 167, 168, 1305, 2850, 2851, + 2850, 2851, 1304, 1302, 1303, 169, 169, 1305, + 169, 169, 1304, 1302, 1303, 242, 242, 1305, + 2852, 2852, 1304, 1302, 1303, 243, 243, 1305, + 2853, 2853, 1304, 1302, 1303, 244, 244, 1305, + 244, 244, 1304, 1302, 1303, 170, 170, 1305, + 2854, 2854, 1304, 1302, 1303, 171, 171, 1305, + 2855, 2855, 1304, 1302, 1303, 172, 172, 1305, + 172, 172, 1304, 1302, 1303, 173, 174, 175, + 173, 174, 175, 1305, 2856, 2857, 2858, 2856, + 2857, 2858, 1304, 1302, 1303, 176, 177, 178, + 176, 177, 178, 1305, 2859, 2860, 2861, 2859, + 2860, 2861, 1304, 1302, 1303, 179, 179, 1305, + 2862, 2862, 1304, 1302, 1303, 180, 180, 1305, + 2863, 2863, 1304, 1302, 1303, 181, 181, 1305, + 2864, 2864, 1304, 1302, 1303, 175, 175, 1305, + 2858, 2858, 1304, 1302, 1303, 182, 182, 1305, + 182, 182, 1304, 1302, 1303, 223, 223, 1305, + 223, 223, 1304, 1302, 2621, 2622, 2623, 2624, + 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, + 2633, 2634, 2635, 2636, 2623, 2624, 2625, 2626, + 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, + 2635, 2636, 2621, 2638, 2865, 2865, 2637, 2620, + 1303, 224, 224, 1305, 2866, 2866, 1304, 1302, + 1303, 225, 225, 1305, 2867, 2867, 1304, 1302, + 1303, 226, 226, 1305, 226, 226, 1304, 1302, + 1303, 227, 227, 1305, 2868, 2868, 1304, 1302, + 1303, 228, 228, 1305, 2869, 2869, 1304, 1302, + 1303, 229, 229, 1305, 2870, 2870, 1304, 1302, + 230, 1303, 2871, 1305, 1304, 1302, 1303, 231, + 232, 233, 231, 232, 233, 1305, 2872, 2873, + 2874, 2872, 2873, 2874, 1304, 1302, 1303, 234, + 234, 1305, 234, 234, 1304, 1302, 1303, 235, + 235, 1305, 2875, 2875, 1304, 1302, 1303, 236, + 236, 1305, 2876, 2876, 1304, 1302, 1303, 237, + 237, 1305, 237, 237, 1304, 1302, 1303, 238, + 238, 1305, 2877, 2877, 1304, 1302, 1303, 239, + 239, 1305, 2878, 2878, 1304, 1302, 1303, 240, + 240, 1305, 2879, 2879, 1304, 1302, 1303, 241, + 241, 1305, 241, 241, 1304, 1302, 1303, 183, + 183, 1305, 2880, 2880, 1304, 1302, 1303, 184, + 184, 1305, 2881, 2881, 1304, 1302, 1303, 185, + 185, 1305, 2882, 2882, 1304, 1302, 1303, 186, + 186, 1305, 186, 186, 1304, 1302, 1303, 187, + 188, 189, 190, 187, 188, 189, 190, 1305, + 2883, 2884, 2885, 2886, 2883, 2884, 2885, 2886, + 1304, 1302, 1303, 191, 191, 1305, 191, 191, + 1304, 1302, 1303, 194, 195, 196, 194, 195, + 196, 1305, 194, 2887, 2888, 194, 2887, 2888, + 1304, 1302, 1303, 197, 197, 1305, 2889, 2889, + 1304, 1302, 1303, 198, 198, 1305, 2890, 2890, + 1304, 1302, 1303, 199, 199, 1305, 2891, 2891, + 1304, 1302, 1303, 200, 200, 1305, 2892, 2892, + 1304, 1302, 201, 1303, 2893, 1305, 1304, 1302, + 1303, 202, 202, 1305, 2894, 2894, 1304, 1302, + 1303, 203, 203, 1305, 203, 203, 1304, 1302, + 1303, 204, 204, 1305, 2895, 2895, 1304, 1302, + 1303, 205, 205, 1305, 2896, 2896, 1304, 1302, + 1303, 206, 206, 1305, 206, 206, 1304, 1302, + 1303, 207, 207, 1305, 2897, 2897, 1304, 1302, + 1303, 208, 208, 1305, 208, 208, 1304, 1302, + 1303, 209, 209, 1305, 2898, 2898, 1304, 1302, + 1303, 210, 210, 1305, 2899, 2899, 1304, 1302, + 211, 1303, 2900, 1305, 1304, 1302, 1303, 212, + 213, 214, 212, 213, 214, 1305, 2901, 2902, + 2903, 2901, 2902, 2903, 1304, 1302, 1303, 215, + 215, 1305, 215, 215, 1304, 1302, 1303, 216, + 217, 216, 217, 1305, 2904, 2905, 2904, 2905, + 1304, 1302, 1303, 218, 218, 1305, 2906, 2906, + 1304, 1302, 1303, 219, 219, 1305, 219, 219, + 1304, 1302, 1303, 220, 220, 1305, 220, 220, + 1304, 1302, 1303, 221, 221, 1305, 2907, 2907, + 1304, 1302, 1303, 222, 222, 1305, 222, 222, + 1304, 1302, 1303, 192, 192, 1305, 192, 192, + 1304, 1302, 1303, 193, 193, 1305, 193, 193, + 1304, 1302, 2909, 2910, 261, 2909, 2910, 261, + 2911, 2908, 2910, 2910, 2911, 2908, 2913, 2913, + 2914, 2912, 0 +}; + +static const short _demo_machine_parser_cmd_trans_targs[] = { + 2, 0, 235, 3, 2, 235, 3, 237, + 232, 6, 94, 7, 8, 9, 10, 11, + 12, 13, 91, 14, 15, 16, 17, 378, + 381, 20, 21, 22, 384, 24, 385, 25, + 26, 27, 28, 29, 30, 31, 32, 33, + 34, 36, 37, 38, 39, 387, 41, 388, + 43, 44, 389, 46, 390, 48, 49, 391, + 394, 404, 52, 53, 54, 395, 56, 65, + 68, 396, 69, 71, 57, 58, 59, 60, + 61, 63, 64, 398, 66, 67, 399, 400, + 70, 401, 402, 73, 74, 75, 76, 403, + 78, 405, 406, 81, 407, 83, 408, 410, + 86, 411, 88, 412, 90, 413, 92, 93, + 414, 96, 97, 415, 99, 100, 101, 416, + 417, 232, 420, 105, 106, 107, 448, 109, + 110, 111, 112, 114, 450, 451, 115, 116, + 117, 118, 120, 452, 122, 653, 124, 125, + 654, 127, 222, 128, 129, 130, 655, 684, + 132, 217, 133, 134, 656, 136, 137, 657, + 139, 140, 141, 142, 658, 144, 215, 145, + 659, 682, 147, 148, 149, 150, 151, 152, + 212, 660, 154, 155, 661, 157, 199, 162, + 158, 195, 676, 159, 160, 161, 662, 164, + 165, 166, 663, 168, 171, 182, 184, 664, + 665, 666, 667, 172, 179, 173, 174, 175, + 176, 177, 178, 668, 180, 181, 669, 183, + 670, 185, 186, 187, 188, 189, 193, 671, + 190, 192, 191, 672, 673, 194, 674, 675, + 197, 198, 677, 200, 201, 202, 203, 204, + 205, 208, 678, 206, 207, 679, 209, 210, + 211, 680, 213, 214, 681, 216, 683, 218, + 219, 220, 221, 223, 225, 224, 685, 226, + 227, 228, 229, 230, 686, 798, 232, 233, + 1, 4, 102, 231, 232, 234, 232, 234, + 232, 235, 236, 232, 236, 232, 238, 239, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 55, 397, 232, 238, + 240, 241, 255, 256, 259, 260, 266, 279, + 286, 293, 300, 301, 309, 317, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 368, 376, 242, 367, + 243, 244, 245, 246, 247, 248, 249, 363, + 250, 251, 252, 253, 254, 232, 240, 241, + 255, 256, 259, 260, 266, 279, 286, 293, + 300, 301, 309, 317, 232, 240, 241, 255, + 256, 259, 260, 266, 279, 286, 293, 300, + 301, 309, 357, 360, 317, 232, 240, 257, + 255, 256, 259, 260, 266, 279, 286, 293, + 300, 301, 309, 317, 345, 258, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 317, 232, 240, 241, + 255, 256, 259, 260, 354, 266, 279, 286, + 293, 300, 301, 309, 317, 232, 261, 241, + 255, 348, 259, 260, 266, 279, 351, 293, + 300, 301, 309, 265, 317, 262, 263, 264, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 267, + 278, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 232, 240, 241, 255, 256, + 259, 260, 266, 279, 286, 293, 300, 301, + 309, 317, 232, 240, 241, 255, 280, 259, + 260, 266, 279, 286, 293, 300, 301, 309, + 317, 281, 282, 283, 284, 285, 256, 287, + 288, 232, 240, 241, 255, 256, 259, 260, + 289, 266, 279, 286, 293, 300, 301, 309, + 317, 290, 291, 292, 294, 295, 232, 240, + 241, 255, 256, 259, 260, 296, 279, 286, + 293, 300, 301, 309, 317, 297, 298, 299, + 266, 241, 232, 240, 241, 255, 302, 259, + 260, 266, 279, 286, 293, 300, 301, 309, + 343, 317, 303, 339, 232, 240, 241, 255, + 256, 259, 260, 304, 266, 279, 286, 293, + 300, 301, 309, 317, 305, 306, 307, 308, + 310, 322, 326, 316, 328, 331, 311, 312, + 313, 314, 315, 232, 240, 241, 255, 256, + 259, 260, 266, 279, 286, 293, 300, 301, + 309, 317, 232, 240, 241, 255, 256, 259, + 260, 318, 266, 279, 286, 293, 300, 301, + 309, 317, 319, 320, 321, 323, 324, 325, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 327, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 329, + 330, 232, 240, 241, 255, 256, 259, 260, + 266, 279, 286, 293, 300, 301, 309, 317, + 332, 232, 240, 241, 255, 256, 259, 260, + 266, 279, 286, 293, 300, 301, 333, 317, + 334, 335, 336, 337, 338, 309, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 340, 317, 341, 342, + 344, 256, 346, 347, 349, 350, 240, 256, + 286, 232, 240, 241, 255, 256, 259, 260, + 352, 279, 286, 293, 300, 301, 309, 317, + 353, 266, 355, 356, 358, 359, 232, 240, + 241, 255, 256, 259, 260, 266, 279, 286, + 293, 300, 301, 309, 317, 361, 362, 364, + 365, 366, 232, 240, 241, 255, 256, 259, + 260, 266, 279, 286, 293, 300, 301, 309, + 317, 369, 370, 371, 372, 373, 374, 375, + 232, 240, 241, 255, 256, 259, 260, 266, + 279, 286, 293, 300, 301, 309, 317, 232, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 55, 95, 232, 377, + 5, 379, 380, 382, 383, 23, 386, 40, + 45, 392, 393, 55, 397, 232, 377, 5, + 379, 380, 382, 383, 23, 386, 40, 45, + 392, 393, 55, 87, 89, 397, 232, 377, + 18, 379, 380, 382, 383, 23, 386, 40, + 45, 392, 393, 55, 397, 80, 232, 377, + 5, 379, 380, 382, 383, 23, 386, 40, + 45, 392, 393, 55, 397, 232, 377, 5, + 379, 380, 382, 383, 85, 23, 386, 40, + 45, 392, 393, 55, 397, 232, 19, 5, + 379, 82, 382, 383, 23, 386, 409, 45, + 392, 393, 55, 397, 232, 377, 5, 379, + 380, 382, 383, 23, 386, 40, 45, 392, + 393, 55, 397, 232, 377, 5, 379, 380, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 35, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 380, 232, 377, 5, 379, 380, 382, + 383, 42, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 47, 386, 40, 45, 392, 393, 55, + 397, 23, 5, 232, 377, 5, 379, 50, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 79, 397, 232, 377, 5, 379, 380, + 382, 383, 51, 23, 386, 40, 45, 392, + 393, 55, 397, 232, 377, 5, 379, 380, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 62, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 232, 377, 5, 379, 380, 382, 383, + 23, 386, 40, 45, 392, 393, 55, 397, + 232, 377, 5, 379, 380, 382, 383, 23, + 386, 40, 45, 392, 393, 55, 397, 232, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 72, 397, 55, 232, + 377, 5, 379, 380, 382, 383, 23, 386, + 40, 45, 392, 393, 55, 77, 397, 380, + 377, 380, 40, 232, 377, 5, 379, 380, + 382, 383, 84, 386, 40, 45, 392, 393, + 55, 397, 23, 232, 377, 5, 379, 380, + 382, 383, 23, 386, 40, 45, 392, 393, + 55, 397, 232, 377, 5, 379, 380, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 98, 232, 377, 5, 379, 380, 382, + 383, 23, 386, 40, 45, 392, 393, 55, + 397, 232, 418, 419, 507, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 652, 454, 232, + 418, 419, 103, 453, 454, 232, 419, 103, + 453, 454, 232, 421, 422, 423, 447, 449, + 113, 232, 421, 422, 232, 422, 424, 430, + 436, 232, 422, 424, 425, 430, 436, 426, + 427, 428, 429, 431, 432, 433, 434, 435, + 437, 442, 443, 438, 439, 440, 441, 232, + 422, 424, 430, 436, 232, 422, 444, 430, + 436, 445, 446, 424, 232, 422, 447, 104, + 449, 113, 108, 232, 422, 447, 449, 113, + 232, 422, 119, 449, 113, 447, 232, 103, + 453, 454, 420, 455, 232, 423, 456, 458, + 460, 484, 490, 496, 232, 457, 456, 458, + 459, 423, 458, 423, 460, 461, 467, 473, + 232, 458, 461, 462, 467, 473, 463, 464, + 465, 466, 468, 469, 470, 471, 472, 474, + 479, 480, 475, 476, 477, 478, 232, 458, + 461, 467, 473, 232, 458, 481, 467, 473, + 482, 483, 461, 232, 458, 484, 485, 490, + 496, 486, 487, 488, 489, 491, 492, 493, + 494, 495, 497, 502, 503, 498, 499, 500, + 501, 232, 458, 484, 490, 496, 232, 458, + 504, 490, 496, 505, 506, 484, 508, 511, + 515, 521, 526, 530, 536, 540, 548, 552, + 560, 565, 568, 570, 509, 510, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 512, 513, 514, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 516, + 641, 517, 518, 519, 520, 640, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 522, 635, 523, 524, 525, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 527, 528, 529, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 531, + 532, 533, 534, 535, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 537, + 632, 538, 539, 631, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 541, + 542, 543, 544, 545, 546, 627, 547, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 549, 550, 551, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 553, 611, 558, 554, 604, 606, 555, 556, + 557, 559, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 561, 562, 563, + 564, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 566, 572, 586, 589, + 567, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 569, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 571, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 573, 574, 582, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 575, 576, 577, 578, 579, 580, + 581, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 583, 584, 585, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 587, 588, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 590, + 591, 592, 593, 595, 601, 594, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 596, 599, 597, 598, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 600, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 602, 603, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 605, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 607, + 548, 552, 560, 565, 568, 570, 453, 454, + 608, 609, 610, 540, 612, 613, 614, 615, + 616, 618, 622, 617, 232, 419, 103, 508, + 511, 515, 521, 526, 530, 536, 540, 548, + 552, 560, 565, 568, 570, 453, 454, 619, + 620, 621, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 623, 624, 625, + 626, 232, 419, 103, 508, 511, 515, 521, + 526, 530, 536, 540, 548, 552, 560, 565, + 568, 570, 453, 454, 628, 629, 630, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 232, 419, 103, 508, 511, 515, + 521, 526, 530, 536, 540, 548, 552, 560, + 565, 568, 570, 453, 454, 633, 634, 232, + 419, 103, 508, 511, 515, 521, 526, 530, + 536, 540, 548, 552, 560, 565, 568, 570, + 453, 454, 636, 637, 638, 639, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 642, 645, 643, 644, 232, 419, 103, + 508, 511, 515, 521, 526, 530, 536, 540, + 548, 552, 560, 565, 568, 570, 453, 454, + 646, 647, 648, 649, 650, 651, 232, 419, + 103, 508, 511, 515, 521, 526, 530, 536, + 540, 548, 552, 560, 565, 568, 570, 453, + 454, 687, 689, 692, 706, 715, 718, 723, + 728, 738, 741, 766, 770, 796, 797, 232, + 419, 103, 121, 123, 126, 131, 135, 138, + 143, 146, 153, 156, 163, 167, 169, 170, + 453, 454, 232, 419, 103, 121, 123, 126, + 131, 135, 138, 143, 146, 153, 156, 163, + 167, 169, 170, 453, 454, 232, 419, 103, + 121, 123, 126, 131, 135, 138, 143, 146, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 232, 419, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 454, 232, 419, + 103, 121, 123, 126, 131, 135, 138, 143, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, + 135, 138, 143, 146, 153, 156, 163, 167, + 169, 170, 453, 454, 232, 419, 103, 121, + 123, 126, 131, 135, 138, 143, 146, 153, + 156, 163, 167, 169, 170, 453, 454, 232, + 419, 103, 121, 123, 126, 131, 135, 138, + 143, 146, 153, 156, 163, 167, 169, 170, + 453, 454, 232, 419, 103, 121, 123, 126, + 131, 135, 138, 143, 146, 153, 156, 163, + 167, 169, 170, 453, 454, 232, 419, 103, + 121, 123, 126, 131, 135, 138, 143, 146, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 232, 419, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 454, 232, 419, + 103, 121, 123, 126, 131, 135, 138, 143, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, + 135, 138, 143, 146, 153, 156, 163, 167, + 169, 170, 453, 454, 232, 419, 103, 121, + 123, 126, 131, 135, 138, 143, 146, 153, + 156, 163, 167, 169, 170, 453, 454, 232, + 419, 103, 121, 123, 126, 131, 135, 138, + 143, 146, 153, 156, 163, 167, 169, 170, + 453, 454, 232, 419, 103, 121, 123, 126, + 131, 135, 138, 143, 146, 153, 156, 163, + 167, 169, 170, 453, 454, 232, 419, 103, + 121, 123, 126, 131, 135, 138, 143, 146, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 232, 419, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 454, 232, 419, + 103, 121, 123, 126, 131, 135, 138, 143, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, + 135, 138, 143, 146, 153, 156, 163, 167, + 169, 170, 453, 454, 232, 419, 103, 121, + 123, 126, 131, 135, 138, 143, 196, 153, + 156, 163, 167, 169, 170, 453, 454, 146, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 232, 419, 103, 121, 123, + 126, 131, 135, 138, 143, 146, 153, 156, + 163, 167, 169, 170, 453, 454, 232, 419, + 103, 121, 123, 126, 131, 135, 138, 143, + 146, 153, 156, 163, 167, 169, 170, 453, + 454, 232, 419, 103, 121, 123, 126, 131, + 135, 138, 143, 146, 153, 156, 163, 167, + 169, 170, 453, 454, 232, 419, 103, 121, + 123, 126, 131, 135, 138, 143, 146, 153, + 156, 163, 167, 169, 170, 453, 454, 232, + 419, 103, 121, 123, 126, 131, 135, 138, + 143, 146, 153, 156, 163, 167, 169, 170, + 453, 454, 232, 419, 103, 121, 123, 126, + 131, 135, 138, 143, 146, 153, 156, 163, + 167, 169, 170, 453, 454, 232, 419, 103, + 121, 123, 126, 131, 135, 138, 143, 146, + 153, 156, 163, 167, 169, 170, 453, 454, + 232, 419, 103, 121, 123, 126, 131, 135, + 138, 143, 146, 153, 156, 163, 167, 169, + 170, 453, 454, 688, 690, 691, 693, 697, + 694, 695, 696, 698, 700, 699, 701, 702, + 703, 704, 705, 707, 710, 708, 709, 711, + 712, 713, 714, 716, 717, 719, 720, 721, + 722, 724, 726, 725, 727, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 739, 740, + 742, 753, 747, 743, 748, 749, 744, 745, + 746, 750, 751, 752, 754, 755, 756, 757, + 758, 759, 762, 760, 761, 763, 764, 765, + 767, 768, 769, 771, 772, 783, 785, 773, + 780, 774, 775, 776, 777, 778, 779, 781, + 782, 784, 786, 787, 788, 789, 790, 794, + 791, 793, 792, 795, 232, 799, 232, 800, + 232, 232, 800 +}; + +static const short _demo_machine_parser_cmd_trans_actions[] = { + 0, 0, 472, 164, 164, 5, 0, 135, + 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, + 135, 0, 0, 0, 135, 0, 135, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 0, 135, + 0, 0, 135, 0, 135, 0, 0, 135, + 135, 135, 0, 0, 0, 135, 0, 0, + 0, 135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 135, 135, + 0, 135, 135, 0, 0, 0, 0, 135, + 0, 135, 135, 0, 135, 0, 135, 135, + 0, 135, 0, 135, 0, 135, 0, 0, + 135, 0, 0, 135, 0, 0, 0, 135, + 135, 141, 135, 0, 0, 0, 135, 0, + 0, 0, 0, 0, 135, 135, 0, 0, + 0, 0, 0, 135, 0, 135, 0, 0, + 135, 0, 0, 0, 0, 0, 135, 135, + 0, 0, 0, 0, 135, 0, 0, 135, + 0, 0, 0, 0, 135, 0, 0, 0, + 135, 135, 0, 0, 0, 0, 0, 0, + 0, 135, 0, 0, 135, 0, 0, 0, + 0, 0, 135, 0, 0, 0, 135, 0, + 0, 0, 135, 0, 0, 0, 0, 135, + 135, 135, 135, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 135, 0, + 135, 0, 0, 0, 0, 0, 0, 135, + 0, 0, 0, 135, 135, 0, 135, 135, + 0, 0, 135, 0, 0, 0, 0, 0, + 0, 0, 135, 0, 0, 135, 0, 0, + 0, 135, 0, 0, 135, 0, 135, 0, + 0, 0, 0, 0, 0, 0, 135, 0, + 0, 0, 0, 0, 135, 0, 137, 0, + 0, 0, 0, 0, 460, 1, 167, 0, + 1025, 0, 1, 476, 0, 464, 1, 1, + 135, 0, 135, 135, 135, 135, 0, 135, + 0, 0, 135, 135, 0, 135, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 488, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 496, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 508, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 0, 0, 19, 516, 23, 0, + 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 0, 0, 512, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 520, 25, 25, + 25, 25, 25, 25, 0, 25, 25, 25, + 25, 25, 25, 25, 25, 528, 0, 29, + 29, 0, 29, 29, 29, 29, 0, 29, + 29, 29, 29, 0, 29, 0, 0, 0, + 524, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 536, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 540, 35, 35, 35, 0, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 0, 0, 0, 0, 0, 35, 0, + 0, 544, 37, 37, 37, 37, 37, 37, + 0, 37, 37, 37, 37, 37, 37, 37, + 37, 0, 0, 0, 0, 0, 548, 39, + 39, 39, 39, 39, 39, 0, 39, 39, + 39, 39, 39, 39, 39, 0, 0, 0, + 39, 23, 560, 45, 45, 45, 0, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 0, 45, 0, 0, 552, 41, 41, 41, + 41, 41, 41, 0, 41, 41, 41, 41, + 41, 41, 41, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 564, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 584, 57, 57, 57, 57, 57, + 57, 0, 57, 57, 57, 57, 57, 57, + 57, 57, 0, 0, 0, 0, 0, 0, + 568, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 0, + 572, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 0, + 0, 576, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 0, 580, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 55, + 0, 0, 0, 0, 0, 55, 556, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 0, 43, 0, 0, + 0, 45, 0, 0, 0, 0, 29, 29, + 29, 532, 31, 31, 31, 31, 31, 31, + 0, 31, 31, 31, 31, 31, 31, 31, + 0, 31, 0, 0, 0, 0, 504, 17, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 0, 0, 0, + 0, 0, 500, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 0, 0, + 492, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 173, + 269, 9, 269, 269, 269, 269, 9, 269, + 9, 9, 269, 269, 9, 0, 179, 275, + 13, 275, 275, 275, 275, 13, 275, 13, + 13, 275, 275, 13, 275, 188, 284, 19, + 284, 284, 284, 284, 19, 284, 19, 19, + 284, 284, 19, 0, 0, 284, 194, 290, + 0, 290, 290, 290, 290, 23, 290, 23, + 23, 290, 290, 23, 290, 0, 191, 287, + 21, 287, 287, 287, 287, 21, 287, 21, + 21, 287, 287, 21, 287, 197, 293, 25, + 293, 293, 293, 293, 0, 25, 293, 25, + 25, 293, 293, 25, 293, 203, 0, 29, + 299, 0, 299, 299, 29, 299, 135, 29, + 299, 299, 29, 299, 200, 296, 27, 296, + 296, 296, 296, 27, 296, 27, 27, 296, + 296, 27, 296, 209, 305, 33, 305, 305, + 305, 305, 33, 305, 33, 33, 305, 305, + 33, 305, 212, 308, 35, 308, 0, 308, + 308, 35, 308, 35, 35, 308, 308, 35, + 308, 308, 215, 311, 37, 311, 311, 311, + 311, 0, 37, 311, 37, 37, 311, 311, + 37, 311, 218, 314, 39, 314, 314, 314, + 314, 0, 314, 39, 39, 314, 314, 39, + 314, 39, 23, 227, 323, 45, 323, 0, + 323, 323, 45, 323, 45, 45, 323, 323, + 45, 0, 323, 221, 317, 41, 317, 317, + 317, 317, 0, 41, 317, 41, 41, 317, + 317, 41, 317, 230, 326, 47, 326, 326, + 326, 326, 47, 326, 47, 47, 326, 326, + 47, 326, 245, 341, 57, 341, 341, 341, + 341, 0, 57, 341, 57, 57, 341, 341, + 57, 341, 233, 329, 49, 329, 329, 329, + 329, 49, 329, 49, 49, 329, 329, 49, + 329, 236, 332, 51, 332, 332, 332, 332, + 51, 332, 51, 51, 332, 332, 51, 332, + 239, 335, 53, 335, 335, 335, 335, 53, + 335, 53, 53, 335, 335, 53, 335, 242, + 338, 55, 338, 338, 338, 338, 55, 338, + 55, 55, 338, 338, 0, 338, 55, 224, + 320, 43, 320, 320, 320, 320, 43, 320, + 43, 43, 320, 320, 43, 0, 320, 323, + 299, 299, 29, 206, 302, 31, 302, 302, + 302, 302, 0, 302, 31, 31, 302, 302, + 31, 302, 31, 185, 281, 17, 281, 281, + 281, 281, 17, 281, 17, 17, 281, 281, + 17, 281, 182, 278, 15, 278, 278, 278, + 278, 15, 278, 15, 15, 278, 278, 15, + 278, 0, 176, 272, 11, 272, 272, 272, + 272, 11, 272, 11, 11, 272, 272, 11, + 272, 1638, 736, 1240, 736, 1035, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 1240, 1240, 1035, 1434, + 135, 263, 480, 740, 480, 1020, 135, 143, + 257, 143, 1030, 1, 146, 1, 135, 135, + 0, 484, 0, 7, 152, 0, 0, 0, + 0, 1235, 254, 129, 0, 129, 129, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1230, + 251, 127, 127, 127, 1225, 248, 0, 125, + 125, 0, 0, 125, 728, 129, 449, 0, + 449, 129, 0, 724, 127, 446, 446, 127, + 720, 125, 0, 443, 125, 443, 468, 3, + 135, 3, 260, 260, 1410, 155, 1, 732, + 155, 135, 135, 135, 1040, 3, 0, 266, + 3, 0, 135, 3, 3, 0, 0, 0, + 1428, 1016, 129, 0, 129, 129, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1422, 1012, + 127, 127, 127, 1416, 1008, 0, 125, 125, + 0, 0, 125, 1055, 449, 449, 135, 449, + 449, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 1050, 446, 446, 446, 446, 1045, 443, + 135, 443, 443, 135, 135, 443, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, + 736, 736, 736, 736, 135, 135, 1645, 748, + 1060, 344, 344, 344, 344, 344, 344, 344, + 344, 344, 344, 344, 344, 344, 344, 1245, + 1060, 135, 135, 135, 1652, 756, 1065, 347, + 347, 347, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 1250, 1065, 135, + 135, 135, 135, 135, 135, 135, 1659, 764, + 1070, 350, 350, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 1255, + 1070, 135, 135, 135, 135, 135, 1687, 796, + 1090, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 1275, + 1090, 135, 135, 135, 1701, 812, 1100, 368, + 368, 368, 368, 368, 368, 368, 368, 368, + 368, 368, 368, 368, 368, 1285, 1100, 135, + 135, 135, 135, 135, 1708, 820, 1105, 371, + 371, 371, 371, 371, 371, 371, 371, 371, + 371, 371, 371, 371, 371, 1290, 1105, 135, + 135, 135, 135, 135, 1715, 828, 1110, 374, + 374, 374, 374, 374, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 1295, 1110, 135, + 135, 135, 135, 135, 135, 135, 135, 1736, + 852, 1125, 383, 383, 383, 383, 383, 383, + 383, 383, 383, 383, 383, 383, 383, 383, + 1310, 1125, 135, 135, 135, 1750, 868, 1135, + 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 1320, 1135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 1757, 876, 1140, 392, 392, 392, + 392, 392, 392, 392, 392, 392, 392, 392, + 392, 392, 392, 1325, 1140, 135, 135, 135, + 135, 1799, 924, 1170, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 1355, 1170, 135, 135, 135, 135, + 135, 1806, 932, 1175, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 1360, 1175, 135, 1869, 1004, 1220, + 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 1405, 1220, + 135, 1694, 804, 1095, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 1280, 1095, 135, 135, 135, 1813, + 940, 1180, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, + 1365, 1180, 135, 135, 135, 135, 135, 135, + 135, 1820, 948, 1185, 419, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 1370, 1185, 135, 135, 135, 1827, + 956, 1190, 422, 422, 422, 422, 422, 422, + 422, 422, 422, 422, 422, 422, 422, 422, + 1375, 1190, 135, 135, 1834, 964, 1195, 425, + 425, 425, 425, 425, 425, 425, 425, 425, + 425, 425, 425, 425, 425, 1380, 1195, 135, + 135, 135, 135, 135, 135, 135, 1841, 972, + 1200, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 1385, + 1200, 135, 135, 135, 135, 1855, 988, 1210, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 1395, 1210, + 135, 1848, 980, 1205, 431, 431, 431, 431, + 431, 431, 431, 431, 431, 431, 431, 431, + 431, 431, 1390, 1205, 135, 135, 1862, 996, + 1215, 437, 437, 437, 437, 437, 437, 437, + 437, 437, 437, 437, 437, 437, 437, 1400, + 1215, 135, 1764, 884, 1145, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 1330, 1145, 1771, 892, 1150, + 398, 398, 398, 398, 398, 398, 398, 135, + 398, 398, 398, 398, 398, 398, 1335, 1150, + 135, 135, 135, 398, 135, 135, 135, 135, + 135, 135, 135, 135, 1778, 900, 1155, 401, + 401, 401, 401, 401, 401, 401, 401, 401, + 401, 401, 401, 401, 401, 1340, 1155, 135, + 135, 135, 1785, 908, 1160, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 404, 404, + 404, 404, 404, 1345, 1160, 135, 135, 135, + 135, 1792, 916, 1165, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 1350, 1165, 135, 135, 135, 1743, + 860, 1130, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, + 1315, 1130, 1722, 836, 1115, 377, 377, 377, + 377, 377, 377, 377, 377, 377, 377, 377, + 377, 377, 377, 1300, 1115, 135, 135, 1729, + 844, 1120, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, + 1305, 1120, 135, 135, 135, 135, 1666, 772, + 1075, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 1260, + 1075, 135, 135, 135, 135, 1673, 780, 1080, + 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 356, 356, 356, 1265, 1080, + 135, 135, 135, 135, 135, 135, 1680, 788, + 1085, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 1270, + 1085, 736, 736, 736, 736, 736, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 1440, + 344, 588, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, + 744, 588, 1446, 347, 592, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 752, 592, 1452, 350, 596, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 760, 596, + 1476, 362, 612, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 792, 612, 1488, 368, 620, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 808, 620, 1494, 371, + 624, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 816, + 624, 1500, 374, 628, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 824, 628, 1518, 383, 640, 85, + 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 848, 640, 1530, + 389, 648, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, + 864, 648, 1536, 392, 652, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 872, 652, 1572, 410, 676, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 920, 676, + 1578, 413, 680, 105, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, + 105, 928, 680, 1632, 440, 716, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 1000, 716, 1482, 365, + 616, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 800, + 616, 1584, 416, 684, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 936, 684, 1590, 419, 688, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 944, 688, 1596, + 422, 692, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, + 952, 692, 1602, 425, 696, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 960, 696, 1608, 428, 700, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 968, 700, + 1620, 434, 708, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 119, 984, 708, 1614, 431, 704, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 976, 704, 1626, 437, + 712, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 992, + 712, 1542, 395, 656, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 880, 656, 1548, 398, 660, 95, + 95, 95, 95, 95, 95, 95, 0, 95, + 95, 95, 95, 95, 95, 888, 660, 95, + 1554, 401, 664, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, + 97, 896, 664, 1560, 404, 668, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 904, 668, 1566, 407, + 672, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 912, + 672, 1524, 386, 644, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 856, 644, 1506, 377, 632, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 832, 632, 1512, + 380, 636, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, + 840, 636, 1458, 353, 600, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 768, 600, 1464, 356, 604, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 776, 604, + 1470, 359, 608, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 784, 608, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 456, 0, 452, 1, + 161, 158, 0 +}; + +static const short _demo_machine_parser_cmd_to_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 131, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 +}; + +static const short _demo_machine_parser_cmd_from_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 133, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 +}; + +static const short _demo_machine_parser_cmd_eof_trans[] = { + 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 0, + 0, 269, 271, 273, 276, 278, 295, 278, + 311, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 342, 357, + 374, 295, 391, 406, 422, 295, 295, 295, + 295, 441, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 468, 483, + 295, 295, 295, 295, 295, 483, 295, 295, + 506, 295, 295, 295, 506, 295, 295, 527, + 295, 295, 295, 527, 374, 547, 295, 565, + 295, 295, 295, 295, 565, 295, 295, 295, + 295, 295, 295, 295, 596, 611, 295, 295, + 295, 611, 295, 295, 295, 633, 295, 649, + 295, 295, 666, 295, 682, 295, 295, 295, + 295, 295, 682, 703, 295, 295, 703, 295, + 547, 295, 295, 374, 295, 295, 422, 730, + 295, 730, 295, 295, 406, 295, 295, 751, + 295, 295, 357, 295, 295, 295, 771, 295, + 295, 295, 295, 311, 295, 295, 295, 295, + 793, 808, 823, 838, 855, 871, 886, 902, + 917, 932, 947, 947, 963, 963, 979, 979, + 855, 996, 1012, 1012, 1028, 1043, 1043, 1059, + 1074, 1089, 1104, 1104, 1120, 1120, 996, 855, + 902, 1140, 1140, 886, 1156, 838, 1171, 808, + 1187, 1202, 1224, 1230, 1235, 1242, 1245, 1235, + 1250, 1242, 1242, 1242, 1242, 1250, 1250, 1242, + 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, + 1242, 1242, 1272, 1277, 1242, 1242, 1277, 1285, + 1285, 1285, 1292, 1297, 1297, 1303, 1303, 1309, + 1317, 1242, 1303, 1317, 1309, 1329, 1317, 1317, + 1317, 1317, 1329, 1329, 1317, 1317, 1317, 1317, + 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1351, + 1356, 1317, 1317, 1356, 1364, 1303, 1303, 1303, + 1303, 1364, 1364, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1386, 1391, + 1303, 1303, 1391, 1202, 1224, 1224, 1415, 1224, + 1224, 1224, 1437, 1224, 1224, 1224, 1224, 1224, + 1463, 1224, 1224, 1224, 1224, 1487, 1224, 1224, + 1224, 1509, 1224, 1224, 1224, 1224, 1224, 1533, + 1224, 1224, 1224, 1557, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1584, 1224, 1224, 1224, 1606, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1635, + 1224, 1224, 1224, 1224, 1658, 1224, 1224, 1682, + 1224, 1702, 1224, 1722, 1224, 1744, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1770, 1224, 1224, + 1224, 1792, 1224, 1224, 1813, 1224, 1224, 1224, + 1224, 1224, 1839, 1224, 1224, 1224, 1862, 1224, + 1882, 1224, 1224, 1903, 1224, 1923, 1942, 1224, + 1224, 1224, 1942, 1224, 1224, 1224, 1224, 1224, + 1224, 1973, 1224, 1224, 1224, 1995, 1224, 1224, + 1224, 1224, 2018, 1224, 1224, 1224, 2040, 2059, + 1224, 1224, 2080, 1224, 1224, 1224, 1224, 1224, + 2103, 1224, 1224, 1224, 2126, 1224, 1224, 1224, + 1224, 1224, 1224, 2151, 1202, 2184, 2203, 2222, + 2241, 2260, 2279, 2298, 2317, 2336, 2355, 2374, + 2393, 2412, 2431, 2450, 2469, 2488, 2507, 2526, + 2545, 2564, 2583, 2602, 2621, 2621, 2641, 2660, + 2679, 2698, 2717, 2736, 2755, 2774, 2793, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 2621, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, + 1303, 1303, 1303, 1303, 1303, 1303, 2909, 2909, + 2913 +}; + +static const int demo_machine_parser_cmd_start = 232; +static const int demo_machine_parser_cmd_first_final = 232; +static const int demo_machine_parser_cmd_error = 0; + +static const int demo_machine_parser_cmd_en_main = 232; + + +/* #line 332 "./dssl.rl" */ + +/* #line 4439 "./dssl.c" */ + { + cs = demo_machine_parser_cmd_start; + ts = 0; + te = 0; + act = 0; + } + +/* #line 333 "./dssl.rl" */ + + /* default values */ + *comment = tsk_false; + + /* only parse one line */ + if((index = tsk_strindexOf(p, size, "\n")) != -1){ + pe = eof = (p + index + 1/*\n*/); + } + else{ + pe = eof = p + size; + } + + /* exec */ + +/* #line 4462 "./dssl.c" */ + { + int _klen; + unsigned int _trans; + short _widec; + const char *_acts; + unsigned int _nacts; + const short *_keys; + + if ( p == pe ) + goto _test_eof; + if ( cs == 0 ) + goto _out; +_resume: + _acts = _demo_machine_parser_cmd_actions + _demo_machine_parser_cmd_from_state_actions[cs]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) { + switch ( *_acts++ ) { + case 75: +/* #line 1 "./dssl.rl" */ + {ts = p;} + break; +/* #line 4484 "./dssl.c" */ + } + } + + _widec = (*p); + _klen = _demo_machine_parser_cmd_cond_lengths[cs]; + _keys = _demo_machine_parser_cmd_cond_keys + (_demo_machine_parser_cmd_cond_offsets[cs]*2); + if ( _klen > 0 ) { + const short *_lower = _keys; + const short *_mid; + const short *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( _widec < _mid[0] ) + _upper = _mid - 2; + else if ( _widec > _mid[1] ) + _lower = _mid + 2; + else { + switch ( _demo_machine_parser_cmd_cond_spaces[_demo_machine_parser_cmd_cond_offsets[cs] + ((_mid - _keys)>>1)] ) { + case 0: { + _widec = (short)(128 + ((*p) - -128)); + if ( +/* #line 187 "./dssl.rl" */ + + next_not_hyphens(p, pe) + && next_not_arobases(p, pe) + && next_not_percents(p, pe) + && next_not_redirs(p, pe) + && (p && *p != '\n') + && (p && *p != '#') + ) _widec += 256; + break; + } + case 1: { + _widec = (short)(640 + ((*p) - -128)); + if ( +/* #line 196 "./dssl.rl" */ + + (p && *p != '\n') + ) _widec += 256; + break; + } + } + break; + } + } + } + + _keys = _demo_machine_parser_cmd_trans_keys + _demo_machine_parser_cmd_key_offsets[cs]; + _trans = _demo_machine_parser_cmd_index_offsets[cs]; + + _klen = _demo_machine_parser_cmd_single_lengths[cs]; + if ( _klen > 0 ) { + const short *_lower = _keys; + const short *_mid; + const short *_upper = _keys + _klen - 1; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _widec < *_mid ) + _upper = _mid - 1; + else if ( _widec > *_mid ) + _lower = _mid + 1; + else { + _trans += (_mid - _keys); + goto _match; + } + } + _keys += _klen; + _trans += _klen; + } + + _klen = _demo_machine_parser_cmd_range_lengths[cs]; + if ( _klen > 0 ) { + const short *_lower = _keys; + const short *_mid; + const short *_upper = _keys + (_klen<<1) - 2; + while (1) { + if ( _upper < _lower ) + break; + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( _widec < _mid[0] ) + _upper = _mid - 2; + else if ( _widec > _mid[1] ) + _lower = _mid + 2; + else { + _trans += ((_mid - _keys)>>1); + goto _match; + } + } + _trans += _klen; + } + +_match: + _trans = _demo_machine_parser_cmd_indicies[_trans]; +_eof_trans: + cs = _demo_machine_parser_cmd_trans_targs[_trans]; + + if ( _demo_machine_parser_cmd_trans_actions[_trans] == 0 ) + goto _again; + + _acts = _demo_machine_parser_cmd_actions + _demo_machine_parser_cmd_trans_actions[_trans]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) + { + switch ( *_acts++ ) + { + case 0: +/* #line 86 "./dssl.rl" */ + { + tag_start = p; +#if DEBUG_PARSER + // - TSK_DEBUG_INFO("tag=%s", tag_start); +#endif + } + break; + case 1: +/* #line 93 "./dssl.rl" */ + { +#if DEBUG_PARSER + TSK_DEBUG_INFO("create_option"); +#endif + TSK_OBJECT_SAFE_FREE(opt); + opt = opt_create_null(); + } + break; + case 2: +/* #line 101 "./dssl.rl" */ + { +#if DEBUG_PARSER + TSK_DEBUG_INFO("add_option"); +#endif + tsk_list_push_back_data(cmd->opts, (void**)&opt); + } + break; + case 3: +/* #line 108 "./dssl.rl" */ + { + if(opt){ + int index_1, index_2; + char* newval = tsk_null; + TSK_PARSER_SET_STRING(opt->value); + /* trim both: left and right */ + tsk_strtrim_both(&opt->value); + /* replace params */ +replace: + if((index_1 = tsk_strindexOf(opt->value, tsk_strlen(opt->value), "$$")) != -1){ + if((index_2 = tsk_strindexOf((opt->value + index_1), tsk_strlen((opt->value + index_1)), " ")) != -1){ + newval = replace_param(opt->value, index_1, (index_1 + index_2), params); + } + else{ + newval = replace_param(opt->value, index_1, tsk_strlen(opt->value), params); + } + if(newval){ + TSK_FREE(opt->value); + opt->value = newval; + + /* again */ + goto replace; + } + } +#if DEBUG_PARSER + TSK_DEBUG_INFO("set_opt_value [%d] '%s'", opt->type, opt->value); +#endif + } + } + break; + case 4: +/* #line 138 "./dssl.rl" */ + { + TSK_PARSER_SET_STRING(cmd->sidparam); +#if DEBUG_PARSER + TSK_DEBUG_INFO("set_sidparam_value '%s'", cmd->sidparam); +#endif + } + break; + case 5: +/* #line 145 "./dssl.rl" */ + { +#if DEBUG_PARSER + TSK_DEBUG_INFO("create_param"); +#endif + TSK_OBJECT_SAFE_FREE(param); + param = tsk_param_create_null(); + } + break; + case 6: +/* #line 153 "./dssl.rl" */ + { +#if DEBUG_PARSER + TSK_DEBUG_INFO("add_param"); +#endif + tsk_params_add_param_2(¶ms, param); + TSK_OBJECT_SAFE_FREE(param); + } + break; + case 7: +/* #line 161 "./dssl.rl" */ + { + if(param){ + TSK_PARSER_SET_STRING(param->value); + /* trim both: left and right */ + tsk_strtrim_both(¶m->value); +#if DEBUG_PARSER + TSK_DEBUG_INFO("set_param_value [%s] '%s'", param->name, param->value); +#endif + } + } + break; + case 8: +/* #line 172 "./dssl.rl" */ + { + if(param){ + TSK_PARSER_SET_STRING(param->name); + } + } + break; + case 9: +/* #line 178 "./dssl.rl" */ + { +#if DEBUG_PARSER + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_INFO("is_comment '%s'", temp); +#endif + // *comment = tsk_true; + // TSK_OBJECT_SAFE_FREE(opts); + } + break; + case 10: +/* #line 200 "./dssl.rl" */ + { + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_ERROR("'%s' is not a valid option.", temp); + } + break; + case 11: +/* #line 205 "./dssl.rl" */ + { + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_ERROR("'%s' is not a valid command.", temp); + } + break; + case 12: +/* #line 210 "./dssl.rl" */ + { + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_ERROR("'%s' is not a valid level.", temp); + } + break; + case 13: +/* #line 227 "./dssl.rl" */ + { cmd->type = cmd_audio; } + break; + case 14: +/* #line 228 "./dssl.rl" */ + { cmd->type = cmd_audiovideo; } + break; + case 15: +/* #line 229 "./dssl.rl" */ + { cmd->type = cmd_config_session; } + break; + case 16: +/* #line 230 "./dssl.rl" */ + { cmd->type = cmd_config_stack; } + break; + case 17: +/* #line 231 "./dssl.rl" */ + { cmd->type = cmd_dtmf; } + break; + case 18: +/* #line 232 "./dssl.rl" */ + { cmd->type = cmd_dump; } + break; + case 19: +/* #line 233 "./dssl.rl" */ + { cmd->type = cmd_ect; } + break; + case 20: +/* #line 234 "./dssl.rl" */ + { cmd->type = cmd_exit; } + break; + case 21: +/* #line 235 "./dssl.rl" */ + { cmd->type = cmd_file; } + break; + case 22: +/* #line 236 "./dssl.rl" */ + { cmd->type = cmd_hangup; } + break; + case 23: +/* #line 237 "./dssl.rl" */ + { cmd->type = cmd_help; } + break; + case 24: +/* #line 238 "./dssl.rl" */ + { cmd->type = cmd_hold; } + break; + case 25: +/* #line 239 "./dssl.rl" */ + { cmd->type = cmd_large_message; } + break; + case 26: +/* #line 240 "./dssl.rl" */ + { cmd->type = cmd_message; } + break; + case 27: +/* #line 241 "./dssl.rl" */ + { cmd->type = cmd_options; } + break; + case 28: +/* #line 242 "./dssl.rl" */ + { cmd->type = cmd_publish; } + break; + case 29: +/* #line 243 "./dssl.rl" */ + { cmd->type = cmd_register; } + break; + case 30: +/* #line 244 "./dssl.rl" */ + { cmd->type = cmd_resume; } + break; + case 31: +/* #line 245 "./dssl.rl" */ + { cmd->type = cmd_run; } + break; + case 32: +/* #line 246 "./dssl.rl" */ + { cmd->type = cmd_scenario; } + break; + case 33: +/* #line 247 "./dssl.rl" */ + { cmd->type = cmd_sleep; } + break; + case 34: +/* #line 248 "./dssl.rl" */ + { cmd->type = cmd_sms; } + break; + case 35: +/* #line 249 "./dssl.rl" */ + { cmd->type = cmd_stop; } + break; + case 36: +/* #line 250 "./dssl.rl" */ + { cmd->type = cmd_subscribe; } + break; + case 37: +/* #line 251 "./dssl.rl" */ + { cmd->type = cmd_video; } + break; + case 38: +/* #line 255 "./dssl.rl" */ + { opt->type = opt_amf; } + break; + case 39: +/* #line 256 "./dssl.rl" */ + { opt->type = opt_caps; } + break; + case 40: +/* #line 257 "./dssl.rl" */ + { opt->type = opt_dhcpv4; } + break; + case 41: +/* #line 258 "./dssl.rl" */ + { opt->type = opt_dhcpv6; } + break; + case 42: +/* #line 259 "./dssl.rl" */ + { opt->type = opt_amf; } + break; + case 43: +/* #line 260 "./dssl.rl" */ + { opt->type = opt_dname; } + break; + case 44: +/* #line 261 "./dssl.rl" */ + { opt->type = opt_event; } + break; + case 45: +/* #line 262 "./dssl.rl" */ + { opt->type = opt_expires; } + break; + case 46: +/* #line 263 "./dssl.rl" */ + { opt->type = opt_from; } + break; + case 47: +/* #line 264 "./dssl.rl" */ + { opt->type = opt_header; } + break; + case 48: +/* #line 265 "./dssl.rl" */ + { opt->type = opt_impi; } + break; + case 49: +/* #line 266 "./dssl.rl" */ + { opt->type = opt_impu; } + break; + case 50: +/* #line 267 "./dssl.rl" */ + { opt->type = opt_ipv6; } + break; + case 51: +/* #line 268 "./dssl.rl" */ + { opt->type = opt_local_ip; } + break; + case 52: +/* #line 269 "./dssl.rl" */ + { opt->type = opt_local_port; } + break; + case 53: +/* #line 270 "./dssl.rl" */ + { opt->type = opt_opid; } + break; + case 54: +/* #line 271 "./dssl.rl" */ + { opt->type = opt_password; } + break; + case 55: +/* #line 272 "./dssl.rl" */ + { opt->type = opt_path; } + break; + case 56: +/* #line 273 "./dssl.rl" */ + { opt->type = opt_payload; } + break; + case 57: +/* #line 274 "./dssl.rl" */ + { opt->type = opt_pcscf_ip; } + break; + case 58: +/* #line 275 "./dssl.rl" */ + { opt->type = opt_pcscf_port; } + break; + case 59: +/* #line 276 "./dssl.rl" */ + { opt->type = opt_pcscf_trans; } + break; + case 60: +/* #line 277 "./dssl.rl" */ + { opt->type = opt_realm; } + break; + case 61: +/* #line 278 "./dssl.rl" */ + { opt->type = opt_sec; } + break; + case 62: +/* #line 279 "./dssl.rl" */ + { opt->type = opt_sid; } + break; + case 63: +/* #line 280 "./dssl.rl" */ + { opt->type = opt_sigcomp_id; } + break; + case 64: +/* #line 281 "./dssl.rl" */ + { opt->type = opt_silent; } + break; + case 65: +/* #line 282 "./dssl.rl" */ + { opt->type = opt_smsc; } + break; + case 66: +/* #line 283 "./dssl.rl" */ + { opt->type = opt_stun_ip; } + break; + case 67: +/* #line 284 "./dssl.rl" */ + { opt->type = opt_stun_pwd; } + break; + case 68: +/* #line 285 "./dssl.rl" */ + { opt->type = opt_stun_port; } + break; + case 69: +/* #line 286 "./dssl.rl" */ + { opt->type = opt_stun_usr; } + break; + case 70: +/* #line 287 "./dssl.rl" */ + { opt->type = opt_to; } + break; + case 71: +/* #line 294 "./dssl.rl" */ + { set_level(lv_stack); } + break; + case 72: +/* #line 294 "./dssl.rl" */ + { set_level(lv_session); } + break; + case 73: +/* #line 294 "./dssl.rl" */ + { set_level(lv_action); } + break; + case 76: +/* #line 1 "./dssl.rl" */ + {te = p+1;} + break; + case 77: +/* #line 307 "./dssl.rl" */ + {te = p+1;{ }} + break; + case 78: +/* #line 309 "./dssl.rl" */ + {te = p+1;{ }} + break; + case 79: +/* #line 304 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 80: +/* #line 305 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 81: +/* #line 306 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 82: +/* #line 307 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 83: +/* #line 308 "./dssl.rl" */ + {te = p;p--;{ }} + break; + case 84: +/* #line 304 "./dssl.rl" */ + {{p = ((te))-1;}{ }} + break; + case 85: +/* #line 305 "./dssl.rl" */ + {{p = ((te))-1;}{ }} + break; +/* #line 5023 "./dssl.c" */ + } + } + +_again: + _acts = _demo_machine_parser_cmd_actions + _demo_machine_parser_cmd_to_state_actions[cs]; + _nacts = (unsigned int) *_acts++; + while ( _nacts-- > 0 ) { + switch ( *_acts++ ) { + case 74: +/* #line 1 "./dssl.rl" */ + {ts = 0;} + break; +/* #line 5036 "./dssl.c" */ + } + } + + if ( cs == 0 ) + goto _out; + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _demo_machine_parser_cmd_eof_trans[cs] > 0 ) { + _trans = _demo_machine_parser_cmd_eof_trans[cs] - 1; + goto _eof_trans; + } + } + + _out: {} + } + +/* #line 347 "./dssl.rl" */ + + if( cs < +/* #line 5059 "./dssl.c" */ +232 +/* #line 348 "./dssl.rl" */ + ){ + TSK_DEBUG_ERROR("Failed to parse [%s] command-Line.", p); + TSK_OBJECT_SAFE_FREE(cmd); + } + TSK_OBJECT_SAFE_FREE(opt); + TSK_OBJECT_SAFE_FREE(param); + TSK_FREE(temp); + + return cmd; +} + diff --git a/tinyDEMO/dssl.h b/tinyDEMO/dssl.h new file mode 100644 index 0000000..172664c --- /dev/null +++ b/tinyDEMO/dssl.h @@ -0,0 +1,35 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_DSSL_H) +#define TINYDEMO_DSSL_H + +#include "demo_config.h" + +#include "cmd.h" + +_BEGIN_DECLS + +cmd_t* dssl_parse(const char *buffer, tsk_size_t size, tsk_bool_t *comment, tsk_params_L_t* params); + +_END_DECLS + +#endif /* TINYDEMO_DSSL_H */ diff --git a/tinyDEMO/dssl.rl b/tinyDEMO/dssl.rl new file mode 100644 index 0000000..cc4d104 --- /dev/null +++ b/tinyDEMO/dssl.rl @@ -0,0 +1,358 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "dssl.h" + +#include "tsk_debug.h" +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_ragel_state.h" + +#include <string.h> + +#define DEBUG_PARSER 0 + +#define set_level(_lv) if(opt) opt->lv = _lv; + +char* replace_param(char* pivot, int index_1, int index_2, tsk_params_L_t* params) +{ + char* pname = tsk_null; + char* ret = tsk_null; + const tsk_param_t* p; + //tsk_size_t len = tsk_strlen(pivot); + //tsk_bool_t parenthesis = tsk_false; + int i1, i2; + + /* whether there are parenthesis around the param */ + if((i1 = tsk_strindexOf((pivot + index_1), tsk_strlen((pivot + index_1)), "(")) == 2 + && (i2 = tsk_strindexOf((pivot + index_1 + i1), tsk_strlen((pivot + index_1 + i1)), ")")) != -1) + { + pname = tsk_strndup((pivot + index_1 + i1 + 1), (i2 - i1 + 1)); + index_2 = index_1 + i1 + i2 + 1; + } + else{ + pname = tsk_strndup((pivot + index_1 + 2/*$$*/), (index_2 - index_1 - 2)); + } + + if((p = tsk_params_get_param_by_name(params, pname))){ + tsk_strncat(&ret, pivot, index_1); + tsk_strncat(&ret, p->value, tsk_strlen(p->value)); + tsk_strncat(&ret, (pivot + index_2), (tsk_strlen(pivot) - index_2)); + } + else{ + TSK_DEBUG_WARN("Failed to find param [%s]", pname); + } + + TSK_FREE(pname); + return ret; +} + +tsk_bool_t next_not_(const char* p, const char* pe, char c) +{ + if((p && pe) && (pe-p) >=2){ + return (*p == c && *(p + 1) == c) ? tsk_false : tsk_true; + } + return tsk_true; +} +#define next_not_hyphens(p, pe) next_not_(p, pe, '-') +#define next_not_arobases(p, pe) next_not_(p, pe, '@') +#define next_not_percents(p, pe) next_not_(p, pe, '%') +#define next_not_redirs(p, pe) next_not_(p, pe, '>') + +/*********************************** +* Ragel state machine. +*/ +%%{ + machine demo_machine_parser_cmd; + + action tag{ + tag_start = p; +#if DEBUG_PARSER + // - TSK_DEBUG_INFO("tag=%s", tag_start); +#endif + } + + action create_option{ +#if DEBUG_PARSER + TSK_DEBUG_INFO("create_option"); +#endif + TSK_OBJECT_SAFE_FREE(opt); + opt = opt_create_null(); + } + + action add_option{ +#if DEBUG_PARSER + TSK_DEBUG_INFO("add_option"); +#endif + tsk_list_push_back_data(cmd->opts, (void**)&opt); + } + + action set_opt_value{ + if(opt){ + int index_1, index_2; + char* newval = tsk_null; + TSK_PARSER_SET_STRING(opt->value); + /* trim both: left and right */ + tsk_strtrim_both(&opt->value); + /* replace params */ +replace: + if((index_1 = tsk_strindexOf(opt->value, tsk_strlen(opt->value), "$$")) != -1){ + if((index_2 = tsk_strindexOf((opt->value + index_1), tsk_strlen((opt->value + index_1)), " ")) != -1){ + newval = replace_param(opt->value, index_1, (index_1 + index_2), params); + } + else{ + newval = replace_param(opt->value, index_1, tsk_strlen(opt->value), params); + } + if(newval){ + TSK_FREE(opt->value); + opt->value = newval; + + /* again */ + goto replace; + } + } +#if DEBUG_PARSER + TSK_DEBUG_INFO("set_opt_value [%d] '%s'", opt->type, opt->value); +#endif + } + } + + action set_sidparam_value{ + TSK_PARSER_SET_STRING(cmd->sidparam); +#if DEBUG_PARSER + TSK_DEBUG_INFO("set_sidparam_value '%s'", cmd->sidparam); +#endif + } + + action create_param{ +#if DEBUG_PARSER + TSK_DEBUG_INFO("create_param"); +#endif + TSK_OBJECT_SAFE_FREE(param); + param = tsk_param_create_null(); + } + + action add_param{ +#if DEBUG_PARSER + TSK_DEBUG_INFO("add_param"); +#endif + tsk_params_add_param_2(¶ms, param); + TSK_OBJECT_SAFE_FREE(param); + } + + action set_param_value{ + if(param){ + TSK_PARSER_SET_STRING(param->value); + /* trim both: left and right */ + tsk_strtrim_both(¶m->value); +#if DEBUG_PARSER + TSK_DEBUG_INFO("set_param_value [%s] '%s'", param->name, param->value); +#endif + } + } + + action set_param_name{ + if(param){ + TSK_PARSER_SET_STRING(param->name); + } + } + + action is_comment{ +#if DEBUG_PARSER + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_INFO("is_comment '%s'", temp); +#endif + // *comment = tsk_true; + // TSK_OBJECT_SAFE_FREE(opts); + } + + action next_not_reserved{ + next_not_hyphens(p, pe) + && next_not_arobases(p, pe) + && next_not_percents(p, pe) + && next_not_redirs(p, pe) + && (p && *p != '\n') + && (p && *p != '#') + } + + action next_not_newline{ + (p && *p != '\n') + } + + action option_error{ + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_ERROR("'%s' is not a valid option.", temp); + } + + action command_error{ + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_ERROR("'%s' is not a valid command.", temp); + } + + action level_error{ + TSK_PARSER_SET_STRING(temp); + TSK_DEBUG_ERROR("'%s' is not a valid level.", temp); + } + + SP = " "; + LF = "\n"; + CR = "\r"; + endline = ("\n" | "\r"); + equal = "="; + hyphens = "-" {2,}; + plusplus = "+" {2,}; + percents = "%" {2,}; + redirs = ">" {2,}; + sharp = "#"; + arobases = "@" {2,}; + + command = (("audio"i | "a"i) %{ cmd->type = cmd_audio; } | + ("audiovideo"i | "av"i) %{ cmd->type = cmd_audiovideo; } | + ("config-session"i | "css"i) %{ cmd->type = cmd_config_session; } | + ("config-stack"i | "cst"i) %{ cmd->type = cmd_config_stack; } | + ("dtmf"i) %{ cmd->type = cmd_dtmf; } | + ("dump"i | "d"i) %{ cmd->type = cmd_dump; } | + ("ect"i) %{ cmd->type = cmd_ect; } | + ("exit"i | "e"i | "quit"i | "q"i) %{ cmd->type = cmd_exit; } | + ("file"i | "f"i) %{ cmd->type = cmd_file; } | + ("hangup"i | "hu"i) %{ cmd->type = cmd_hangup; } | + ("help"i | "h"i) %{ cmd->type = cmd_help; } | + ("hold"i | "ho"i) %{ cmd->type = cmd_hold; } | + ("large-message"i | "lm"i) %{ cmd->type = cmd_large_message; } | + ("message"i | "m"i) %{ cmd->type = cmd_message; } | + ("options"i | "opt"i) %{ cmd->type = cmd_options; } | + ("publish"i | "pub"i) %{ cmd->type = cmd_publish; } | + ("register"i | "reg"i) %{ cmd->type = cmd_register; } | + ("resume"i | "res"i) %{ cmd->type = cmd_resume; } | + ("run"i | "r"i) %{ cmd->type = cmd_run; } | + ("scenario"i | "sn"i) %{ cmd->type = cmd_scenario; } | + "sleep"i %{ cmd->type = cmd_sleep; } | + "sms"i %{ cmd->type = cmd_sms; } | + "stop"i %{ cmd->type = cmd_stop; } | + ("subscribe"i | "sub"i) %{ cmd->type = cmd_subscribe; } | + ("video"i | "v"i) %{ cmd->type = cmd_video; } + )** >10 | + (any*) >tag >0 %command_error; + + key = ("amf"i % { opt->type = opt_amf; } | + "caps"i % { opt->type = opt_caps; } | + "dhcpv4"i % { opt->type = opt_dhcpv4; } | + "dhcpv6"i % { opt->type = opt_dhcpv6; } | + "dname"i % { opt->type = opt_amf; } | + "dns-naptr"i % { opt->type = opt_dname; } | + "event"i % { opt->type = opt_event; } | + ("expires"i | "xp"i) % { opt->type = opt_expires; } | + "from"i % { opt->type = opt_from; } | + "header"i % { opt->type = opt_header; } | + "impi"i % { opt->type = opt_impi; } | + "impu"i % { opt->type = opt_impu; } | + "ipv6"i % { opt->type = opt_ipv6; } | + "local-ip"i % { opt->type = opt_local_ip; } | + "local-port"i % { opt->type = opt_local_port; } | + "opid"i % { opt->type = opt_opid; } | + ("password"i | "pwd"i) % { opt->type = opt_password; } | + "path"i % { opt->type = opt_path; } | + ("payload"i | "pay"i) % { opt->type = opt_payload; } | + "pcscf-ip"i % { opt->type = opt_pcscf_ip; } | + "pcscf-port"i % { opt->type = opt_pcscf_port; } | + "pcscf-trans"i % { opt->type = opt_pcscf_trans; } | + "realm"i % { opt->type = opt_realm; } | + "sec"i % { opt->type = opt_sec; } | + "sid"i % { opt->type = opt_sid; } | + "sigcomp-id"i % { opt->type = opt_sigcomp_id; } | + "silent"i % { opt->type = opt_silent; } | + "smsc"i % { opt->type = opt_smsc; } | + "stun-ip"i % { opt->type = opt_stun_ip; } | + "stun-pwd"i % { opt->type = opt_stun_pwd; } | + "stun-port"i % { opt->type = opt_stun_port; } | + "stun-usr"i % { opt->type = opt_stun_usr; } | + "to"i % { opt->type = opt_to; } + )** >10 | + (any*) >tag >0 %option_error; + + level_stack = ("stack"i | "st"i); + level_session = ("session"i | "ss"i); + level_action= ("action"i | "request"i | "a"i | "r"i); + level = ( (level_stack %{ set_level(lv_stack); } | level_session %{ set_level(lv_session); } | level_action %{ set_level(lv_action); })** > 10 + | (any*)>tag >0 %level_error ) :> space*; + value = (any when next_not_reserved)*>tag; + option = key>tag:>SP* <:value %set_opt_value (arobases level)?; + + pname = (any when next_not_newline)*>tag %set_param_name; + pvalue = value; + param = pname :>(space | '\n')+ <:pvalue %set_param_value; + + main := |* + (plusplus command) >100 { }; + (hyphens option>create_option %add_option) >99 { }; + (percents param>create_param %add_param) >98 { }; + (redirs "("?<: value %set_sidparam_value :>")"?) >97 { }; + (sharp (any when next_not_newline)* >tag %is_comment) >96 { }; + any >0 { }; + *|; +}%% + +cmd_t* dssl_parse(const char *buffer, tsk_size_t size, tsk_bool_t *comment, tsk_params_L_t* params) +{ + int cs = 0; + const char *p = buffer; + const char *pe; + const char *eof; + opt_t* opt = tsk_null; + tsk_param_t* param = tsk_null; + cmd_t *cmd = cmd_create_null(); + char* temp = tsk_null; + int index; + + const char *ts = tsk_null, *te = tsk_null; + int act = 0; + + const char *tag_start = tsk_null; + + /* global vars and initilization (Ragel) */ + %%write data; + %%write init; + + /* default values */ + *comment = tsk_false; + + /* only parse one line */ + if((index = tsk_strindexOf(p, size, "\n")) != -1){ + pe = eof = (p + index + 1/*\n*/); + } + else{ + pe = eof = p + size; + } + + /* exec */ + %%write exec; + + if( cs < %%{ write first_final; }%% ){ + TSK_DEBUG_ERROR("Failed to parse [%s] command-Line.", p); + TSK_OBJECT_SAFE_FREE(cmd); + } + TSK_OBJECT_SAFE_FREE(opt); + TSK_OBJECT_SAFE_FREE(param); + TSK_FREE(temp); + + return cmd; +} + diff --git a/tinyDEMO/invite.c b/tinyDEMO/invite.c new file mode 100644 index 0000000..58b3925 --- /dev/null +++ b/tinyDEMO/invite.c @@ -0,0 +1,283 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "invite.h" + +#include "tinymsrp.h" + + +extern ctx_t* ctx; +extern const session_t* session_handle_cmd(cmd_type_t , const opts_L_t*); + +static int invite_msrp_cb(const tmsrp_event_t* _event); + +int invite_handle_event(const tsip_event_t *_event) +{ + const tsip_invite_event_t* inv_event = TSIP_INVITE_EVENT(_event); + const session_t* session; + tsip_ssession_id_t sid; + int ret = 0; + + /* Find associated session */ + sid = tsip_ssession_get_id(_event->ss); + if(!(session = session_get_by_sid(ctx->sessions, sid))){ + if(inv_event->type == tsip_i_newcall){ + /* It's a new incoming call */ + if(!tsip_ssession_have_ownership(_event->ss)){ + session_t* _session; + if((_session = session_server_create(st_invite, _event->ss)) && (session = _session)){ + tsk_list_push_back_data(ctx->sessions, (void**)&_session); + } + else{ + TSK_DEBUG_ERROR("Failed to create \"sever-side-session\"."); + ret = -3; + goto bail; + } + } + } + else{ + /* it's or own session and we fail to match it ==> should never happen */ + TSK_DEBUG_ERROR("Failed to match session event."); + ret = -2; + goto bail; + } + } + + if(!session || !session->handle){ + /* guard ==> should never happen */ + TSK_DEBUG_ERROR("Null session."); + goto bail; + } + + switch(inv_event->type){ + // ============================ + // Sip Events + // + case tsip_i_newcall: + { /* New call */ + tmedia_type_t media_type = tsip_ssession_get_mediatype(session); + tsip_api_common_accept(session->handle, + TSIP_ACTION_SET_NULL()); + /*tsip_api_common_reject(session->handle, + TSIP_ACTION_SET_NULL());*/ + break; + } + case tsip_i_request: + TSK_DEBUG_INFO("invite_handle_event(tsip_i_request)"); + break; + case tsip_ao_request: + TSK_DEBUG_INFO("invite_handle_event(tsip_ao_request)"); + break; + + /* Explicit Call Transfer (ECT) */ + case tsip_o_ect_trying: + case tsip_o_ect_accepted: + case tsip_o_ect_completed: + case tsip_o_ect_failed: + case tsip_o_ect_notify: + case tsip_i_ect_requested: + case tsip_i_ect_newcall: + case tsip_i_ect_completed: + case tsip_i_ect_failed: + case tsip_i_ect_notify: + TSK_DEBUG_INFO("ECT event"); + break; + + // ============================ + // Media Events + // + + /* Early Media started */ + case tsip_m_early_media: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_early_media)"); + break; + + /* 3GPP TS 24.610: Communication Hold */ + case tsip_m_local_hold_ok: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_local_hold_ok)"); + break; + case tsip_m_local_hold_nok: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_local_hold_nok)"); + break; + case tsip_m_local_resume_ok: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_local_resume_ok)"); + break; + case tsip_m_local_resume_nok: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_local_resume_nok)"); + break; + case tsip_m_remote_hold: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_remote_hold)"); + break; + case tsip_m_remote_resume: + TSK_DEBUG_INFO("invite_handle_event(tsip_m_remote_resume)"); + break; + + default: + break; + } + +bail: + return ret; +} + +tsip_ssession_id_t invite_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + tsip_ssession_id_t id = TSIP_SSESSION_INVALID_ID; + + if(!(session = session_handle_cmd(cmd, opts))){ + goto bail; + } + else{ + id = tsip_ssession_get_id(session->handle); + } + + switch(cmd){ + case cmd_audio: + case cmd_audiovideo: + { /* Make Audio/Video call */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_invite_send_invite(session->handle, (cmd == cmd_audio) ? tmedia_audio : (tmedia_audio|tmedia_video), + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + + case cmd_file: + { /* Send file using MSRP protocol */ + tsip_action_handle_t* action_config = action_get_config(opts); + const opt_t* opt = opt_get_by_type(opts, opt_path); // existance already checked + /* Set Callback function */ + tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_MEDIA( + TSIP_MSESSION_SET_MSRP_CB(invite_msrp_cb), + TSIP_MSESSION_SET_NULL() + ), + TSIP_SSESSION_SET_NULL()); + + /* Send INVITE */ + tsip_api_invite_send_invite(session->handle, tmedia_msrp, + TSIP_ACTION_SET_CONFIG(action_config), + + TSIP_ACTION_SET_MEDIA( + TMEDIA_SESSION_MSRP_SET_STR("file-path", opt->value), + TMEDIA_SESSION_MSRP_SET_STR("accept-types", "application/octet-stream"), + //TMEDIA_SESSION_MSRP_SET_STR("accept-wrapped-types", "application/octet-stream"), + //TMEDIA_SESSION_MSRP_SET_STR("file-selector", "name:\"test.sn\" type:application/octet-stream size:3740 hash:sha-1:27:D0:AE:39:48:77:37:1D:FD:39:7E:2D:78:2F:BC:7B:94:48:29:81"), + //TMEDIA_SESSION_MSRP_SET_STR("file-disposition", "attachment"), + //TMEDIA_SESSION_MSRP_SET_STR("file-date", "creation:2010-02-13T17:50:31.763Z"), + //TMEDIA_SESSION_MSRP_SET_STR("file-icon", "cid:test@doubango.org"), + + TMEDIA_SESSION_SET_NULL() + ), + + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + + case cmd_dtmf: + { + const opt_t* opt = opt_get_by_type(opts, opt_event); // existance already checked + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_invite_send_dtmf(session->handle, atoi(opt->value), + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + + case cmd_ect: + { /* Explict Call Transfer */ + const opt_t* opt = opt_get_by_type(opts, opt_to); // existance already checked + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_invite_send_ect(session->handle, opt? opt->value : "sip:anonymous@example.com", + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + + case cmd_hold: + { /* Put the session on hold state */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_invite_send_hold(session->handle, tmedia_all, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + case cmd_resume: + { /* Put the session on hold state */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_invite_send_resume(session->handle, tmedia_all, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + default: + /* already handled by session_handle_cmd() */ + break; + } + +bail: + return id; +} + + +int invite_msrp_cb(const tmsrp_event_t* _event) +{ + const session_t* session = _event->callback_data; + + if(_event->message){ + if(_event->message->end_line.cflag == '$'){ + TSK_DEBUG_INFO("Last Chunck"); + } + switch(_event->message->type){ + case tmsrp_request: + { /* MSRP Request */ + + + break; + } + case tmsrp_response: + { /* MSRP Response */ + if(_event->message->ByteRange){ + TSK_DEBUG_INFO("MSRP Response code=%hi %lld-%lld/%lld", TMSRP_RESPONSE_CODE(_event->message), + _event->message->ByteRange->start, _event->message->ByteRange->end, _event->message->ByteRange->total); + } + break; + } + default: + TSK_DEBUG_ERROR("Invalid MSRP message"); + break; + } + } + + return 0; +}
\ No newline at end of file diff --git a/tinyDEMO/invite.h b/tinyDEMO/invite.h new file mode 100644 index 0000000..96c6a1f --- /dev/null +++ b/tinyDEMO/invite.h @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_INVITE_H) +#define TINYDEMO_INVITE_H + +#include "demo_config.h" + +#include "common.h" + +_BEGIN_DECLS + +int invite_handle_event(const tsip_event_t *sipevent); +tsip_ssession_id_t invite_handle_cmd(cmd_type_t cmd, const opts_L_t* opts); + +_END_DECLS + +#endif /* TINYDEMO_INVITE_H */ diff --git a/tinyDEMO/main.c b/tinyDEMO/main.c new file mode 100644 index 0000000..3eb39c8 --- /dev/null +++ b/tinyDEMO/main.c @@ -0,0 +1,526 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "main.h" +#include "common.h" + +#include "invite.h" +#include "message.h" +#include "options.h" +#include "publish.h" +#include "register.h" +#include "subscribe.h" + +#include "tinydav.h" /* Doubango Audio/Video Framework */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> + +#define LINE_DELIM "\n \r\n" + +/* === global variables === */ +ctx_t* ctx = tsk_null; + +const char* trim(const char*); +int insert(char* dest, tsk_size_t index, tsk_size_t dest_size, char* src, tsk_size_t src_size); +int update_param(const char* , const char* ); +int execute(const cmd_t* ); + +/* === entry point === */ +int main(int argc, char** argv) +{ + char cmdbuf[4096]; + tsk_buffer_t* buffer = tsk_null; + cmd_t* cmd = tsk_null; + tsk_bool_t comment = tsk_false; + int ret; + int i, index; + const char* start = tsk_null, *end = tsk_null; + + int a = 32 | 1 | 2; + + /* Copyright */ + printf("Doubango Project (tinyDEMO)\nCopyright (C) 2009 - 2013 Mamadou Diop \n\n"); + + /* Initialize Network Layer ==> Mandatory */ + tnet_startup(); + /* Initialize Doubango Audio/Video Framework ==> will register all plugins(codecs and sessions) + * Not mandatory if you have your own plugins*/ + tdav_init(); + + /* Print Usage */ + //cmd_print_help(); + + /* create user's ctx */ + if(!(ctx = ctx_create()) || !ctx->stack){ + TSK_DEBUG_ERROR("Failed to create user's ctx."); + goto bail; + } + + /* create new buffer */ + if(!(buffer = tsk_buffer_create_null())){ + TSK_DEBUG_ERROR("Failed to create new buffer."); + goto bail; + } + + /* initial args */ + for(i=1 /* index zero contains the exe path */, index=0; i<argc && argv[i]; i++){ + if(index){ + tsk_buffer_append(buffer, " ", 1); + } + tsk_buffer_append(buffer, argv[i], tsk_strlen(argv[i])); + } + + /* If initial args ==> parse it now */ + if(buffer->size){ + TSK_DEBUG_INFO("Initial command-line: %s", buffer->data); + goto init_buffer; + } + + /* always use fgets() instead of gets. gets() is considered to be unsafe.(Android and Mac OS X will warn) */ + while(fgets(cmdbuf, sizeof(cmdbuf), stdin)){ + TSK_DEBUG_INFO("Command-Line: %s", cmdbuf); + tsk_buffer_cleanup(buffer); /* cannot read from console while executing scenario */ + tsk_buffer_append(buffer, cmdbuf, tsk_strlen(cmdbuf)); +init_buffer: + start = buffer->data; + //start = trim(start); + end = start + buffer->size; + if(start >= end){ + TSK_DEBUG_INFO("Empty buffer"); + continue; + } +parse_buffer: + TSK_OBJECT_SAFE_FREE(cmd); /* Free old value */ + cmd = cmd_parse(start, (end-start), &comment, ctx->params); + if(cmd){ + if(comment || cmd->type == cmd_none){ + goto nex_line; + } + } + else{ + continue; + } + + /* Load from scenario file? */ + if(cmd->type == cmd_scenario){ + FILE* file; + const opt_t* opt; + tsk_size_t read = 0; + tsk_bool_t rm_lf = tsk_false; + if((opt = opt_get_by_type(cmd->opts, opt_path)) && !tsk_strnullORempty(opt->value)){ /* --path option */ + if((file = fopen(opt->value, "r"))){ + memset(cmdbuf, '\0', sizeof(cmdbuf)), cmdbuf[0] = '\n'; + read = fread(cmdbuf+1, sizeof(uint8_t), sizeof(cmdbuf)-1, file); + fclose(file), file = tsk_null; + + if(read == 0){ + TSK_DEBUG_ERROR("[%s] is empty.", opt->value); + goto nex_line; + } + else if(read == sizeof(cmdbuf)-1){ + TSK_DEBUG_ERROR("Buffer too short."); + + goto nex_line; + } + read++; /* \n */ + /* repplace all '\' with spaces (easier than handling that in the ragel file) */ + for(i=0; ((tsk_size_t)i)<read; i++){ + if(cmdbuf[i] == '\\'){ + cmdbuf[i] = ' '; + rm_lf = tsk_true; + } + else if(rm_lf && cmdbuf[i] == '\n'){ + cmdbuf[i] = ' '; + rm_lf = tsk_false; + } + } + cmdbuf[read] = '\n'; + + /* insert embedded scenario */ + if((index = tsk_strindexOf(start, (end-start), "\n")) == -1){ /* ++sn line */ + index = buffer->size; + } + else{ + index += (start - ((const char*)buffer->data)); + } + + if(tsk_buffer_insert(buffer, index, cmdbuf, read)){ + continue; + } + else{ + start = ((const char*)buffer->data) + index; // because insert use realloc() + end = (((const char*)buffer->data) + buffer->size); + goto nex_line; + } + } + else{ + TSK_DEBUG_ERROR("Failed to open scenario-file [%s].", opt->value); + goto nex_line; + } + continue; + } + else{ + TSK_DEBUG_ERROR("++scenario command must have --path option."); + continue; + } + } + + /* execute current command */ + switch(cmd->type){ + case cmd_exit: + TSK_DEBUG_INFO("Exit/Quit"); + goto bail; + default: + ret = execute(cmd); + break; + } + + /* next line */ +nex_line: + if((index = tsk_strindexOf(start, (end - start), "\n")) !=-1){ + start += index; + while((start < end) && isspace(*start)){ + start ++; + } + if((start + 2/*++*/) < end){ + goto parse_buffer; /* next line */ + } + else{ + continue; /* wait for new commands */ + } + } + } /* while(buffer) */ + + +bail: + + /* Free current command */ + TSK_OBJECT_SAFE_FREE(cmd); + /* Free buffer */ + TSK_OBJECT_SAFE_FREE(buffer); + /* Destroy the user's ctx */ + TSK_OBJECT_SAFE_FREE(ctx); + /* Deinitialize Doubango Audio/Video Framework ==> will unregister all plugins(codecs and sessions) + * Not mandatory */ + tdav_init(); + /* Uninitilize Network Layer */ + tnet_cleanup(); + +#if ANDROID + exit(0); +#endif + return 0; +} + +const char* trim(const char* str) +{ + while(isspace(*str)){ + str++; + } + return str; +} + +int update_param(const char* pname, const char* pvalue) +{ + if(ctx->params && pname){ + const tsk_param_t* param; + if((param = tsk_params_get_param_by_name(ctx->params, pname))){ + tsk_strupdate(&TSK_PARAM(param)->value, pvalue); + return 0; + } + else{ + TSK_DEBUG_INFO("[%s] parameter does not exist", pname); + } + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + } + return -1; +} + +int execute(const cmd_t* cmd) +{ + int ret = 0; + tsip_ssession_id_t sid; + tsk_istr_t istr; + + if(!cmd){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + tsk_safeobj_lock(ctx); + + switch(cmd->type){ + case cmd_audio: + case cmd_audiovideo: + { + TSK_DEBUG_INFO("command=audio/video"); + if((sid = invite_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_config_session: + { + TSK_DEBUG_INFO("command=config-session"); + break; + } + case cmd_config_stack: + { + TSK_DEBUG_INFO("command=config-satck"); + ret = stack_config(cmd->opts); + break; + } + case cmd_dtmf: + { + const opt_t* opt; + TSK_DEBUG_INFO("command=dtmf"); + if(!(opt = opt_get_by_type(cmd->opts, opt_sid)) || tsk_strnullORempty(opt->value)){ /* --sid option */ + TSK_DEBUG_ERROR("++dtmf command need --sid option"); + break; + } + if(!(opt = opt_get_by_type(cmd->opts, opt_event)) || tsk_strnullORempty(opt->value)){ /* --event option */ + TSK_DEBUG_ERROR("++dtmf command need --event option"); + break; + } + invite_handle_cmd(cmd->type, cmd->opts); + break; + } + case cmd_dump: + { + TSK_DEBUG_INFO("command=dump"); + ret = stack_dump(); + break; + } + case cmd_ect: + { + const opt_t* opt; + TSK_DEBUG_INFO("command=ect"); + if((opt = opt_get_by_type(cmd->opts, opt_sid)) && !tsk_strnullORempty(opt->value)){ + TSK_DEBUG_ERROR("++ect command need --sid option"); + ret = -1; + break; + } + if((opt = opt_get_by_type(cmd->opts, opt_to)) && !tsk_strnullORempty(opt->value)){ + TSK_DEBUG_ERROR("++ect command need --to option"); + ret = -1; + break; + } + invite_handle_cmd(cmd->type, cmd->opts); + break; + } + case cmd_exit: + { + TSK_DEBUG_INFO("command=exit"); + goto bail; + break; + } + case cmd_file: + { + const opt_t* opt; + TSK_DEBUG_INFO("command=file"); + if(!(opt = opt_get_by_type(cmd->opts, opt_path)) || tsk_strnullORempty(opt->value)){ + TSK_DEBUG_ERROR("++file command need --path option"); + break; + } + if((sid = invite_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_hangup: + { + const opt_t* opt; + TSK_DEBUG_INFO("command=hangup"); + if((opt = opt_get_by_type(cmd->opts, opt_sid)) && !tsk_strnullORempty(opt->value)){ /* --sid option */ + ret = session_hangup(tsk_atoll(opt->value)); + } + else{ + TSK_DEBUG_ERROR("++hangup command need --sid option"); + ret = -1; + } + break; + } + case cmd_help: + { + TSK_DEBUG_INFO("command=help"); + cmd_print_help(); + break; + } + case cmd_hold: + { + const opt_t* opt; + TSK_DEBUG_INFO("command=hold"); + if((opt = opt_get_by_type(cmd->opts, opt_sid)) && !tsk_strnullORempty(opt->value)){ /* --sid option */ + invite_handle_cmd(cmd->type, cmd->opts); + } + else{ + TSK_DEBUG_ERROR("++hold command need --sid option"); + ret = -1; + } + break; + } + case cmd_message: + { + TSK_DEBUG_INFO("command=message"); + if((sid = message_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + + case cmd_options: + { + TSK_DEBUG_INFO("command=options"); + if((sid = options_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_publish: + { + TSK_DEBUG_INFO("command=publish"); + if((sid = publish_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_register: + { + TSK_DEBUG_INFO("command=register"); + if((sid = register_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_resume: + { + const opt_t* opt; + TSK_DEBUG_INFO("command=resume"); + if((opt = opt_get_by_type(cmd->opts, opt_sid)) && !tsk_strnullORempty(opt->value)){ /* --sid option */ + invite_handle_cmd(cmd->type, cmd->opts); + } + else{ + TSK_DEBUG_ERROR("++resume command need --sid option"); + ret = -1; + } + break; + } + case cmd_run: + { + TSK_DEBUG_INFO("command=run"); + ret = stack_run(cmd->opts); + break; + } + case cmd_scenario: + { + TSK_DEBUG_INFO("command=scenario"); + break; + } + case cmd_sleep: + { + const opt_t* opt; + double seconds; + + tsk_safeobj_unlock(ctx); /* beacuse of callback function */ + + if((opt = opt_get_by_type(cmd->opts, opt_sec)) && !tsk_strnullORempty(opt->value)){ /* --sec option */ + seconds = strtod(opt->value, tsk_null); /* strtod() is better than atof() */ + if(seconds<=0){ + printf("\n==== Press ENTER to continue...\n"); + getchar(); + } + else{ + TSK_DEBUG_INFO("Sleeping %f seconds", seconds); + tsk_thread_sleep((uint64_t)(seconds * 1000)); + } + } + else{ + TSK_DEBUG_WARN("++sleep need --sec option."); + } + return 0; /* bail: will unlock again */ + } + case cmd_sms: + { + TSK_DEBUG_INFO("command=sms"); + if((sid = message_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_stop: + { + TSK_DEBUG_INFO("command=stop"); + tsip_stack_stop(ctx->stack); + break; + } + case cmd_subscribe: + { + TSK_DEBUG_INFO("command=subscribe"); + if((sid = subscribe_handle_cmd(cmd->type, cmd->opts)) != TSIP_SSESSION_INVALID_ID){ + if(cmd->sidparam){ + tsk_itoa(sid, &istr); + update_param(cmd->sidparam, istr); + } + } + break; + } + case cmd_video: + { + TSK_DEBUG_INFO("command=video"); + break; + } + default: + { + TSK_DEBUG_ERROR("%d not a valid command.", cmd); + break; + } + } + +bail: + tsk_safeobj_unlock(ctx); + + return ret; +} diff --git a/tinyDEMO/main.h b/tinyDEMO/main.h new file mode 100644 index 0000000..351f334 --- /dev/null +++ b/tinyDEMO/main.h @@ -0,0 +1,32 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_MAIN_H) +#define TINYDEMO_MAIN_H + +#include "demo_config.h" + +_BEGIN_DECLS + + +_END_DECLS + +#endif /* TINYDEMO_MAIN_H */ diff --git a/tinyDEMO/main.sn b/tinyDEMO/main.sn new file mode 100644 index 0000000..e6928b1 --- /dev/null +++ b/tinyDEMO/main.sn @@ -0,0 +1,35 @@ +# Alcatel-Lucent +#++sn --path ./core-alcatel.sn + +# Colibria +#++sn --path ./core-colibria.sn + +# Ericsson +#++sn --path ./core-ericsson.sn + +# Inexbee +#++sn --path ./core-inexbee.sn + +# Micromethod +#++sn --path ./core-micromethod.sn + +# Nokia Siemens Networks +#++sn --path ./core-nsn.sn + +# Starents Networks +#++sn --path ./core-starent.sn + +# sip2sip.info +++sn --path ./sip2sip.info.sn + +# asterisk +#++sn --path ./asterisk.sn + +# SigComp +#++sn --path ./sigcomp.sn + +# open-ims.test +#++sn --path ./open-ims.test.sn + +# BlinkMind +#++sn --path ./blinkmind.sn
\ No newline at end of file diff --git a/tinyDEMO/message.c b/tinyDEMO/message.c new file mode 100644 index 0000000..b0a97aa --- /dev/null +++ b/tinyDEMO/message.c @@ -0,0 +1,270 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "message.h" + +#include "tinysms.h" /* Binary SMS API*/ + +#include <ctype.h> + +extern ctx_t* ctx; +extern const session_t* session_handle_cmd(cmd_type_t , const opts_L_t*); + +tsk_bool_t is_valid_telnum(const tsip_uri_t* uri); +tsk_buffer_t* sms_submit(const tsip_uri_t* smsc, const tsip_uri_t* dest, const char* ascii_pay); + +int message_handle_event(const tsip_event_t *_event) +{ + const tsip_message_event_t* msg_event = TSIP_MESSAGE_EVENT(_event); + const session_t* session = tsk_null; + tsip_ssession_id_t sid; + int ret = 0; + + /* Find associated session */ + sid = tsip_ssession_get_id(_event->ss); + if(!(session = session_get_by_sid(ctx->sessions, sid))){ + if(tsip_ssession_have_ownership(_event->ss)){ + /* it's or own session and we fail to match it ==> should never happen */ + TSK_DEBUG_ERROR("Failed to match session event."); + ret = -2; + goto bail; + } + else{ + /* it's a "server-side-session" (incoming MESSAGE) */ + session_t* _session; + if((_session = session_server_create(st_message, _event->ss)) && (session = _session)){ + tsk_list_push_back_data(ctx->sessions, (void**)&_session); + } + else{ + TSK_DEBUG_ERROR("Failed to create \"sever-side-session\"."); + ret = -3; + goto bail; + } + } + } + + + switch(msg_event->type){ + case tsip_ao_message: /* Answer to outgoing MESSAGE */ + { + TSK_DEBUG_INFO("Event: Answer to outgoing MESSAGE. Code=%d", TSIP_RESPONSE_CODE(_event->sipmessage)); + if(TSIP_RESPONSE_IS_2XX(_event->sipmessage)){ + TSK_DEBUG_INFO("Message successfully sent."); + } + break; + } + + case tsip_i_message: /* Incoming MESSAGE */ + { + const char* content_type = TSIP_MESSAGE_CONTENT_TYPE(_event->sipmessage); + + TSK_DEBUG_INFO("Event: Incoming MESSAGE."); + if(TSIP_MESSAGE_HAS_CONTENT(_event->sipmessage)){ + const tsk_buffer_t* content = TSIP_MESSAGE_CONTENT(_event->sipmessage); + TSK_DEBUG_INFO("MESSAGE Content-Type: %s", content_type); + TSK_DEBUG_INFO("MESSAGE Content: %s", content->data); + } + /* accept() the MESSAGE to terminate the dialog */ + if(tsk_striequals("plain/text", content_type) || tsk_striequals("text/html", content_type)){ + tsip_api_common_accept(session->handle, + TSIP_ACTION_SET_HEADER("Info", "I've accept()ed your message"),// just for test + TSIP_ACTION_SET_NULL()); + } + /* reject() the MESSAGE to terminate the dialog */ + else{ + tsip_api_common_reject(session->handle, + TSIP_ACTION_SET_HEADER("Info", "I've reject()ed your message"),// just for test + TSIP_ACTION_SET_HEADER("In-Reply-To", "apb03a0s09dkjdfglkj49112"),// just for test + TSIP_ACTION_SET_NULL()); + } + break; + } + + default: + { /* Any other event */ + TSK_DEBUG_WARN("%d not a valid SIP Messaging event.", msg_event->type); + break; + } + } + +bail: + return ret; +} + +tsip_ssession_id_t message_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + const opt_t* opt; + tsip_ssession_id_t id = TSIP_SSESSION_INVALID_ID; + + if(!(session = session_handle_cmd(cmd, opts))){ + goto bail; + } + else{ + id = tsip_ssession_get_id(session->handle); + } + + switch(cmd){ + case cmd_message: + { /* Send SIP MESSAGE */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_message_send_message(session->handle, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + case cmd_sms: + { /* Binary SMS (RP-DATA) */ + const char* ascii_pay = tsk_null; + tsk_buffer_t* binary_pay = tsk_null; + if((opt = opt_get_by_type(opts, opt_smsc)) && !tsk_strnullORempty(opt->value)){ + tsip_uri_t* smsc = tsip_uri_parse(opt->value, tsk_strlen(opt->value)); + tsip_uri_t* dest = tsk_null; + if(smsc){ + /* Valid phone number for the SMSC address? */ + if(!is_valid_telnum(smsc)){ + TSK_DEBUG_ERROR("[%s] contains invalid telephone number", opt->value); + goto done; + } + tsip_ssession_set(session->handle, + TSIP_SSESSION_SET_TO(opt->value), + TSIP_SSESSION_SET_NULL()); + + /* Destination URI */ + if((opt = opt_get_by_type(opts, opt_to)) && !tsk_strnullORempty(opt->value)){ + if((dest = tsip_uri_parse(opt->value, tsk_strlen(opt->value)))){ + if(!is_valid_telnum(dest)){ + TSK_DEBUG_ERROR("[%s] contains invalid telephone number", opt->value); + goto done; + } + } + else{ + TSK_DEBUG_ERROR("[%s] is an invalid SIP/tel uri", opt->value); + goto done; + } + } + else{ + TSK_DEBUG_ERROR("++sms command need --to"); + goto done; + } + + /* Payload? */ + if((opt = opt_get_by_type(opts, opt_payload)) && !tsk_strnullORempty(opt->value)){ + ascii_pay = opt->value; + } + else{ + TSK_DEBUG_ERROR("++sms command need --to"); + goto done; + } + + /* Create the binary content */ + if(!(binary_pay = sms_submit(smsc, dest, ascii_pay))){ + TSK_DEBUG_ERROR("Failed to encode RP-DATA(SMS-SUBMIT) message."); + goto done; + } + + /* Send the message */ + tsip_api_message_send_message(session->handle, + /* TSIP_ACTION_SET_HEADER("Content-Type", "application/vnd.3gpp.sms"), */ + /* TSIP_ACTION_SET_HEADER("Transfer-Encoding", "binary"),*/ + TSIP_ACTION_SET_PAYLOAD(binary_pay->data, binary_pay->size), + TSIP_ACTION_SET_NULL()); + +done: + TSK_OBJECT_SAFE_FREE(binary_pay); + TSK_OBJECT_SAFE_FREE(dest); + TSK_OBJECT_SAFE_FREE(smsc); + } + else{ + TSK_DEBUG_ERROR("[%s] is an invalid SIP/tel uri", opt->value); + break; + } + } + else{ + TSK_DEBUG_ERROR("++sms command need --smsc"); + break; + } + break; + } + default: + /* already handled by session_handle_cmd() */ + break; + } + +bail: + return id; +} + + +tsk_bool_t is_valid_telnum(const tsip_uri_t* uri) +{ + tsk_size_t i; + tsk_size_t len; + + if(!uri || tsk_strnullORempty(uri->user_name)){ + return tsk_false; + } + + for(i = 0, len = tsk_strlen(uri->user_name); i<len; i++){ + if(uri->user_name[i] != '+' && !isdigit(uri->user_name[i])){ + return tsk_false; + } + } + return tsk_true; +} + +tsk_buffer_t* sms_submit(const tsip_uri_t* smsc, const tsip_uri_t* dest, const char* ascii_pay) +{ + static uint8_t mr = 0x00; + + int ret; + tsk_buffer_t* buffer = tsk_null; + tsms_tpdu_submit_t* sms_submit = tsk_null; + tsms_rpdu_data_t* rp_data = tsk_null; + + // create SMS-SUBMIT message + sms_submit = tsms_tpdu_submit_create(++mr, (const uint8_t*)smsc->user_name, (const uint8_t*)dest->user_name); + // Set content for SMS-SUBMIT + if((buffer = tsms_pack_to_7bit(ascii_pay))){ + if((ret = tsms_tpdu_submit_set_userdata(sms_submit, buffer, tsms_alpha_7bit))){ + goto bail; + } + TSK_OBJECT_SAFE_FREE(buffer); + } + // create Mobile Originated (MO) RP-DATA message + if((rp_data = tsms_rpdu_data_create_mo(mr, (const uint8_t*)smsc->user_name, TSMS_TPDU_MESSAGE(sms_submit)))){ + // serialize into a buffer + if((buffer = tsk_buffer_create_null())){ + ret = tsms_rpdu_data_serialize(rp_data, buffer); + } + } + +bail: + if(ret){ /* Failed? */ + TSK_OBJECT_SAFE_FREE(buffer); + } + TSK_OBJECT_SAFE_FREE(sms_submit); + TSK_OBJECT_SAFE_FREE(rp_data); + + return buffer; +} diff --git a/tinyDEMO/message.h b/tinyDEMO/message.h new file mode 100644 index 0000000..6adb9c5 --- /dev/null +++ b/tinyDEMO/message.h @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_MESSAGE_H) +#define TINYDEMO_MESSAGE_H + +#include "demo_config.h" + +#include "common.h" + +_BEGIN_DECLS + +int message_handle_event(const tsip_event_t *_event); +tsip_ssession_id_t message_handle_cmd(cmd_type_t cmd, const opts_L_t* opts); + +_END_DECLS + +#endif /* TINYDEMO_MESSAGE_H */ diff --git a/tinyDEMO/open-ims.test.sn b/tinyDEMO/open-ims.test.sn new file mode 100644 index 0000000..7062e09 --- /dev/null +++ b/tinyDEMO/open-ims.test.sn @@ -0,0 +1,56 @@ +## For more information about scenarios, please refer to the Programmer's Guide +# 2233392625mamadoud3sb7j4fb8 + +# user's parameters (like ANSI-C #define) +%%domain doubango.org +%%user 002 +%%pwd 002 +#%%proxy_ip 2a01:e35:8b32:7050:212:f0ff:fe99:c9fc # IP address or FQDN +%%proxy_ip 192.168.0.9 +%%proxy_port 5060 +%%proxy_trans udp # udp, tcp, tls or sctp +%%expires 300 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid + +#--ipv6 + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# OPTIONS to hack AOR +#++opt +#++sleep --sec $$(sleep-sec) + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + + +# Press ENTER +++sleep --sec -1 + +++av --to sip:001@$$(domain) \ + --header Action-Header=Myheader-value @@action \ + >>(inv_audio_sid) + +++sleep --sec -1 +#++hu --sid $$(inv_audio_sid) + + +# Exit the application +++e diff --git a/tinyDEMO/options.c b/tinyDEMO/options.c new file mode 100644 index 0000000..e46defb --- /dev/null +++ b/tinyDEMO/options.c @@ -0,0 +1,115 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "options.h" + +extern ctx_t* ctx; +extern const session_t* session_handle_cmd(cmd_type_t , const opts_L_t*); + +int options_hack_aor(const tsip_response_t* resp); + +int options_handle_event(const tsip_event_t *_event) +{ + const tsip_options_event_t* opt_event = TSIP_OPTIONS_EVENT(_event); + const session_t* session; + tsip_ssession_id_t sid; + + /* Find associated session */ + sid = tsip_ssession_get_id(_event->ss); + if(!(session = session_get_by_sid(ctx->sessions, sid))){ + TSK_DEBUG_WARN("Failed to match session event."); + return -1; + } + + switch(opt_event->type){ + case tsip_i_options: /* incoming OPTIONS */ + break; + case tsip_ao_options: /* answer to outgoing OPTIONS */ +#if HACK_AOR + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + options_hack_aor(_event->sipmessage); + } +#endif + break; + } + + return 0; +} + +tsip_ssession_id_t options_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + tsip_ssession_id_t id = TSIP_SSESSION_INVALID_ID; + + if(!(session = session_handle_cmd(cmd, opts))){ + goto bail; + } + else{ + id = tsip_ssession_get_id(session->handle); + } + + /* Execute command */ + switch(cmd){ + case cmd_options: + { /* Send SIP OPTIONS */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_options_send_options(session->handle, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + default: + /* already handled by session_handle_cmd() */ + break; + } + +bail: + return id; +} + +/* used to hack the AOR. useful for devices behind NATs or emulators (e.g. ANDROID) */ +int options_hack_aor(const tsip_response_t* resp) +{ + int32_t rport; + if(resp && resp->firstVia){ + if(resp->firstVia->rport <=0){ + char* received_port_ext; + /* Ericsson SDS + ==> Via: SIP/2.0/TCP 192.168.0.12:49744;rport;branch=z9hG4bK1273100904048;received_port_ext=49744;received=192.168.0.12 */ + if((received_port_ext = tsip_header_get_param_value((const tsip_header_t*)resp->firstVia, "received_port_ext"))){ + rport = (int32_t)atoi(received_port_ext); + TSK_FREE(received_port_ext); + } + } + else{ + rport = resp->firstVia->rport; + } + + tsip_stack_set(ctx->stack, + TSIP_STACK_SET_AOR(resp->firstVia->received, rport), + TSIP_STACK_SET_NULL()); + return 0; + } + + return -1; +} diff --git a/tinyDEMO/options.h b/tinyDEMO/options.h new file mode 100644 index 0000000..5f1d95f --- /dev/null +++ b/tinyDEMO/options.h @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_OPTIONS_H) +#define TINYDEMO_OPTIONS_H + +#include "demo_config.h" + +#include "common.h" + +_BEGIN_DECLS + +int options_handle_event(const tsip_event_t *sipevent); +tsip_ssession_id_t options_handle_cmd(cmd_type_t cmd, const opts_L_t* opts); + +_END_DECLS + +#endif /* TINYDEMO_OPTIONS_H */ diff --git a/tinyDEMO/publish.c b/tinyDEMO/publish.c new file mode 100644 index 0000000..0d34f1e --- /dev/null +++ b/tinyDEMO/publish.c @@ -0,0 +1,117 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "publish.h" + +extern ctx_t* ctx; +extern const session_t* session_handle_cmd(cmd_type_t , const opts_L_t*); + +int publish_handle_event(const tsip_event_t *_event) +{ + const tsip_publish_event_t* pub_event = TSIP_PUBLISH_EVENT(_event); + const session_t* session; + tsip_ssession_id_t sid; + + /* Find associated session */ + sid = tsip_ssession_get_id(_event->ss); + if(!(session = session_get_by_sid(ctx->sessions, sid))){ + TSK_DEBUG_WARN("Failed to match session event."); + return -1; + } + + switch(pub_event->type){ + case tsip_ao_publish: /* Answer to outgoing PUBLISH */ + { + if(_event->sipmessage){ + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + TSK_DEBUG_INFO("Event: Answer to outgoing PUBLISH. Code=%d and phrase=%s", + _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); + } + else{ + // request + } + } + break; + } + + case tsip_ao_unpublish: /* Answer to outgoing unPUBLISH */ + { + if(_event->sipmessage){ + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + TSK_DEBUG_INFO("Event: Answer to outgoing UNPUBLISH. Code=%d and phrase=%s", + _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); + } + else{ + // request + } + } + break; + } + + /* Server events (For whose dev. Server Side IMS Services) */ + case tsip_i_publish: /* Incoming PUBLISH */ + case tsip_i_unpublish: /* Incoming unPUBLISH */ + { + TSK_DEBUG_WARN("Event not support by Client Framework."); + break; + } + + default: + { /* Any other event */ + TSK_DEBUG_WARN("%d not a valid SIP Subscription event.", pub_event->type); + break; + } + } + + return 0; +} + +tsip_ssession_id_t publish_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + tsip_ssession_id_t id = TSIP_SSESSION_INVALID_ID; + + if(!(session = session_handle_cmd(cmd, opts))){ + goto bail; + } + else{ + id = tsip_ssession_get_id(session->handle); + } + + switch(cmd){ + case cmd_publish: + { /* Send SIP PUBLISH */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_publish_send_publish(session->handle, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + default: + /* already handled by session_handle_cmd() */ + break; + } + +bail: + return id; +} diff --git a/tinyDEMO/publish.h b/tinyDEMO/publish.h new file mode 100644 index 0000000..36470ed --- /dev/null +++ b/tinyDEMO/publish.h @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_PUBLISH_H) +#define TINYDEMO_PUBLISH_H + +#include "demo_config.h" + +#include "common.h" + +_BEGIN_DECLS + +int publish_handle_event(const tsip_event_t *_event); +tsip_ssession_id_t publish_handle_cmd(cmd_type_t cmd, const opts_L_t* opts); + +_END_DECLS + +#endif /* TINYDEMO_PUBLISH_H */ diff --git a/tinyDEMO/publish.sn b/tinyDEMO/publish.sn new file mode 100644 index 0000000..0f8f1eb --- /dev/null +++ b/tinyDEMO/publish.sn @@ -0,0 +1,35 @@ +# File used to test embedded scenarios +++pub --to sip:$$(user)@$$(domain) --caps +g.oma.sip-im --caps language="en,fr" --header Content-Type=application/pidf+xml @@a --pay \ +<?xml version=1.0 encoding=utf-8?>\ +<presence xmlns:cp=urn:ietf:params:xml:ns:pidf:cipid xmlns:caps=urn:ietf:params:xml:ns:pidf:caps xmlns:rpid=urn:ietf:params:xml:ns:pidf:rpid xmlns:pdm=urn:ietf:params:xml:ns:pidf:data-model xmlns:p=urn:ietf:params:xml:ns:pidf-diff xmlns:op=urn:oma:xml:prs:pidf:oma-pres entity=sip:$$(user)@$$(domain) xmlns=urn:ietf:params:xml:ns:pidf>\ +<pdm:person id=CRUVREZS>\ +<op:overriding-willingness>\ +<op:basic>open</op:basic>\ +</op:overriding-willingness>\ +<rpid:activities>\ +<rpid:unknown />\ +</rpid:activities>\ +<rpid:mood>\ +<rpid:neutral />\ +</rpid:mood>\ +<pdm:note>Hello world</pdm:note>\ +</pdm:person>\ +<pdm:device id=d0001>\ +<status>\ +<basic>open</basic>\ +</status>\ +<caps:devcaps>\ +<caps:mobility>\ +<caps:supported>\ +<caps:fixed />\ +</caps:supported>\ +</caps:mobility>\ +</caps:devcaps>\ +<op:network-availability>\ +<op:network id=IMS>\ +<op:active />\ +</op:network>\ +</op:network-availability>\ +<pdm:deviceID>urn:uuid:00000000-0000-0000-0000-000000000000</pdm:deviceID>\ +</pdm:device>\ +</presence> >>(pub-sid) @@a
\ No newline at end of file diff --git a/tinyDEMO/ragel.sh b/tinyDEMO/ragel.sh new file mode 100644 index 0000000..08f11ed --- /dev/null +++ b/tinyDEMO/ragel.sh @@ -0,0 +1,4 @@ +#export OPTIONS="-C -L -G2" +export OPTIONS="-C -L -T0" + +ragel.exe $OPTIONS -o ./dssl.c ./dssl.rl
\ No newline at end of file diff --git a/tinyDEMO/register.c b/tinyDEMO/register.c new file mode 100644 index 0000000..45ca7fb --- /dev/null +++ b/tinyDEMO/register.c @@ -0,0 +1,121 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "register.h" + +extern ctx_t* ctx; +extern const session_t* session_handle_cmd(cmd_type_t , const opts_L_t*); + + +int register_handle_event(const tsip_event_t *_event) +{ + const tsip_register_event_t* reg_event = TSIP_REGISTER_EVENT(_event); + const session_t* session; + tsip_ssession_id_t sid; + + /* Find associated session */ + sid = tsip_ssession_get_id(_event->ss); + if(!(session = session_get_by_sid(ctx->sessions, sid))){ + TSK_DEBUG_WARN("Failed to match session event."); + return -1; + } + + switch(reg_event->type){ + case tsip_ao_register: /* Answer to outgoing REGISTER */ + { + if(_event->sipmessage){ + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + TSK_DEBUG_INFO("Event: Answer to outgoing REGISTER. Code=%d and phrase=%s", + _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); + } + else{ + // request + } + } + break; + } + case tsip_ao_unregister: /* Answer to outgoing unREGISTER */ + { + if(_event->sipmessage){ + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + TSK_DEBUG_INFO("Event: Answer to outgoing unREGISTER. Code=%d and phrase=%s", + _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); + } + else{ + // request + } + } + break; + } + + /* Server events (For whose dev. Server Side IMS Services) */ + case tsip_i_register: /* Incoming REGISTER */ + case tsip_i_unregister: /* Incoming unREGISTER */ + { + TSK_DEBUG_WARN("Event not support by Client Framework."); + break; + } + + default: + { /* Any other event */ + TSK_DEBUG_WARN("%d not a valid SIP Registration event.", reg_event->type); + break; + } + } + + return 0; +} + + +tsip_ssession_id_t register_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + tsip_ssession_id_t id = TSIP_SSESSION_INVALID_ID; + + if(!(session = session_handle_cmd(cmd, opts))){ + goto bail; + } + else{ + id = tsip_ssession_get_id(session->handle); + } + + /* action config */ + + /* Execute command */ + switch(cmd){ + case cmd_register: + { /* Send SIP REGISTER */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_register_send_register(session->handle, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + default: + /* already handled by session_handle_cmd() */ + break; + } + +bail: + return id; +} diff --git a/tinyDEMO/register.h b/tinyDEMO/register.h new file mode 100644 index 0000000..f0c2ec0 --- /dev/null +++ b/tinyDEMO/register.h @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_REGISTER_H) +#define TINYDEMO_REGISTER_H + +#include "demo_config.h" + +#include "common.h" + +_BEGIN_DECLS + +int register_handle_event(const tsip_event_t *_event); +tsip_ssession_id_t register_handle_cmd(cmd_type_t cmd, const opts_L_t* opts); + +_END_DECLS + +#endif /* TINYDEMO_REGISTER_H */ diff --git a/tinyDEMO/sample.sn b/tinyDEMO/sample.sn new file mode 100644 index 0000000..1c494bf --- /dev/null +++ b/tinyDEMO/sample.sn @@ -0,0 +1,61 @@ +## For more information about scenarios, please refer to the Programmer's Guide + +# user's parameters (like ANSI-C #define) +%%domain ericsson.com +%%user mamadou +%%pwd mamadou +%%proxy_ip 192.168.0.13 # IP address or FQDN +%%proxy_port 5081 +%%proxy_trans tcp # udp, tcp, tls or sctp +%%expires 100 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user)@$$(domain) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans)\ + --header Privacy=header;id --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# REGISTER +++reg --xp $$(expires) >>(reg-sid) \ + --header Myheader-name=Myheader-value \ + +# sleep +++sleep --sec $$(sleep-sec) + +# subscribe to reg event package +++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --header Event=reg --header Accept=application/reginfo+xml \ + --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) + +#subscribe to presence event package (alice) +++sub --to sip:alice@$$(domain) --xp $$(expires) --header Event=presence --header Supported=eventlist\ + --header Accept=multipart/related, application/rlmi+xml, application/pidf+xml, application/rpid+xml, application/xcap-diff+xml, message/external-body \ + --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-pres-sid) + +# sleep +++sleep --sec $$(sleep-sec) + +# unsunscribe (reg and pres) +++hu --sid $$(sub-reg-sid) +++hu --sid $$(sub-pres-sid) + +# sleep +++sleep --sec $$(sleep-sec) + +# unregister +++hu --sid $$(reg-sid) + +# sleep +++sleep --sec $$(sleep-sec) + +# Exit the application +++e
\ No newline at end of file diff --git a/tinyDEMO/sigcomp.sn b/tinyDEMO/sigcomp.sn new file mode 100644 index 0000000..fe57db0 --- /dev/null +++ b/tinyDEMO/sigcomp.sn @@ -0,0 +1,55 @@ +## For more information about scenarios, please refer to the Programmer's Guide + +# This scenario shows how to use two SigComp compartments (one for the REGISTER and one for SUBSCRIBE). +# However, for performance reasons, in your application you should use only one Compartment for all sessions. + +# user's parameters (like ANSI-C #define) +%%domain ericsson.com +%%user mamadou +%%pwd mamadou +%%proxy_ip 192.168.0.16 # IP address or FQDN +%%proxy_port 4060 +%%proxy_trans tcp # udp, tcp, tls or sctp +%%expires 30 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid + +#--local-ip 10.0.2.15\ + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) --local-port 5060 \ + --sigcomp-id urn:uuid:2e5fdc76-00be-4314-8202-1116fa82a473 \ + --sigcomp-id urn:uuid:2e5fdc76-00be-4314-8202-1116fa82a474 \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --sigcomp-id urn:uuid:2e5fdc76-00be-4314-8202-1116fa82a473 \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + +++sleep --sec 1 + +# SUBSCRIBE to reg event package (silent hangup) +#++sub --to sip:$$(user)@$$(domain) --xp $$(expires) --silent --header Event=reg --header Accept=application/reginfo+xml \ +# --sigcomp-id urn:uuid:2e5fdc76-00be-4314-8202-1116fa82a473 \ +# --header Allow-Events=refer, presence, presence.winfo, xcap-diff, conference >>(sub-reg-sid) + +# Press ENTER +++sleep --sec -1 + +# Exit the application +++e
\ No newline at end of file diff --git a/tinyDEMO/sip2sip.info.sn b/tinyDEMO/sip2sip.info.sn new file mode 100644 index 0000000..5555b7f --- /dev/null +++ b/tinyDEMO/sip2sip.info.sn @@ -0,0 +1,55 @@ +## For more information about scenarios, please refer to the Programmer's Guide +# 2233422677mamadou9em774kl1c + +# user's parameters (like ANSI-C #define) +%%domain sip2sip.info +%%user 2233392625 # +%%pwd d3sb7j4fb8 +%%proxy_ip proxy.sipthor.net # 78.250.95.126 # IP address or FQDN +%%proxy_port 5060 +%%proxy_trans udp # udp, tcp, tls or sctp +%%expires 300 # expires used by all dialogs +%%sleep-sec 1.0 # number of seconds to wait before sending next sip message + +%%reg-sid +%%sub-reg-sid +%%sub-pres-sid +%%pub-sid +%%inv_audio_sid + +#--stun-ip numb.viagenie.ca --stun-port 3478 --stun-usr $$(user)@$$(domain) --stun-pwd $$(pwd) \ + +# Configure the stack +# Realm, IMPI and IMPU are mandatory +++cst --realm $$(domain) --impi $$(user) --impu sip:$$(user)@$$(domain) --pwd $$(pwd) \ + --pcscf-ip $$(proxy_ip) --pcscf-port $$(proxy_port) --pcscf-trans $$(proxy_trans) \ + --header Privacy=none --header Allow=INVITE, ACK, CANCEL, BYE, MESSAGE, OPTIONS, NOTIFY, PRACK, UPDATE, REFER \ + --header P-Access-Network-Info=ADSL;utran-cell-id-3gpp=00000000 \ + --header User-Agent=IM-client/OMA1.0 doubango/v1.0.0 # last should not have backslash + +# Run the engine +++r + +# OPTIONS to hack AOR +#++opt +#++sleep --sec $$(sleep-sec) + +# REGISTER +++reg --xp $$(expires) --caps +g.oma.sip-im --caps +g.3gpp.smsip --caps language="en,fr" \ + --header Action-Header=Myheader-value @@action \ + >>(reg-sid) + + +# Press ENTER +++sleep --sec -1 + +++av --to sip:2233422677@$$(domain) \ + --header Action-Header=Myheader-value @@action \ + >>(inv_audio_sid) + +++sleep --sec -1 +++hu --sid $$(inv_audio_sid) + + +# Exit the application +++e diff --git a/tinyDEMO/subscribe.c b/tinyDEMO/subscribe.c new file mode 100644 index 0000000..54a0375 --- /dev/null +++ b/tinyDEMO/subscribe.c @@ -0,0 +1,129 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#include "subscribe.h" + +extern ctx_t* ctx; +extern const session_t* session_handle_cmd(cmd_type_t , const opts_L_t*); + +int subscribe_handle_event(const tsip_event_t *_event) +{ + const tsip_subscribe_event_t* sub_event = TSIP_SUBSCRIBE_EVENT(_event); + const session_t* session; + tsip_ssession_id_t sid; + + /* Find associated session */ + sid = tsip_ssession_get_id(_event->ss); + if(!(session = session_get_by_sid(ctx->sessions, sid))){ + TSK_DEBUG_WARN("Failed to match session event."); + return -1; + } + + + switch(sub_event->type){ + case tsip_ao_subscribe: /* Answer to outgoing SUBSCRIBE */ + { + if(_event->sipmessage){ + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + TSK_DEBUG_INFO("Event: Answer to outgoing SUBSCRIBE. Code=%d and phrase=%s", + _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); + } + else{ + // request + } + } + break; + } + + case tsip_ao_unsubscribe: /* Answer to outgoing unSUBSCRIBE */ + { + if(_event->sipmessage){ + if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ + TSK_DEBUG_INFO("Event: Answer to outgoing unSUBSCRIBE. Code=%d and phrase=%s", + _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); + } + else{ + // request + } + } + break; + } + + case tsip_i_notify: /* Incoming NOTIFY */ + { + TSK_DEBUG_INFO("Event: Incoming NOTIFY."); + if(TSIP_MESSAGE_HAS_CONTENT(_event->sipmessage)){ + const tsk_buffer_t* content = TSIP_MESSAGE_CONTENT(_event->sipmessage); + TSK_DEBUG_INFO("NOTIFY Content-Type: %s", TSIP_MESSAGE_CONTENT_TYPE(_event->sipmessage)); + TSK_DEBUG_INFO("NOTIFY Content: %s", content->data); + } + break; + } + + /* Server events (For whose dev. Server Side IMS Services) */ + case tsip_i_subscribe: /* Incoming SUBSCRIBE */ + case tsip_i_unsubscribe: /* Incoming unSUBSCRIBE */ + { + TSK_DEBUG_WARN("Event not support by Client Framework."); + break; + } + + default: + { /* Any other event */ + TSK_DEBUG_WARN("%d not a valid SIP Subscription event.", sub_event->type); + break; + } + } + + return 0; +} + +tsip_ssession_id_t subscribe_handle_cmd(cmd_type_t cmd, const opts_L_t* opts) +{ + const session_t* session = tsk_null; + tsip_ssession_id_t id = TSIP_SSESSION_INVALID_ID; + + if(!(session = session_handle_cmd(cmd, opts))){ + goto bail; + } + else{ + id = tsip_ssession_get_id(session->handle); + } + + switch(cmd){ + case cmd_subscribe: + { /* Send SIP SUBSCRIBE */ + tsip_action_handle_t* action_config = action_get_config(opts); + tsip_api_subscribe_send_subscribe(session->handle, + TSIP_ACTION_SET_CONFIG(action_config), + /* Any other TSIP_ACTION_SET_*() macros */ + TSIP_ACTION_SET_NULL()); + TSK_OBJECT_SAFE_FREE(action_config); + break; + } + default: + /* already handled by session_handle_cmd() */ + break; + } + +bail: + return id; +} diff --git a/tinyDEMO/subscribe.h b/tinyDEMO/subscribe.h new file mode 100644 index 0000000..3a10538 --- /dev/null +++ b/tinyDEMO/subscribe.h @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +#if !defined(TINYDEMO_SUBSCRIBE_H) +#define TINYDEMO_SUBSCRIBE_H + +#include "demo_config.h" + +#include "common.h" + +_BEGIN_DECLS + +int subscribe_handle_event(const tsip_event_t *_event); +tsip_ssession_id_t subscribe_handle_cmd(cmd_type_t cmd, const opts_L_t* opts); + +_END_DECLS + +#endif /* TINYDEMO_SUBSCRIBE_H */ diff --git a/tinyDEMO/tinyDEMO.sln b/tinyDEMO/tinyDEMO.sln new file mode 100644 index 0000000..806f4ff --- /dev/null +++ b/tinyDEMO/tinyDEMO.sln @@ -0,0 +1,205 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyDEMO", "tinyDEMO.vcproj", "{D1E1F982-2308-4008-A056-814EE137166D}" + ProjectSection(ProjectDependencies) = postProject + {B3E45009-C7C3-4090-837C-2D30C9058443} = {B3E45009-C7C3-4090-837C-2D30C9058443} + {52814B0D-7DCA-45B8-9A16-8B147040D619} = {52814B0D-7DCA-45B8-9A16-8B147040D619} + {AA46AF16-9678-4054-8E48-98DC21ECEC82} = {AA46AF16-9678-4054-8E48-98DC21ECEC82} + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1} = {8E2F0B2E-2596-4010-BF4A-2F688975B5C1} + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15} = {99B7D02F-8C70-4B45-AF3C-92313C3CEE15} + {4CE20732-9978-4A88-B586-CFEFCB63E82D} = {4CE20732-9978-4A88-B586-CFEFCB63E82D} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {002FF064-588F-402E-A096-C8D033F49F40} = {002FF064-588F-402E-A096-C8D033F49F40} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + {76261DC8-25B3-43F4-9FB5-112C4AC0880E} = {76261DC8-25B3-43F4-9FB5-112C4AC0880E} + {9A3A5AF3-2333-4477-B880-7F901F9D8972} = {9A3A5AF3-2333-4477-B880-7F901F9D8972} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\tinySAK\tinySAK.vcproj", "{6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\tinyHTTP\tinyHTTP.vcproj", "{B3E45009-C7C3-4090-837C-2D30C9058443}" + ProjectSection(ProjectDependencies) = postProject + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyIPSec", "..\tinyIPSec\tinyIPSec.vcproj", "{002FF064-588F-402E-A096-C8D033F49F40}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "..\tinyMEDIA\tinyMEDIA.vcproj", "{52814B0D-7DCA-45B8-9A16-8B147040D619}" + ProjectSection(ProjectDependencies) = postProject + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\tinySDP\tinySDP.vcproj", "{E45DB518-6562-4033-80E8-60030F0B169F}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIP", "..\tinySIP\tinySIP.vcproj", "{4CE20732-9978-4A88-B586-CFEFCB63E82D}" + ProjectSection(ProjectDependencies) = postProject + {B3E45009-C7C3-4090-837C-2D30C9058443} = {B3E45009-C7C3-4090-837C-2D30C9058443} + {52814B0D-7DCA-45B8-9A16-8B147040D619} = {52814B0D-7DCA-45B8-9A16-8B147040D619} + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {002FF064-588F-402E-A096-C8D033F49F40} = {002FF064-588F-402E-A096-C8D033F49F40} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + {76261DC8-25B3-43F4-9FB5-112C4AC0880E} = {76261DC8-25B3-43F4-9FB5-112C4AC0880E} + {9A3A5AF3-2333-4477-B880-7F901F9D8972} = {9A3A5AF3-2333-4477-B880-7F901F9D8972} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\tinyNET\tinyNET.vcproj", "{7522A458-92F4-4259-B906-E84C2A65D9F1}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySMS", "..\tinySMS\tinySMS.vcproj", "{9A3A5AF3-2333-4477-B880-7F901F9D8972}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyDAV", "..\tinyDAV\tinyDAV.vcproj", "{8E2F0B2E-2596-4010-BF4A-2F688975B5C1}" + ProjectSection(ProjectDependencies) = postProject + {52814B0D-7DCA-45B8-9A16-8B147040D619} = {52814B0D-7DCA-45B8-9A16-8B147040D619} + {AA46AF16-9678-4054-8E48-98DC21ECEC82} = {AA46AF16-9678-4054-8E48-98DC21ECEC82} + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15} = {99B7D02F-8C70-4B45-AF3C-92313C3CEE15} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyRTP", "..\tinyRTP\tinyRTP.vcproj", "{99B7D02F-8C70-4B45-AF3C-92313C3CEE15}" + ProjectSection(ProjectDependencies) = postProject + {52814B0D-7DCA-45B8-9A16-8B147040D619} = {52814B0D-7DCA-45B8-9A16-8B147040D619} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIGCOMP", "..\tinySIGCOMP\tinySIGCOMP.vcproj", "{76261DC8-25B3-43F4-9FB5-112C4AC0880E}" + ProjectSection(ProjectDependencies) = postProject + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMSRP", "..\tinyMSRP\tinyMSRP.vcproj", "{AA46AF16-9678-4054-8E48-98DC21ECEC82}" + ProjectSection(ProjectDependencies) = postProject + {E45DB518-6562-4033-80E8-60030F0B169F} = {E45DB518-6562-4033-80E8-60030F0B169F} + {7522A458-92F4-4259-B906-E84C2A65D9F1} = {7522A458-92F4-4259-B906-E84C2A65D9F1} + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} = {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + Release|Win32 = Release|Win32 + Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D1E1F982-2308-4008-A056-814EE137166D}.Debug|Win32.ActiveCfg = Debug|Win32 + {D1E1F982-2308-4008-A056-814EE137166D}.Debug|Win32.Build.0 = Debug|Win32 + {D1E1F982-2308-4008-A056-814EE137166D}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {D1E1F982-2308-4008-A056-814EE137166D}.Release|Win32.ActiveCfg = Release|Win32 + {D1E1F982-2308-4008-A056-814EE137166D}.Release|Win32.Build.0 = Release|Win32 + {D1E1F982-2308-4008-A056-814EE137166D}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Debug|Win32.ActiveCfg = Debug|Win32 + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Debug|Win32.Build.0 = Debug|Win32 + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Release|Win32.ActiveCfg = Release|Win32 + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Release|Win32.Build.0 = Release|Win32 + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {6BC9B796-10C6-4CF7-A6E4-E2DACCDA84DA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {B3E45009-C7C3-4090-837C-2D30C9058443}.Debug|Win32.ActiveCfg = Debug|Win32 + {B3E45009-C7C3-4090-837C-2D30C9058443}.Debug|Win32.Build.0 = Debug|Win32 + {B3E45009-C7C3-4090-837C-2D30C9058443}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {B3E45009-C7C3-4090-837C-2D30C9058443}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {B3E45009-C7C3-4090-837C-2D30C9058443}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {B3E45009-C7C3-4090-837C-2D30C9058443}.Release|Win32.ActiveCfg = Release|Win32 + {B3E45009-C7C3-4090-837C-2D30C9058443}.Release|Win32.Build.0 = Release|Win32 + {B3E45009-C7C3-4090-837C-2D30C9058443}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {B3E45009-C7C3-4090-837C-2D30C9058443}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {B3E45009-C7C3-4090-837C-2D30C9058443}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {002FF064-588F-402E-A096-C8D033F49F40}.Debug|Win32.ActiveCfg = Debug|Win32 + {002FF064-588F-402E-A096-C8D033F49F40}.Debug|Win32.Build.0 = Debug|Win32 + {002FF064-588F-402E-A096-C8D033F49F40}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {002FF064-588F-402E-A096-C8D033F49F40}.Release|Win32.ActiveCfg = Release|Win32 + {002FF064-588F-402E-A096-C8D033F49F40}.Release|Win32.Build.0 = Release|Win32 + {002FF064-588F-402E-A096-C8D033F49F40}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {52814B0D-7DCA-45B8-9A16-8B147040D619}.Debug|Win32.ActiveCfg = Debug|Win32 + {52814B0D-7DCA-45B8-9A16-8B147040D619}.Debug|Win32.Build.0 = Debug|Win32 + {52814B0D-7DCA-45B8-9A16-8B147040D619}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {52814B0D-7DCA-45B8-9A16-8B147040D619}.Release|Win32.ActiveCfg = Release|Win32 + {52814B0D-7DCA-45B8-9A16-8B147040D619}.Release|Win32.Build.0 = Release|Win32 + {52814B0D-7DCA-45B8-9A16-8B147040D619}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {E45DB518-6562-4033-80E8-60030F0B169F}.Debug|Win32.ActiveCfg = Debug|Win32 + {E45DB518-6562-4033-80E8-60030F0B169F}.Debug|Win32.Build.0 = Debug|Win32 + {E45DB518-6562-4033-80E8-60030F0B169F}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {E45DB518-6562-4033-80E8-60030F0B169F}.Release|Win32.ActiveCfg = Release|Win32 + {E45DB518-6562-4033-80E8-60030F0B169F}.Release|Win32.Build.0 = Release|Win32 + {E45DB518-6562-4033-80E8-60030F0B169F}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Debug|Win32.ActiveCfg = Debug|Win32 + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Debug|Win32.Build.0 = Debug|Win32 + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Release|Win32.ActiveCfg = Release|Win32 + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Release|Win32.Build.0 = Release|Win32 + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {4CE20732-9978-4A88-B586-CFEFCB63E82D}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Debug|Win32.ActiveCfg = Debug|Win32 + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Debug|Win32.Build.0 = Debug|Win32 + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Release|Win32.ActiveCfg = Release|Win32 + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Release|Win32.Build.0 = Release|Win32 + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {7522A458-92F4-4259-B906-E84C2A65D9F1}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Win32.Build.0 = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Win32.ActiveCfg = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Win32.Build.0 = Release|Win32 + {9A3A5AF3-2333-4477-B880-7F901F9D8972}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1}.Debug|Win32.ActiveCfg = Debug|Win32 + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1}.Debug|Win32.Build.0 = Debug|Win32 + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1}.Release|Win32.ActiveCfg = Release|Win32 + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1}.Release|Win32.Build.0 = Release|Win32 + {8E2F0B2E-2596-4010-BF4A-2F688975B5C1}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15}.Debug|Win32.ActiveCfg = Debug|Win32 + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15}.Debug|Win32.Build.0 = Debug|Win32 + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15}.Release|Win32.ActiveCfg = Release|Win32 + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15}.Release|Win32.Build.0 = Release|Win32 + {99B7D02F-8C70-4B45-AF3C-92313C3CEE15}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Debug|Win32.ActiveCfg = Debug|Win32 + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Debug|Win32.Build.0 = Debug|Win32 + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Release|Win32.ActiveCfg = Release|Win32 + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Release|Win32.Build.0 = Release|Win32 + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {76261DC8-25B3-43F4-9FB5-112C4AC0880E}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {AA46AF16-9678-4054-8E48-98DC21ECEC82}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA46AF16-9678-4054-8E48-98DC21ECEC82}.Debug|Win32.Build.0 = Debug|Win32 + {AA46AF16-9678-4054-8E48-98DC21ECEC82}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 + {AA46AF16-9678-4054-8E48-98DC21ECEC82}.Release|Win32.ActiveCfg = Release|Win32 + {AA46AF16-9678-4054-8E48-98DC21ECEC82}.Release|Win32.Build.0 = Release|Win32 + {AA46AF16-9678-4054-8E48-98DC21ECEC82}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tinyDEMO/tinyDEMO.vcproj b/tinyDEMO/tinyDEMO.vcproj new file mode 100644 index 0000000..b74468d --- /dev/null +++ b/tinyDEMO/tinyDEMO.vcproj @@ -0,0 +1,347 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="tinyDEMO" + ProjectGUID="{D1E1F982-2308-4008-A056-814EE137166D}" + RootNamespace="tinyDEMO" + Keyword="Win32Proj" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="..\thirdparties\win32\include;..\tinySAK\src;..\tinyNET\src;..\tinySMS\include;..\tinyHTTP\include;..\tinySIP\include;..\tinyDAV\include;..\tinyMEDIA\include;..\tinySDP\include;..\tinyMSRP\include" + PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + WarnAsError="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\tinySAK.lib $(OutDir)\tinySIP.lib $(OutDir)\tinyNET.lib $(OutDir)\tinySMS.lib $(OutDir)\tinyMEDIA.lib $(OutDir)\tinyDAV.lib $(OutDir)\tinySDP.lib $(OutDir)\tinyMSRP.lib" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + EnableIntrinsicFunctions="true" + AdditionalIncludeDirectories="..\thirdparties\win32\include;..\tinySAK\src;..\tinyNET\src;..\tinySMS\include;..\tinyHTTP\include;..\tinySIP\include" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="2" + EnableFunctionLevelLinking="true" + UsePrecompiledHeader="0" + WarningLevel="3" + WarnAsError="true" + DebugInformationFormat="3" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\tinySAK.lib $(OutDir)\tinySIP.lib $(OutDir)\tinyNET.lib $(OutDir)\tinySMS.lib" + LinkIncremental="1" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="source(*.c)" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\cmd.c" + > + </File> + <File + RelativePath=".\common.c" + > + </File> + <File + RelativePath=".\dssl.c" + > + </File> + <File + RelativePath=".\invite.c" + > + </File> + <File + RelativePath=".\main.c" + > + </File> + <File + RelativePath=".\message.c" + > + </File> + <File + RelativePath=".\options.c" + > + </File> + <File + RelativePath=".\publish.c" + > + </File> + <File + RelativePath=".\register.c" + > + </File> + <File + RelativePath=".\subscribe.c" + > + </File> + </Filter> + <Filter + Name="include(*.h)" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\cmd.h" + > + </File> + <File + RelativePath=".\common.h" + > + </File> + <File + RelativePath=".\demo_config.h" + > + </File> + <File + RelativePath=".\dssl.h" + > + </File> + <File + RelativePath=".\invite.h" + > + </File> + <File + RelativePath=".\main.h" + > + </File> + <File + RelativePath=".\message.h" + > + </File> + <File + RelativePath=".\options.h" + > + </File> + <File + RelativePath=".\publish.h" + > + </File> + <File + RelativePath=".\register.h" + > + </File> + <File + RelativePath=".\subscribe.h" + > + </File> + </Filter> + <Filter + Name="ragel(*.rl)" + > + <File + RelativePath=".\dssl.rl" + > + </File> + </Filter> + <Filter + Name="scenarios(*.scn)" + > + <File + RelativePath=".\asterisk.sn" + > + </File> + <File + RelativePath=".\blinkmind.sn" + > + </File> + <File + RelativePath=".\core-alcatel.sn" + > + </File> + <File + RelativePath=".\core-colibria.sn" + > + </File> + <File + RelativePath=".\core-doubango.sn" + > + </File> + <File + RelativePath=".\core-ericsson.sn" + > + </File> + <File + RelativePath=".\core-inexbee.sn" + > + </File> + <File + RelativePath=".\core-micromethod.sn" + > + </File> + <File + RelativePath=".\core-nsn.sn" + > + </File> + <File + RelativePath=".\main.sn" + > + </File> + <File + RelativePath=".\open-ims.test.sn" + > + </File> + <File + RelativePath=".\publish.sn" + > + </File> + <File + RelativePath=".\sample.sn" + > + </File> + <File + RelativePath=".\sigcomp.sn" + > + </File> + <File + RelativePath=".\sip2sip.info.sn" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> |