From ede9ddcd05d89c97c9b19e76bfed647ff5cd074d Mon Sep 17 00:00:00 2001 From: zoltanvb <101990835+zoltanvb@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:33:17 +0100 Subject: [PATCH] Tests for pointer device and associated buttons. (#17130) Sensor screen is extended with a pointer (a single white pixel) and a few indicators for the mouse and lightgun buttons. Pointer type is selectable from core options (mouse, lightgun, pointer, old relative lightgun). An extra square indicator shows when absolute pointer types get near the edge / to the very edge / return to 0,0 position. --- .../libretro-net-retropad/net_retropad_core.c | 231 +++++++++++++++++- cores/libretro-net-retropad/remotepad.h | 34 +-- 2 files changed, 243 insertions(+), 22 deletions(-) diff --git a/cores/libretro-net-retropad/net_retropad_core.c b/cores/libretro-net-retropad/net_retropad_core.c index 31d33d1af7..ccc92ca2c4 100644 --- a/cores/libretro-net-retropad/net_retropad_core.c +++ b/cores/libretro-net-retropad/net_retropad_core.c @@ -61,6 +61,10 @@ #define NETRETROPAD_SCREEN_KEYBOARD 1 #define NETRETROPAD_SCREEN_SENSORS 2 #define EVENT_RATE 60 +#define NETRETROPAD_MOUSE 3 +#define NETRETROPAD_POINTER 4 +#define NETRETROPAD_LIGHTGUN 5 +#define NETRETROPAD_LIGHTGUN_OLD 6 struct descriptor { @@ -91,6 +95,12 @@ static bool lux_sensor_enabled = false; static float tilt_sensor_values[3] = {0}; static float gyro_sensor_values[3] = {0}; static float lux_sensor_value = 0.0f; +static unsigned mouse_type = 0; +static int pointer_x = 0; +static int pointer_y = 0; +static unsigned pointer_prev_x = 0; +static unsigned pointer_prev_y = 0; +static unsigned pointer_prev_color = 0; static int s; static int port; @@ -141,16 +151,60 @@ static struct descriptor analog_button = { .id_max = RETRO_DEVICE_ID_JOYPAD_R3 }; +static struct descriptor mouse = { + .device = RETRO_DEVICE_MOUSE, + .port_min = 0, + .port_max = 0, + .index_min = 0, + .index_max = 0, + .id_min = RETRO_DEVICE_ID_MOUSE_X, + .id_max = RETRO_DEVICE_ID_MOUSE_BUTTON_5 +}; + +static struct descriptor pointer = { + .device = RETRO_DEVICE_POINTER/* | 0x10000*/, + .port_min = 0, + .port_max = 0, + .index_min = 0, + .index_max = 0, + .id_min = RETRO_DEVICE_ID_POINTER_X, + .id_max = RETRO_DEVICE_ID_POINTER_COUNT +}; + +static struct descriptor lightgun = { + .device = RETRO_DEVICE_LIGHTGUN, + .port_min = 0, + .port_max = 0, + .index_min = 0, + .index_max = 0, + .id_min = RETRO_DEVICE_ID_LIGHTGUN_TRIGGER, + .id_max = RETRO_DEVICE_ID_LIGHTGUN_RELOAD +}; + +static struct descriptor lightgun_old = { + .device = RETRO_DEVICE_LIGHTGUN, + .port_min = 0, + .port_max = 0, + .index_min = 0, + .index_max = 0, + .id_min = RETRO_DEVICE_ID_LIGHTGUN_X, + .id_max = RETRO_DEVICE_ID_LIGHTGUN_Y +}; + /* Sensors are not fed to the descriptors. */ static struct descriptor *descriptors[] = { &joypad, &analog, - &analog_button + &analog_button, + &mouse, /* NETRETROPAD_MOUSE */ + &pointer, /* NETRETROPAD_POINTER */ + &lightgun, /* NETRETROPAD_LIGHTGUN */ + &lightgun_old /* NETRETROPAD_LIGHTGUN_OLD */ }; static uint16_t analog_item_colors[32]; -static uint16_t sensor_item_colors[70]; +static uint16_t sensor_item_colors[104]; static uint16_t combo_def[] = { @@ -571,6 +625,23 @@ static void NETRETROPAD_CORE_PREFIX(update_keyboard_cb)(bool down, unsigned keyc } } +static unsigned get_pixel_coordinate(int val, unsigned dimension) +{ + int64_t longval = (val + 32768) * dimension; + return (unsigned) (longval / 65536); +} + +static unsigned set_pixel(unsigned x, unsigned y, unsigned color) +{ + unsigned old_color; + uint16_t *pixel; + pixel = frame_buf + y * 320 + x; + old_color = *pixel; + *pixel = color; + return old_color; + +} + static void retropad_update_input(void) { unsigned i; @@ -585,6 +656,10 @@ static void retropad_update_input(void) /* Get current descriptor */ struct descriptor *desc = descriptors[i]; + /* Only query one mouse type device */ + if ( i > 2 && i != mouse_type) + continue; + /* Go through range of ports/indices/IDs */ for (port = desc->port_min; port <= desc->port_max; port++) { @@ -618,7 +693,42 @@ static void retropad_update_input(void) /* Update state */ desc->value[offset] = state; - /* Do not send analog button state - RA side is not prepared to receive it */ + if (i>2) + { + /* NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG, "Mouse state: %d %d %d (%d %d)\n",i,id, (int16_t)state,pointer_x,pointer_y); */ + if (mouse_type == NETRETROPAD_MOUSE || mouse_type == NETRETROPAD_LIGHTGUN_OLD) + { + if (id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_LIGHTGUN_X) + { + int32_t large = pointer_x + (int16_t)state*204; + if (large < -32768) + pointer_x = -32768; + else if (large > 32767) + pointer_x = 32767; + else + pointer_x = (int16_t) large; + } + else if (id == RETRO_DEVICE_ID_MOUSE_Y || id == RETRO_DEVICE_ID_LIGHTGUN_Y) + { + int32_t large = pointer_y + (int16_t)state*273; + if (large < -32768) + pointer_y = -32768; + else if (large > 32767) + pointer_y = 32767; + else + pointer_y = (int16_t) large; + } + } + else if (mouse_type == NETRETROPAD_POINTER || mouse_type == NETRETROPAD_LIGHTGUN) + { + if (id == RETRO_DEVICE_ID_POINTER_X || id == RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X) + pointer_x = (int16_t)state; + else if (id == RETRO_DEVICE_ID_POINTER_Y || id == RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y) + pointer_y = (int16_t)state; + } + } + + /* Do not send extra descriptor state - RA side is not prepared to receive it */ if (i>1) continue; @@ -674,6 +784,7 @@ void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) { "net_retropad_ip_octet4", "IP address part 4; 0|1|2|3|4|5|6|7|8|9|10|11|12|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" }, { "net_retropad_screen", "Start screen; Retropad|Keyboard tester|Sensor tester" }, { "net_retropad_hide_analog_mismatch", "Hide mismatching analog button inputs; True|False" }, + { "net_retropad_pointer_test", "Pointer test; Off|Mouse|Pointer|Lightgun|Old lightgun" }, { NULL, NULL }, }; enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565; @@ -695,7 +806,7 @@ void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) static void netretropad_check_variables(void) { - struct retro_variable var, var2, var3, var4, port_var, screen_var, hide_a_var; + struct retro_variable var, var2, var3, var4, port_var, screen_var, hide_a_var, mouse_var; var.key = "net_retropad_ip_octet1"; var2.key = "net_retropad_ip_octet2"; var3.key = "net_retropad_ip_octet3"; @@ -703,6 +814,7 @@ static void netretropad_check_variables(void) port_var.key = "net_retropad_port"; screen_var.key = "net_retropad_screen"; hide_a_var.key = "net_retropad_hide_analog_mismatch"; + mouse_var.key = "net_retropad_pointer_test"; NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &var); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &var2); @@ -711,6 +823,7 @@ static void netretropad_check_variables(void) NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &port_var); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &screen_var); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &hide_a_var); + NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &mouse_var); snprintf(server, sizeof(server), "%s.%s.%s.%s", var.value, var2.value, var3.value, var4.value); port = atoi(port_var.value); @@ -725,6 +838,17 @@ static void netretropad_check_variables(void) else hide_analog_mismatch = false; + if (mouse_var.value && strstr(mouse_var.value,"Mouse")) + mouse_type = NETRETROPAD_MOUSE; + else if (mouse_var.value && strstr(mouse_var.value,"Pointer")) + mouse_type = NETRETROPAD_POINTER; + else if (mouse_var.value && strstr(mouse_var.value,"Lightgun")) + mouse_type = NETRETROPAD_LIGHTGUN; + else if (mouse_var.value && strstr(mouse_var.value,"Old lightgun")) + mouse_type = NETRETROPAD_LIGHTGUN_OLD; + else + mouse_type = 0; + } void NETRETROPAD_CORE_PREFIX(retro_set_audio_sample)(retro_audio_sample_t cb) @@ -910,7 +1034,93 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) sensor_item_colors[median_index] = (uint16_t)(fabsf(32*4*value)) << 11; } } + + if (mouse_type == NETRETROPAD_MOUSE) + { + int offset; + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_LEFT); + sensor_item_colors[80] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE); + sensor_item_colors[81] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_RIGHT); + sensor_item_colors[82] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP); + sensor_item_colors[83] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN); + sensor_item_colors[84] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP); + sensor_item_colors[85] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN); + sensor_item_colors[86] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_BUTTON_4); + sensor_item_colors[88] = mouse.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&mouse, 0, 0, RETRO_DEVICE_ID_MOUSE_BUTTON_5); + sensor_item_colors[89] = mouse.value[offset] ? 0xA000 : 0x0000; + + } + else if (mouse_type == NETRETROPAD_LIGHTGUN) + { + int offset; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_A); + sensor_item_colors[70] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_B); + sensor_item_colors[71] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_C); + sensor_item_colors[72] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_TRIGGER); + sensor_item_colors[73] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD); + sensor_item_colors[74] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_START); + sensor_item_colors[75] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_SELECT); + sensor_item_colors[76] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN); + sensor_item_colors[77] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP); + sensor_item_colors[94] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN); + sensor_item_colors[95] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT); + sensor_item_colors[96] = lightgun.value[offset] ? 0xA000 : 0x0000; + + offset = DESC_OFFSET(&lightgun, 0, 0, RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT); + sensor_item_colors[97] = lightgun.value[offset] ? 0xA000 : 0x0000; + + } + if (mouse_type == NETRETROPAD_POINTER || mouse_type == NETRETROPAD_LIGHTGUN) + { + sensor_item_colors[90] = (pointer_x == -32768) ? 0xA000 : 0x0000; + sensor_item_colors[100] = (pointer_x < -32700) ? 0xA000 : 0x0000; + sensor_item_colors[92] = (pointer_x == 32767) ? 0xA000 : 0x0000; + sensor_item_colors[102] = (pointer_x > 32700) ? 0xA000 : 0x0000; + sensor_item_colors[91] = (pointer_y == -32768) ? 0xA000 : 0x0000; + sensor_item_colors[101] = (pointer_y < -32700) ? 0xA000 : 0x0000; + sensor_item_colors[93] = (pointer_y == 32767) ? 0xA000 : 0x0000; + sensor_item_colors[103] = (pointer_y > 32700) ? 0xA000 : 0x0000; + } + if (mouse_type != 0) + sensor_item_colors[87] = (pointer_x == 0 && pointer_y == 0) ? 0xA000 : 0x0000; /* Input test section start. */ @@ -1116,6 +1326,9 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) } else if (current_screen == NETRETROPAD_SCREEN_SENSORS) { + unsigned pointer_x_coord = get_pixel_coordinate(pointer_x, 320); + unsigned pointer_y_coord = get_pixel_coordinate(pointer_y, 240); + for (rle = 0; rle < ARRAY_SIZE(sensor_buttons); ) { unsigned runs; @@ -1144,8 +1357,16 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) pixel += 65; } - } + if(pointer_x_coord != pointer_prev_x || pointer_y_coord != pointer_prev_y) + { + set_pixel(pointer_prev_x, pointer_prev_y, pointer_prev_color); + pointer_prev_color = set_pixel(pointer_x_coord, pointer_y_coord, 0xffff); + pointer_prev_x = pointer_x_coord; + pointer_prev_y = pointer_y_coord; + } + } + NETRETROPAD_CORE_PREFIX(video_cb)(frame_buf, 320, 240, 640); retro_sleep(4); } diff --git a/cores/libretro-net-retropad/remotepad.h b/cores/libretro-net-retropad/remotepad.h index 0d10d00705..7cef0fad30 100644 --- a/cores/libretro-net-retropad/remotepad.h +++ b/cores/libretro-net-retropad/remotepad.h @@ -700,23 +700,23 @@ static uint16_t sensor_buttons[] = /* 102 */ 1, 255, /* 103 */ 1, 255, /* 104 */ 1, 255, - /* 105 */ 1, 255, - /* 106 */ 1, 255, - /* 107 */ 1, 255, - /* 108 */ 1, 255, - /* 109 */ 1, 255, - /* 110 */ 1, 255, - /* 111 */ 1, 255, - /* 112 */ 1, 255, - /* 113 */ 1, 255, - /* 114 */ 1, 255, - /* 115 */ 1, 255, - /* 116 */ 1, 255, - /* 117 */ 1, 255, - /* 118 */ 1, 255, - /* 119 */ 1, 255, - /* 120 */ 1, 255, - /* 121 */ 1, 255, + /* 105 */ 3, 220, 91, 15, 20, + /* 106 */ 31, 20, 70, 4, 5, 71, 4, 6, 72, 4, 4, 73, 6, 4, 74, 4, 6, 75, 3, 11, 76, 3, 11, 77, 3, 59, 94, 2, 8, 95, 2, 8, 96, 1, 8, 97, 1, 32, 90, 1, 1, 101, 13, 1, 92, 1, 19, + /* 107 */ 45, 19, 70, 2, 2, 70, 2, 4, 71, 2, 2, 71, 1, 4, 72, 2, 7, 73, 6, 4, 74, 2, 2, 74, 1, 4, 75, 1, 6, 75, 3, 4, 76, 1, 6, 76, 3, 4, 77, 1, 2, 77, 2, 57, 94, 4, 7, 95, 2, 7, 96, 2, 8, 97, 2, 31, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 108 */ 43, 19, 70, 2, 2, 70, 2, 4, 71, 4, 5, 72, 2, 9, 73, 2, 6, 74, 4, 5, 75, 4, 4, 75, 1, 5, 76, 4, 3, 76, 1, 6, 77, 1, 1, 77, 1, 1, 77, 1, 56, 94, 6, 6, 95, 2, 6, 96, 5, 4, 97, 5, 30, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 109 */ 41, 19, 70, 6, 4, 71, 4, 5, 72, 2, 9, 73, 2, 6, 74, 4, 6, 75, 4, 3, 75, 1, 6, 76, 4, 2, 76, 2, 5, 77, 1, 1, 77, 1, 1, 77, 1, 58, 94, 2, 6, 95, 6, 4, 96, 5, 4, 97, 5, 30, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 110 */ 45, 19, 70, 2, 2, 70, 2, 4, 71, 2, 2, 71, 1, 4, 72, 2, 9, 73, 2, 6, 74, 2, 2, 74, 1, 8, 75, 1, 3, 75, 1, 9, 76, 1, 2, 76, 1, 6, 77, 2, 2, 77, 1, 58, 94, 2, 7, 95, 4, 6, 96, 2, 8, 97, 2, 31, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 111 */ 43, 19, 70, 2, 2, 70, 2, 4, 71, 4, 6, 72, 4, 6, 73, 2, 6, 74, 2, 2, 74, 1, 5, 75, 3, 4, 75, 1, 6, 76, 3, 3, 76, 3, 5, 77, 3, 59, 94, 2, 8, 95, 2, 8, 96, 1, 8, 97, 1, 32, 90, 1, 0, 100, 1, 5, 87, 3, 5, 102, 1, 0, 92, 1, 19, + /* 112 */ 13, 219, 90, 1, 0, 100, 1, 4, 87, 1, 2, 87, 2, 4, 102, 1, 0, 92, 1, 19, + /* 113 */ 15, 219, 90, 1, 0, 100, 1, 4, 87, 1, 1, 87, 1, 1, 87, 1, 4, 102, 1, 0, 92, 1, 19, + /* 114 */ 15, 219, 90, 1, 0, 100, 1, 4, 87, 1, 1, 87, 1, 1, 87, 1, 4, 102, 1, 0, 92, 1, 19, + /* 115 */ 43, 19, 80, 2, 8, 81, 1, 4, 81, 1, 4, 82, 4, 4, 83, 2, 2, 83, 2, 4, 84, 4, 5, 85, 2, 1, 85, 1, 1, 85, 1, 8, 86, 2, 1, 86, 1, 1, 86, 1, 73, 88, 1, 5, 89, 6, 48, 90, 1, 0, 100, 1, 4, 87, 2, 2, 87, 1, 4, 102, 1, 0, 92, 1, 19, + /* 116 */ 49, 19, 80, 2, 8, 81, 6, 4, 82, 2, 2, 82, 1, 3, 83, 2, 2, 83, 2, 4, 84, 2, 2, 84, 1, 4, 85, 2, 1, 85, 1, 1, 85, 1, 2, 85, 1, 5, 86, 2, 1, 86, 1, 1, 86, 1, 1, 86, 1, 1, 86, 1, 68, 88, 2, 5, 89, 1, 53, 90, 1, 0, 100, 1, 5, 87, 3, 5, 102, 1, 0, 92, 1, 19, + /* 117 */ 45, 19, 80, 2, 8, 81, 6, 4, 82, 4, 4, 83, 2, 2, 83, 2, 4, 84, 2, 2, 84, 1, 4, 85, 2, 1, 85, 1, 1, 85, 1, 2, 85, 1, 5, 86, 2, 1, 86, 1, 1, 86, 1, 1, 86, 2, 68, 88, 1, 1, 88, 1, 5, 89, 5, 49, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 118 */ 47, 19, 80, 2, 8, 81, 2, 2, 81, 2, 4, 82, 2, 2, 82, 1, 3, 83, 2, 2, 83, 2, 4, 84, 2, 2, 84, 1, 4, 85, 2, 1, 85, 1, 1, 85, 1, 2, 85, 1, 5, 86, 2, 1, 86, 1, 1, 86, 1, 1, 86, 1, 68, 88, 5, 4, 89, 6, 48, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 119 */ 45, 19, 80, 2, 8, 81, 2, 2, 81, 2, 4, 82, 2, 2, 82, 1, 3, 83, 6, 4, 84, 2, 2, 84, 1, 4, 85, 2, 1, 85, 1, 1, 85, 1, 2, 85, 1, 5, 86, 2, 1, 86, 1, 1, 86, 1, 1, 86, 1, 71, 88, 1, 10, 89, 1, 48, 90, 1, 0, 100, 1, 13, 102, 1, 0, 92, 1, 19, + /* 120 */ 37, 19, 80, 6, 4, 81, 2, 2, 81, 2, 4, 82, 2, 2, 82, 1, 4, 83, 4, 5, 84, 4, 6, 85, 2, 1, 85, 1, 3, 85, 1, 6, 86, 2, 1, 86, 1, 2, 86, 1, 71, 88, 1, 5, 89, 5, 49, 90, 1, 1, 103, 13, 1, 92, 1, 19, + /* 121 */ 3, 220, 93, 15, 20, /* 122 */ 1, 255, /* 123 */ 1, 255, /* 124 */ 1, 255,